From 116b21de45a01e2c78d257ac2aae8b52a5bcd710 Mon Sep 17 00:00:00 2001 From: yinq Date: Tue, 11 Mar 2025 14:55:42 +0800 Subject: [PATCH 01/18] =?UTF-8?q?update=20=E7=89=A9=E6=96=99BOM=E5=8A=A0?= =?UTF-8?q?=E5=8D=95=E4=BD=8D=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/mes/domain/vo/ProdMaterialBomVo.java | 2 ++ .../dromara/mes/service/impl/BaseMaterialTypeServiceImpl.java | 2 +- .../dromara/mes/service/impl/ProdMaterialBomServiceImpl.java | 2 +- .../src/main/resources/mapper/mes/ProdMaterialBomMapper.xml | 3 ++- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdMaterialBomVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdMaterialBomVo.java index 0438846e..e55ac0f6 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdMaterialBomVo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdMaterialBomVo.java @@ -169,4 +169,6 @@ public class ProdMaterialBomVo implements Serializable { private String materialTypeName;//join字段 + private String unitName;//子物料单位 + } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialTypeServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialTypeServiceImpl.java index c11a292f..b196fdd4 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialTypeServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialTypeServiceImpl.java @@ -79,7 +79,7 @@ public class BaseMaterialTypeServiceImpl implements IBaseMaterialTypeService { .eq(StringUtils.isNotBlank(bo.getMaterialSubclass()), BaseMaterialType::getMaterialSubclass, bo.getMaterialSubclass()) .eq(bo.getProcessId() != null, BaseMaterialType::getProcessId, bo.getProcessId()) .eq(StringUtils.isNotBlank(bo.getActiveFlag()), BaseMaterialType::getActiveFlag, bo.getActiveFlag()) - .orderByDesc(BaseMaterialType::getCreateTime); + .orderByAsc(BaseMaterialType::getCreateTime); return lqw; } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java index 853a4371..997beff7 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java @@ -235,7 +235,7 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService { ProdMaterialBomVo topProdMaterialBomVo = new ProdMaterialBomVo(); topProdMaterialBomVo.setMaterialBomId(0L); topProdMaterialBomVo.setMaterialName("生产BOM"); - topProdMaterialBomVo.setMaterialTypeId(-1L); + topProdMaterialBomVo.setMaterialTypeId(1L); prodMaterialBomVos.add(topProdMaterialBomVo); List tempList = prodMaterialBomVos.stream().map(ProdMaterialBomVo::getMaterialBomId).collect(Collectors.toList()); diff --git a/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdMaterialBomMapper.xml b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdMaterialBomMapper.xml index 0820cfc7..cda6aa14 100644 --- a/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdMaterialBomMapper.xml +++ b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdMaterialBomMapper.xml @@ -41,13 +41,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" pmb.standard_amount, bmi.material_name, bsb.material_type_id, + bmui.unit_name, bmt.matrial_type_code as material_type_code, bmt.matrial_type_name as material_type_name from base_structure_bom bsb left join prod_material_bom pmb on pmb.material_type_id = bsb.material_type_id and pmb.parent_id = #{parentId} left join base_material_info bmi on pmb.material_id=bmi.material_id left join base_material_type bmt on bsb.material_type_id = bmt.matrial_type_id - + LEFT JOIN base_measurement_unit_info bmui ON bmui.unit_id = bmi.material_unit_id and bmt.matrial_type_code like concat('%', #{materialTypeCode}, '%') From 8d6df6f3f1bc4ef9fa021f5ecfcc18b515d0228d Mon Sep 17 00:00:00 2001 From: zch Date: Tue, 11 Mar 2025 16:15:16 +0800 Subject: [PATCH 02/18] =?UTF-8?q?change(hwmom-mes):=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=89=A9=E6=96=99=E5=90=8D=E7=A7=B0=E5=92=8C=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E7=9A=84=E5=94=AF=E4=B8=80=E6=80=A7=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在保存物料信息前,对物料编码的唯一性校验 - 新增对物料名称的唯一性校验 --- .../impl/BaseMaterialInfoServiceImpl.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java index 20a3ed3a..674daca7 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java @@ -197,16 +197,36 @@ public class BaseMaterialInfoServiceImpl implements IBaseMaterialInfoService { */ private void validEntityBeforeSave(BaseMaterialInfo entity){ //TODO 做一些数据校验,如唯一约束 + + //编码校验 if (StringUtils.isNotBlank(entity.getMaterialCode())) { BaseMaterialInfoBo query = new BaseMaterialInfoBo(); query.setMaterialCode(entity.getMaterialCode()); MPJLambdaWrapper lqw = buildQueryWrapper(query); BaseMaterialInfo baseMaterialInfo = baseMapper.selectOne(lqw); - if (baseMaterialInfo != null + if (!ObjectUtils.isEmpty(baseMaterialInfo) && !baseMaterialInfo.getMaterialId().equals(entity.getMaterialId())) { throw new ServiceException("编码已存在"); } } + + //名称校验 + + + if (StringUtils.isNotBlank(entity.getMaterialName())) { + BaseMaterialInfoBo query = new BaseMaterialInfoBo(); + query.setMaterialName(entity.getMaterialName()); + MPJLambdaWrapper lqw = JoinWrappers.lambda(BaseMaterialInfo.class) + .selectAll(BaseMaterialInfo.class) + //buildQueryWrapper中getMaterialName是like,相似搜索 + .eq(StringUtils.isNotBlank(query.getMaterialName()), BaseMaterialInfo::getMaterialName, query.getMaterialName()); + BaseMaterialInfo baseMaterialInfo = baseMapper.selectOne(lqw); + if ( !ObjectUtils.isEmpty(baseMaterialInfo) + && !baseMaterialInfo.getMaterialId().equals(entity.getMaterialId())) { + throw new ServiceException("名称已存在"); + } + } + } /** From 0caf87915c70eebe2c17971b23224590ca80688f Mon Sep 17 00:00:00 2001 From: zch Date: Tue, 11 Mar 2025 16:17:12 +0800 Subject: [PATCH 03/18] =?UTF-8?q?del(mes):=20=E7=A7=BB=E9=99=A4=E7=89=A9?= =?UTF-8?q?=E6=96=99=E4=BF=A1=E6=81=AF=E4=BF=9D=E5=AD=98=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E6=A0=A1=E9=AA=8C=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除了 BaseMaterialInfoServiceImpl 类中的物料名称校验逻辑- 优化了物料信息保存的代码结构,提高了代码可维护性 --- .../service/impl/BaseMaterialInfoServiceImpl.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java index 674daca7..6cb9bf6c 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java @@ -210,23 +210,8 @@ public class BaseMaterialInfoServiceImpl implements IBaseMaterialInfoService { } } - //名称校验 - if (StringUtils.isNotBlank(entity.getMaterialName())) { - BaseMaterialInfoBo query = new BaseMaterialInfoBo(); - query.setMaterialName(entity.getMaterialName()); - MPJLambdaWrapper lqw = JoinWrappers.lambda(BaseMaterialInfo.class) - .selectAll(BaseMaterialInfo.class) - //buildQueryWrapper中getMaterialName是like,相似搜索 - .eq(StringUtils.isNotBlank(query.getMaterialName()), BaseMaterialInfo::getMaterialName, query.getMaterialName()); - BaseMaterialInfo baseMaterialInfo = baseMapper.selectOne(lqw); - if ( !ObjectUtils.isEmpty(baseMaterialInfo) - && !baseMaterialInfo.getMaterialId().equals(entity.getMaterialId())) { - throw new ServiceException("名称已存在"); - } - } - } /** From 16559bd4f8f14a80a0a1c2b4debfad7142a16679 Mon Sep 17 00:00:00 2001 From: zch Date: Tue, 11 Mar 2025 16:41:23 +0800 Subject: [PATCH 04/18] =?UTF-8?q?change(hwmom-mes):=20(MeterSphere100025)?= =?UTF-8?q?=E3=80=90=E8=AE=BE=E5=A4=87=E5=A4=A7=E7=B1=BB=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E3=80=91=E7=BC=96=E5=8F=B7=E3=80=81=E5=90=8D=E7=A7=B0=E5=94=AF?= =?UTF-8?q?=E4=B8=80=EF=BC=8C=E4=B8=8D=E5=85=81=E8=AE=B8=E9=87=8D=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在保存设备类别信息前,增加对设备类别名称和编号的唯一性校验 - 如果存在重复的名称或编号,抛出异常并提示相应错误信息 --- .../impl/BaseDeviceCategoryServiceImpl.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseDeviceCategoryServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseDeviceCategoryServiceImpl.java index 89a91e3d..1997e450 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseDeviceCategoryServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseDeviceCategoryServiceImpl.java @@ -1,5 +1,8 @@ package org.dromara.mes.service.impl; + +import org.springframework.util.ObjectUtils; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -7,7 +10,6 @@ import org.dromara.common.mybatis.core.page.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.dromara.mes.domain.bo.BaseDeviceCategoryBo; @@ -116,6 +118,33 @@ public class BaseDeviceCategoryServiceImpl implements IBaseDeviceCategoryService */ private void validEntityBeforeSave(BaseDeviceCategory entity){ //TODO 做一些数据校验,如唯一约束 + + //编号校验 + if (StringUtils.isNotNull(entity.getDeviceCategoryCode())){ + BaseDeviceCategoryBo query = new BaseDeviceCategoryBo(); + query.setDeviceCategoryCode(entity.getDeviceCategoryCode()); + MPJLambdaWrapper lqw = buildQueryWrapper(query); + BaseDeviceCategory detail = baseMapper.selectOne(lqw); + if ( !ObjectUtils.isEmpty(detail) + && !detail.getDeviceCategoryId().equals(entity.getDeviceCategoryId())){ + throw new ServiceException("编号已存在"); + } + } + + //名称校验 + if (StringUtils.isNotNull(entity.getDeviceCategoryName())){ + BaseDeviceCategoryBo query = new BaseDeviceCategoryBo(); + query.setDeviceCategoryName(entity.getDeviceCategoryName()); + MPJLambdaWrapper lqw = JoinWrappers.lambda(BaseDeviceCategory.class) + .selectAll(BaseDeviceCategory.class) + .eq(StringUtils.isNotBlank(query.getDeviceCategoryName()),BaseDeviceCategory::getDeviceCategoryName, query.getDeviceCategoryName()); + BaseDeviceCategory detail = baseMapper.selectOne(lqw); + if ( !ObjectUtils.isEmpty(detail) + && !detail.getDeviceCategoryId().equals(entity.getDeviceCategoryId())){ + throw new ServiceException("名称已存在"); + } + } + } /** From 40aeee6c8b74764fe423218ce05ee69741d738ca Mon Sep 17 00:00:00 2001 From: zch Date: Tue, 11 Mar 2025 16:50:31 +0800 Subject: [PATCH 05/18] =?UTF-8?q?change(mes):=20(MeterSphere100022)?= =?UTF-8?q?=E3=80=90=E8=AE=BE=E5=A4=87=E5=A4=A7=E7=B1=BB=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E3=80=91=E5=A4=87=E6=B3=A8=E4=B8=8D=E5=BA=94=E8=AF=A5=E6=98=AF?= =?UTF-8?q?=E5=BF=85=E5=A1=AB=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 注释掉 BaseDeviceCategoryBo 类中的 remark 字段的 @NotBlank 注解 - 移除 baseDeviceCategory 组件中 remark 字段的验证规则 --- .../java/org/dromara/mes/domain/bo/BaseDeviceCategoryBo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseDeviceCategoryBo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseDeviceCategoryBo.java index 71507f0c..01ac8dfa 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseDeviceCategoryBo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseDeviceCategoryBo.java @@ -47,7 +47,7 @@ public class BaseDeviceCategoryBo extends BaseEntity { /** * 备注 */ - @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) +/* @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })*/ private String remark; From 1828a9365513cf3fc6d76e905dc31fa56fc6bf41 Mon Sep 17 00:00:00 2001 From: zch Date: Tue, 11 Mar 2025 16:58:10 +0800 Subject: [PATCH 06/18] =?UTF-8?q?feat(wms):=20=E4=B8=BA=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85=E6=B7=BB=E5=8A=A0=E4=BA=8B?= =?UTF-8?q?=E5=8A=A1=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 WmsPurchaseOrderDetailServiceImpl 类中,为 insertByBo 方法添加了 @Transactional 注解 - 此修改确保了在插入采购订单详情时,如果发生异常将回滚事务 --- .../wms/service/impl/WmsPurchaseOrderDetailServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsPurchaseOrderDetailServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsPurchaseOrderDetailServiceImpl.java index 8b650934..7d6d55e7 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsPurchaseOrderDetailServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsPurchaseOrderDetailServiceImpl.java @@ -23,6 +23,7 @@ import org.dromara.wms.domain.vo.WmsPurchaseOrderDetailVo; import org.dromara.wms.domain.WmsPurchaseOrderDetail; import org.dromara.wms.mapper.WmsPurchaseOrderDetailMapper; import org.dromara.wms.service.IWmsPurchaseOrderDetailService; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; @@ -103,6 +104,7 @@ public class WmsPurchaseOrderDetailServiceImpl implements IWmsPurchaseOrderDetai * @return 是否新增成功 */ @Override + @Transactional( rollbackFor = Exception.class ) public Boolean insertByBo(List bo) { ArrayList list = new ArrayList<>(); int a = 0; From 33a4847aa781714115433dab974dc1f0295444e2 Mon Sep 17 00:00:00 2001 From: yinq Date: Tue, 11 Mar 2025 17:27:34 +0800 Subject: [PATCH 07/18] =?UTF-8?q?update=20=E7=89=A9=E6=96=99BOM=E9=80=92?= =?UTF-8?q?=E5=BD=92=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ProdMaterialBomServiceImpl.java | 38 +++++++++---------- .../mapper/mes/ProdMaterialBomMapper.xml | 2 +- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java index 997beff7..6b7f62b5 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java @@ -238,7 +238,7 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService { topProdMaterialBomVo.setMaterialTypeId(1L); prodMaterialBomVos.add(topProdMaterialBomVo); - List tempList = prodMaterialBomVos.stream().map(ProdMaterialBomVo::getMaterialBomId).collect(Collectors.toList()); + List tempList = prodMaterialBomVos.stream().map(ProdMaterialBomVo::getMaterialBomId).toList(); for (ProdMaterialBomVo prodMaterialBomVo : prodMaterialBomVos) { // 如果是顶级节点, 遍历该父节点的所有子节点 if (!tempList.contains(prodMaterialBomVo.getParentId())) { @@ -267,33 +267,29 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService { /** * 递归列表 */ - private void recursionFn(List list, ProdMaterialBomVo t) { - // 得到子节点列表 - List childList = getChildList(list, t); - t.setChildren(childList); - for (ProdMaterialBomVo tChild : childList) { - if (hasChild(list, tChild)) { - recursionFn(list, tChild); + private void recursionFn(List list, ProdMaterialBomVo parent) { + // 获取子节点 + List childList = getChildList(list, parent); + parent.setChildren(childList); + + // 递归处理子节点 + for (ProdMaterialBomVo child : childList) { + // 确保子节点继承 BOM 版本信息 + if (StringUtils.isBlank(child.getMaterialBomVersion()) && StringUtils.isNotBlank(parent.getMaterialBomVersion())) { + child.setMaterialBomVersion(parent.getMaterialBomVersion()); } + recursionFn(list, child); } } /** * 得到子节点列表 */ - private List getChildList(List list, ProdMaterialBomVo t) { - List tlist = new ArrayList(); - Iterator it = list.iterator(); - while (it.hasNext()) { - ProdMaterialBomVo n = (ProdMaterialBomVo) it.next(); - if(StringUtils.isNotBlank(t.getMaterialBomVersion())){ - n.setMaterialBomVersion(t.getMaterialBomVersion()); - } - if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getMaterialBomId().longValue()) { - tlist.add(n); - } - } - return tlist; + private List getChildList(List list, ProdMaterialBomVo parent) { + return list.stream() + .filter(n -> StringUtils.isNotNull(n.getParentId()) && + n.getParentId().equals(parent.getMaterialBomId())) + .collect(Collectors.toList()); } /** diff --git a/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdMaterialBomMapper.xml b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdMaterialBomMapper.xml index cda6aa14..b7aa5cc7 100644 --- a/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdMaterialBomMapper.xml +++ b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdMaterialBomMapper.xml @@ -27,7 +27,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and pmb.parent_id = #{parentId} - order by pmb.material_bom_id desc + order by pmb.material_bom_id, pmb.material_bom_version desc From 7d4e5688350f3949c369cb0ed600b619d76c2e6c Mon Sep 17 00:00:00 2001 From: yinq Date: Wed, 12 Mar 2025 09:47:00 +0800 Subject: [PATCH 08/18] =?UTF-8?q?update=20=E6=B7=BB=E5=8A=A0dms=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E6=A8=A1=E5=9D=97=E3=80=81=E6=B7=BB=E5=8A=A0=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E6=A8=A1=E5=9E=8B=E5=8A=9F=E8=83=BD=E3=80=81=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/hwmom-dms/pom.xml | 137 ++++++++++++++++++ .../org/dromara/dms/HwMomDmsApplication.java | 22 +++ .../controller/DmsDeviceModeController.java | 117 +++++++++++++++ .../org/dromara/dms/domain/DmsDeviceMode.java | 52 +++++++ .../dms/domain/bo/DmsDeviceModeBo.java | 50 +++++++ .../dms/domain/vo/DmsDeviceModeVo.java | 63 ++++++++ .../dms/mapper/DmsDeviceModeMapper.java | 15 ++ .../dms/service/IDmsDeviceModeService.java | 69 +++++++++ .../impl/DmsDeviceModeServiceImpl.java | 135 +++++++++++++++++ .../src/main/resources/application.yml | 34 +++++ .../hwmom-dms/src/main/resources/banner.txt | 8 + .../src/main/resources/logback-plus.xml | 28 ++++ .../mapper/dms/DmsDeviceModeMapper.xml | 7 + .../src/main/resources/mapper/package-info.md | 3 + ruoyi-modules/pom.xml | 1 + 15 files changed, 741 insertions(+) create mode 100644 ruoyi-modules/hwmom-dms/pom.xml create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/HwMomDmsApplication.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeController.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceMode.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeBo.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeVo.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeMapper.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeService.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeServiceImpl.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/resources/application.yml create mode 100644 ruoyi-modules/hwmom-dms/src/main/resources/banner.txt create mode 100644 ruoyi-modules/hwmom-dms/src/main/resources/logback-plus.xml create mode 100644 ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeMapper.xml create mode 100644 ruoyi-modules/hwmom-dms/src/main/resources/mapper/package-info.md diff --git a/ruoyi-modules/hwmom-dms/pom.xml b/ruoyi-modules/hwmom-dms/pom.xml new file mode 100644 index 00000000..2dda9049 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/pom.xml @@ -0,0 +1,137 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + hwmom-dms + + + hwmom-dms设备模块 + + + + + + org.dromara + ruoyi-common-nacos + + + + org.dromara + ruoyi-common-sentinel + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-dict + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + + org.dromara + ruoyi-api-system + + + + org.dromara + ruoyi-api-resource + + + + + + + + + com.microsoft.sqlserver + mssql-jdbc + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/HwMomDmsApplication.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/HwMomDmsApplication.java new file mode 100644 index 00000000..b2560f67 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/HwMomDmsApplication.java @@ -0,0 +1,22 @@ +package org.dromara.dms; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * DMS设备模块 + * + * @author ruoyi + */ +@EnableDubbo +@SpringBootApplication +public class HwMomDmsApplication { + public static void main(String[] args) { + SpringApplication application = new SpringApplication(HwMomDmsApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ HwDms启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeController.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeController.java new file mode 100644 index 00000000..21e595a0 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeController.java @@ -0,0 +1,117 @@ +package org.dromara.dms.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.dms.domain.vo.DmsDeviceModeVo; +import org.dromara.dms.domain.bo.DmsDeviceModeBo; +import org.dromara.dms.service.IDmsDeviceModeService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 设备模型 + * 前端访问路由地址为:/dms/deviceMode + * + * @author Yinq + * @date 2025-03-11 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/deviceMode") +public class DmsDeviceModeController extends BaseController { + + private final IDmsDeviceModeService dmsDeviceModeService; + + /** + * 查询设备模型列表 + */ + @SaCheckPermission("dms:deviceMode:list") + @GetMapping("/list") + public TableDataInfo list(DmsDeviceModeBo bo, PageQuery pageQuery) { + return dmsDeviceModeService.queryPageList(bo, pageQuery); + } + + /** + * 导出设备模型列表 + */ + @SaCheckPermission("dms:deviceMode:export") + @Log(title = "设备模型", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(DmsDeviceModeBo bo, HttpServletResponse response) { + List list = dmsDeviceModeService.queryList(bo); + ExcelUtil.exportExcel(list, "设备模型", DmsDeviceModeVo.class, response); + } + + /** + * 获取设备模型详细信息 + * + * @param deviceModeId 主键 + */ + @SaCheckPermission("dms:deviceMode:query") + @GetMapping("/{deviceModeId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long deviceModeId) { + return R.ok(dmsDeviceModeService.queryById(deviceModeId)); + } + + /** + * 新增设备模型 + */ + @SaCheckPermission("dms:deviceMode:add") + @Log(title = "设备模型", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody DmsDeviceModeBo bo) { + return toAjax(dmsDeviceModeService.insertByBo(bo)); + } + + /** + * 修改设备模型 + */ + @SaCheckPermission("dms:deviceMode:edit") + @Log(title = "设备模型", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody DmsDeviceModeBo bo) { + return toAjax(dmsDeviceModeService.updateByBo(bo)); + } + + /** + * 删除设备模型 + * + * @param deviceModeIds 主键串 + */ + @SaCheckPermission("dms:deviceMode:remove") + @Log(title = "设备模型", businessType = BusinessType.DELETE) + @DeleteMapping("/{deviceModeIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] deviceModeIds) { + return toAjax(dmsDeviceModeService.deleteWithValidByIds(List.of(deviceModeIds), true)); + } + + + /** + * 下拉框查询设备模型列表 + */ + + @GetMapping("/getDmsDeviceModeList") + public R> getDmsDeviceModeList(DmsDeviceModeBo bo) { + List list = dmsDeviceModeService.queryList(bo); + return R.ok(list); + } +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceMode.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceMode.java new file mode 100644 index 00000000..1ed27f82 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceMode.java @@ -0,0 +1,52 @@ +package org.dromara.dms.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 设备模型对象 dms_device_mode + * + * @author Yinq + * @date 2025-03-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("dms_device_mode") +public class DmsDeviceMode extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 设备模型ID + */ + @TableId(value = "device_mode_id", type = IdType.AUTO) + private Long deviceModeId; + + /** + * 设备模型名称 + */ + private String deviceModeName; + + /** + * 设备模型状态(1:启用,9:删除) + */ + @TableLogic(value="1", delval="9") + private String deviceModeStatus; + + /** + * 设备模型图片地址 + */ + private String deviceModePic; + + /** + * 场景描述 + */ + private String remark; + + +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeBo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeBo.java new file mode 100644 index 00000000..ebc170ee --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeBo.java @@ -0,0 +1,50 @@ +package org.dromara.dms.domain.bo; + +import org.dromara.dms.domain.DmsDeviceMode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 设备模型业务对象 dms_device_mode + * + * @author Yinq + * @date 2025-03-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = DmsDeviceMode.class, reverseConvertGenerate = false) +public class DmsDeviceModeBo extends BaseEntity { + + /** + * 设备模型ID + */ + private Long deviceModeId; + + /** + * 设备模型名称 + */ + @NotBlank(message = "设备模型名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String deviceModeName; + + /** + * 设备模型状态(1:启用,9:删除) + */ + private String deviceModeStatus; + + /** + * 设备模型图片地址 + */ + private String deviceModePic; + + /** + * 场景描述 + */ + private String remark; + + +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeVo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeVo.java new file mode 100644 index 00000000..e036b9eb --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeVo.java @@ -0,0 +1,63 @@ +package org.dromara.dms.domain.vo; + +import org.dromara.dms.domain.DmsDeviceMode; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 设备模型视图对象 dms_device_mode + * + * @author Yinq + * @date 2025-03-11 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = DmsDeviceMode.class) +public class DmsDeviceModeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 设备模型ID + */ + @ExcelProperty(value = "设备模型ID") + private Long deviceModeId; + + /** + * 设备模型名称 + */ + @ExcelProperty(value = "设备模型名称") + private String deviceModeName; + + /** + * 设备模型状态(1:启用,9:删除) + */ + @ExcelProperty(value = "设备模型状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dms_device_mode_status") + private String deviceModeStatus; + + /** + * 设备模型图片地址 + */ + @ExcelProperty(value = "设备模型图片地址") + private String deviceModePic; + + /** + * 场景描述 + */ + @ExcelProperty(value = "场景描述") + private String remark; + + +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeMapper.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeMapper.java new file mode 100644 index 00000000..0f7005ef --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeMapper.java @@ -0,0 +1,15 @@ +package org.dromara.dms.mapper; + +import org.dromara.dms.domain.DmsDeviceMode; +import org.dromara.dms.domain.vo.DmsDeviceModeVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 设备模型Mapper接口 + * + * @author Yinq + * @date 2025-03-11 + */ +public interface DmsDeviceModeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeService.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeService.java new file mode 100644 index 00000000..df894344 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeService.java @@ -0,0 +1,69 @@ +package org.dromara.dms.service; + +import org.dromara.dms.domain.DmsDeviceMode; +import org.dromara.dms.domain.vo.DmsDeviceModeVo; +import org.dromara.dms.domain.bo.DmsDeviceModeBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 设备模型Service接口 + * + * @author Yinq + * @date 2025-03-11 + */ +public interface IDmsDeviceModeService { + + /** + * 查询设备模型 + * + * @param deviceModeId 主键 + * @return 设备模型 + */ + DmsDeviceModeVo queryById(Long deviceModeId); + + /** + * 分页查询设备模型列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设备模型分页列表 + */ + TableDataInfo queryPageList(DmsDeviceModeBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的设备模型列表 + * + * @param bo 查询条件 + * @return 设备模型列表 + */ + List queryList(DmsDeviceModeBo bo); + + /** + * 新增设备模型 + * + * @param bo 设备模型 + * @return 是否新增成功 + */ + Boolean insertByBo(DmsDeviceModeBo bo); + + /** + * 修改设备模型 + * + * @param bo 设备模型 + * @return 是否修改成功 + */ + Boolean updateByBo(DmsDeviceModeBo bo); + + /** + * 校验并批量删除设备模型信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeServiceImpl.java new file mode 100644 index 00000000..c861d074 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeServiceImpl.java @@ -0,0 +1,135 @@ +package org.dromara.dms.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.dms.domain.bo.DmsDeviceModeBo; +import org.dromara.dms.domain.vo.DmsDeviceModeVo; +import org.dromara.dms.domain.DmsDeviceMode; +import org.dromara.dms.mapper.DmsDeviceModeMapper; +import org.dromara.dms.service.IDmsDeviceModeService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 设备模型Service业务层处理 + * + * @author Yinq + * @date 2025-03-11 + */ +@RequiredArgsConstructor +@Service +public class DmsDeviceModeServiceImpl implements IDmsDeviceModeService { + + private final DmsDeviceModeMapper baseMapper; + + /** + * 查询设备模型 + * + * @param deviceModeId 主键 + * @return 设备模型 + */ + @Override + public DmsDeviceModeVo queryById(Long deviceModeId){ + return baseMapper.selectVoById(deviceModeId); + } + + /** + * 分页查询设备模型列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设备模型分页列表 + */ + @Override + public TableDataInfo queryPageList(DmsDeviceModeBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的设备模型列表 + * + * @param bo 查询条件 + * @return 设备模型列表 + */ + @Override + public List queryList(DmsDeviceModeBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(DmsDeviceModeBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(DmsDeviceMode.class) + .selectAll(DmsDeviceMode.class) + .eq(bo.getDeviceModeId() != null, DmsDeviceMode::getDeviceModeId, bo.getDeviceModeId()) + .like(StringUtils.isNotBlank(bo.getDeviceModeName()), DmsDeviceMode::getDeviceModeName, bo.getDeviceModeName()) + .eq(StringUtils.isNotBlank(bo.getDeviceModeStatus()), DmsDeviceMode::getDeviceModeStatus, bo.getDeviceModeStatus()) + .eq(StringUtils.isNotBlank(bo.getDeviceModePic()), DmsDeviceMode::getDeviceModePic, bo.getDeviceModePic()) + .orderByAsc(DmsDeviceMode::getCreateTime); + return lqw; + } + + /** + * 新增设备模型 + * + * @param bo 设备模型 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(DmsDeviceModeBo bo) { + DmsDeviceMode add = MapstructUtils.convert(bo, DmsDeviceMode.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setDeviceModeId(add.getDeviceModeId()); + } + return flag; + } + + /** + * 修改设备模型 + * + * @param bo 设备模型 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(DmsDeviceModeBo bo) { + DmsDeviceMode update = MapstructUtils.convert(bo, DmsDeviceMode.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(DmsDeviceMode entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除设备模型信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/application.yml b/ruoyi-modules/hwmom-dms/src/main/resources/application.yml new file mode 100644 index 00000000..d4d1ed7f --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/resources/application.yml @@ -0,0 +1,34 @@ +# Tomcat +server: + port: 6017 + +# Spring +spring: + application: + # 应用名称 + name: hwmom-dms + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + username: @nacos.username@ + password: @nacos.password@ + discovery: + # 注册组 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/banner.txt b/ruoyi-modules/hwmom-dms/src/main/resources/banner.txt new file mode 100644 index 00000000..6bf01156 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/resources/banner.txt @@ -0,0 +1,8 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + | |____ ___ __ ___ ___ _ __ ___ __| |_ __ ___ ___ + | '_ \ \ /\ / / '_ ` _ \ / _ \| '_ ` _ \ _____ / _` | '_ ` _ \/ __| + | | | \ V V /| | | | | | (_) | | | | | |_____| (_| | | | | | \__ \ + |_| |_|\_/\_/ |_| |_| |_|\___/|_| |_| |_| \__,_|_| |_| |_|___/ + diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/logback-plus.xml b/ruoyi-modules/hwmom-dms/src/main/resources/logback-plus.xml new file mode 100644 index 00000000..caaa3455 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeMapper.xml b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeMapper.xml new file mode 100644 index 00000000..4fcc82d0 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/package-info.md b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/package-info.md new file mode 100644 index 00000000..c938b1e5 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml index ba7a4ae7..c1bd1ca2 100644 --- a/ruoyi-modules/pom.xml +++ b/ruoyi-modules/pom.xml @@ -18,6 +18,7 @@ hwmom-wms hwmom-qms hwmom-api + hwmom-dms ruoyi-modules From c454b61ed034d83886f18cc5b8d77b19415a57a2 Mon Sep 17 00:00:00 2001 From: zch Date: Wed, 12 Mar 2025 14:00:51 +0800 Subject: [PATCH 09/18] =?UTF-8?q?change(wms):=20=E4=BF=AE=E6=94=B9WMS?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E9=A1=B5=E9=9D=A2=E7=9A=84=E7=89=A9=E6=96=99?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=AF=B9=E8=AF=9D=E6=A1=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 instockOrderCopy 和 linkage 组件中添加物料选择对话框 - 实现物料编码点击检索功能,替换原有的直接选择方式 - 新增 MaterialSelectInWMS 组件用于展示和选择物料信息 --- .../dromara/wms/domain/WmsPurchaseOrderDetail.java | 9 +++++++++ .../wms/domain/bo/WmsPurchaseOrderDetailBo.java | 3 +++ .../impl/WmsAllocateOrderDetailServiceImpl.java | 11 ++++++----- .../impl/WmsPurchaseOrderDetailServiceImpl.java | 2 +- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsPurchaseOrderDetail.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsPurchaseOrderDetail.java index d8b9b4a5..e7dd1f7c 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsPurchaseOrderDetail.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsPurchaseOrderDetail.java @@ -1,5 +1,7 @@ package org.dromara.wms.domain; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; import org.dromara.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; @@ -7,6 +9,9 @@ import lombok.EqualsAndHashCode; import java.io.Serial; import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; /** * 采购订单-物料对象 wms_purchase_order_detail @@ -68,6 +73,10 @@ public class WmsPurchaseOrderDetail extends TenantEntity { */ private BigDecimal deliveryQty; + /** + * 物料id + */ + @TableField(exist = false) private Long materialId; diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsPurchaseOrderDetailBo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsPurchaseOrderDetailBo.java index e7edf92f..2ef41ada 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsPurchaseOrderDetailBo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsPurchaseOrderDetailBo.java @@ -70,6 +70,9 @@ public class WmsPurchaseOrderDetailBo extends BaseEntity { */ private BigDecimal deliveryQty; + /** + * 物料id + */ private Long materialId; diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsAllocateOrderDetailServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsAllocateOrderDetailServiceImpl.java index b3c35b42..f6eb13a0 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsAllocateOrderDetailServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsAllocateOrderDetailServiceImpl.java @@ -108,15 +108,16 @@ public class WmsAllocateOrderDetailServiceImpl implements IWmsAllocateOrderDetai * @return 是否新增成功 */ @Override + @Transactional( rollbackFor = Exception.class ) public Boolean insertByBo(List bo) { - ArrayList list = new ArrayList<>(); + int i = 0; for (WmsAllocateOrderDetailBo detailBo : bo) { WmsAllocateOrderDetail add = MapstructUtils.convert(detailBo, WmsAllocateOrderDetail.class); - add.setCreateBy(LoginHelper.getUsername()); - add.setTenantId(LoginHelper.getTenantId()); - list.add(add); +/* add.setCreateBy(LoginHelper.getUsername()); + add.setTenantId(LoginHelper.getTenantId());*/ + i = baseMapper.insert(add); } - int i = baseMapper.insertDetails(list); +// int i = baseMapper.insertDetails(list); return i > 0; } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsPurchaseOrderDetailServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsPurchaseOrderDetailServiceImpl.java index 7d6d55e7..639987a1 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsPurchaseOrderDetailServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsPurchaseOrderDetailServiceImpl.java @@ -132,7 +132,7 @@ public class WmsPurchaseOrderDetailServiceImpl implements IWmsPurchaseOrderDetai public Boolean updateByBo(WmsPurchaseOrderDetailBo bo) { WmsPurchaseOrderDetail update = MapstructUtils.convert(bo, WmsPurchaseOrderDetail.class); validEntityBeforeSave(update); - update.setUpdateBy(LoginHelper.getUserId()); +// update.setUpdateBy(LoginHelper.getUserId()); return baseMapper.updateById(update) > 0; } From 28f384986ed6df07d9e2637258b44810df5f12ed Mon Sep 17 00:00:00 2001 From: zch Date: Wed, 12 Mar 2025 15:08:54 +0800 Subject: [PATCH 10/18] =?UTF-8?q?feat(mes):=20=E5=B0=86=E7=89=A9=E6=96=99?= =?UTF-8?q?=E5=A4=A7=E7=B1=BB=E4=BB=8E=E5=AD=97=E5=85=B8=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E8=A1=A8=E4=B8=AD=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 BaseMaterialInfo 实体类中将 materialCategories 字段改为 materialCategoryId - 在 BaseMaterialInfoBo 和 BaseMaterialInfoVo 中做相应修改 - 更新 BaseMaterialInfoServiceImpl 中的查询逻辑,关联物料大类信息 - 修改前端页面,使用新的物料大类选项从数据库获取 - 更新相关类型定义,将物料大类改为数据库表字段 --- .../org/dromara/mes/domain/BaseMaterialInfo.java | 11 +++++++++-- .../dromara/mes/domain/bo/BaseMaterialInfoBo.java | 4 ++-- .../dromara/mes/domain/vo/BaseMaterialInfoVo.java | 14 ++++++++++---- .../service/impl/BaseMaterialInfoServiceImpl.java | 11 ++++++----- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseMaterialInfo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseMaterialInfo.java index 4cbf300c..c2aa8b6c 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseMaterialInfo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/BaseMaterialInfo.java @@ -55,9 +55,9 @@ public class BaseMaterialInfo extends TenantEntity { private Long materialTypeId; /** - * 物料大类(1原材料 2半成品 3成品) + * 物料大类(字典改为数据库表) */ - private String materialCategories; + private String materialCategoryId; /** * 物料小类 @@ -277,4 +277,11 @@ public class BaseMaterialInfo extends TenantEntity { @TableField(exist = false) private String matrialTypeName;//映射字段 + + /** + * 物料大类名称 + */ + @TableField(exist = false) + private String materialCategoryName;//映射字段 + } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseMaterialInfoBo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseMaterialInfoBo.java index 7dbc7619..e28a0311 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseMaterialInfoBo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseMaterialInfoBo.java @@ -56,9 +56,9 @@ public class BaseMaterialInfoBo extends BaseEntity { private Long materialTypeId; /** - * 物料大类(1原材料 2半成品 3成品) + * 物料大类(字典改为数据库表) */ - private String materialCategories; + private String materialCategoryId; /** * 物料小类 diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseMaterialInfoVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseMaterialInfoVo.java index 788cca24..b2817308 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseMaterialInfoVo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/BaseMaterialInfoVo.java @@ -1,6 +1,8 @@ package org.dromara.mes.domain.vo; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import org.dromara.mes.domain.BaseMaterialInfo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; @@ -73,11 +75,9 @@ public class BaseMaterialInfoVo implements Serializable { private Long materialTypeId; /** - * 物料大类(1原材料 2半成品 3成品) + * 物料大类(字典改为数据库表) */ - @ExcelProperty(value = "物料大类(1原材料 2半成品 3成品)", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "mes_material_categories") - private String materialCategories; + private String materialCategoryId; /** * 物料小类 @@ -381,4 +381,10 @@ public class BaseMaterialInfoVo implements Serializable { @ExcelProperty(value = "物料类型名称") private String matrialTypeName;//映射字段 + /** + * 物料大类名称 + */ + @ExcelProperty(value = "物料大类名称") + private String materialCategoryName;//映射字段 + } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java index 6cb9bf6c..4974f798 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java @@ -9,10 +9,7 @@ import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.mes.domain.BaseMaterialInfo; -import org.dromara.mes.domain.BaseMaterialType; -import org.dromara.mes.domain.ProdBaseFactoryInfo; -import org.dromara.mes.domain.ProdMaterialBom; +import org.dromara.mes.domain.*; import org.dromara.mes.domain.bo.BaseMaterialInfoBo; import org.dromara.mes.domain.vo.BaseMaterialInfoVo; import org.dromara.mes.mapper.BaseMaterialInfoMapper; @@ -94,6 +91,10 @@ public class BaseMaterialInfoServiceImpl implements IBaseMaterialInfoService { .select(BaseMeasurementUnitInfo::getUnitName) .leftJoin(BaseMeasurementUnitInfo.class, BaseMeasurementUnitInfo::getUnitId, BaseMaterialInfo::getMaterialUnitId)*/ + //关联物料大类信息(物料大类从字典改为了数据库表) + .select(BaseMaterialCategory::getMaterialCategoryName) + .leftJoin(BaseMaterialCategory.class, BaseMaterialCategory::getMaterialCategoryId, BaseMaterialInfo::getMaterialCategoryId) + .eq(bo.getMaterialId() != null, BaseMaterialInfo::getMaterialId, bo.getMaterialId()) .eq(StringUtils.isNotBlank(bo.getErpId()), BaseMaterialInfo::getErpId, bo.getErpId()) @@ -101,7 +102,7 @@ public class BaseMaterialInfoServiceImpl implements IBaseMaterialInfoService { .eq(StringUtils.isNotBlank(bo.getOldMaterialCode()), BaseMaterialInfo::getOldMaterialCode, bo.getOldMaterialCode()) .like(StringUtils.isNotBlank(bo.getMaterialName()), BaseMaterialInfo::getMaterialName, bo.getMaterialName()) .eq(bo.getMaterialTypeId() != null, BaseMaterialInfo::getMaterialTypeId, bo.getMaterialTypeId()) - .eq(StringUtils.isNotBlank(bo.getMaterialCategories()), BaseMaterialInfo::getMaterialCategories, bo.getMaterialCategories()) + .eq(StringUtils.isNotBlank(bo.getMaterialCategoryId()), BaseMaterialInfo::getMaterialCategoryId, bo.getMaterialCategoryId()) .eq(StringUtils.isNotBlank(bo.getMaterialSubclass()), BaseMaterialInfo::getMaterialSubclass, bo.getMaterialSubclass()) .eq(StringUtils.isNotBlank(bo.getBatchFlag()), BaseMaterialInfo::getBatchFlag, bo.getBatchFlag()) .eq(bo.getBatchAmount() != null, BaseMaterialInfo::getBatchAmount, bo.getBatchAmount()) From 10113b4a47d9c6dd785d11524b51499b4d948dcf Mon Sep 17 00:00:00 2001 From: zch Date: Wed, 12 Mar 2025 15:24:27 +0800 Subject: [PATCH 11/18] =?UTF-8?q?feat(BaseMaterialInfoServiceImpl):(MeterS?= =?UTF-8?q?phere10018)=E3=80=90=E7=89=A9=E6=96=99=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E3=80=91=E7=89=A9=E6=96=99=E5=90=8D=E7=A7=B0=EF=BC=8C=E5=94=AF?= =?UTF-8?q?=E4=B8=80=EF=BC=8C=E4=B8=8D=E5=85=81=E8=AE=B8=E9=87=8D=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加了对物料名称的重复性校验 - 如果存在相同名称的物料且 ID 不匹配,则抛出"名称已存在"的异常 --- .../service/impl/BaseMaterialInfoServiceImpl.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java index 4974f798..db8da508 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialInfoServiceImpl.java @@ -211,7 +211,20 @@ public class BaseMaterialInfoServiceImpl implements IBaseMaterialInfoService { } } - + //名称校验 + if (StringUtils.isNotBlank(entity.getMaterialName())) { + BaseMaterialInfoBo query = new BaseMaterialInfoBo(); + query.setMaterialName(entity.getMaterialName()); + MPJLambdaWrapper lqw = JoinWrappers.lambda(BaseMaterialInfo.class) + .selectAll(BaseMaterialInfo.class) + //buildQueryWrapper中getMaterialName是like,相似搜索 + .eq(StringUtils.isNotBlank(query.getMaterialName()), BaseMaterialInfo::getMaterialName, query.getMaterialName()); + BaseMaterialInfo baseMaterialInfo = baseMapper.selectOne(lqw); + if ( !ObjectUtils.isEmpty(baseMaterialInfo) + && !baseMaterialInfo.getMaterialId().equals(entity.getMaterialId())) { + throw new ServiceException("名称已存在"); + } + } } From c50bf7206013d6bd323c166d3ccad9082a330a25 Mon Sep 17 00:00:00 2001 From: yinq Date: Wed, 12 Mar 2025 15:52:21 +0800 Subject: [PATCH 12/18] =?UTF-8?q?update=20=E6=B7=BB=E5=8A=A0=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E6=A8=A1=E5=9E=8B=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DmsDeviceModeFunctionController.java | 116 ++++++++++++ .../dms/domain/DmsDeviceModeFunction.java | 128 +++++++++++++ .../domain/bo/DmsDeviceModeFunctionBo.java | 131 ++++++++++++++ .../domain/vo/DmsDeviceModeFunctionVo.java | 168 ++++++++++++++++++ .../mapper/DmsDeviceModeFunctionMapper.java | 15 ++ .../IDmsDeviceModeFunctionService.java | 69 +++++++ .../DmsDeviceModeFunctionServiceImpl.java | 151 ++++++++++++++++ .../dms/DmsDeviceModeFunctionMapper.xml | 7 + 8 files changed, 785 insertions(+) create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeFunctionController.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeFunction.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeFunctionBo.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeFunctionVo.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeFunctionMapper.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeFunctionService.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeFunctionServiceImpl.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeFunctionMapper.xml diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeFunctionController.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeFunctionController.java new file mode 100644 index 00000000..6e75766d --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeFunctionController.java @@ -0,0 +1,116 @@ +package org.dromara.dms.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.dms.domain.vo.DmsDeviceModeFunctionVo; +import org.dromara.dms.domain.bo.DmsDeviceModeFunctionBo; +import org.dromara.dms.service.IDmsDeviceModeFunctionService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 设备模型功能 + * 前端访问路由地址为:/dms/deviceModeFunction + * + * @author Yinq + * @date 2025-03-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/deviceModeFunction") +public class DmsDeviceModeFunctionController extends BaseController { + + private final IDmsDeviceModeFunctionService dmsDeviceModeFunctionService; + + /** + * 查询设备模型功能列表 + */ + @SaCheckPermission("dms:deviceModeFunction:list") + @GetMapping("/list") + public TableDataInfo list(DmsDeviceModeFunctionBo bo, PageQuery pageQuery) { + return dmsDeviceModeFunctionService.queryPageList(bo, pageQuery); + } + + /** + * 导出设备模型功能列表 + */ + @SaCheckPermission("dms:deviceModeFunction:export") + @Log(title = "设备模型功能", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(DmsDeviceModeFunctionBo bo, HttpServletResponse response) { + List list = dmsDeviceModeFunctionService.queryList(bo); + ExcelUtil.exportExcel(list, "设备模型功能", DmsDeviceModeFunctionVo.class, response); + } + + /** + * 获取设备模型功能详细信息 + * + * @param modeFunctionId 主键 + */ + @SaCheckPermission("dms:deviceModeFunction:query") + @GetMapping("/{modeFunctionId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long modeFunctionId) { + return R.ok(dmsDeviceModeFunctionService.queryById(modeFunctionId)); + } + + /** + * 新增设备模型功能 + */ + @SaCheckPermission("dms:deviceModeFunction:add") + @Log(title = "设备模型功能", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody DmsDeviceModeFunctionBo bo) { + return toAjax(dmsDeviceModeFunctionService.insertByBo(bo)); + } + + /** + * 修改设备模型功能 + */ + @SaCheckPermission("dms:deviceModeFunction:edit") + @Log(title = "设备模型功能", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody DmsDeviceModeFunctionBo bo) { + return toAjax(dmsDeviceModeFunctionService.updateByBo(bo)); + } + + /** + * 删除设备模型功能 + * + * @param modeFunctionIds 主键串 + */ + @SaCheckPermission("dms:deviceModeFunction:remove") + @Log(title = "设备模型功能", businessType = BusinessType.DELETE) + @DeleteMapping("/{modeFunctionIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] modeFunctionIds) { + return toAjax(dmsDeviceModeFunctionService.deleteWithValidByIds(List.of(modeFunctionIds), true)); + } + + + /** + * 下拉框查询设备模型功能列表 + */ + @GetMapping("/getDmsDeviceModeFunctionList") + public R> getDmsDeviceModeFunctionList(DmsDeviceModeFunctionBo bo) { + List list = dmsDeviceModeFunctionService.queryList(bo); + return R.ok(list); + } +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeFunction.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeFunction.java new file mode 100644 index 00000000..c3eb829d --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeFunction.java @@ -0,0 +1,128 @@ +package org.dromara.dms.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serial; + +/** + * 设备模型功能对象 dms_device_mode_function + * + * @author Yinq + * @date 2025-03-12 + */ +@Data +@TableName("dms_device_mode_function") +public class DmsDeviceModeFunction { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 设备模型功能ID + */ + @TableId(value = "mode_function_id", type = IdType.AUTO) + private Long modeFunctionId; + + /** + * 设备模型ID,关联表hw_device_mode的device_mode_id + */ + private Long deviceModeId; + + /** + * 功能模式(1、属性,2、服务,3、事件) + */ + private String functionMode; + + /** + * 坐标标识(1、经度,2、纬度) + */ + private String coordinate; + + /** + * 功能名称 + */ + private String functionName; + + /** + * 标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符) + */ + private String functionIdentifier; + + /** + * 功能类型(1、直采变量 2、手录变量 3、运算性变量) + */ + private String functionType; + + /** + * 数据类型(2、int,4、float,5、double,6、binary(image/base64),9、bool,10、string) + */ + private Long dataType; + + /** + * 数据定义 + */ + private String dataDefinition; + + /** + * 运算性变量公式(标识符1*标识符2*100) + */ + private String functionFormula; + + /** + * 单位 + */ + private String propertyUnit; + + /** + * 显示标识(0、不显示,1、显示,2、可累积显示) + */ + private String displayFlag; + + /** + * 读写标识(1、读写,2、只读) + */ + private String rwFlag; + + /** + * 调用方式(1、异步,2、同步),当功能模式为服务时必填 + */ + private String invokeMethod; + + /** + * 事件类型(1、信息,2、告警,3、故障),当功能类型为事件时必填 + */ + private String eventType; + + /** + * 描述 + */ + private String remark; + + /** + * 获取公式 + */ + private String acquisitionFormula; + + /** + * 预留字段,顺序 + */ + private Long orderFlag; + + /** + * 预留字段,寄存器 + */ + private String deviceRegister; + + /** + * 预留字段,步长 + */ + private Long propertyStep; + + /** + * 预留字段 + */ + private String propertyField; + +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeFunctionBo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeFunctionBo.java new file mode 100644 index 00000000..a8e68ff5 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeFunctionBo.java @@ -0,0 +1,131 @@ +package org.dromara.dms.domain.bo; + +import org.dromara.dms.domain.DmsDeviceModeFunction; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 设备模型功能业务对象 dms_device_mode_function + * + * @author Yinq + * @date 2025-03-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = DmsDeviceModeFunction.class, reverseConvertGenerate = false) +public class DmsDeviceModeFunctionBo extends BaseEntity { + + /** + * 设备模型功能ID + */ + private Long modeFunctionId; + + /** + * 设备模型ID,关联表hw_device_mode的device_mode_id + */ + private Long deviceModeId; + + /** + * 功能模式(1、属性,2、服务,3、事件) + */ + @NotBlank(message = "功能模式(1、属性,2、服务,3、事件)不能为空", groups = {AddGroup.class, EditGroup.class}) + private String functionMode; + + /** + * 坐标标识(1、经度,2、纬度) + */ + private String coordinate; + + /** + * 功能名称 + */ + @NotBlank(message = "功能名称不能为空", groups = {AddGroup.class, EditGroup.class}) + private String functionName; + + /** + * 标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符) + */ + private String functionIdentifier; + + /** + * 功能类型(1、直采变量 2、手录变量 3、运算性变量) + */ + private String functionType; + + /** + * 数据类型(2、int,4、float,5、double,6、binary(image/base64),9、bool,10、string) + */ + private Long dataType; + + /** + * 数据定义 + */ + private String dataDefinition; + + /** + * 运算性变量公式(标识符1*标识符2*100) + */ + private String functionFormula; + + /** + * 单位 + */ + private String propertyUnit; + + /** + * 显示标识(0、不显示,1、显示,2、可累积显示) + */ + private String displayFlag; + + /** + * 读写标识(1、读写,2、只读) + */ + private String rwFlag; + + /** + * 调用方式(1、异步,2、同步),当功能模式为服务时必填 + */ + private String invokeMethod; + + /** + * 事件类型(1、信息,2、告警,3、故障),当功能类型为事件时必填 + */ + private String eventType; + + /** + * 描述 + */ + private String remark; + + /** + * 获取公式 + */ + private String acquisitionFormula; + + /** + * 预留字段,顺序 + */ + private Long orderFlag; + + /** + * 预留字段,寄存器 + */ + private String deviceRegister; + + /** + * 预留字段,步长 + */ + private Long propertyStep; + + /** + * 预留字段 + */ + private String propertyField; + + +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeFunctionVo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeFunctionVo.java new file mode 100644 index 00000000..d4575f39 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeFunctionVo.java @@ -0,0 +1,168 @@ +package org.dromara.dms.domain.vo; + +import org.dromara.dms.domain.DmsDeviceModeFunction; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 设备模型功能视图对象 dms_device_mode_function + * + * @author Yinq + * @date 2025-03-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = DmsDeviceModeFunction.class) +public class DmsDeviceModeFunctionVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 设备模型功能ID + */ + @ExcelProperty(value = "设备模型功能ID") + private Long modeFunctionId; + + /** + * 设备模型ID,关联表hw_device_mode的device_mode_id + */ + @ExcelProperty(value = "设备模型ID,关联表hw_device_mode的device_mode_id") + private Long deviceModeId; + + /** + * 功能模式(1、属性,2、服务,3、事件) + */ + @ExcelProperty(value = "功能模式", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dms_function_mode") + private String functionMode; + + /** + * 坐标标识(1、经度,2、纬度) + */ + @ExcelProperty(value = "坐标标识", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dms_coordinate") + private String coordinate; + + /** + * 功能名称 + */ + @ExcelProperty(value = "功能名称") + private String functionName; + + /** + * 标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符) + */ + @ExcelProperty(value = "标识符", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "支=持大小写字母、数字和下划线,对外暂时不超过50个字符") + private String functionIdentifier; + + /** + * 功能类型(1、直采变量 2、手录变量 3、运算性变量) + */ + @ExcelProperty(value = "功能类型(1、直采变量 2、手录变量 3、运算性变量)", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dms_function_type") + private String functionType; + + /** + * 数据类型(2、int,4、float,5、double,6、binary(image/base64),9、bool,10、string) + */ + @ExcelProperty(value = "数据类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dms_data_type") + private Long dataType; + + /** + * 数据定义 + */ + @ExcelProperty(value = "数据定义") + private String dataDefinition; + + /** + * 运算性变量公式(标识符1*标识符2*100) + */ + @ExcelProperty(value = "运算性变量公式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "标=识符1*标识符2*100") + private String functionFormula; + + /** + * 单位 + */ + @ExcelProperty(value = "单位") + private String propertyUnit; + + /** + * 显示标识(0、不显示,1、显示,2、可累积显示) + */ + @ExcelProperty(value = "显示标识", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dms_display_flag") + private String displayFlag; + + /** + * 读写标识(1、读写,2、只读) + */ + @ExcelProperty(value = "读写标识", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dms_rw_flag") + private String rwFlag; + + /** + * 调用方式(1、异步,2、同步),当功能模式为服务时必填 + */ + @ExcelProperty(value = "调用方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dms_invoke_method") + private String invokeMethod; + + /** + * 事件类型(1、信息,2、告警,3、故障),当功能类型为事件时必填 + */ + @ExcelProperty(value = "事件类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dms_event_type") + private String eventType; + + /** + * 描述 + */ + @ExcelProperty(value = "描述") + private String remark; + + /** + * 获取公式 + */ + @ExcelProperty(value = "获取公式") + private String acquisitionFormula; + + /** + * 预留字段,顺序 + */ + @ExcelProperty(value = "预留字段,顺序") + private Long orderFlag; + + /** + * 预留字段,寄存器 + */ + @ExcelProperty(value = "预留字段,寄存器") + private String deviceRegister; + + /** + * 预留字段,步长 + */ + @ExcelProperty(value = "预留字段,步长") + private Long propertyStep; + + /** + * 预留字段 + */ + @ExcelProperty(value = "预留字段") + private String propertyField; + + +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeFunctionMapper.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeFunctionMapper.java new file mode 100644 index 00000000..6c7239d9 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeFunctionMapper.java @@ -0,0 +1,15 @@ +package org.dromara.dms.mapper; + +import org.dromara.dms.domain.DmsDeviceModeFunction; +import org.dromara.dms.domain.vo.DmsDeviceModeFunctionVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 设备模型功能Mapper接口 + * + * @author Yinq + * @date 2025-03-12 + */ +public interface DmsDeviceModeFunctionMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeFunctionService.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeFunctionService.java new file mode 100644 index 00000000..2919118c --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeFunctionService.java @@ -0,0 +1,69 @@ +package org.dromara.dms.service; + +import org.dromara.dms.domain.DmsDeviceModeFunction; +import org.dromara.dms.domain.vo.DmsDeviceModeFunctionVo; +import org.dromara.dms.domain.bo.DmsDeviceModeFunctionBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 设备模型功能Service接口 + * + * @author Yinq + * @date 2025-03-12 + */ +public interface IDmsDeviceModeFunctionService { + + /** + * 查询设备模型功能 + * + * @param modeFunctionId 主键 + * @return 设备模型功能 + */ + DmsDeviceModeFunctionVo queryById(Long modeFunctionId); + + /** + * 分页查询设备模型功能列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设备模型功能分页列表 + */ + TableDataInfo queryPageList(DmsDeviceModeFunctionBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的设备模型功能列表 + * + * @param bo 查询条件 + * @return 设备模型功能列表 + */ + List queryList(DmsDeviceModeFunctionBo bo); + + /** + * 新增设备模型功能 + * + * @param bo 设备模型功能 + * @return 是否新增成功 + */ + Boolean insertByBo(DmsDeviceModeFunctionBo bo); + + /** + * 修改设备模型功能 + * + * @param bo 设备模型功能 + * @return 是否修改成功 + */ + Boolean updateByBo(DmsDeviceModeFunctionBo bo); + + /** + * 校验并批量删除设备模型功能信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeFunctionServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeFunctionServiceImpl.java new file mode 100644 index 00000000..ddc2904b --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeFunctionServiceImpl.java @@ -0,0 +1,151 @@ +package org.dromara.dms.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.dms.domain.bo.DmsDeviceModeFunctionBo; +import org.dromara.dms.domain.vo.DmsDeviceModeFunctionVo; +import org.dromara.dms.domain.DmsDeviceModeFunction; +import org.dromara.dms.mapper.DmsDeviceModeFunctionMapper; +import org.dromara.dms.service.IDmsDeviceModeFunctionService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 设备模型功能Service业务层处理 + * + * @author Yinq + * @date 2025-03-12 + */ +@RequiredArgsConstructor +@Service +public class DmsDeviceModeFunctionServiceImpl implements IDmsDeviceModeFunctionService { + + private final DmsDeviceModeFunctionMapper baseMapper; + + /** + * 查询设备模型功能 + * + * @param modeFunctionId 主键 + * @return 设备模型功能 + */ + @Override + public DmsDeviceModeFunctionVo queryById(Long modeFunctionId) { + return baseMapper.selectVoById(modeFunctionId); + } + + /** + * 分页查询设备模型功能列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设备模型功能分页列表 + */ + @Override + public TableDataInfo queryPageList(DmsDeviceModeFunctionBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的设备模型功能列表 + * + * @param bo 查询条件 + * @return 设备模型功能列表 + */ + @Override + public List queryList(DmsDeviceModeFunctionBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(DmsDeviceModeFunctionBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(DmsDeviceModeFunction.class) + .selectAll(DmsDeviceModeFunction.class) + .eq(bo.getModeFunctionId() != null, DmsDeviceModeFunction::getModeFunctionId, bo.getModeFunctionId()) + .eq(bo.getDeviceModeId() != null, DmsDeviceModeFunction::getDeviceModeId, bo.getDeviceModeId()) + .eq(StringUtils.isNotBlank(bo.getFunctionMode()), DmsDeviceModeFunction::getFunctionMode, bo.getFunctionMode()) + .eq(StringUtils.isNotBlank(bo.getCoordinate()), DmsDeviceModeFunction::getCoordinate, bo.getCoordinate()) + .like(StringUtils.isNotBlank(bo.getFunctionName()), DmsDeviceModeFunction::getFunctionName, bo.getFunctionName()) + .eq(StringUtils.isNotBlank(bo.getFunctionIdentifier()), DmsDeviceModeFunction::getFunctionIdentifier, bo.getFunctionIdentifier()) + .eq(StringUtils.isNotBlank(bo.getFunctionType()), DmsDeviceModeFunction::getFunctionType, bo.getFunctionType()) + .eq(bo.getDataType() != null, DmsDeviceModeFunction::getDataType, bo.getDataType()) + .eq(StringUtils.isNotBlank(bo.getDataDefinition()), DmsDeviceModeFunction::getDataDefinition, bo.getDataDefinition()) + .eq(StringUtils.isNotBlank(bo.getFunctionFormula()), DmsDeviceModeFunction::getFunctionFormula, bo.getFunctionFormula()) + .eq(StringUtils.isNotBlank(bo.getPropertyUnit()), DmsDeviceModeFunction::getPropertyUnit, bo.getPropertyUnit()) + .eq(StringUtils.isNotBlank(bo.getDisplayFlag()), DmsDeviceModeFunction::getDisplayFlag, bo.getDisplayFlag()) + .eq(StringUtils.isNotBlank(bo.getRwFlag()), DmsDeviceModeFunction::getRwFlag, bo.getRwFlag()) + .eq(StringUtils.isNotBlank(bo.getInvokeMethod()), DmsDeviceModeFunction::getInvokeMethod, bo.getInvokeMethod()) + .eq(StringUtils.isNotBlank(bo.getEventType()), DmsDeviceModeFunction::getEventType, bo.getEventType()) + .eq(StringUtils.isNotBlank(bo.getAcquisitionFormula()), DmsDeviceModeFunction::getAcquisitionFormula, bo.getAcquisitionFormula()) + .eq(bo.getOrderFlag() != null, DmsDeviceModeFunction::getOrderFlag, bo.getOrderFlag()) + .eq(StringUtils.isNotBlank(bo.getDeviceRegister()), DmsDeviceModeFunction::getDeviceRegister, bo.getDeviceRegister()) + .eq(bo.getPropertyStep() != null, DmsDeviceModeFunction::getPropertyStep, bo.getPropertyStep()) + .eq(StringUtils.isNotBlank(bo.getPropertyField()), DmsDeviceModeFunction::getPropertyField, bo.getPropertyField()) + .orderByAsc(DmsDeviceModeFunction::getModeFunctionId); + return lqw; + } + + /** + * 新增设备模型功能 + * + * @param bo 设备模型功能 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(DmsDeviceModeFunctionBo bo) { + DmsDeviceModeFunction add = MapstructUtils.convert(bo, DmsDeviceModeFunction.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setModeFunctionId(add.getModeFunctionId()); + } + return flag; + } + + /** + * 修改设备模型功能 + * + * @param bo 设备模型功能 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(DmsDeviceModeFunctionBo bo) { + DmsDeviceModeFunction update = MapstructUtils.convert(bo, DmsDeviceModeFunction.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(DmsDeviceModeFunction entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除设备模型功能信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeFunctionMapper.xml b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeFunctionMapper.xml new file mode 100644 index 00000000..376e60f1 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeFunctionMapper.xml @@ -0,0 +1,7 @@ + + + + + From 6944bbfe3e1dbd41f8a79f9993543b8d79ae41d4 Mon Sep 17 00:00:00 2001 From: xs Date: Wed, 12 Mar 2025 16:19:11 +0800 Subject: [PATCH 13/18] =?UTF-8?q?1.2.5:=20mqttbroker=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=EF=BC=8C=E8=BD=AC=E5=8F=91=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=B0kafka=E2=80=94=E2=80=94dp=E5=A4=84=E7=90=86=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E2=80=94=E2=80=94=E4=BF=9D=E5=AD=98=E5=88=B0influxdb?= =?UTF-8?q?=EF=BC=8C=E6=95=B4=E4=BD=93=E6=A1=86=E6=9E=B6=E6=90=AD=E5=BB=BA?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/hwmom-dp/pom.xml | 93 +++ .../dromara/dp/HwDataProcessApplication.java | 20 + .../kafka/service/KafkaConsumerService.java | 13 + .../service/DataProcessServiceImpl.java | 685 ++++++++++++++++++ .../service/DeviceStatusServiceImpl.java | 178 +++++ .../src/main/resources/application.yml | 62 ++ ruoyi-modules/hwmom-mqtt/pom.xml | 99 +++ .../com/hw/mqtt/HwMqttBrokerApplication.java | 20 + .../com/hw/mqtt/auth/MqttAuthHandler.java | 147 ++++ .../com/hw/mqtt/auth/MqttHttpAuthFilter.java | 37 + .../hw/mqtt/auth/MqttSubscribeValidator.java | 23 + .../com/hw/mqtt/auth/MqttUniqueIdService.java | 22 + .../hw/mqtt/config/RedisListenerConfig.java | 35 + .../com/hw/mqtt/domain/DeviceInfoDto.java | 29 + .../java/com/hw/mqtt/enums/ConnectStatus.java | 32 + .../java/com/hw/mqtt/enums/DeviceType.java | 37 + .../java/com/hw/mqtt/enums/RedisKeys.java | 63 ++ .../listener/MqttConnectStatusListener.java | 127 ++++ .../listener/MqttServerMessageListener.java | 49 ++ .../mqtt/listener/RedisMessageListener.java | 58 ++ .../hw/mqtt/service/KafkaProducerService.java | 19 + .../src/main/java/org/dromara/Main.java | 17 + .../src/main/resources/application.yml | 60 ++ .../hwmom-mqtt/src/main/resources/banner.txt | 10 + ruoyi-modules/hwmom-tsdb/pom.xml | 100 +++ .../org/dromara/tsdb/HwTsDbApplication.java | 20 + .../dromara/tsdb/config/InfluxDbConfig.java | 30 + .../tsdb/controller/InfluxDbController.java | 35 + .../tsdb/service/IInfluxDbService.java | 25 + .../service/impl/InfluxDbServiceImpl.java | 50 ++ .../src/main/resources/application.yml | 37 + 31 files changed, 2232 insertions(+) create mode 100644 ruoyi-modules/hwmom-dp/pom.xml create mode 100644 ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/HwDataProcessApplication.java create mode 100644 ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/kafka/service/KafkaConsumerService.java create mode 100644 ruoyi-modules/hwmom-dp/src/main/java/org/dromara/service/DataProcessServiceImpl.java create mode 100644 ruoyi-modules/hwmom-dp/src/main/java/org/dromara/service/DeviceStatusServiceImpl.java create mode 100644 ruoyi-modules/hwmom-dp/src/main/resources/application.yml create mode 100644 ruoyi-modules/hwmom-mqtt/pom.xml create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/HwMqttBrokerApplication.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttAuthHandler.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttHttpAuthFilter.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttSubscribeValidator.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttUniqueIdService.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/config/RedisListenerConfig.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/domain/DeviceInfoDto.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/enums/ConnectStatus.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/enums/DeviceType.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/enums/RedisKeys.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/listener/MqttConnectStatusListener.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/listener/MqttServerMessageListener.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/listener/RedisMessageListener.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/service/KafkaProducerService.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/java/org/dromara/Main.java create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/resources/application.yml create mode 100644 ruoyi-modules/hwmom-mqtt/src/main/resources/banner.txt create mode 100644 ruoyi-modules/hwmom-tsdb/pom.xml create mode 100644 ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/HwTsDbApplication.java create mode 100644 ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/config/InfluxDbConfig.java create mode 100644 ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/controller/InfluxDbController.java create mode 100644 ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/IInfluxDbService.java create mode 100644 ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/impl/InfluxDbServiceImpl.java create mode 100644 ruoyi-modules/hwmom-tsdb/src/main/resources/application.yml diff --git a/ruoyi-modules/hwmom-dp/pom.xml b/ruoyi-modules/hwmom-dp/pom.xml new file mode 100644 index 00000000..1db1493c --- /dev/null +++ b/ruoyi-modules/hwmom-dp/pom.xml @@ -0,0 +1,93 @@ + + + 4.0.0 + + org.dromara + ruoyi-modules + ${revision} + + + hwmom-dp + + + hwmom-dp data process数据处理模块 + + + + + + org.springframework.kafka + spring-kafka + + + + org.dromara + ruoyi-common-nacos + + + + + org.dromara + ruoyi-common-security + + + + + org.dromara + ruoyi-api-resource + + + com.alibaba.fastjson2 + fastjson2 + 2.0.51 + compile + + + + + + + + + + + + + + + + + + + + + ${project.artifactId} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 17 + 17 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + + diff --git a/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/HwDataProcessApplication.java b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/HwDataProcessApplication.java new file mode 100644 index 00000000..033dab5e --- /dev/null +++ b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/HwDataProcessApplication.java @@ -0,0 +1,20 @@ +package org.dromara.dp; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) +public class HwDataProcessApplication { + + public static void main(String[] args) { + SpringApplication application = new SpringApplication(HwDataProcessApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ data process数据处理模块启动成功 ლ(´ڡ`ლ)゙ "); + + + } + +} diff --git a/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/kafka/service/KafkaConsumerService.java b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/kafka/service/KafkaConsumerService.java new file mode 100644 index 00000000..782fc349 --- /dev/null +++ b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/kafka/service/KafkaConsumerService.java @@ -0,0 +1,13 @@ +package org.dromara.dp.kafka.service; + +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Service; + +@Service +public class KafkaConsumerService { + + @KafkaListener(topics = "test", groupId = "my-consumer-group") + public void listen(String message) { + System.out.println("Received message: " + message); + } +} diff --git a/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/service/DataProcessServiceImpl.java b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/service/DataProcessServiceImpl.java new file mode 100644 index 00000000..6e0219f2 --- /dev/null +++ b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/service/DataProcessServiceImpl.java @@ -0,0 +1,685 @@ +//package org.dromara.service; +// +//import com.alibaba.fastjson.JSON; +//import com.alibaba.fastjson.JSONArray; +//import com.alibaba.fastjson.JSONObject; +//import com.aliyun.auth.credentials.Credential; +//import com.aliyun.auth.credentials.provider.StaticCredentialProvider; +//import com.aliyun.sdk.service.dysmsapi20170525.AsyncClient; +//import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsRequest; +//import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponse; +//import com.ruoyi.common.core.constant.HwDictConstants; +//import com.ruoyi.common.core.constant.SecurityConstants; +//import com.ruoyi.common.core.constant.TdEngineConstants; +//import com.ruoyi.common.core.domain.R; +//import com.ruoyi.common.core.enums.ResultEnums; +//import com.ruoyi.common.core.utils.RegexUtils; +//import com.ruoyi.common.core.utils.StringUtils; +//import com.ruoyi.dataprocess.amap.LocationVo; +//import com.ruoyi.dataprocess.amap.PositionUtils; +//import com.ruoyi.dataprocess.amap.PositionVo; +//import com.ruoyi.dataprocess.common.ImageUtils; +//import com.ruoyi.dataprocess.domain.*; +//import com.ruoyi.dataprocess.mapper.*; +//import com.ruoyi.dataprocess.service.CommanHandleService; +//import com.ruoyi.dataprocess.service.IDataProcessService; +//import com.ruoyi.tdengine.api.RemoteTdEngineService; +//import com.ruoyi.tdengine.api.domain.TdField; +//import com.ruoyi.tdengine.api.domain.TdHistorySelectDto; +//import com.ruoyi.tdengine.api.domain.TdReturnDataVo; +//import com.ruoyi.tdengine.api.domain.TdTableVo; +//import darabonba.core.client.ClientOverrideConfiguration; +//import org.apache.commons.codec.binary.Base64; +//import org.apache.poi.openxml4j.exceptions.InvalidOperationException; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Service; +// +//import javax.annotation.Resource; +//import javax.script.ScriptEngine; +//import javax.script.ScriptEngineManager; +//import java.io.IOException; +//import java.math.BigDecimal; +//import java.text.SimpleDateFormat; +//import java.util.*; +//import java.util.concurrent.CompletableFuture; +//import java.util.concurrent.ExecutionException; +//import java.util.concurrent.atomic.AtomicBoolean; +//import java.util.stream.Collectors; +// +///** +// * @Description: 数据处理业务类 +// * @ClassName: DataProcessServiceImpl +// * @Author : xins +// * @Date :2023-09-04 8:58 +// * @Version :1.0 +// */ +//@Service +//public class DataProcessServiceImpl extends CommanHandleService implements IDataProcessService { +// +// private static final Logger logger = LoggerFactory.getLogger(DataProcessServiceImpl.class); +// +// private final String AccessKeyId = "LTAI5tPoTQHh8HHst2toxtGa"; +// private final String AccessKeySecret = "K8OIuSNgsSnpGMJ2PdqIJFYyUqL38m"; +// +// @Resource +// private RemoteTdEngineService remoteTdEngineService; +// +// @Autowired +// private HwDeviceMapper hwDeviceMapper; +// +// @Autowired +// private HwElectronicFenceMapper hwElectronicFenceMapper; +// +// @Autowired +// private HwFenceAreaMapper hwFenceAreaMapper; +// +// @Autowired +// private HwAlarmInfoMapper hwAlarmInfoMapper; +// +// @Autowired +// private HwAlarmRuleMapper hwAlarmRuleMapper; +// +// /** +// * @param: jsonData +// * @param: imagePath ruoyifile的上传地址 +// * @param: imagePatterns +// * @param: imageDomain ruoyifile的domain +// * @param: imagePrefix ruoyifile的prefix +// * @param: topic 发布主题,用来获取网关设备devicecode +// * @description +// * @author xins +// * @date 2023-08-31 16:16 +// */ +// @Override +// public int processBusinessData(String jsonData, String imagePath, +// String imagePatterns, String imageDomain, String imagePrefix, String topic) { +// JSONObject json = JSON.parseObject(jsonData); +// Long ts = json.getLong(TdEngineConstants.PAYLOAD_TS); +// String tsStr = String.valueOf(ts); +// if (tsStr.length() == 10) { +// ts = ts * 1000; +// } +// JSONArray paramArr = json.getJSONArray(TdEngineConstants.PAYLOAD_PARAM); +//// System.out.println(this.hwDeviceMapper); +//// System.out.println(this.remoteTdEngineService); +// String deviceCode = ""; +// for (int i = 0; i < paramArr.size(); i++) { +// try { +// JSONObject paramJson = paramArr.getJSONObject(i); +// String dataType = paramJson.getString(TdEngineConstants.PAYLOAD_DATATYPE); +// JSONObject dataValueJson = paramJson.getJSONObject(TdEngineConstants.PAYLOAD_DATAVALUE); +// deviceCode = dataValueJson.getString(TdEngineConstants.PAYLOAD_DEVICE_CODE).toLowerCase(); +// //deviceCode = getUidByParam(json); +// HwDevice hwDevice = hwDeviceMapper.selectHwDeviceByDeviceCode(deviceCode); +// if (hwDevice == null) { +// logger.error("此设备【deviceCode:{}】不存在", deviceCode); +// continue; +// } +// if (hwDevice.getDeviceStatus().equals(HwDictConstants.DEVICE_STATUS_DELETE)) { +// logger.error("此设备【deviceCode:{}】已删除", deviceCode); +// continue; +// } +// +// Long sceneId = hwDevice.getSceneId(); +// Long deviceId = hwDevice.getDeviceId(); +// Long monitorUnitId = hwDevice.getMonitorUnitId(); +// Long tenantId = hwDevice.getTenantId(); +// String databaseName = TdEngineConstants.getDatabaseName(); +// String tableName = TdEngineConstants.DEFAULT_TABLE_NAME_PREFIX + deviceId; +// +// dataValueJson.remove(TdEngineConstants.PAYLOAD_DEVICE_CODE); +// TdTableVo tdTableVo = new TdTableVo(); +// List schemaFields = new ArrayList<>(); +// List alarmSchemaFields = new ArrayList<>(); +// +// //添加timestamp字段,默认字段名称是ts,协议上传的key是timestamp +// TdField firstTdField = new TdField(); +// firstTdField.setFieldName(TdEngineConstants.DEFAULT_FIRST_FIELD_NAME); +// long currentTimeMillis = System.currentTimeMillis(); +// firstTdField.setFieldValue(currentTimeMillis); +//// firstTdField.setFieldValue(ts); +// schemaFields.add(firstTdField); +// +// Object longitude = null; +// Object latitude = null; +// +// for (Map.Entry entry : dataValueJson.entrySet()) { +// String originalKey = entry.getKey();//原来的key +// Object value = entry.getValue(); +// +// /** +// * 先对key进行转换,例如对于key是value的需要转换成value1; +// */ +// String key = TdEngineConstants.TDENGINE_KEY_TRANSFER_MAP.get(originalKey) == null ? originalKey +// : TdEngineConstants.TDENGINE_KEY_TRANSFER_MAP.get(originalKey); +// +// if (key.equalsIgnoreCase(TdEngineConstants.PAYLOAD_DEVICE_DATA_TYPE_TYPE)) { +// continue; +// } +// +// +// if (value instanceof String) { +// String valueStr = (String) value; +// if (StringUtils.isNotBlank(valueStr)) { +// /** +// * 先判读是否是图片,并获取图片名称, 获取到证明是图片 +// */ +// String[] imagePatternArr = imagePatterns.split(","); +// String extension = ImageUtils.getImageType(valueStr, imagePatternArr); +// if (StringUtils.isNotBlank(extension) && valueStr.length() > 300) { +// //保存图片,并返回图片详细地址进行赋值保存 +// value = getImageFileName(imagePath, imageDomain, imagePrefix, valueStr, deviceId, extension); +// if (value == null) continue; +// } else if (dataType.equalsIgnoreCase(TdEngineConstants.PAYLOAD_DEVICE_DATA_TYPE_IMAGE)) { +// if (ImageUtils.checkIsBase64(valueStr) && valueStr.length() > 300) {//判断没有加前缀的情况 +// String type = dataValueJson.getString(TdEngineConstants.PAYLOAD_DEVICE_DATA_TYPE_TYPE); +// if (type == null) { +// type = dataValueJson.getString(TdEngineConstants.PAYLOAD_DEVICE_DATA_TYPE_TYPE_FIRSET_UPPER); +// } +// extension = "jpg"; +// if (type != null) { +// extension = StringUtils.isNotBlank(ImageUtils.getImageType(type, imagePatternArr)) +// ? ImageUtils.getImageType(type, imagePatternArr) : extension; +// } +// value = getImageFileName(imagePath, imageDomain, imagePrefix, valueStr, deviceId, extension); +// if (value == null) continue; +// } +// } +// +// TdField tdField = new TdField(); +// tdField.setFieldName(key); +// tdField.setFieldValue(value); +// schemaFields.add(tdField); +// } +// } else { +// TdField tdField = new TdField(); +// tdField.setFieldName(key); +// tdField.setFieldValue(value); +// schemaFields.add(tdField); +// +// //经纬度判断 +// if (key.equalsIgnoreCase(HwDictConstants.DEFAULT_FUNCTION_LONGITUDE_IDENTIFIER)) { +// longitude = value; +// } else if (key.equalsIgnoreCase(HwDictConstants.DEFAULT_FUNCTION_LATITUDE_IDENTIFIER)) { +// latitude = value; +// } else { +// TdField alarmTdField = new TdField(); +// alarmTdField.setFieldName(originalKey); +// alarmTdField.setFieldValue(value); +// alarmSchemaFields.add(alarmTdField); +// } +// } +// } +// +// tdTableVo.setDatabaseName(databaseName); +// tdTableVo.setTableName(tableName); +// tdTableVo.setSchemaFields(schemaFields); +// +// final R insertResult = this.remoteTdEngineService.insertTable(tdTableVo , SecurityConstants.INNER); +// if (insertResult.getCode() == ResultEnums.SUCCESS.getCode()) { +// logger.info("Insert data result: {}", insertResult.getCode()); +// } else { +// logger.error("Insert data Exception: {},data:{}", insertResult.getMsg(), jsonData); +// } +// +// //校验电子围栏 +// if (longitude != null && latitude != null) { +// checkElectronicFence(deviceId, tenantId, monitorUnitId, sceneId, longitude, latitude, ts); +// } +// +// //校验设备报警信息 +// checkAlarm(deviceId, alarmSchemaFields, tenantId, sceneId, monitorUnitId, topic, deviceCode); +// +// } catch (Exception e) { +// e.printStackTrace(); +// logger.error("deviceCode:{},errorMsg:{},data:{}", deviceCode, e.getMessage(), jsonData); +// } +// } +// +// return paramArr.size(); +// } +// +// /** +// * 获取设备UID +// * @param jsonStr +// * @return +// */ +// private String getUidByParam(JSONObject jsonStr){ +// +// JSONObject jsonObject = new JSONObject(jsonStr); +// +// JSONArray paramArray = jsonObject.getJSONArray("param"); +// +// JSONObject firstParamObject = paramArray.getJSONObject(0); +// +// JSONObject datavalueObject = firstParamObject.getJSONObject("datavalue"); +// +// String uid = datavalueObject.getString("uid"); +// +// return uid; +// } +// +// +// private static String getImageFileName(String imagePath, String imageDomain, String imagePrefix, String valueStr, Long deviceId, String extension) { +// try { +// String imageFileName = ImageUtils.convertBase64ToImage(imagePath, +// valueStr, "device" + deviceId, extension); +// return imageDomain + imagePrefix + imageFileName; +// +// } catch (IOException e) { +// logger.error("转换图片错误:" + e.getMessage(), e); +// } +// return null; +// } +// +// +// /** +// * @param: deviceId +// * @param: monitorUnitId +// * @param: sceneId +// * @param: longitude +// * @param: latitude +// * @param: ts +// * @description 校验此设备电子围栏 +// * @author xins +// * @date 2023-09-04 14:04 +// */ +// private void checkElectronicFence(Long deviceId, Long tenantId, Long monitorUnitId, Long sceneId, Object longitude, Object latitude, Long ts) { +// //根据设备ID、监控单元ID和场景ID获取所有的电子围栏配置。(目前先只支持场景) +//// List hwElectronicFences = hwElectronicFenceMapper.selectElectronicFencesByDeviceId(deviceId); +//// hwElectronicFences = hwElectronicFenceMapper.selectElectronicFencesByMonitorUnitId(monitorUnitId); +// List hwElectronicFences = hwElectronicFenceMapper.selectElectronicFencesBySceneId(sceneId); +// +// if (StringUtils.isNotEmpty(hwElectronicFences)) { +// for (HwElectronicFence hwElectronicFence : hwElectronicFences) { +// HwFenceArea queryFenceArea = new HwFenceArea(); +// queryFenceArea.setElectronicFenceId(hwElectronicFence.getElectronicFenceId()); +// //获取电子围栏下配置的区域列表 +// List fenceAreas = hwFenceAreaMapper.selectHwFenceAreaList(queryFenceArea); +// String effectiveTimeFlag = hwElectronicFence.getEffectiveTimeFlag(); +// String triggerStatus = hwElectronicFence.getTriggerStatus(); +// if (fenceAreas != null && !fenceAreas.isEmpty()) { +// fenceAreas.forEach(fenceArea -> { +// boolean isAlarmed = false;//是否报警 +// if (effectiveTimeFlag.equals(HwDictConstants.EFFECTIVE_TIME_FLAG_LONG)) { +// String areaShapeFlag = fenceArea.getAreaShapeFlag(); +// String areaRange = fenceArea.getAreaRange(); +// //多边形处理 +// if (areaShapeFlag.equals(HwDictConstants.AREA_SHAPE_FLAG_POLYGN)) { +// LocationVo polygonVo = new LocationVo(); +// polygonVo.setMarkerType(LocationVo.MARKER_TYPE_POLYGON); +// List> polygonList = new ArrayList<>(); +// List postionList = new ArrayList<>(); +// String[] areaRangeArr = areaRange.split("_");//多个点,每个点的经纬度信息(经度_纬度) +// for (String areaRange1 : areaRangeArr) { +// String[] areaRange1Arr = areaRange1.split(","); +// String longitudeStr = areaRange1Arr[0]; +// String latitudeStr = areaRange1Arr[1]; +// postionList.add(new PositionVo(new BigDecimal(longitudeStr), new BigDecimal(latitudeStr))); +// polygonList.add(postionList); +// } +// +// polygonVo.setPolygonList(polygonList); +// +// /** +// * 传入的longitude和latitude是object类型,本身有可能是BigDecimal,Double,Long和Integer,先转成String再转成Double +// */ +// boolean isWithin = PositionUtils.checkAddressInLocation(polygonVo, Double.valueOf(String.valueOf(longitude)), Double.valueOf(String.valueOf(latitude))); +// if (triggerStatus.equals(HwDictConstants.ELECTRONIC_FENCE_TRIGGER_STATUS_EXIT) && !isWithin) {//如果电子围栏配置是出界,而此设备出界则报警 +// isAlarmed = true; +// } else if (triggerStatus.equals(HwDictConstants.ELECTRONIC_FENCE_TRIGGER_STATUS_ENTRY) && isWithin) {//如果电子围栏配置是入界,而此设备入界则报警 +// isAlarmed = true; +// } +// +// } else if (areaShapeFlag.equals(HwDictConstants.AREA_SHAPE_FLAG_CIRCULA)) {//圆形处理 +// String[] areaRangeArr = areaRange.split(","); +// String longitudeStr = areaRangeArr[0]; +// String latitudeStr = areaRangeArr[1]; +// String radiusStr = areaRangeArr[2]; +// LocationVo circulrVo = new LocationVo(); +// circulrVo.setRadius(Double.valueOf(radiusStr)); +// circulrVo.setLongitude(Double.valueOf(longitudeStr)); +// circulrVo.setLatitude(Double.valueOf(latitudeStr)); +// circulrVo.setMarkerType(LocationVo.MARKER_TYPE_CIRCULAR); +// boolean isWithin = PositionUtils.checkAddressInLocation(circulrVo, Double.valueOf(String.valueOf(longitude)), Double.valueOf(String.valueOf(latitude))); +// if (triggerStatus.equals(HwDictConstants.ELECTRONIC_FENCE_TRIGGER_STATUS_EXIT) && !isWithin) {//如果电子围栏配置是出界,而此设备出界则报警 +// isAlarmed = true; +// } else if (triggerStatus.equals(HwDictConstants.ELECTRONIC_FENCE_TRIGGER_STATUS_ENTRY) && isWithin) {//如果电子围栏配置是入界,而此设备入界则报警 +// isAlarmed = true; +// } +// } +// } +// +// if (isAlarmed) { +// HwAlarmInfo hwAralmInfo = new HwAlarmInfo(); +// hwAralmInfo.setAlarmInfoType(HwDictConstants.ALARM_INFO_TYPE_ELECTRONIC_FENCE); +// hwAralmInfo.setAlarmReleatedId(hwElectronicFence.getElectronicFenceId()); +// hwAralmInfo.setDeviceId(deviceId); +// hwAralmInfo.setMonitorUnitId(monitorUnitId); +// hwAralmInfo.setTenantId(tenantId); +// hwAralmInfo.setSceneId(sceneId); +// hwAralmInfo.setFunctionValue(longitude + "_" + latitude); +// hwAralmInfo.setTriggerStatus(triggerStatus); +// hwAralmInfo.setAlarmTime(new Date(ts)); +// hwAralmInfo.setCreateTime(new Date()); +// hwAralmInfo.setFenceAreaId(fenceArea.getFenceAreaId()); +// hwAlarmInfoMapper.insertHwAlarmInfo(hwAralmInfo); +// } +// }); +// } +// } +// } +// } +// +// +// /** +// * @param: deviceId +// * @param: alarmFields +// * @description 校验报警 +// * @author xins +// * @date 2023-11-07 10:15 +// */ +// private void checkAlarm(Long deviceId, List alarmFields, +// Long tenantId, Long sceneId, Long monitorUnitId, String topic, String subDeviceCode) { +// +// try { +// HwAlarmRule queryAlarmRule = new HwAlarmRule(); +// queryAlarmRule.setRuleDeviceId(deviceId); +// queryAlarmRule.setRuleType(HwDictConstants.ALARM_RULE_RULE_TYPE_DEVICE); +// queryAlarmRule.setAlarmRuleStatus(HwDictConstants.ALARM_RULE_STATUS_ENABLE); +// List alarmRules = hwAlarmRuleMapper.selectHwAlarmRulesWithLink(queryAlarmRule); +// +// ScriptEngineManager manager = new ScriptEngineManager(); +// ScriptEngine engine = manager.getEngineByName("js"); +// +// if (alarmRules != null) { +// Date currentDate = new Date(); +// for (HwAlarmRule alarmRule : alarmRules) { +// String triggerExpression = alarmRule.getTriggerExpression() +// .replaceAll("and", "&&") +// .replaceAll("or", "||"); +// AtomicBoolean isAlarmed = new AtomicBoolean(false); +// List alarmDetails = new ArrayList(); +// +// for (TdField alarmField : alarmFields) { +// String fieldName = alarmField.getFieldName(); +// Object filedValue = alarmField.getFieldValue(); +// if (triggerExpression.contains("{" + fieldName + "}")) { +// isAlarmed.set(true); +// +// /** +// * Add By 获取五分钟内的数据 WenJY 2024-07-03 14:13:21 +// */ +// if(alarmRule.getTriggerTimeFrame() != null && alarmRule.getTriggerTimeFrame() > 0){ +// double difValue = FilterDeviceValue(deviceId, fieldName, alarmRule.getTriggerTimeFrame()); +//// if(difValue > 0){ +//// filedValue = difValue; +//// } +// filedValue = difValue; +// } +// /** End **/ +// +// triggerExpression = triggerExpression.replaceAll("\\{" + fieldName + "\\}", String.valueOf(filedValue)); +// HwAlarmDetail alarmDetail = new HwAlarmDetail(); +// alarmDetail.setDeviceId(deviceId); +// alarmDetail.setFunctionIdentifier(fieldName); +// alarmDetail.setFunctionValue(String.valueOf(filedValue)); +// alarmDetail.setMonitorTime(currentDate); +// alarmDetails.add(alarmDetail); +// +// } +// } +// +// if (isAlarmed.get() && !triggerExpression.contains("{") +// && RegexUtils.findSymbolInText(triggerExpression).size() > 0 +// && RegexUtils.findNumberInText(triggerExpression).size() > 0) { +// +// Boolean triggerExpressionBool = (Boolean) engine.eval(triggerExpression); +// if (triggerExpressionBool) { +// HwAlarmInfo alarmInfo = new HwAlarmInfo(); +// alarmInfo.setAlarmInfoType(HwDictConstants.ALARM_INFO_TYPE_DEVICE); +// alarmInfo.setAlarmReleatedId(alarmRule.getAlarmRuleId()); +// alarmInfo.setDeviceId(deviceId); +// alarmInfo.setMonitorUnitId(monitorUnitId); +// alarmInfo.setTenantId(tenantId); +// alarmInfo.setSceneId(sceneId); +// alarmInfo.setAlarmLevelId(alarmRule.getAlarmLevelId()); +// alarmInfo.setAlarmTypeId(alarmRule.getAlarmTypeId()); +// alarmInfo.setHwAlarmDetailList(alarmDetails); +// alarmInfo.setHandleStatus(HwDictConstants.ALARM_HANDLE_STATUS_NO); +// alarmInfo.setCreateTime(currentDate); +// alarmInfo.setAlarmTime(currentDate); +// hwAlarmInfoMapper.insertHwAlarmInfo(alarmInfo); +// this.insertHwAlarmDetail(alarmInfo); +// this.handleAlarmLink(alarmRule, topic, subDeviceCode); +// /** +// * Add By WenJY 下发报警信息 +// */ +// if(StringUtils.isNotEmpty(alarmRule.getPhoneNumbers())){ +// SendAlarmInfoBySms(deviceId,alarmRule); +// }else { +// logger.warn("设备:{};报警信息发送失败,联系方式为空",deviceId); +// } +// break; +// } +// } +// } +// } +// }catch (Exception e){ +// logger.error("设备:{};报警逻辑处理异常:{}",deviceId,e.getMessage()); +// } +// } +// +// /** +// * 过滤指定时间段内的数据,返回最大最小的差值,过滤0 +// * @param deviceId +// * @param fieldName +// * @param triggerTimeFrame +// * @return 差值 +// */ +// private double FilterDeviceValue(Long deviceId,String fieldName,long triggerTimeFrame){ +// double differenceValue = 0.00; +// String databaseName = TdEngineConstants.getDatabaseName(); +// String tableName = TdEngineConstants.DEFAULT_TABLE_NAME_PREFIX + deviceId; +// long currentTimeMillis = System.currentTimeMillis(); +// long fiveMinutesInMillis = triggerTimeFrame * 60 * 1000; +// long beforeTimeMillis = currentTimeMillis - fiveMinutesInMillis; +// +// TdHistorySelectDto tdHistorySelectDto = new TdHistorySelectDto(); +// tdHistorySelectDto.setDatabaseName(databaseName); +// tdHistorySelectDto.setTableName(tableName); +// tdHistorySelectDto.setStartTime(beforeTimeMillis); +// tdHistorySelectDto.setEndTime(currentTimeMillis); +// tdHistorySelectDto.setFirstFieldName("ts"); +// R result = this.remoteTdEngineService.getHistoryData(tdHistorySelectDto , SecurityConstants.INNER); +// +// if (result.getCode() == ResultEnums.SUCCESS.getCode()) { +// logger.info("Get history data result: {}", result.getCode()); +// +// TdReturnDataVo data = (TdReturnDataVo) result.getData(); +// +// List> dataList = data.getDataList(); +// List value = dataList.stream().map(map -> (Double)map.get("value1")).distinct().filter(x -> x > 0).collect(Collectors.toList()); +// +// System.out.println(triggerTimeFrame +"分钟内数据:"+JSONArray.toJSON(value) ); +// +// OptionalDouble maxOptional = value.stream().mapToDouble(Double::doubleValue).max(); +// OptionalDouble minOptional = value.stream().mapToDouble(Double::doubleValue).min(); +// +// if (maxOptional.isPresent() && minOptional.isPresent()) { +// double maxValue = maxOptional.getAsDouble(); +// double minValue = minOptional.getAsDouble(); +// differenceValue = maxValue - minValue; +// System.out.println("Difference between max and min values: " + differenceValue); +// } else { +// System.out.println("No values found to calculate difference."); +// } +// +// } else { +// logger.error("Get history data Exception: {}", result.getMsg()); +// } +// +// return differenceValue; +// +// } +// +// /** +// * 新增报警详情信息信息 +// * +// * @param hwAlarmInfo 报警信息对象 +// */ +// private void insertHwAlarmDetail(HwAlarmInfo hwAlarmInfo) { +// List hwAlarmDetailList = hwAlarmInfo.getHwAlarmDetailList(); +// Long alarmInfoId = hwAlarmInfo.getAlarmInfoId(); +// if (StringUtils.isNotNull(hwAlarmDetailList)) { +// List list = new ArrayList(); +// for (HwAlarmDetail hwAlarmDetail : hwAlarmDetailList) { +// hwAlarmDetail.setAlarmInfoId(alarmInfoId); +// list.add(hwAlarmDetail); +// } +// if (list.size() > 0) { +// hwAlarmInfoMapper.batchHwAlarmDetail(list); +// } +// } +// } +// +// /** +// * @param: alarmRule +// * @param: topic +// * @param: subDeviceCode +// * @description 处理报警规则联动设备 +// * @author xins +// * @date 2023-11-07 16:39 +// */ +// private void handleAlarmLink(HwAlarmRule alarmRule, String topic, String subDeviceCode) { +// String controlCommandTopic = topic.replace(HwDictConstants.TOPIC_TYPE_DATA_POSTFIX, HwDictConstants.TOPIC_TYPE_COMMAND_POSTFIX); +// if (alarmRule.getLinkFlag().equals(HwDictConstants.ALARM_RULE_LINK_FLAG_YES)) { +// List alarmRuleLinks = alarmRule.getHwAlarmRuleLinkList(); +// alarmRuleLinks.forEach(alarmRuleLink -> { +// this.publishControlCommand(controlCommandTopic, subDeviceCode, alarmRuleLink.getLinkDeviceFunctionIdentifier()); +// }); +// } +// } +// +// @Override +// public void testBase64(String jsonData, String imagePath, String imagePatterns, String imageDomain, String imagePrefix) { +// JSONObject json = JSON.parseObject(jsonData); +// Object value = json.get("base64"); +// if (value instanceof String) { +// +// String valueStr = (String) value; +// System.out.println(Base64.isBase64(valueStr)); +// if (StringUtils.isNotBlank(valueStr)) { +// /** +// * 先判读是否是图片,并获取图片名称, 获取到证明是图片 +// */ +// String[] imagePatternArr = imagePatterns.split(","); +// String extension = ImageUtils.getImageType(valueStr, imagePatternArr); +// if (StringUtils.isNotBlank(extension)) { +// //保存图片,并返回图片详细地址进行赋值保存 +// Long deviceId = 100L; +// String imageFileName = null; +// try { +// imageFileName = ImageUtils.convertBase64ToImage(imagePath, +// valueStr, "device" + deviceId, extension); +// if (StringUtils.isNotBlank(imageFileName)) { +// String url = imageDomain + imagePrefix + imageFileName; +// System.out.println(url); +// } +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// +// } +// } +// } +// } +// +// /** +// * 发送报警短信 +// * @param deviceId +// * @param alarmRule +// */ +// private void SendAlarmInfoBySms(Long deviceId,HwAlarmRule alarmRule){ +// try { +// HwDevice hwDevice = hwDeviceMapper.GetDeviceById(deviceId); +// if(hwDevice != null){ +// AlarmMsgTemplateParam alarmMsgTemplateParam = new AlarmMsgTemplateParam(); +// alarmMsgTemplateParam.setWarning(alarmRule.getAlarmRuleName()); +// alarmMsgTemplateParam.setParentname(hwDevice.getMonitorUnitName()); +// alarmMsgTemplateParam.setSensorID(deviceId.toString()); +// AliSmsHandle(alarmRule.getPhoneNumbers(),alarmMsgTemplateParam); +// } +// } catch (ExecutionException | InterruptedException e) { +// throw new InvalidOperationException(String.format("报警信息发送异常:%e",e.getMessage())); +// } +// } +// +// /** +// * 报警短信推送 +// * @param phoneNumbers +// * @param alarmMsgTemplateParam +// * @throws ExecutionException +// * @throws InterruptedException +// */ +// private void AliSmsHandle(String phoneNumbers,AlarmMsgTemplateParam alarmMsgTemplateParam ) throws ExecutionException, InterruptedException { +// StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder() +// .accessKeyId(AccessKeyId) +// .accessKeySecret(AccessKeySecret) +// .build()); +// +// AsyncClient client = AsyncClient.builder() +// .region("cn-shenzhen") // Region ID +// .credentialsProvider(provider) +// .overrideConfiguration( +// ClientOverrideConfiguration.create() +// .setEndpointOverride("dysmsapi.aliyuncs.com") +// ) +// .build(); +// +// String jsonString = com.alibaba.fastjson2.JSONArray.toJSONString(alarmMsgTemplateParam); +// +// SendSmsRequest sendSmsRequest = SendSmsRequest.builder() +// .phoneNumbers(phoneNumbers) +// .signName("深圳市金瑞铭科技") +// .templateCode("SMS_468740027") +// .templateParam(jsonString) +// .build(); +// logger.info("向:{};发送报警信息:{}",phoneNumbers,jsonString); +// CompletableFuture response = client.sendSms(sendSmsRequest); +// SendSmsResponse resp = response.get(); +// +// client.close(); +// } +// +// +// public static void main(String[] args) { +// System.out.println(System.currentTimeMillis()); +// SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); +// Date date = new Date(); +// System.out.println(format.format(date)); +// Object jsonData = "{\n" + +// "\n" + +// " \"timestamp\": 1689814424,\"type\": \"CMD_REPORTDATA\",\n" + +// " \"param\": [\n{\n" + +// " \"datatype\": \"cttemperature\",\n" + +// "\"datavalue\": {\n" + +// " \"uid\": \"0009340109040126\", \"alias\": \"\",\n" + +// " \"value\": 25.6,\n" + +// " \"voltage\": 3.76,\n" + +// " \"rssi\": -80\n" + +// " } },\n" + +// " {\"datatype\": \"cttemperature\",\n" + +// " \"datavalue\": {\n" + +// " \"uid1\": \"00093440109040924\",\n" + +// " \"alias\": \"\",\n" + +// " \"value\": 25.6,\n" + +// " \"voltage\": 3.64,\n" + +// " \"rssi\": -87\n" + +// " }\n" + +// " }]}"; +// +// } +//} diff --git a/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/service/DeviceStatusServiceImpl.java b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/service/DeviceStatusServiceImpl.java new file mode 100644 index 00000000..eb3b851c --- /dev/null +++ b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/service/DeviceStatusServiceImpl.java @@ -0,0 +1,178 @@ +//package org.dromara.service; +// +//import com.alibaba.fastjson.JSON; +//import com.alibaba.fastjson.JSONObject; +//import com.ruoyi.common.core.constant.HwDictConstants; +//import com.ruoyi.common.core.constant.SecurityConstants; +//import com.ruoyi.common.core.constant.TdEngineConstants; +//import com.ruoyi.common.core.domain.R; +//import com.ruoyi.common.core.utils.StringUtils; +//import com.ruoyi.dataprocess.domain.*; +//import com.ruoyi.dataprocess.mapper.HwAlarmInfoMapper; +//import com.ruoyi.dataprocess.mapper.HwDeviceMapper; +//import com.ruoyi.dataprocess.mapper.HwOfflineRuleMapper; +//import com.ruoyi.dataprocess.service.CommanHandleService; +//import com.ruoyi.dataprocess.service.IDeviceStatusService; +//import com.ruoyi.tdengine.api.RemoteTdEngineService; +//import com.ruoyi.tdengine.api.domain.DeviceStatus; +//import com.ruoyi.tdengine.api.domain.TdField; +//import com.ruoyi.tdengine.api.domain.TdTableVo; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Service; +// +//import javax.annotation.Resource; +//import java.util.ArrayList; +//import java.util.Date; +//import java.util.List; +//import java.util.Map; +// +///** +// * @Description: 设备状态处理服务 +// * @ClassName: DeviceStatusServiceImpl +// * @Author : xins +// * @Date :2023-09-12 15:31 +// * @Version :1.0 +// */ +//@Service +//public class DeviceStatusServiceImpl extends CommanHandleService implements IDeviceStatusService { +// +// @Autowired +// private HwDeviceMapper hwDeviceMapper; +// @Autowired +// private HwOfflineRuleMapper hwOfflineRuleMapper; +// @Autowired +// private HwAlarmInfoMapper hwAlarmInfoMapper; +// @Resource +// private RemoteTdEngineService remoteTdEngineService; +// +// @Override +// public void handleDeviceStatus(String payloadString, String clientId) { +//// ddd:{"msg":"设备设备连接状态信息","deviceType":"edge","connectStatus":1, +//// "statusTime":1694506127199,"deviceCode":"hw-data-process-1"} +// JSONObject json = JSON.parseObject(payloadString); +// String deviceCode = json.getString("deviceCode").toLowerCase(); +// if (clientId.equals(deviceCode)) { //校验是不是自己,如果是自己则不记录状态,返回即可。 +// return; +// } +// HwDevice hwDevice = hwDeviceMapper.selectHwDeviceByDeviceCode(deviceCode); +// if (hwDevice != null) { +// Long deviceId = hwDevice.getDeviceId(); +// TdTableVo tdTableVo = new TdTableVo(); +// tdTableVo.setDatabaseName(TdEngineConstants.PLATFORM_DB_NAME); +// tdTableVo.setTableName(TdEngineConstants.DEFAULT_DEVICE_STATUS_TABLE_NAME_PREFIX + deviceId); +// +// List schemaFields = new ArrayList<>(); +// TdField onlineStatusField = new TdField(); +// onlineStatusField.setFieldName(TdEngineConstants.ST_TAG_ONLINESTATUS); +// onlineStatusField.setFieldValue(json.getInteger("connectStatus")); +// schemaFields.add(onlineStatusField); +// +// TdField deviceTypeField = new TdField(); +// deviceTypeField.setFieldName(TdEngineConstants.ST_TAG_DEVICETYPE); +// deviceTypeField.setFieldValue(json.getString("deviceType")); +// schemaFields.add(deviceTypeField); +// +// TdField tsField = new TdField(); +// tsField.setFieldName(TdEngineConstants.DEFAULT_FIRST_FIELD_NAME); +// tsField.setFieldValue(json.getLong("statusTime")); +// schemaFields.add(tsField); +// +// tdTableVo.setSchemaFields(schemaFields); +// +// this.remoteTdEngineService.insertTable(tdTableVo, SecurityConstants.INNER); +// +// //更新设备当前状态信息 +// String connectStatus = String.valueOf(json.getInteger("connectStatus")); +// hwDevice.setOnlineStatus(connectStatus); +// //判断如果是否是第一次连接,更新激活状态和激活时间。 +// if (hwDevice.getActiveStatus().equals(HwDictConstants.DEVICE_ACTIVE_STATUS_INACTIVE)) { +// hwDevice.setActiveStatus(HwDictConstants.DEVICE_ACTIVE_STATUS_ACTIVE); +// hwDevice.setActiveTime(new Date()); +// } +// +// hwDeviceMapper.updateHwDevice(hwDevice); +// +// if (connectStatus.equals(HwDictConstants.DEVICE_ONLINE_STATUS_OFFLINE)) { +// this.checkOfflineAlarm(hwDevice); +// } +// +// } +// } +// +// +// /** +// * @param: device +// * @description 离线报警处理 +// * @author xins +// * @date 2023-11-14 16:01 +// */ +// private void checkOfflineAlarm(HwDevice device) { +// Long deviceId = device.getDeviceId(); +// Long sceneId = device.getSceneId(); +// +// HwOfflineRule offlineRule = hwOfflineRuleMapper.selectHwOfflineRuleByDeviceId(deviceId); +// if (offlineRule == null) { +// offlineRule = hwOfflineRuleMapper.selectHwOfflineRuleBySceneId(sceneId); +// } +// +// if (offlineRule != null) { +// Long offlineNumberTime = offlineRule.getOfflineNumberTime();//分钟 +// Long offlineNumber = offlineRule.getOfflineNumber(); +// +// if (offlineNumber > 1) { +// Long currentTime = System.currentTimeMillis(); +// Long startTime = currentTime - offlineNumberTime * 60 * 1000; +// DeviceStatus queryDeviceStatus = new DeviceStatus(); +// queryDeviceStatus.setDeviceId(deviceId); +// queryDeviceStatus.setStartTime(startTime); +// queryDeviceStatus.setEndTime(currentTime); +// queryDeviceStatus.setOnlineStatus(0); +// +// R>> deviceStatusListR = this.remoteTdEngineService.getDeviceStatusList(queryDeviceStatus, SecurityConstants.INNER); +// List> deviceStatusList = deviceStatusListR.getData(); +// //在几分钟时间内离线几次的报警信息保存 +// if (deviceStatusList != null && deviceStatusList.size() > offlineNumber) { +// insertHwAlarmInfo(device, offlineRule, deviceId); +// } +// } else {//只要离线就报警 +// insertHwAlarmInfo(device, offlineRule, deviceId); +// } +// } +// } +// +// private void insertHwAlarmInfo(HwDevice device, HwOfflineRule offlineRule, Long deviceId) { +// Date currentDate = new Date(); +// +// HwAlarmInfo alarmInfo = new HwAlarmInfo(); +// alarmInfo.setAlarmInfoType(HwDictConstants.ALARM_INFO_TYPE_OFFLINE); +// alarmInfo.setAlarmReleatedId(offlineRule.getOfflineRuleId()); +// alarmInfo.setDeviceId(deviceId); +// alarmInfo.setTenantId(device.getTenantId()); +// alarmInfo.setSceneId(device.getSceneId()); +// alarmInfo.setMonitorUnitId(device.getMonitorUnitId()); +// alarmInfo.setAlarmLevelId(offlineRule.getAlarmLevelId()); +// alarmInfo.setHandleStatus(HwDictConstants.ALARM_HANDLE_STATUS_NO); +// alarmInfo.setAlarmTime(currentDate); +// alarmInfo.setCreateTime(currentDate); +// hwAlarmInfoMapper.insertHwAlarmInfo(alarmInfo); +// this.handleAlarmLink(offlineRule, device.getDeviceCode()); +// } +// +// /** +// * @param: offlineRule +// * @param: deviceCode +// * @description 处理报警规则联动设备 +// * @author xins +// * @date 2023-11-07 16:39 +// */ +// private void handleAlarmLink(HwOfflineRule offlineRule, String deviceCode) { +// String controlCommandTopic = StringUtils +// .format(HwDictConstants.CONTROL_COMMAND_TOPIC_VALUE, deviceCode); +// if (offlineRule.getLinkFlag().equals(HwDictConstants.ALARM_RULE_LINK_FLAG_YES)) { +// List offlineRuleLinks = offlineRule.getHwAlarmRuleLinkList(); +// offlineRuleLinks.forEach(offlineRuleLink -> { +// this.publishControlCommand(controlCommandTopic, deviceCode, offlineRuleLink.getLinkDeviceFunctionIdentifier()); +// }); +// } +// } +//} diff --git a/ruoyi-modules/hwmom-dp/src/main/resources/application.yml b/ruoyi-modules/hwmom-dp/src/main/resources/application.yml new file mode 100644 index 00000000..6c724a18 --- /dev/null +++ b/ruoyi-modules/hwmom-dp/src/main/resources/application.yml @@ -0,0 +1,62 @@ +# Tomcat +server: + port: 9603 + +mqtt: + client: + ip: 127.0.0.1 # mqtt server ip地址 + port: 1883 # mqtt server 端口 + clientId: hw-data-process-1 # 客户端ID,保证唯一 + username: mica # mqtt server 认证用户名 + password: mica # mqtt server 认证密码 + timeout: 10 + keepalive: 20 + qos : 1 # qos服务质量等级,0最多交付一次,1至少交付一次,2只交付一次 + dataTopicFilter: /v1/# # 订阅的处理设备上报数据的topic + deviceStatusTopic: /device/status/v1 # 订阅的处理设备状态的topic + #domain: http://127.0.0.1:9665 # 文件服务地址 + #path: D:/ruoyi/uploadPath # base64图片转换保存的路径 + domain: http://175.27.215.92:9665 # 文件服务地址 + path: /home/ruoyi/uploadPath # base64图片转换保存的路径 + prefix: /statics + imagePatterns: jpg,jpeg,png #支持的图片格式 + +# Spring +spring: + application: + # 应用名称 + name: hwmom-dp + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + application: + # 应用名称 + name: hwmom-dp + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + username: @nacos.username@ + password: @nacos.password@ + discovery: + # 注册组 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml + + kafka: + bootstrap-servers: localhost:9092 + producer: + key-serializer: org.apache.kafka.common.serialization.StringSerializer + value-serializer: org.apache.kafka.common.serialization.StringSerializer diff --git a/ruoyi-modules/hwmom-mqtt/pom.xml b/ruoyi-modules/hwmom-mqtt/pom.xml new file mode 100644 index 00000000..86546a56 --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/pom.xml @@ -0,0 +1,99 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + hwmom-mqtt + + + hwmom-mqtt broker模块 + + + + + + net.dreamlu + mica-mqtt-server-spring-boot-starter + 2.3.5 + + + + + org.springframework.kafka + spring-kafka + + + + org.dromara + ruoyi-common-nacos + + + + + org.dromara + ruoyi-common-security + + + + + org.dromara + ruoyi-api-resource + + + com.alibaba.fastjson2 + fastjson2 + 2.0.51 + compile + + + + + + + + + + + + + + + + + + + + + ${project.artifactId} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 17 + 17 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/HwMqttBrokerApplication.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/HwMqttBrokerApplication.java new file mode 100644 index 00000000..1061e561 --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/HwMqttBrokerApplication.java @@ -0,0 +1,20 @@ +package com.hw.mqtt; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) +public class HwMqttBrokerApplication { + + public static void main(String[] args) { + SpringApplication application = new SpringApplication(HwMqttBrokerApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ mqtt模块启动成功 ლ(´ڡ`ლ)゙ "); + + + } + +} diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttAuthHandler.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttAuthHandler.java new file mode 100644 index 00000000..6765b7df --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttAuthHandler.java @@ -0,0 +1,147 @@ +package com.hw.mqtt.auth; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.hw.mqtt.domain.DeviceInfoDto; +import com.hw.mqtt.enums.RedisKeys; +//import net.dreamlu.iot.mqtt.core.server.auth.IMqttServerAuthHandler; + +import net.dreamlu.iot.mqtt.core.server.auth.IMqttServerAuthHandler; +import org.dromara.common.core.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.tio.core.ChannelContext; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * mqtt tcp、websocket 认证 + * @author WenJY + * @date 2023-03-14 12:19 + * @return null + */ +@Configuration(proxyBeanMethods = false) +public class MqttAuthHandler implements IMqttServerAuthHandler { + + private final Logger logger = LoggerFactory.getLogger(MqttAuthHandler.class); + + /** + * 存储设备信息,设备接入校验 + */ + private List deviceInfoDtos; + + @Value("${broker.whitelist}") + private String clientIdWhitelist; + + private final StringRedisTemplate redisTemplate; + + public MqttAuthHandler(List deviceInfoDtos, StringRedisTemplate redisTemplate) { + this.deviceInfoDtos = deviceInfoDtos; + this.redisTemplate = redisTemplate; + this.InitDeviceInfoListByRedis(); + } + + /** + * 通过Redis初始化本地设备信息集合,只在该类初始化时执行 + */ + private void InitDeviceInfoListByRedis(){ + try{ + String jsonStr = redisTemplate.opsForValue().get(RedisKeys.CLIENT_DEVICE_INFO.getKey()); + if(StringUtils.isEmpty(jsonStr)){ + logger.warn("通过Redis获取设备信息为空"); + return; + } + this.deviceInfoDtos = JSONArray.parseArray(jsonStr, DeviceInfoDto.class); + }catch (Exception ex){ + logger.error("通过Redis获取设备信息方法处理异常:"+ex.getMessage()); + } + } + + /** + * 客户端认证逻辑实现 + * @param context ChannelContext + * @param uniqueId mqtt 内唯一id,默认和 clientId 相同 + * @param clientId 客户端 ID + * @param userName 用户名 + * @param password 密码 + * @return + */ + @Override + public boolean authenticate(ChannelContext context, String uniqueId, String clientId, String userName, String password) { + // + try{ + //白名单过滤 + if(clientIdWhitelist.contains(clientId)){ + return true; + }else if (deviceInfoDtos!=null){ + Optional optionalDeviceInfoDto = deviceInfoDtos.stream().distinct().filter(x -> x.getDeviceCode().equals(clientId)).findFirst(); + //判断本地集合中是否包含该设备信息,如果不包含再次读取Redis并初始化本地集合 + if (optionalDeviceInfoDto.isPresent()) { + DeviceInfoDto deviceInfo = optionalDeviceInfoDto.get(); + return checkDeviceInfo(deviceInfo,clientId,userName,password); + } + } + return NoDeviceInfoEvent(clientId,userName,password); + }catch (Exception ex){ + logger.error("客户端认证逻辑处理异常:"+ex.getMessage()); + } + return false; + } + + /** + * 通过本地集合未获取到设备信息时重新获取进行校验 + * @param clientId + * @param userName + * @param password + * @return + */ + private boolean NoDeviceInfoEvent(String clientId,String userName,String password){ + DeviceInfoDto deviceInfo = GetDeviceInfoByRedis(clientId); + if (deviceInfo != null) { + return checkDeviceInfo(deviceInfo,clientId,userName,password); + }else { + logger.warn("未获取到接入客户端的设备信息,禁止该设备接入"); + return false; + } + } + + /** + * 校验设备接入信息 + * @param deviceInfo + * @param clientId + * @param userName + * @param passwd + * @return + */ + private boolean checkDeviceInfo(DeviceInfoDto deviceInfo,String clientId,String userName,String passwd){ + if(Objects.equals(userName, deviceInfo.getUserName()) && Objects.equals(passwd, deviceInfo.getPassword())){ + return true; + }else { + logger.warn("接入设备:"+clientId+";账号或密码错误,禁止该设备接入"); + return false; + } + } + + /** + * 再次读取Redis重新加载本地设备信息集合内容获取设备信息,过滤出指定clientId的设备信息 + * @param clientId + * @return + */ + private DeviceInfoDto GetDeviceInfoByRedis(String clientId){ + this.InitDeviceInfoListByRedis(); + if(deviceInfoDtos!=null){ + Optional optionalDeviceInfoDto = deviceInfoDtos.stream().distinct().filter(x -> x.getDeviceCode().equals(clientId)).findFirst(); + return optionalDeviceInfoDto.orElse(null); + }else { + return null; + } + } + +} diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttHttpAuthFilter.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttHttpAuthFilter.java new file mode 100644 index 00000000..2c4a3743 --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttHttpAuthFilter.java @@ -0,0 +1,37 @@ +package com.hw.mqtt.auth; + +import net.dreamlu.iot.mqtt.core.server.http.api.code.ResultCode; +import net.dreamlu.iot.mqtt.core.server.http.api.result.Result; +import net.dreamlu.iot.mqtt.core.server.http.handler.HttpFilter; +import net.dreamlu.iot.mqtt.core.server.http.handler.MqttHttpRoutes; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.annotation.Configuration; +import org.tio.http.common.HttpRequest; +import org.tio.http.common.HttpResponse; + +/** + * mqtt http 接口认证 + * @author WenJY + * @date 2023-03-14 12:20 + * @return null + */ +@Configuration(proxyBeanMethods = false) +public class MqttHttpAuthFilter implements HttpFilter, InitializingBean { + + @Override + public boolean filter(HttpRequest request) throws Exception { + // 自行实现逻辑 + return true; + } + + @Override + public HttpResponse response(HttpRequest request) { + // 认证不通过时的响应 + return Result.fail(request, ResultCode.E103); + } + + @Override + public void afterPropertiesSet() throws Exception { + MqttHttpRoutes.addFilter(this); + } +} diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttSubscribeValidator.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttSubscribeValidator.java new file mode 100644 index 00000000..733b1538 --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttSubscribeValidator.java @@ -0,0 +1,23 @@ +package com.hw.mqtt.auth; + +import net.dreamlu.iot.mqtt.codec.MqttQoS; +import net.dreamlu.iot.mqtt.core.server.auth.IMqttServerSubscribeValidator; +import org.springframework.context.annotation.Configuration; +import org.tio.core.ChannelContext; + +/** + * 自定义订阅校验 + * @author WenJY + * @date 2023-03-14 12:20 + * @return null + */ +@Configuration(proxyBeanMethods = false) +public class MqttSubscribeValidator implements IMqttServerSubscribeValidator { + + @Override + public boolean isValid(ChannelContext context, String clientId, String topicFilter, MqttQoS qoS) { + // 校验客户端订阅的 topic,校验成功返回 true,失败返回 false + return true; + } + +} diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttUniqueIdService.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttUniqueIdService.java new file mode 100644 index 00000000..84f5a2b8 --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/auth/MqttUniqueIdService.java @@ -0,0 +1,22 @@ +package com.hw.mqtt.auth; + +import net.dreamlu.iot.mqtt.core.server.auth.IMqttServerUniqueIdService; +import org.springframework.context.annotation.Configuration; +import org.tio.core.ChannelContext; + +/** + * 自定义 clientId + * @author WenJY + * @date 2023-03-14 12:20 + * @return null + */ +@Configuration(proxyBeanMethods = false) +public class MqttUniqueIdService implements IMqttServerUniqueIdService { + + @Override + public String getUniqueId(ChannelContext context, String clientId, String userName, String password) { + // 返回的 uniqueId 会替代 mqtt client 传过来的 clientId,请保证返回的 uniqueId 唯一。 + return clientId; + } + +} diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/config/RedisListenerConfig.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/config/RedisListenerConfig.java new file mode 100644 index 00000000..f9884a23 --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/config/RedisListenerConfig.java @@ -0,0 +1,35 @@ +package com.hw.mqtt.config; + +import com.hw.mqtt.enums.RedisKeys; +import com.hw.mqtt.listener.RedisMessageListener; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.listener.PatternTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; + +/** + * @author Wen JY + * @description: TODO + * @date 2023-09-11 15:35:20 + * @version: 1.0 + */ +@Configuration +public class RedisListenerConfig { + @Bean + RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, + MessageListenerAdapter msgIngoListenerAdapter) { + + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + container.setConnectionFactory(connectionFactory); + // 可以添加多个 messageListener,配置不同的交换机 + container.addMessageListener(msgIngoListenerAdapter, new PatternTopic(RedisKeys.REDIS_CHANNEL_DOWN.getKey())); + return container; + } + + @Bean + MessageListenerAdapter msgIngoListenerAdapter(RedisMessageListener receiver) { + return new MessageListenerAdapter(receiver, "deviceCommand"); + } +} diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/domain/DeviceInfoDto.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/domain/DeviceInfoDto.java new file mode 100644 index 00000000..c03e5e62 --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/domain/DeviceInfoDto.java @@ -0,0 +1,29 @@ +package com.hw.mqtt.domain; + +import lombok.Data; + +/** + * 设备基础信息 + * @author Wen JY + * @description: TODO + * @date 2023-09-13 14:52:18 + * @version: 1.0 + */ +@Data +public class DeviceInfoDto { + + /** + * 设备编号,ClientId + */ + private String deviceCode; + + /** + * 用户名 + */ + private String userName; + + /** + * 密码 + */ + private String password; +} diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/enums/ConnectStatus.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/enums/ConnectStatus.java new file mode 100644 index 00000000..84d68a9b --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/enums/ConnectStatus.java @@ -0,0 +1,32 @@ +package com.hw.mqtt.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 设备连接状态枚举 + * @author Wen JY + * @description: TODO + * @date 2023-09-13 13:42:37 + * @version: 1.0 + */ +@Getter +@RequiredArgsConstructor +public enum ConnectStatus { + + /** + * 设备连接 + */ + connct(1), + + /** + * 设备断开 + */ + disconnect(0); + + private final int key; + + public int getKey(){ + return this.key; + } +} diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/enums/DeviceType.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/enums/DeviceType.java new file mode 100644 index 00000000..399fc127 --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/enums/DeviceType.java @@ -0,0 +1,37 @@ +package com.hw.mqtt.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 设备类型枚举 + * @author Wen JY + * @description: TODO + * @date 2023-09-13 13:30:38 + * @version: 1.0 + */ +@Getter +@RequiredArgsConstructor +public enum DeviceType { + + /** + * 网关/基站 + */ + edge(1), + + /** + * 网关子设备/传感器 + */ + sensor(2), + + /** + * 直连设备 + */ + device(3); + + private final int key; + + public int getKey(){ + return this.key; + } +} diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/enums/RedisKeys.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/enums/RedisKeys.java new file mode 100644 index 00000000..f24bc8f0 --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/enums/RedisKeys.java @@ -0,0 +1,63 @@ +package com.hw.mqtt.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * @author WenJY + * @date 2023年03月14日 13:36 + */ +@Getter +@RequiredArgsConstructor +public enum RedisKeys { + + /** + * mqtt 服务端节点 + */ + SERVER_NODES("mqtt:server:nodes:"), + /** + * mqtt <-> redis pug/sub 集群内消息交互 + */ + REDIS_CHANNEL_EXCHANGE("mqtt:channel:exchange"), + /** + * 设备 -> 云端 redis pug/sub 上行消息通道,适合 mq 的集群模式消费 + */ + REDIS_CHANNEL_UP("mqtt:channel:up"), + /** + * 云端 -> 设备 redis pug/sub 下行数据通道,广播到 mqtt 集群 + */ + REDIS_CHANNEL_DOWN("mqtt:channel:down"), + /** + * 连接状态存储 + */ + CONNECT_STATUS("mqtt:connect:status:"), + /** + * 遗嘱消息存储 + */ + MESSAGE_STORE_WILL("mqtt:messages:will:"), + /** + * 保留消息存储 + */ + MESSAGE_STORE_RETAIN("mqtt:messages:retain:"), + + /** + * 设备信息 + */ + CLIENT_DEVICE_INFO("hw_device_info"), + ; + + + private final String key; + + /** + * 用于拼接后缀 + * + * @param suffix 后缀 + * @return 完整的 redis key + */ + public String getKey(String suffix) { + return this.key.concat(suffix); + } + +} + diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/listener/MqttConnectStatusListener.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/listener/MqttConnectStatusListener.java new file mode 100644 index 00000000..fa78dfb7 --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/listener/MqttConnectStatusListener.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & dreamlu.net). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hw.mqtt.listener; + +import com.alibaba.fastjson2.JSONArray; +import com.hw.mqtt.enums.ConnectStatus; +import com.hw.mqtt.enums.DeviceType; +import com.hw.mqtt.enums.RedisKeys; +import net.dreamlu.iot.mqtt.core.server.MqttServerCreator; +import net.dreamlu.iot.mqtt.core.server.event.IMqttConnectStatusListener; +import net.dreamlu.iot.mqtt.spring.server.MqttServerTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.SmartInitializingSingleton; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; +import org.tio.core.ChannelContext; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +/** + * 状态监听器 + * 性能损失小 + * @author WenJY + * @date 2023-03-14 12:17 + * @return null + */ +@Service +public class MqttConnectStatusListener implements IMqttConnectStatusListener, SmartInitializingSingleton, DisposableBean { + private static final Logger logger = LoggerFactory.getLogger(MqttConnectStatusListener.class); + + private final ApplicationContext context; + private final StringRedisTemplate redisTemplate; + private MqttServerCreator serverCreator; + private MqttServerTemplate mqttServerTemplate; + + @Value("${broker.connectStatus.enable}") + private boolean publishConnectStatusEnable; + + @Value("${broker.connectStatus.topic}") + private String publishConnectStatusTopic; + + public MqttConnectStatusListener(ApplicationContext context, StringRedisTemplate redisTemplate) { + this.context = context; + this.redisTemplate = redisTemplate; + } + + @Override + public void online(ChannelContext context, String clientId, String username) { + logger.info("Mqtt clientId:{} username:{} online.", clientId, username); + redisTemplate.opsForSet().add(getRedisKey(), clientId); + pushConnectStatus(clientId,ConnectStatus.connct); + } + + @Override + public void offline(ChannelContext context, String clientId, String username, String reason) { + logger.info("Mqtt clientId:{} username:{} offline reason:{}.", clientId, username, reason); + redisTemplate.opsForSet().remove(getRedisKey(), clientId); + pushConnectStatus(clientId,ConnectStatus.disconnect); + } + + /** + * 设备上下线存储,key 的值为 前缀:nodeName + * + * @return redis key + */ + private String getRedisKey() { + return RedisKeys.CONNECT_STATUS.getKey(serverCreator.getNodeName()); + } + + @Override + public void afterSingletonsInstantiated() { + this.serverCreator = context.getBean(MqttServerCreator.class); + this.mqttServerTemplate = context.getBean(MqttServerTemplate.class); + } + + @Override + public void destroy() throws Exception { + // 停机时删除集合 + redisTemplate.opsForSet().remove(getRedisKey()); + } + + /** + * 推送设备状态到指定主题 + * @param clientId + * @param connectStatus + */ + public void pushConnectStatus(String clientId, ConnectStatus connectStatus){ + if(publishConnectStatusEnable){ + Map entityMap = new HashMap<>(); + entityMap.put("msg","设备设备连接状态信息"); + entityMap.put("deviceType", DeviceType.edge.getKey()); + entityMap.put("deviceCode",clientId); + entityMap.put("connectStatus",connectStatus.getKey()); + entityMap.put("statusTime",System.currentTimeMillis()); + String jsonString = JSONArray.toJSONString(entityMap); + boolean result = mqttServerTemplate.publishAll(publishConnectStatusTopic, jsonString.getBytes(StandardCharsets.UTF_8)); + if(result){ + logger.info("客户端:"+clientId+";"+ (connectStatus == ConnectStatus.connct ? "连接" :"断开") +"状态推送成功"); + }else { + logger.info("客户端:"+clientId+";"+ (connectStatus == ConnectStatus.connct ? "连接" :"断开") +"状态推送失败"); + } + }else { + logger.info("未开启设备连接状态推送"); + } + + } +} diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/listener/MqttServerMessageListener.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/listener/MqttServerMessageListener.java new file mode 100644 index 00000000..eb136a6e --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/listener/MqttServerMessageListener.java @@ -0,0 +1,49 @@ +package com.hw.mqtt.listener; + +//import net.dreamlu.iot.mqtt.codec.ByteBufferUtil; + +import net.dreamlu.iot.mqtt.codec.MqttPublishMessage; +import net.dreamlu.iot.mqtt.codec.MqttQoS; +import net.dreamlu.iot.mqtt.core.server.event.IMqttMessageListener; +import net.dreamlu.iot.mqtt.spring.server.MqttServerTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.SmartInitializingSingleton; +import com.hw.mqtt.service.KafkaProducerService; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Service; +import org.tio.core.ChannelContext; + +import java.nio.charset.StandardCharsets; + +/** + * 消息监听器 + * + * @author WenJY + * @date 2023-03-14 12:18 + * @return null + */ +@Service +public class MqttServerMessageListener implements IMqttMessageListener, SmartInitializingSingleton { + private static final Logger logger = LoggerFactory.getLogger(MqttServerMessageListener.class); + private final ApplicationContext applicationContext; + private MqttServerTemplate mqttServerTemplate; + private final KafkaProducerService kafkaProducerService; + + public MqttServerMessageListener(ApplicationContext applicationContext, KafkaProducerService kafkaProducerService) { + this.applicationContext = applicationContext; + this.kafkaProducerService = kafkaProducerService; + } + + @Override + public void onMessage(ChannelContext context, String clientId, String topic, MqttQoS qos, MqttPublishMessage message) { + logger.info("context:{} clientId:{} message:{} payload:{}", context, clientId, message, new String(message.getPayload(), StandardCharsets.UTF_8)); + kafkaProducerService.sendMessage("test", new String(message.getPayload(), StandardCharsets.UTF_8)); + } + + @Override + public void afterSingletonsInstantiated() { + // 单利 bean 初始化完成之后从 ApplicationContext 中获取 bean + mqttServerTemplate = applicationContext.getBean(MqttServerTemplate.class); + } +} diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/listener/RedisMessageListener.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/listener/RedisMessageListener.java new file mode 100644 index 00000000..5d0444bc --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/listener/RedisMessageListener.java @@ -0,0 +1,58 @@ +package com.hw.mqtt.listener; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import net.dreamlu.iot.mqtt.spring.server.MqttServerTemplate; +import org.dromara.common.core.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; + +import java.nio.charset.StandardCharsets; + +/** + * @author Wen JY + * @description: TODO + * @date 2023-09-11 15:28:18 + * @version: 1.0 + */ +@Component +public class RedisMessageListener { + + private static final Logger logger = LoggerFactory.getLogger(RedisMessageListener.class); + + private final MqttServerTemplate mqttServerTemplate; + + public RedisMessageListener(MqttServerTemplate mqttServerTemplate) { + this.mqttServerTemplate = mqttServerTemplate; + } + + /** + * 订阅设备控制信息、发布设备指令 + * @param message + */ + public void deviceCommand(String message){ + try { + + if(StringUtils.isEmpty(message)){ + logger.warn("Redis订阅内容为空!!!"); + return; + } + logger.info("Redis订阅内容:"+message); + JSONObject jsonObject = JSONObject.parseObject(message); + String topic = jsonObject.get("Topic").toString(); + String payload = jsonObject.get("Payload").toString(); + boolean publishResult = mqttServerTemplate.publishAll(topic, payload.getBytes(StandardCharsets.UTF_8)); + if(publishResult){ + logger.info("Topic:"+topic+";Payload:"+payload+";消息发布成功"); + }else { + logger.info("Topic:"+topic+";Payload:"+payload+";消息发布失败!!!"); + } + }catch (Exception e){ + logger.error("设备控制指令下发异常:"+e.getMessage()); + } + } +} diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/service/KafkaProducerService.java b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/service/KafkaProducerService.java new file mode 100644 index 00000000..eff9e3fb --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/com/hw/mqtt/service/KafkaProducerService.java @@ -0,0 +1,19 @@ +package com.hw.mqtt.service; + +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.stereotype.Service; + +@Service +public class KafkaProducerService { + + private final KafkaTemplate kafkaTemplate; + + public KafkaProducerService(KafkaTemplate kafkaTemplate) { + this.kafkaTemplate = kafkaTemplate; + } + + public void sendMessage(String topic, String message) { + kafkaTemplate.send(topic, message); + System.out.println("Forwarded message to Kafka: " + message); + } +} diff --git a/ruoyi-modules/hwmom-mqtt/src/main/java/org/dromara/Main.java b/ruoyi-modules/hwmom-mqtt/src/main/java/org/dromara/Main.java new file mode 100644 index 00000000..7a72da2c --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/java/org/dromara/Main.java @@ -0,0 +1,17 @@ +package org.dromara; + +//TIP To Run code, press or +// click the icon in the gutter. +public class Main { + public static void main(String[] args) { + //TIP Press with your caret at the highlighted text + // to see how IntelliJ IDEA suggests fixing it. + System.out.printf("Hello and welcome!"); + + for (int i = 1; i <= 5; i++) { + //TIP Press to start debugging your code. We have set one breakpoint + // for you, but you can always add more by pressing . + System.out.println("i = " + i); + } + } +} \ No newline at end of file diff --git a/ruoyi-modules/hwmom-mqtt/src/main/resources/application.yml b/ruoyi-modules/hwmom-mqtt/src/main/resources/application.yml new file mode 100644 index 00000000..b2e33bac --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/resources/application.yml @@ -0,0 +1,60 @@ +# Tomcat +server: + port: 9605 + +# broker监听端口 +mqtt: + server: + port: 1883 # MQTT端口,默认:1883 + web-port: 8083 # http、websocket 端口,默认:8083 + +#broker相关配置 +broker: + #客户端ClientId白名单,不进行接入校验,多个ClientId用逗号隔开 + whitelist: hw-data-process-1 + #设备接入状态推送 + connectStatus: + enable: true #是否启用设备连接状态推送 + topic: /device/status/v1 #设备连接状态推送主题 + +# Spring +spring: + application: + # 应用名称 + name: hwmom-mqtt + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + application: + # 应用名称 + name: hw-mqtt-broker + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + username: @nacos.username@ + password: @nacos.password@ + discovery: + # 注册组 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml + + kafka: + bootstrap-servers: localhost:9092 + producer: + key-serializer: org.apache.kafka.common.serialization.StringSerializer + value-serializer: org.apache.kafka.common.serialization.StringSerializer + + diff --git a/ruoyi-modules/hwmom-mqtt/src/main/resources/banner.txt b/ruoyi-modules/hwmom-mqtt/src/main/resources/banner.txt new file mode 100644 index 00000000..89e25a4f --- /dev/null +++ b/ruoyi-modules/hwmom-mqtt/src/main/resources/banner.txt @@ -0,0 +1,10 @@ + +${AnsiColor.RED} ## ## ####### ######## ######## +${AnsiColor.RED} ### ### ## ## ## ## +${AnsiColor.RED} #### #### ## ## ## ## +${AnsiColor.RED} ## ### ## ## ## ## ## +${AnsiColor.RED} ## ## ## ## ## ## ## +${AnsiColor.RED} ## ## ## ## ## ## +${AnsiColor.RED} ## ## ##### ## ## ## + +${AnsiColor.BRIGHT_BLUE}:: ${spring.application.name} :: Running Spring Boot ${spring-boot.version} 🏃🏃🏃 ${AnsiColor.DEFAULT} diff --git a/ruoyi-modules/hwmom-tsdb/pom.xml b/ruoyi-modules/hwmom-tsdb/pom.xml new file mode 100644 index 00000000..fd706974 --- /dev/null +++ b/ruoyi-modules/hwmom-tsdb/pom.xml @@ -0,0 +1,100 @@ + + + 4.0.0 + + org.dromara + ruoyi-modules + ${revision} + + + hwmom-tsdb + + + hwmom-tsdb 时序数据库处理模块 + + + + + org.dromara + ruoyi-common-nacos + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-sentinel + + + + + org.influxdb + influxdb-java + 2.23 + + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-tenant + + + + + + + + ${project.artifactId} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 17 + 17 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + + diff --git a/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/HwTsDbApplication.java b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/HwTsDbApplication.java new file mode 100644 index 00000000..28e97ec7 --- /dev/null +++ b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/HwTsDbApplication.java @@ -0,0 +1,20 @@ +package org.dromara.tsdb; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) +public class HwTsDbApplication { + + public static void main(String[] args) { + SpringApplication application = new SpringApplication(HwTsDbApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ TSDB 时序数据库处理模块启动成功 ლ(´ڡ`ლ)゙ "); + + + } + +} diff --git a/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/config/InfluxDbConfig.java b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/config/InfluxDbConfig.java new file mode 100644 index 00000000..2e5e7f27 --- /dev/null +++ b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/config/InfluxDbConfig.java @@ -0,0 +1,30 @@ +package org.dromara.tsdb.config; + +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class InfluxDbConfig { + + @Value("${influxdb.url}") + private String influxDBUrl; + + @Value("${influxdb.username}") + private String username; + + @Value("${influxdb.password}") + private String password; + + @Value("${influxdb.database}") + private String database; + + @Bean + public InfluxDB influxDB() { + InfluxDB influxDB = InfluxDBFactory.connect(influxDBUrl, username, password); + influxDB.setDatabase(database); + return influxDB; + } +} diff --git a/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/controller/InfluxDbController.java b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/controller/InfluxDbController.java new file mode 100644 index 00000000..9c74366b --- /dev/null +++ b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/controller/InfluxDbController.java @@ -0,0 +1,35 @@ +package org.dromara.tsdb.controller; + +import org.dromara.tsdb.service.IInfluxDbService; +import org.influxdb.dto.QueryResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/influx") +public class InfluxDbController { + + @Autowired + private IInfluxDbService influxDbService; + + /** + * 写入数据到InfluxDB + */ + @PostMapping("/write") + public String writeData(@RequestParam String measurement, + @RequestParam String tagKey, + @RequestParam String tagValue, + @RequestParam String fieldKey, + @RequestParam String fieldValue) { + influxDbService.writeData(measurement, tagKey, tagValue, fieldKey, fieldValue); + return "Data written to InfluxDB successfully!"; + } + + /** + * 查询数据 + */ + @GetMapping("/query") + public QueryResult queryData(@RequestParam String query) { + return influxDbService.queryData(query); + } +} diff --git a/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/IInfluxDbService.java b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/IInfluxDbService.java new file mode 100644 index 00000000..f4f065d8 --- /dev/null +++ b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/IInfluxDbService.java @@ -0,0 +1,25 @@ +package org.dromara.tsdb.service; + +import org.influxdb.dto.QueryResult; + +public interface IInfluxDbService { + /** + * 写入数据到InfluxDB + * + * @param measurement 表名 + * @param tagKey 标签键 + * @param tagValue 标签值 + * @param fieldKey 字段键 + * @param fieldValue 字段值 + */ + public void writeData(String measurement, String tagKey, String tagValue, String fieldKey, String fieldValue); + + /** + * 查询数据 + * + * @param query 查询语句 + * @return 查询结果 + */ + public QueryResult queryData(String query); + +} diff --git a/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/impl/InfluxDbServiceImpl.java b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/impl/InfluxDbServiceImpl.java new file mode 100644 index 00000000..6a2dc170 --- /dev/null +++ b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/impl/InfluxDbServiceImpl.java @@ -0,0 +1,50 @@ +package org.dromara.tsdb.service.impl; + +import org.dromara.tsdb.service.IInfluxDbService; +import org.influxdb.InfluxDB; +import org.influxdb.dto.Point; +import org.influxdb.dto.Query; +import org.influxdb.dto.QueryResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + +@Service +public class InfluxDbServiceImpl implements IInfluxDbService { + + @Autowired + private InfluxDB influxDB; + + /** + * 写入数据到InfluxDB + * + * @param measurement 表名 + * @param tagKey 标签键 + * @param tagValue 标签值 + * @param fieldKey 字段键 + * @param fieldValue 字段值 + */ + @Override + public void writeData(String measurement, String tagKey, String tagValue, String fieldKey, String fieldValue) { + Point point = Point.measurement(measurement) + .tag(tagKey, tagValue) + .addField(fieldKey, fieldValue) + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .build(); + influxDB.write(point); + } + + /** + * 查询数据 + * + * @param query 查询语句 + * @return 查询结果 + */ + @Override + public QueryResult queryData(String query) { + QueryResult queryResult = influxDB.query(new Query(query)); + System.out.println(queryResult.getResults()); + return queryResult; + } +} diff --git a/ruoyi-modules/hwmom-tsdb/src/main/resources/application.yml b/ruoyi-modules/hwmom-tsdb/src/main/resources/application.yml new file mode 100644 index 00000000..d7731390 --- /dev/null +++ b/ruoyi-modules/hwmom-tsdb/src/main/resources/application.yml @@ -0,0 +1,37 @@ +# Tomcat +server: + port: 9608 + +# Spring +spring: + application: + # 应用名称 + name: hwmom-tsdb + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + application: + # 应用名称 + name: hwmom-tsdb + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + username: @nacos.username@ + password: @nacos.password@ + discovery: + # 注册组 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml From f3a7aecdd72a9fd6d2f915ec84db3736eeeaa489 Mon Sep 17 00:00:00 2001 From: xs Date: Wed, 12 Mar 2025 16:20:19 +0800 Subject: [PATCH 14/18] =?UTF-8?q?1.2.6:=20=E8=A1=A5=E5=85=85=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml index c1bd1ca2..437defce 100644 --- a/ruoyi-modules/pom.xml +++ b/ruoyi-modules/pom.xml @@ -19,6 +19,10 @@ hwmom-qms hwmom-api hwmom-dms + hwmom-mqtt + hwmom-dp + hwmom-tsdb + ruoyi-modules From e52a09f37d14d2d5c9571a40bca1e4fd47725e8e Mon Sep 17 00:00:00 2001 From: zch Date: Wed, 12 Mar 2025 16:53:26 +0800 Subject: [PATCH 15/18] =?UTF-8?q?change(mes):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=94=9F=E4=BA=A7=E8=AE=A1=E5=88=92=E6=98=8E=E7=BB=86=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改字段名称:classesId -> shiftId, teamId -> classTeamId - 添加工装名称、班次名称、班组名称等额外查询字段 --- .../mes/domain/ProdProductPlanDetail.java | 18 +++++++- .../domain/bo/ProdProductPlanDetailBo.java | 4 +- .../domain/vo/ProdProductPlanDetailVo.java | 4 +- .../ProdProductPlanDetailServiceImpl.java | 46 +++++++++++++------ 4 files changed, 53 insertions(+), 19 deletions(-) diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/ProdProductPlanDetail.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/ProdProductPlanDetail.java index 4920d3b6..087e6923 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/ProdProductPlanDetail.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/ProdProductPlanDetail.java @@ -56,12 +56,12 @@ public class ProdProductPlanDetail extends TenantEntity { /** * 班次ID */ - private Long classesId; + private Long shiftId; /** * 班组ID */ - private Long teamId; + private Long classTeamId; /** * 完成数量 @@ -169,5 +169,19 @@ public class ProdProductPlanDetail extends TenantEntity { @TableLogic private String delFlag; + /** + * 工装名称 + */ + @TableField(exist = false) + private String toolingName; + + @TableField(exist = false) + private String shiftName; + + @TableField(exist = false) + private String classTeamName; + + + } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdProductPlanDetailBo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdProductPlanDetailBo.java index cb8322c8..6797b873 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdProductPlanDetailBo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdProductPlanDetailBo.java @@ -60,13 +60,13 @@ public class ProdProductPlanDetailBo extends BaseEntity { * 班次ID */ @NotNull(message = "班次ID不能为空", groups = {AddGroup.class, EditGroup.class}) - private Long classesId; + private Long shiftId; /** * 班组ID */ @NotNull(message = "班组ID不能为空", groups = {AddGroup.class, EditGroup.class}) - private Long teamId; + private Long classTeamId; /** * 完成数量 diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdProductPlanDetailVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdProductPlanDetailVo.java index 124cf5fe..a922c6ba 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdProductPlanDetailVo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProdProductPlanDetailVo.java @@ -70,13 +70,13 @@ public class ProdProductPlanDetailVo implements Serializable { * 班次ID */ @ExcelProperty(value = "班次ID") - private Long classesId; + private Long shiftId; /** * 班组ID */ @ExcelProperty(value = "班组ID") - private Long teamId; + private Long classTeamId; /** * 完成数量 diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdProductPlanDetailServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdProductPlanDetailServiceImpl.java index 6600d77f..45586864 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdProductPlanDetailServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdProductPlanDetailServiceImpl.java @@ -1,28 +1,25 @@ package org.dromara.mes.service.impl; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; import org.dromara.common.constant.DatabaseConstants; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mapper.DynamicBaseSqlMapper; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.github.yulichang.toolkit.JoinWrappers; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import lombok.RequiredArgsConstructor; -import org.dromara.mes.domain.ProdPlanInfo; -import org.dromara.mes.domain.vo.ProdPlanInfoVo; -import org.springframework.stereotype.Service; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.mes.domain.*; import org.dromara.mes.domain.bo.ProdProductPlanDetailBo; import org.dromara.mes.domain.vo.ProdProductPlanDetailVo; -import org.dromara.mes.domain.ProdProductPlanDetail; import org.dromara.mes.mapper.ProdProductPlanDetailMapper; import org.dromara.mes.service.IProdProductPlanDetailService; +import org.springframework.stereotype.Service; +import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Collection; /** * 生产信息Service业务层处理 @@ -87,14 +84,37 @@ public class ProdProductPlanDetailServiceImpl implements IProdProductPlanDetailS Map params = bo.getParams(); MPJLambdaWrapper lqw = JoinWrappers.lambda(ProdProductPlanDetail.class) .selectAll(ProdProductPlanDetail.class) + + //工装连表查询名称 + .select(BaseToolingInfo::getToolingName) + .leftJoin(BaseToolingInfo.class, BaseToolingInfo::getToolingId, ProdProductPlanDetail::getToolingId) + + //班次连表查询名称 + .select(BaseShiftInfo::getShiftName) + .leftJoin(BaseShiftInfo.class, BaseShiftInfo::getShiftId, ProdProductPlanDetail::getShiftId) + + //班组连表查询名称 + .select(BaseClassTeamInfo::getTeamName) + .leftJoin(BaseClassTeamInfo.class, BaseClassTeamInfo::getClassTeamId, ProdProductPlanDetail::getClassTeamId) + +/* //计划连表查询编号 + .select(ProdPlanInfo::getPlanCode)//已存在plancode + .leftJoin(ProdPlanInfo.class, ProdPlanInfo::getPlanId, ProdProductPlanDetail::getPlanId)*/ + + + //接班 +/* .select(ProdShiftChange::) + .leftJoin(ProdShiftChange.class, ProdShiftChange::getShiftChangeId, ProdProductPlanDetail::getShiftChangeId)*/ + + .eq(bo.getPlanDetailId() != null, ProdProductPlanDetail::getPlanDetailId, bo.getPlanDetailId()) .eq(StringUtils.isNotBlank(bo.getPlanDetailCode()), ProdProductPlanDetail::getPlanDetailCode, bo.getPlanDetailCode()) .eq(bo.getPlanId() != null, ProdProductPlanDetail::getPlanId, bo.getPlanId()) .eq(StringUtils.isNotBlank(bo.getPlanCode()), ProdProductPlanDetail::getPlanCode, bo.getPlanCode()) .eq(StringUtils.isNotBlank(bo.getUserId()), ProdProductPlanDetail::getUserId, bo.getUserId()) .like(StringUtils.isNotBlank(bo.getUserName()), ProdProductPlanDetail::getUserName, bo.getUserName()) - .eq(bo.getClassesId() != null, ProdProductPlanDetail::getClassesId, bo.getClassesId()) - .eq(bo.getTeamId() != null, ProdProductPlanDetail::getTeamId, bo.getTeamId()) + .eq(bo.getShiftId() != null, ProdProductPlanDetail::getShiftId, bo.getShiftId()) + .eq(bo.getClassTeamId() != null, ProdProductPlanDetail::getClassTeamId, bo.getClassTeamId()) .eq(bo.getCompleteAmount() != null, ProdProductPlanDetail::getCompleteAmount, bo.getCompleteAmount()) .eq(bo.getUnitId() != null, ProdProductPlanDetail::getUnitId, bo.getUnitId()) .like(StringUtils.isNotBlank(bo.getUnitName()), ProdProductPlanDetail::getUnitName, bo.getUnitName()) From 3338bb2b4c8966648390b9a3ef11b9a35db52bd3 Mon Sep 17 00:00:00 2001 From: zch Date: Wed, 12 Mar 2025 16:56:06 +0800 Subject: [PATCH 16/18] =?UTF-8?q?feat(hwmom-mes):(MeterSphere10014?= =?UTF-8?q?=E3=80=8115)=E3=80=90=E7=89=A9=E6=96=99=E5=A4=A7=E7=B1=BB?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E3=80=91=E6=96=B0=E5=A2=9E=E7=89=A9=E6=96=99?= =?UTF-8?q?=E5=A4=A7=E7=B1=BB=E4=BF=A1=E6=81=AF=EF=BC=8C=E5=A4=87=E6=B3=A8?= =?UTF-8?q?=E4=B8=8D=E6=98=AF=E5=BF=85=E5=A1=AB=E9=A1=B9=EF=BC=8C=E7=A1=AE?= =?UTF-8?q?=E5=AE=9A=E6=8F=90=E7=A4=BA=EF=BC=9A=E2=80=9C=E5=A4=87=E6=B3=A8?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E4=B8=BA=E7=A9=BA=E2=80=9D=E3=80=81=E3=80=90?= =?UTF-8?q?=E7=89=A9=E6=96=99=E7=B1=BB=E5=9E=8B=E4=BF=A1=E6=81=AF=E3=80=91?= =?UTF-8?q?=E7=89=A9=E6=96=99=E7=B1=BB=E5=9E=8B=E5=90=8D=E7=A7=B0=EF=BC=8C?= =?UTF-8?q?=E5=94=AF=E4=B8=80=EF=BC=8C=E4=B8=8D=E5=85=81=E8=AE=B8=E9=87=8D?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 BaseMaterialTypeServiceImpl 中增加物料类别名称的唯一性校验 - 修改 BaseDeviceTypeBo 和 BaseMaterialCategoryBo 中的“备注”校验注解 - 移除不必要的备注字段校验 - 修改设备大类 ID 的校验错误信息 --- .../dromara/mes/domain/bo/BaseDeviceTypeBo.java | 8 ++++---- .../mes/domain/bo/BaseMaterialCategoryBo.java | 2 +- .../impl/BaseMaterialTypeServiceImpl.java | 16 ++++++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseDeviceTypeBo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseDeviceTypeBo.java index 81a7602b..fce67663 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseDeviceTypeBo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseDeviceTypeBo.java @@ -47,25 +47,25 @@ public class BaseDeviceTypeBo extends BaseEntity { /** * 祖级列表 */ - @NotBlank(message = "祖级列表不能为空", groups = { AddGroup.class, EditGroup.class }) +/* @NotBlank(message = "祖级列表不能为空", groups = { AddGroup.class, EditGroup.class })*/ private String ancestors; /** * 设备大类ID(大类ID(关联base_category表category_type为2的)) */ - @NotNull(message = "设备大类ID(大类ID(关联base_category表category_type为2的))不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "设备大类不能为空", groups = { AddGroup.class, EditGroup.class }) private Long categoryId; /** * 激活标识(1是 0否) */ - @NotBlank(message = "激活标识(1是 0否)不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "激活标识不能为空", groups = { AddGroup.class, EditGroup.class }) private String activeFlag; /** * 备注 */ - @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) +/* @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })*/ private String remark; diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseMaterialCategoryBo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseMaterialCategoryBo.java index 224dd65f..5d48a16c 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseMaterialCategoryBo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/BaseMaterialCategoryBo.java @@ -47,7 +47,7 @@ public class BaseMaterialCategoryBo extends BaseEntity { /** * 备注 */ - @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) +/* @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })*/ private String remark; diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialTypeServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialTypeServiceImpl.java index b196fdd4..bd5ff3b3 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialTypeServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/BaseMaterialTypeServiceImpl.java @@ -129,6 +129,8 @@ public class BaseMaterialTypeServiceImpl implements IBaseMaterialTypeService { */ private void validEntityBeforeSave(BaseMaterialType entity){ //TODO 做一些数据校验,如唯一约束 + + //编号校验 if (StringUtils.isNotBlank(entity.getMatrialTypeCode())) { BaseMaterialTypeBo query = new BaseMaterialTypeBo(); query.setMatrialTypeCode(entity.getMatrialTypeCode()); @@ -138,6 +140,20 @@ public class BaseMaterialTypeServiceImpl implements IBaseMaterialTypeService { throw new ServiceException("编码已存在"); } } + + if (StringUtils.isNotBlank(entity.getMatrialTypeName())) { + BaseMaterialTypeBo query = new BaseMaterialTypeBo(); + query.setMatrialTypeName(entity.getMatrialTypeName()); + MPJLambdaWrapper lqw = JoinWrappers.lambda(BaseMaterialType.class) + .selectAll(BaseMaterialType.class) + .eq(StringUtils.isNotBlank(query.getMatrialTypeName()),BaseMaterialType::getMatrialTypeName, query.getMatrialTypeName()); + BaseMaterialType baseMaterialType = baseMapper.selectOne(lqw); + if (baseMaterialType != null + && !baseMaterialType.getMatrialTypeId().equals(entity.getMatrialTypeId())) { + throw new ServiceException("名称已存在"); + } + } + } /** From 7b904049cc624e649fea00961d1e9ad7c91352e9 Mon Sep 17 00:00:00 2001 From: yinq Date: Wed, 12 Mar 2025 17:50:18 +0800 Subject: [PATCH 17/18] =?UTF-8?q?update=20=E6=B7=BB=E5=8A=A0=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DmsDeviceModeParameterController.java | 116 ++++++++++++++ .../dms/domain/DmsDeviceModeParameter.java | 75 ++++++++++ .../domain/bo/DmsDeviceModeParameterBo.java | 77 ++++++++++ .../domain/vo/DmsDeviceModeParameterVo.java | 95 ++++++++++++ .../mapper/DmsDeviceModeParameterMapper.java | 15 ++ .../IDmsDeviceModeParameterService.java | 69 +++++++++ .../DmsDeviceModeParameterServiceImpl.java | 141 ++++++++++++++++++ .../dms/DmsDeviceModeParameterMapper.xml | 7 + 8 files changed, 595 insertions(+) create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeParameterController.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeParameter.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeParameterBo.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeParameterVo.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeParameterMapper.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeParameterService.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeParameterServiceImpl.java create mode 100644 ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeParameterMapper.xml diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeParameterController.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeParameterController.java new file mode 100644 index 00000000..18c90616 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeParameterController.java @@ -0,0 +1,116 @@ +package org.dromara.dms.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.dms.domain.vo.DmsDeviceModeParameterVo; +import org.dromara.dms.domain.bo.DmsDeviceModeParameterBo; +import org.dromara.dms.service.IDmsDeviceModeParameterService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 设备参数 + * 前端访问路由地址为:/dms/deviceModeParameter + * + * @author Yinq + * @date 2025-03-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/deviceModeParameter") +public class DmsDeviceModeParameterController extends BaseController { + + private final IDmsDeviceModeParameterService dmsDeviceModeParameterService; + + /** + * 查询设备参数列表 + */ + @SaCheckPermission("dms:deviceModeParameter:list") + @GetMapping("/list") + public TableDataInfo list(DmsDeviceModeParameterBo bo, PageQuery pageQuery) { + return dmsDeviceModeParameterService.queryPageList(bo, pageQuery); + } + + /** + * 导出设备参数列表 + */ + @SaCheckPermission("dms:deviceModeParameter:export") + @Log(title = "设备参数", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(DmsDeviceModeParameterBo bo, HttpServletResponse response) { + List list = dmsDeviceModeParameterService.queryList(bo); + ExcelUtil.exportExcel(list, "设备参数", DmsDeviceModeParameterVo.class, response); + } + + /** + * 获取设备参数详细信息 + * + * @param modeParameterId 主键 + */ + @SaCheckPermission("dms:deviceModeParameter:query") + @GetMapping("/{modeParameterId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long modeParameterId) { + return R.ok(dmsDeviceModeParameterService.queryById(modeParameterId)); + } + + /** + * 新增设备参数 + */ + @SaCheckPermission("dms:deviceModeParameter:add") + @Log(title = "设备参数", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody DmsDeviceModeParameterBo bo) { + return toAjax(dmsDeviceModeParameterService.insertByBo(bo)); + } + + /** + * 修改设备参数 + */ + @SaCheckPermission("dms:deviceModeParameter:edit") + @Log(title = "设备参数", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody DmsDeviceModeParameterBo bo) { + return toAjax(dmsDeviceModeParameterService.updateByBo(bo)); + } + + /** + * 删除设备参数 + * + * @param modeParameterIds 主键串 + */ + @SaCheckPermission("dms:deviceModeParameter:remove") + @Log(title = "设备参数", businessType = BusinessType.DELETE) + @DeleteMapping("/{modeParameterIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] modeParameterIds) { + return toAjax(dmsDeviceModeParameterService.deleteWithValidByIds(List.of(modeParameterIds), true)); + } + + + /** + * 下拉框查询设备参数列表 + */ + @GetMapping("/getDmsDeviceModeParameterList") + public R> getDmsDeviceModeParameterList(DmsDeviceModeParameterBo bo) { + List list = dmsDeviceModeParameterService.queryList(bo); + return R.ok(list); + } +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeParameter.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeParameter.java new file mode 100644 index 00000000..a472f4c4 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeParameter.java @@ -0,0 +1,75 @@ +package org.dromara.dms.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 设备参数对象 dms_device_mode_parameter + * + * @author Yinq + * @date 2025-03-12 + */ +@Data +@TableName("dms_device_mode_parameter") +public class DmsDeviceModeParameter { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 设备属性参数ID + */ + @TableId(value = "mode_parameter_id", type = IdType.AUTO) + private Long modeParameterId; + + /** + * 设备模型功能ID,关联表hw_device_mode_function的字段mode_function_id + */ + private Long modeFunctionId; + + /** + * 设备属性参数ID,关联本表的字段mode_parameter_id。如果数据类型为struct类型,定义json参数时需要用此字段 + */ + private Long releatedParameterId; + + /** + * 参数类型(1、输入参数,2、输出参数) + */ + private String parameterType; + + /** + * 参数名称 + */ + private String parameterName; + + /** + * 标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符) + */ + private String parameterIdentifier; + + /** + * 数据类型(在平台字典表中定义) + */ + private Long dataType; + + /** + * 数据定义 + */ + private String dataDefinition; + + /** + * 单位 + */ + private String propertyUnit; + + /** + * 预留字段,步长 + */ + private Long propertyStep; + + +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeParameterBo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeParameterBo.java new file mode 100644 index 00000000..2583de03 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeParameterBo.java @@ -0,0 +1,77 @@ +package org.dromara.dms.domain.bo; + +import org.dromara.dms.domain.DmsDeviceModeParameter; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 设备参数业务对象 dms_device_mode_parameter + * + * @author Yinq + * @date 2025-03-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = DmsDeviceModeParameter.class, reverseConvertGenerate = false) +public class DmsDeviceModeParameterBo extends BaseEntity { + + /** + * 设备属性参数ID + */ + private Long modeParameterId; + + /** + * 设备模型功能ID,关联表hw_device_mode_function的字段mode_function_id + */ + private Long modeFunctionId; + + /** + * 设备属性参数ID,关联本表的字段mode_parameter_id。如果数据类型为struct类型,定义json参数时需要用此字段 + */ + private Long releatedParameterId; + + /** + * 参数类型(1、输入参数,2、输出参数) + */ + @NotBlank(message = "参数类型(1、输入参数,2、输出参数)不能为空", groups = {AddGroup.class, EditGroup.class}) + private String parameterType; + + /** + * 参数名称 + */ + @NotBlank(message = "参数名称不能为空", groups = {AddGroup.class, EditGroup.class}) + private String parameterName; + + /** + * 标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符) + */ + @NotBlank(message = "标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符)不能为空", groups = {AddGroup.class, EditGroup.class}) + private String parameterIdentifier; + + /** + * 数据类型(在平台字典表中定义) + */ + private Long dataType; + + /** + * 数据定义 + */ + private String dataDefinition; + + /** + * 单位 + */ + private String propertyUnit; + + /** + * 预留字段,步长 + */ + private Long propertyStep; + + +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeParameterVo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeParameterVo.java new file mode 100644 index 00000000..e18a3f88 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeParameterVo.java @@ -0,0 +1,95 @@ +package org.dromara.dms.domain.vo; + +import org.dromara.dms.domain.DmsDeviceModeParameter; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 设备参数视图对象 dms_device_mode_parameter + * + * @author Yinq + * @date 2025-03-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = DmsDeviceModeParameter.class) +public class DmsDeviceModeParameterVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 设备属性参数ID + */ + @ExcelProperty(value = "设备属性参数ID") + private Long modeParameterId; + + /** + * 设备模型功能ID,关联表hw_device_mode_function的字段mode_function_id + */ + @ExcelProperty(value = "设备模型功能ID,关联表hw_device_mode_function的字段mode_function_id") + private Long modeFunctionId; + + /** + * 设备属性参数ID,关联本表的字段mode_parameter_id。如果数据类型为struct类型,定义json参数时需要用此字段 + */ + @ExcelProperty(value = "设备属性参数ID,关联本表的字段mode_parameter_id。如果数据类型为struct类型,定义json参数时需要用此字段") + private Long releatedParameterId; + + /** + * 参数类型(1、输入参数,2、输出参数) + */ + @ExcelProperty(value = "参数类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dms_parameter_type") + private String parameterType; + + /** + * 参数名称 + */ + @ExcelProperty(value = "参数名称") + private String parameterName; + + /** + * 标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符) + */ + @ExcelProperty(value = "标识符", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "支=持大小写字母、数字和下划线,对外暂时不超过50个字符") + private String parameterIdentifier; + + /** + * 数据类型(在平台字典表中定义) + */ + @ExcelProperty(value = "数据类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dms_data_type") + private Long dataType; + + /** + * 数据定义 + */ + @ExcelProperty(value = "数据定义") + private String dataDefinition; + + /** + * 单位 + */ + @ExcelProperty(value = "单位") + private String propertyUnit; + + /** + * 预留字段,步长 + */ + @ExcelProperty(value = "预留字段,步长") + private Long propertyStep; + + +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeParameterMapper.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeParameterMapper.java new file mode 100644 index 00000000..52516790 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeParameterMapper.java @@ -0,0 +1,15 @@ +package org.dromara.dms.mapper; + +import org.dromara.dms.domain.DmsDeviceModeParameter; +import org.dromara.dms.domain.vo.DmsDeviceModeParameterVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 设备参数Mapper接口 + * + * @author Yinq + * @date 2025-03-12 + */ +public interface DmsDeviceModeParameterMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeParameterService.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeParameterService.java new file mode 100644 index 00000000..66ccd30b --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeParameterService.java @@ -0,0 +1,69 @@ +package org.dromara.dms.service; + +import org.dromara.dms.domain.DmsDeviceModeParameter; +import org.dromara.dms.domain.vo.DmsDeviceModeParameterVo; +import org.dromara.dms.domain.bo.DmsDeviceModeParameterBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 设备参数Service接口 + * + * @author Yinq + * @date 2025-03-12 + */ +public interface IDmsDeviceModeParameterService { + + /** + * 查询设备参数 + * + * @param modeParameterId 主键 + * @return 设备参数 + */ + DmsDeviceModeParameterVo queryById(Long modeParameterId); + + /** + * 分页查询设备参数列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设备参数分页列表 + */ + TableDataInfo queryPageList(DmsDeviceModeParameterBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的设备参数列表 + * + * @param bo 查询条件 + * @return 设备参数列表 + */ + List queryList(DmsDeviceModeParameterBo bo); + + /** + * 新增设备参数 + * + * @param bo 设备参数 + * @return 是否新增成功 + */ + Boolean insertByBo(DmsDeviceModeParameterBo bo); + + /** + * 修改设备参数 + * + * @param bo 设备参数 + * @return 是否修改成功 + */ + Boolean updateByBo(DmsDeviceModeParameterBo bo); + + /** + * 校验并批量删除设备参数信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeParameterServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeParameterServiceImpl.java new file mode 100644 index 00000000..755b4ba5 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeParameterServiceImpl.java @@ -0,0 +1,141 @@ +package org.dromara.dms.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.dms.domain.bo.DmsDeviceModeParameterBo; +import org.dromara.dms.domain.vo.DmsDeviceModeParameterVo; +import org.dromara.dms.domain.DmsDeviceModeParameter; +import org.dromara.dms.mapper.DmsDeviceModeParameterMapper; +import org.dromara.dms.service.IDmsDeviceModeParameterService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 设备参数Service业务层处理 + * + * @author Yinq + * @date 2025-03-12 + */ +@RequiredArgsConstructor +@Service +public class DmsDeviceModeParameterServiceImpl implements IDmsDeviceModeParameterService { + + private final DmsDeviceModeParameterMapper baseMapper; + + /** + * 查询设备参数 + * + * @param modeParameterId 主键 + * @return 设备参数 + */ + @Override + public DmsDeviceModeParameterVo queryById(Long modeParameterId) { + return baseMapper.selectVoById(modeParameterId); + } + + /** + * 分页查询设备参数列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设备参数分页列表 + */ + @Override + public TableDataInfo queryPageList(DmsDeviceModeParameterBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的设备参数列表 + * + * @param bo 查询条件 + * @return 设备参数列表 + */ + @Override + public List queryList(DmsDeviceModeParameterBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(DmsDeviceModeParameterBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(DmsDeviceModeParameter.class) + .selectAll(DmsDeviceModeParameter.class) + .eq(bo.getModeParameterId() != null, DmsDeviceModeParameter::getModeParameterId, bo.getModeParameterId()) + .eq(bo.getModeFunctionId() != null, DmsDeviceModeParameter::getModeFunctionId, bo.getModeFunctionId()) + .eq(bo.getReleatedParameterId() != null, DmsDeviceModeParameter::getReleatedParameterId, bo.getReleatedParameterId()) + .eq(StringUtils.isNotBlank(bo.getParameterType()), DmsDeviceModeParameter::getParameterType, bo.getParameterType()) + .like(StringUtils.isNotBlank(bo.getParameterName()), DmsDeviceModeParameter::getParameterName, bo.getParameterName()) + .eq(StringUtils.isNotBlank(bo.getParameterIdentifier()), DmsDeviceModeParameter::getParameterIdentifier, bo.getParameterIdentifier()) + .eq(bo.getDataType() != null, DmsDeviceModeParameter::getDataType, bo.getDataType()) + .eq(StringUtils.isNotBlank(bo.getDataDefinition()), DmsDeviceModeParameter::getDataDefinition, bo.getDataDefinition()) + .eq(StringUtils.isNotBlank(bo.getPropertyUnit()), DmsDeviceModeParameter::getPropertyUnit, bo.getPropertyUnit()) + .eq(bo.getPropertyStep() != null, DmsDeviceModeParameter::getPropertyStep, bo.getPropertyStep()) + .orderByDesc(DmsDeviceModeParameter::getModeParameterId); + return lqw; + } + + /** + * 新增设备参数 + * + * @param bo 设备参数 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(DmsDeviceModeParameterBo bo) { + DmsDeviceModeParameter add = MapstructUtils.convert(bo, DmsDeviceModeParameter.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setModeParameterId(add.getModeParameterId()); + } + return flag; + } + + /** + * 修改设备参数 + * + * @param bo 设备参数 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(DmsDeviceModeParameterBo bo) { + DmsDeviceModeParameter update = MapstructUtils.convert(bo, DmsDeviceModeParameter.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(DmsDeviceModeParameter entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除设备参数信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeParameterMapper.xml b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeParameterMapper.xml new file mode 100644 index 00000000..69323a23 --- /dev/null +++ b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeParameterMapper.xml @@ -0,0 +1,7 @@ + + + + + From 1aa787d50d096885c3f7e4f60452c4ef13dd4e20 Mon Sep 17 00:00:00 2001 From: xs Date: Thu, 13 Mar 2025 09:19:10 +0800 Subject: [PATCH 18/18] =?UTF-8?q?1.2.7:=20=E6=97=B6=E5=BA=8F=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93influxdb=E6=A8=A1=E5=9D=97=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tsdb/controller/InfluxDbController.java | 9 +++----- .../tsdb/domain/bo/InfluxMeasurementBo.java | 23 +++++++++++++++++++ .../tsdb/service/IInfluxDbService.java | 10 +++----- .../service/impl/InfluxDbServiceImpl.java | 16 +++++-------- 4 files changed, 35 insertions(+), 23 deletions(-) create mode 100644 ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/domain/bo/InfluxMeasurementBo.java diff --git a/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/controller/InfluxDbController.java b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/controller/InfluxDbController.java index 9c74366b..7d5c7b9d 100644 --- a/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/controller/InfluxDbController.java +++ b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/controller/InfluxDbController.java @@ -1,5 +1,6 @@ package org.dromara.tsdb.controller; +import org.dromara.tsdb.domain.bo.InfluxMeasurementBo; import org.dromara.tsdb.service.IInfluxDbService; import org.influxdb.dto.QueryResult; import org.springframework.beans.factory.annotation.Autowired; @@ -16,12 +17,8 @@ public class InfluxDbController { * 写入数据到InfluxDB */ @PostMapping("/write") - public String writeData(@RequestParam String measurement, - @RequestParam String tagKey, - @RequestParam String tagValue, - @RequestParam String fieldKey, - @RequestParam String fieldValue) { - influxDbService.writeData(measurement, tagKey, tagValue, fieldKey, fieldValue); + public String writeData(@RequestBody InfluxMeasurementBo influxMeasurementBo) { + influxDbService.writeData(influxMeasurementBo); return "Data written to InfluxDB successfully!"; } diff --git a/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/domain/bo/InfluxMeasurementBo.java b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/domain/bo/InfluxMeasurementBo.java new file mode 100644 index 00000000..b248fa06 --- /dev/null +++ b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/domain/bo/InfluxMeasurementBo.java @@ -0,0 +1,23 @@ +package org.dromara.tsdb.domain.bo; + +import lombok.Data; + +@Data +public class InfluxMeasurementBo { + + /** @param measurement 表名 + * @param tagKey 标签键 + * @param tagValue 标签值 + * @param fieldKey 字段键 + * @param fieldValue 字段值*/ + private String measurement; + + private String tagKey; + + private String tagValue; + + private String fieldKey; + + private String fieldValue; + +} diff --git a/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/IInfluxDbService.java b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/IInfluxDbService.java index f4f065d8..ecd2b989 100644 --- a/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/IInfluxDbService.java +++ b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/IInfluxDbService.java @@ -1,18 +1,14 @@ package org.dromara.tsdb.service; +import org.dromara.tsdb.domain.bo.InfluxMeasurementBo; import org.influxdb.dto.QueryResult; public interface IInfluxDbService { /** * 写入数据到InfluxDB - * - * @param measurement 表名 - * @param tagKey 标签键 - * @param tagValue 标签值 - * @param fieldKey 字段键 - * @param fieldValue 字段值 + * @param influxMeasurementBo */ - public void writeData(String measurement, String tagKey, String tagValue, String fieldKey, String fieldValue); + public void writeData(InfluxMeasurementBo influxMeasurementBo); /** * 查询数据 diff --git a/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/impl/InfluxDbServiceImpl.java b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/impl/InfluxDbServiceImpl.java index 6a2dc170..de198af2 100644 --- a/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/impl/InfluxDbServiceImpl.java +++ b/ruoyi-modules/hwmom-tsdb/src/main/java/org/dromara/tsdb/service/impl/InfluxDbServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.tsdb.service.impl; +import org.dromara.tsdb.domain.bo.InfluxMeasurementBo; import org.dromara.tsdb.service.IInfluxDbService; import org.influxdb.InfluxDB; import org.influxdb.dto.Point; @@ -18,18 +19,13 @@ public class InfluxDbServiceImpl implements IInfluxDbService { /** * 写入数据到InfluxDB - * - * @param measurement 表名 - * @param tagKey 标签键 - * @param tagValue 标签值 - * @param fieldKey 字段键 - * @param fieldValue 字段值 + * @param influxMeasurementBo */ @Override - public void writeData(String measurement, String tagKey, String tagValue, String fieldKey, String fieldValue) { - Point point = Point.measurement(measurement) - .tag(tagKey, tagValue) - .addField(fieldKey, fieldValue) + public void writeData(InfluxMeasurementBo influxMeasurementBo) { + Point point = Point.measurement(influxMeasurementBo.getMeasurement()) + .tag(influxMeasurementBo.getTagKey(), influxMeasurementBo.getTagValue()) + .addField(influxMeasurementBo.getFieldKey(), influxMeasurementBo.getFieldValue()) .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .build(); influxDB.write(point);