diff --git a/pom.xml b/pom.xml index 456be637..fd5c0f8f 100644 --- a/pom.xml +++ b/pom.xml @@ -91,17 +91,15 @@ dev - 192.168.24.101:8848 - 192.168.24.101:4560 - - + by.missmoc.top:8848 + by.missmoc.top:4560 DEFAULT_GROUP DEFAULT_GROUP nacos nacos - + prod @@ -369,17 +367,17 @@ ${mapstruct-plus.version} - - - - - + + com.hik + examples + ${hik-sdk.version} + - - - - - + + com.hik + jna + ${hik-sdk.version} + diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java index 3f30c42a..f6359330 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java @@ -1,10 +1,14 @@ package org.dromara.auth.controller; import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import org.springframework.beans.BeanUtils; import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jodd.bean.BeanUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthResponse; @@ -37,12 +41,14 @@ import org.dromara.system.api.RemoteSocialService; import org.dromara.system.api.RemoteTenantService; import org.dromara.system.api.domain.vo.RemoteClientVo; import org.dromara.system.api.domain.vo.RemoteTenantVo; +import org.dromara.system.api.model.LoginUser; import org.springframework.web.bind.annotation.*; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -104,9 +110,22 @@ public class TokenController { scheduledExecutorService.schedule(() -> { remoteMessageService.publishMessage(List.of(userId), "欢迎登录RuoYi-Cloud-Plus微服务管理系统"); }, 3, TimeUnit.SECONDS); + if (loginBody.getRetUrl()!=null){ + return R.f(loginBody.getRetUrl()+"?token="+loginVo.getAccessToken()); + } return R.ok(loginVo); } + /** + * 校验token + * @param token + * @return + */ + @RequestMapping("/token/check") + public R checkToken(String token) { + return R.ok(LoginHelper.getLoginUser(token)); + } + /** * 第三方登录请求 * diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/IAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/IAuthStrategy.java index 28307c38..1a59586c 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/service/IAuthStrategy.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/IAuthStrategy.java @@ -1,8 +1,14 @@ package org.dromara.auth.service; +import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.stp.parameter.SaLoginParameter; import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.PasswordLoginBody; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.api.domain.vo.RemoteClientVo; /** diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java index 625f58be..4421fe89 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java @@ -24,6 +24,11 @@ public class R implements Serializable { */ public static final int SUCCESS = 200; + /** + * 跳转 + */ + public static final int FORBIDDEN = 403; + /** * 失败 */ @@ -43,6 +48,9 @@ public class R implements Serializable { * 数据对象 */ private T data; + public static R f(String url) { + return restResult(null, FORBIDDEN, url); + } public static R ok() { return restResult(null, SUCCESS, "操作成功"); diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java index ee612fdb..69e8e36d 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java @@ -40,4 +40,9 @@ public class LoginBody { */ private String uuid; + /** + * 回调地址 + */ + private String retUrl; + } diff --git a/ruoyi-modules/Property/pom.xml b/ruoyi-modules/Property/pom.xml index 83cbc501..40ad288a 100644 --- a/ruoyi-modules/Property/pom.xml +++ b/ruoyi-modules/Property/pom.xml @@ -17,13 +17,6 @@ - - - - - - - org.dromara ruoyi-common-nacos diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CostCarChargeController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CostCarChargeController.java index b469a15c..0c1336a9 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CostCarChargeController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CostCarChargeController.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.property.domain.bo.CostChargeReturnFeeBo; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -80,6 +81,15 @@ public class CostCarChargeController extends BaseController { return toAjax(costCarChargeService.insertByBo(bo)); } + /** + * 车辆退费接口 + * @param bo + * @return + */ + @PostMapping("/returnFee") + public R returnFree( @RequestBody CostChargeReturnFeeBo bo) { + return toAjax(costCarChargeService.returnFree(bo)); + } /** * 修改费用-车辆收费 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CostHouseChargeController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CostHouseChargeController.java index 26d4f29c..ee46a9c6 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CostHouseChargeController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CostHouseChargeController.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.property.domain.bo.CostChargeReturnFeeBo; import org.dromara.property.domain.vo.CostHouseChargeDetailVo; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; @@ -80,6 +81,10 @@ public class CostHouseChargeController extends BaseController { public R add(@Validated(AddGroup.class) @RequestBody CostHouseChargeBo bo) { return toAjax(costHouseChargeService.insertByBo(bo)); } + @PostMapping("/returnFee") + public R returnFree( @RequestBody CostChargeReturnFeeBo bo) { + return toAjax(costHouseChargeService.returnFree(bo)); + } /** * 修改房屋收费 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CostMeterWaterController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CostMeterWaterController.java index f63a9fb4..9cd89f4f 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CostMeterWaterController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CostMeterWaterController.java @@ -68,7 +68,17 @@ public class CostMeterWaterController extends BaseController { @PathVariable("id") Long id) { return R.ok(costMeterWaterService.queryById(id)); } + /** + * 获取上月费用详情 + * + * + */ + @GetMapping("/ultimoWater/{roomId}") + public R getUltimoWater(@NotNull(message = "房间id不能为空") + @PathVariable("roomId") Long roomId) { + return R.ok(costMeterWaterService.getUltimoWater(roomId)); + } /** * 新增费用-水电抄 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/ServeceCustomerController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/ServeceCustomerController.java new file mode 100644 index 00000000..65e0362a --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/ServeceCustomerController.java @@ -0,0 +1,36 @@ +package org.dromara.property.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.property.domain.bo.ServerBookingBo; +import org.dromara.property.domain.vo.ServeceCustomerCountVo; +import org.dromara.property.domain.vo.ServerBookingVo; +import org.dromara.property.service.IServiceWorkOrdersService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Author:yuyongle + * @Date:2025/7/21 15:25 + * @Description:客户服务控制器 + **/ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/serveceCustomer") +public class ServeceCustomerController { + private final IServiceWorkOrdersService serviceWorkOrdersService; + /** + * 查询客户服务工单看板统计 + */ + @GetMapping("/counts") + public R counts() { + return R.ok(serviceWorkOrdersService.counts()); + } + +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostCarCharge.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostCarCharge.java index 425fa653..f9fa8ef1 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostCarCharge.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostCarCharge.java @@ -59,7 +59,10 @@ public class CostCarCharge extends TenantEntity { * 状态 */ private String state; - + /** + * 缴费状态 + */ + private String chargeStatus; /** * 收费项目 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostHouseCharge.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostHouseCharge.java index 1aac5ee1..5d5a64d8 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostHouseCharge.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostHouseCharge.java @@ -4,6 +4,8 @@ import org.dromara.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; @@ -33,12 +35,18 @@ public class CostHouseCharge extends TenantEntity { * 房屋 */ private Long roomId; - + /** + * 业主 + */ + private Long personId; /** * 收费项目 */ private Long costItemsId; - + /** + * 缴费状态 + */ + private String chargeStatus; /** * 支付方式 */ @@ -52,7 +60,7 @@ public class CostHouseCharge extends TenantEntity { /** * 应收金额 */ - private Long amountReceivable; + private BigDecimal amountReceivable; /** * 计费开始时间 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostPayFeeAudit.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostPayFeeAudit.java index 6ea7a44d..87f9a733 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostPayFeeAudit.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostPayFeeAudit.java @@ -1,5 +1,6 @@ package org.dromara.property.domain; +import lombok.experimental.Accessors; import org.dromara.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; @@ -17,6 +18,7 @@ import java.io.Serial; * @date 2025-07-17 */ @Data +@Accessors(chain = true) @EqualsAndHashCode(callSuper = true) @TableName("cost_pay_fee_audit") public class CostPayFeeAudit extends TenantEntity { @@ -31,9 +33,13 @@ public class CostPayFeeAudit extends TenantEntity { private Long id; /** - * 房屋收费id + * 收费id */ - private Long houseChargeId; + private Long chargeId; + /** + * 收费类型 + */ + private String chargeType; /** * 费用项目id @@ -62,8 +68,6 @@ public class CostPayFeeAudit extends TenantEntity { /** * 缴费时间 - - */ private Date payTime; diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostReturnPayFee.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostReturnPayFee.java index 97cb8805..36a6ca74 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostReturnPayFee.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CostReturnPayFee.java @@ -1,9 +1,12 @@ package org.dromara.property.domain; +import lombok.experimental.Accessors; import org.dromara.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; @@ -16,6 +19,7 @@ import java.io.Serial; * @date 2025-07-17 */ @Data +@Accessors(chain = true) @EqualsAndHashCode(callSuper = true) @TableName("cost_return_pay_fee") public class CostReturnPayFee extends TenantEntity { @@ -28,7 +32,14 @@ public class CostReturnPayFee extends TenantEntity { */ @TableId(value = "id") private Long id; - + /** + * 收费id + */ + private Long chargeId; + /** + * 收费类型 + */ + private String chargeType; /** * 退款单号 */ @@ -57,7 +68,7 @@ public class CostReturnPayFee extends TenantEntity { /** * 支付金额 */ - private Long payAcount; + private BigDecimal payAcount; /** * 支付时间 @@ -74,10 +85,5 @@ public class CostReturnPayFee extends TenantEntity { */ private String remark; - /** - * 搜索值 - */ - private String searchValue; - } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrders.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrders.java index ed5a881c..5fe92a6b 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrders.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrders.java @@ -47,7 +47,7 @@ public class ServiceWorkOrders extends TenantEntity { /** * 状态 */ - private Integer status; + private String status; /** * 派单时间 @@ -55,15 +55,19 @@ public class ServiceWorkOrders extends TenantEntity { private Date dispatchTime; /** - * 发起人姓名 + * 发起人 */ - private String initiatorName; + private String initiatorPeople; /** * 处理人姓名 */ - private String handler; + private long handler; + /** + * 抄送人 + */ + private long ccPeople; /** * 地址 @@ -88,17 +92,7 @@ public class ServiceWorkOrders extends TenantEntity { /** * 是否超时 */ - private Integer isTimeOut; - - /** - * 创建人id - */ - private Long createById; - - /** - * 更新人id - */ - private Long updateById; + private String isTimeOut; } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrdersRecord.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrdersRecord.java new file mode 100644 index 00000000..9e35cc17 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrdersRecord.java @@ -0,0 +1,45 @@ +package org.dromara.property.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 工单接单记录对象 service_work_orders_record + * + * @author mocheng + * @date 2025-07-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("service_work_orders_record") +public class ServiceWorkOrdersRecord extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 工单id + */ + private Long orderId; + + + /** + * 状态(0创建工单,1已派单2已抢单3处理中,4已完成) + */ + private String status; + + /** + * 处理人 + */ + private Long handler; +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrdersType.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrdersType.java index ea18036f..95677afb 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrdersType.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrdersType.java @@ -57,16 +57,6 @@ public class ServiceWorkOrdersType extends TenantEntity { */ private Integer isTransfers; - /** - * 创建人id - */ - private Long createById; - - /** - * 更新人id - */ - private Long updateById; - /** * 搜索值 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostCarChargeBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostCarChargeBo.java index 1dfdc309..e149f6be 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostCarChargeBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostCarChargeBo.java @@ -37,6 +37,7 @@ public class CostCarChargeBo extends BaseEntity { /** * 业主 */ + @NotNull(message = "业主不能为空", groups = { AddGroup.class, EditGroup.class }) private Long personId; /** @@ -49,7 +50,10 @@ public class CostCarChargeBo extends BaseEntity { * 车位 */ private String location; - + /** + * 缴费状态 + */ + private String chargeStatus; /** * 状态 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostChargeReturnFeeBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostChargeReturnFeeBo.java new file mode 100644 index 00000000..c3c658c5 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostChargeReturnFeeBo.java @@ -0,0 +1,37 @@ +package org.dromara.property.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; + +/** + * @Author:yuyongle + * @Date:2025/7/19 13:50 + * @Description: + **/ +@Data +public class CostChargeReturnFeeBo { + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + /** + * 业主 + */ + @NotNull(message = "业主不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long personId; + + /** + * 收费项目 + */ + @NotNull(message = "收费项目不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long costItemsId; + + /** + * 退款原因 + */ + @NotNull(message = "退款原因不能为空", groups = { AddGroup.class, EditGroup.class }) + private String reason; +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostHouseChargeBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostHouseChargeBo.java index 3eee8433..96f5400d 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostHouseChargeBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostHouseChargeBo.java @@ -1,17 +1,16 @@ package org.dromara.property.domain.bo; -import org.dromara.property.domain.CostHouseCharge; -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 jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.property.domain.CostHouseCharge; import java.math.BigDecimal; import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; /** * 房屋收费业务对象 cost_house_charge @@ -35,13 +34,22 @@ public class CostHouseChargeBo extends BaseEntity { */ @NotNull(message = "房屋不能为空", groups = { AddGroup.class, EditGroup.class }) private Long roomId; + /** + * 业主 + */ + @NotNull(message = "业主不能为空", groups = { AddGroup.class, EditGroup.class }) + + private Long personId; /** * 收费项目 */ @NotNull(message = "收费项目不能为空", groups = { AddGroup.class, EditGroup.class }) private Long costItemsId; - + /** + * 缴费状态 + */ + private String chargeStatus; /** * 支付方式 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostPayFeeAuditBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostPayFeeAuditBo.java index 0f6c833f..bc9c9baa 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostPayFeeAuditBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostPayFeeAuditBo.java @@ -31,10 +31,13 @@ public class CostPayFeeAuditBo extends BaseEntity { private Long id; /** - * 房屋收费id + * 收费id */ - @NotNull(message = "房屋收费id不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long houseChargeId; + private Long chargeId; + /** + * 收费类型 + */ + private String chargeType; /** * 费用项目id @@ -65,12 +68,7 @@ public class CostPayFeeAuditBo extends BaseEntity { @NotNull(message = "应收金额不能为空", groups = { AddGroup.class, EditGroup.class }) private BigDecimal receivableAmount; - /** - * 缴费时间 - - */ - @NotNull(message = "缴费时间不能为空", groups = { AddGroup.class, EditGroup.class }) private Date payTime; /** diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostReturnPayFeeBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostReturnPayFeeBo.java index a8c6407f..3e5b944d 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostReturnPayFeeBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostReturnPayFeeBo.java @@ -9,6 +9,7 @@ import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; import org.dromara.property.domain.CostReturnPayFee; +import java.math.BigDecimal; import java.util.Date; /** @@ -33,7 +34,14 @@ public class CostReturnPayFeeBo extends BaseEntity { */ @NotBlank(message = "退款单号不能为空", groups = { AddGroup.class, EditGroup.class }) private String returnNo; - + /** + * 收费id + */ + private Long chargeId; + /** + * 收费类型 + */ + private String chargeType; /** * 支付单号 */ @@ -60,12 +68,11 @@ public class CostReturnPayFeeBo extends BaseEntity { /** * 支付金额 */ - private Long payAcount; + private BigDecimal payAcount; /** * 支付时间 */ - @NotNull(message = "支付时间不能为空", groups = { AddGroup.class, EditGroup.class }) private Date payTime; /** diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersBo.java index 4fbf80cf..dc33ecea 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersBo.java @@ -36,17 +36,19 @@ public class ServiceWorkOrdersBo extends BaseEntity { /** * 工单名称 */ + @NotNull(message = "工单名称不能为空", groups = { EditGroup.class }) private String orderName; /** * 工单类型 */ + @NotNull(message = "工单类型不能为空", groups = { EditGroup.class }) private Long type; /** * 状态 */ - private Integer status; + private String status; /** * 派单时间 @@ -62,16 +64,19 @@ public class ServiceWorkOrdersBo extends BaseEntity { /** * 处理人姓名 */ - private String handler; + private Long handler; /** * 地址 */ + @NotNull(message = "地址不能为空", groups = { EditGroup.class }) + private String location; /** * 计划完成时间 */ + @NotNull(message = "计划完成时间不能为空", groups = { EditGroup.class }) private Date planCompleTime; /** @@ -87,18 +92,6 @@ public class ServiceWorkOrdersBo extends BaseEntity { /** * 是否超时 */ - private Integer isTimeOut; - - /** - * 创建人id - */ - private Long createById; - - /** - * 更新人id - */ - private Long updateById; - - + private String isTimeOut; } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersRecordBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersRecordBo.java new file mode 100644 index 00000000..0575d095 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersRecordBo.java @@ -0,0 +1,53 @@ +package org.dromara.property.domain.bo; + +import org.dromara.property.domain.ServiceWorkOrdersRecord; +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.*; + +/** + * 工单接单记录业务对象 service_work_orders_record + * + * @author mocheng + * @date 2025-07-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ServiceWorkOrdersRecord.class, reverseConvertGenerate = false) +public class ServiceWorkOrdersRecordBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 工单id + */ + @NotBlank(message = "工单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private long orderId; + + /** + * 状态(0创建工单,1已派单2已抢单3处理中,4已完成) + */ + @NotBlank(message = "状态(0创建工单,1已派单2已抢单3处理中,4已完成)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String status; + + /** + * 处理人 + */ + @NotNull(message = "处理人不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long handler; + + /** + * 搜索值 + */ + private String searchValue; + + +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersTypeBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersTypeBo.java index d02facda..ab0d9a20 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersTypeBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersTypeBo.java @@ -60,19 +60,4 @@ public class ServiceWorkOrdersTypeBo extends BaseEntity { */ private Integer isTransfers; - /** - * 创建人id - */ - private Long createById; - - /** - * 更新人id - */ - private Long updateById; - - /** - * 搜索值 - */ - private String searchValue; - } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/ChargeStatusEnum.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/ChargeStatusEnum.java new file mode 100644 index 00000000..ebfb9b41 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/ChargeStatusEnum.java @@ -0,0 +1,44 @@ +package org.dromara.property.domain.enums; + +import lombok.Data; +import lombok.Getter; + +/** + * @Author:yuyongle + * @Date:2025/7/19 11:33 + * @Description: + **/ +@Getter +public enum ChargeStatusEnum { + /** + * 缴费待审核 + */ + PAYMENT_IS_SUBJECT_TO_REVIEW("缴费待审核", "1"), + /** + * 月/天 + */ + THE_PAYMENT_WAS_APPROVED("缴费审核通过", "2"), + THE_PAYMENT_REVIEW_FAILED("缴费审核不通过", "3"), + PAID_FEE("已缴费", "4"), + REFUND_PENDING_REVIEW("退费待审核", "5"), + THE_REFUND_HAS_BEEN_APPROVED("已退费审核通过", "6"), + THE_REFUND_REVIEW_IS_NOT_PASSED("退费审核不通过", "7"); + + + + private final String name; + private final String value; + + ChargeStatusEnum(String name, String value) { + this.name = name; + this.value = value; + } + + public String getName() { + return this.name; + } + + public String getValue() { + return this.value; + } +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostCarChargeVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostCarChargeVo.java index 52dc372e..8734ef72 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostCarChargeVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostCarChargeVo.java @@ -71,6 +71,10 @@ public class CostCarChargeVo implements Serializable { @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "wy_cszt") private String state; + /** + * 缴费状态 + */ + private String chargeStatus; /** * 收费项目 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostHouseChargeDetailVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostHouseChargeDetailVo.java index bf5e2686..777a9e9c 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostHouseChargeDetailVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostHouseChargeDetailVo.java @@ -9,6 +9,7 @@ import org.dromara.property.domain.CostItems; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; /** @@ -34,13 +35,24 @@ public class CostHouseChargeDetailVo implements Serializable { */ @ExcelProperty(value = "房屋") private Long roomId; + /** + * 业主 + */ + private Long personId; + /** + * 业主姓名 + */ + private String personName; /** * 收费项目 */ @ExcelProperty(value = "收费项目") private Long costItemsId; - + /** + * 缴费状态 + */ + private String chargeStatus; /** * 支付方式 */ @@ -57,7 +69,7 @@ public class CostHouseChargeDetailVo implements Serializable { * 应收金额 */ @ExcelProperty(value = "应收金额") - private Long amountReceivable; + private BigDecimal amountReceivable; /** * 计费开始时间 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostHouseChargeVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostHouseChargeVo.java index 1b412adc..0cb4e6d5 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostHouseChargeVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostHouseChargeVo.java @@ -1,5 +1,6 @@ package org.dromara.property.domain.vo; +import java.math.BigDecimal; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import org.dromara.property.domain.CostHouseCharge; @@ -41,7 +42,10 @@ public class CostHouseChargeVo implements Serializable { */ @ExcelProperty(value = "房屋") private Long roomId; - + /** + * 业主 + */ + private Long personId; /** * 收费项目 */ @@ -59,12 +63,15 @@ public class CostHouseChargeVo implements Serializable { */ @ExcelProperty(value = "支付周期") private String chargeCycle; - + /** + * 缴费状态 + */ + private String chargeStatus; /** * 应收金额 */ @ExcelProperty(value = "应收金额") - private Long amountReceivable; + private BigDecimal amountReceivable; /** * 计费开始时间 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostPayFeeAuditVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostPayFeeAuditVo.java index ed32952c..e7704979 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostPayFeeAuditVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostPayFeeAuditVo.java @@ -37,10 +37,13 @@ public class CostPayFeeAuditVo implements Serializable { private Long id; /** - * 房屋收费id + * 收费id */ - @ExcelProperty(value = "房屋收费id") - private Long houseChargeId; + private Long chargeId; + /** + * 收费类型 + */ + private String chargeType; /** * 费用类型 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostReturnPayFeeVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostReturnPayFeeVo.java index cf03a1f6..0b6dcb1c 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostReturnPayFeeVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CostReturnPayFeeVo.java @@ -8,6 +8,7 @@ import org.dromara.property.domain.CostReturnPayFee; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; @@ -44,6 +45,7 @@ public class CostReturnPayFeeVo implements Serializable { @ExcelProperty(value = "支付单号") private String payNo; + /** * 退款原因 */ @@ -66,7 +68,7 @@ public class CostReturnPayFeeVo implements Serializable { * 支付金额 */ @ExcelProperty(value = "支付金额") - private Long payAcount; + private BigDecimal payAcount; /** * 支付时间 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServeceCustomerCountVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServeceCustomerCountVo.java new file mode 100644 index 00000000..60034545 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServeceCustomerCountVo.java @@ -0,0 +1,52 @@ +package org.dromara.property.domain.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * @Author:yuyongle + * @Date:2025/7/21 15:29 + * @Description:客户服务工单统计看板 + **/ +@Data +@Accessors(chain = true) +public class ServeceCustomerCountVo implements Serializable { + /** + * 工单总数 + */ + private Integer workOrdersTotal; + /** + * 未派工单总数 + */ + private Integer notWorkOrdersTotal; + /** + * 未半结超时工单 + */ + private Integer novertimeOrdersTotal; + /** + * 处理中工单 + */ + private Integer InHandOrdersTotal; + /** + * 当月工单超时率 + */ + private Integer novertimeOrdersRate; + /** + * 当月工单数 + */ + private Integer monthOrdersTotal; + /** + * 超时工单数 + */ + private Integer outTimeOrdersTotal; + /** + * 当月满意度 + */ + private Integer monthoSatisfaction; + /** + * 满意数 + */ + private Integer satisfaction; +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersInfoVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersInfoVo.java index 72ebaada..40eca36b 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersInfoVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersInfoVo.java @@ -5,10 +5,12 @@ import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.property.domain.ServiceWorkOrders; +import org.dromara.property.domain.ServiceWorkOrdersRecord; import java.io.Serial; import java.io.Serializable; import java.util.Date; +import java.util.List; /** * @Author:yuyongle @@ -51,7 +53,7 @@ public class ServiceWorkOrdersInfoVo implements Serializable { * 状态 */ @ExcelProperty(value = "状态") - private Integer status; + private String status; /** * 派单时间 @@ -60,15 +62,9 @@ public class ServiceWorkOrdersInfoVo implements Serializable { private Date dispatchTime; /** - * 发起人姓名 + * 发起人 */ - @ExcelProperty(value = "发起人姓名") - private String initiatorName; - /** - * 发起人姓名文本 - */ - @ExcelProperty(value = "发起人姓名文本") - private String initiatorNameText; + private String initiatorPeople; /** * 发起人手机号 @@ -80,7 +76,7 @@ public class ServiceWorkOrdersInfoVo implements Serializable { * 处理人姓名 */ @ExcelProperty(value = "处理人姓名") - private String handler; + private Long handler; /** * 处理人姓名文本 */ @@ -120,7 +116,7 @@ public class ServiceWorkOrdersInfoVo implements Serializable { * 是否超时 */ @ExcelProperty(value = "是否超时") - private Integer isTimeOut; + private String isTimeOut; /** * 类型名称 */ @@ -131,4 +127,10 @@ public class ServiceWorkOrdersInfoVo implements Serializable { */ @ExcelProperty(value = "创建时间") private Date createTime; + /** + *工单记录 + */ + private List workOrdersRecordVoList; + + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersRecordInfoVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersRecordInfoVo.java new file mode 100644 index 00000000..2a3b1b79 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersRecordInfoVo.java @@ -0,0 +1,59 @@ +package org.dromara.property.domain.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.property.domain.ServiceWorkOrdersRecord; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 工单接单记录视图对象 service_work_orders_record + * + * @author mocheng + * @date 2025-07-21 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ServiceWorkOrdersRecord.class) +public class ServiceWorkOrdersRecordInfoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 状态(0创建工单,1已派单2已抢单3处理中,4已完成) + */ + @ExcelProperty(value = "状态(0创建工单,1已派单2已抢单3处理中,4已完成)") + private String status; + + /** + * 处理人 + */ + @ExcelProperty(value = "处理人") + private Long handler; + /** + * 处理人 + */ + @ExcelProperty(value = "处理人") + private String handlerName; + /** + * 发起人 + */ + private String initiatorPeople; + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersRecordVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersRecordVo.java new file mode 100644 index 00000000..8471f476 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersRecordVo.java @@ -0,0 +1,62 @@ +package org.dromara.property.domain.vo; + +import org.dromara.property.domain.ServiceWorkOrdersRecord; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.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; + + + +/** + * 工单接单记录视图对象 service_work_orders_record + * + * @author mocheng + * @date 2025-07-21 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ServiceWorkOrdersRecord.class) +public class ServiceWorkOrdersRecordVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 工单id + */ + @ExcelProperty(value = "工单id") + private String orderId; + + /** + * 状态(0创建工单,1已派单2已抢单3处理中,4已完成) + */ + @ExcelProperty(value = "状态(0创建工单,1已派单2已抢单3处理中,4已完成)") + private String status; + + /** + * 处理人 + */ + @ExcelProperty(value = "处理人") + private Long handler; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersTypeVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersTypeVo.java index a590211e..b56c3c54 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersTypeVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersTypeVo.java @@ -68,17 +68,6 @@ public class ServiceWorkOrdersTypeVo implements Serializable { @ExcelProperty(value = "是否支持转单(0支持,1不支持)") private Integer isTransfers; - /** - * 创建人id - */ - @ExcelProperty(value = "创建人id") - private Long createById; - - /** - * 更新人id - */ - @ExcelProperty(value = "更新人id") - private Long updateById; /** * 搜索值 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersVo.java index 163becd8..ac45e2f2 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersVo.java @@ -59,7 +59,7 @@ public class ServiceWorkOrdersVo implements Serializable { * 状态 */ @ExcelProperty(value = "状态") - private int status; + private String status; /** * 派单时间 @@ -68,27 +68,23 @@ public class ServiceWorkOrdersVo implements Serializable { private Date dispatchTime; /** - * 发起人姓名 + * 发起人 */ - @ExcelProperty(value = "发起人姓名") - private String initiatorName; - /** - * 发起人姓名文本 - */ - @ExcelProperty(value = "发起人姓名文本") - private String initiatorNameText; + private String initiatorPeople; + /** + * 处理人姓名 + */ + private long handler; + /** + * 抄送人 + */ + private long ccPeople; /** * 发起人手机号 */ @ExcelProperty(value = "发起人手机号") private String initiatorPhone; - - /** - * 处理人姓名 - */ - @ExcelProperty(value = "处理人姓名") - private String handler; /** * 处理人姓名文本 */ @@ -124,19 +120,7 @@ public class ServiceWorkOrdersVo implements Serializable { * 是否超时 */ @ExcelProperty(value = "是否超时") - private int isTimeOut; - - /** - * 创建人id - */ - @ExcelProperty(value = "创建人id") - private Long createById; - - /** - * 更新人id - */ - @ExcelProperty(value = "更新人id") - private Long updateById; + private String isTimeOut; /** * 搜索值 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/dubbo/RemoteFloorServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/dubbo/RemoteFloorServiceImpl.java index 1d9c0d36..f5b660f1 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/dubbo/RemoteFloorServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/dubbo/RemoteFloorServiceImpl.java @@ -111,6 +111,16 @@ public class RemoteFloorServiceImpl implements RemoteFloorService { @Override public List queryByUnitId(Long unitId){ List tbFloorVo = floorService.queryByUnitId(unitId); - return MapstructUtils.convert(tbFloorVo, RemoteFloorVo.class); + List remoteFloorVos = new ArrayList<>(); + + tbFloorVo.forEach(item -> { + RemoteFloorVo remoteFloorVo = new RemoteFloorVo(); + remoteFloorVo.setId(item.getId()); + remoteFloorVo.setFloorName(item.getFloorName()); + remoteFloorVo.setFloorNumber(item.getFloorNumber()); + remoteFloorVos.add(remoteFloorVo); + }); + + return remoteFloorVos; } } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/ServiceWorkOrdersRecordMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/ServiceWorkOrdersRecordMapper.java new file mode 100644 index 00000000..6fcaff3b --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/ServiceWorkOrdersRecordMapper.java @@ -0,0 +1,17 @@ +package org.dromara.property.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.property.domain.ServiceWorkOrdersRecord; +import org.dromara.property.domain.vo.ServiceWorkOrdersRecordVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 工单接单记录Mapper接口 + * + * @author mocheng + * @date 2025-07-21 + */ +@Mapper +public interface ServiceWorkOrdersRecordMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICostCarChargeService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICostCarChargeService.java index b4435f50..844f1ff6 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICostCarChargeService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICostCarChargeService.java @@ -1,6 +1,6 @@ package org.dromara.property.service; -import org.dromara.property.domain.CostCarCharge; +import org.dromara.property.domain.bo.CostChargeReturnFeeBo; import org.dromara.property.domain.vo.CostCarChargeVo; import org.dromara.property.domain.bo.CostCarChargeBo; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -50,6 +50,12 @@ public interface ICostCarChargeService { */ Boolean insertByBo(CostCarChargeBo bo); + /** + * 车辆退费 + * @param bo + * @return + */ + Boolean returnFree(CostChargeReturnFeeBo bo); /** * 修改费用-车辆收费 * diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICostHouseChargeService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICostHouseChargeService.java index bd998b01..3b8836ab 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICostHouseChargeService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICostHouseChargeService.java @@ -1,6 +1,6 @@ package org.dromara.property.service; -import org.dromara.property.domain.CostHouseCharge; +import org.dromara.property.domain.bo.CostChargeReturnFeeBo; import org.dromara.property.domain.vo.CostHouseChargeDetailVo; import org.dromara.property.domain.vo.CostHouseChargeVo; import org.dromara.property.domain.bo.CostHouseChargeBo; @@ -51,6 +51,14 @@ public interface ICostHouseChargeService { */ Boolean insertByBo(CostHouseChargeBo bo); + /** + * 房屋退费 + * + * @param bo 房屋退费 + * @return 是否修改成功 + */ + Boolean returnFree(CostChargeReturnFeeBo bo); + /** * 修改房屋收费 * diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICostMeterWaterService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICostMeterWaterService.java index e301107c..3370a0ce 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICostMeterWaterService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICostMeterWaterService.java @@ -66,4 +66,10 @@ public interface ICostMeterWaterService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取上月水电详情 + * @return + */ + CostMeterWaterVo getUltimoWater(Long roomId); } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersService.java index 08d66aef..9906d476 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersService.java @@ -3,6 +3,7 @@ package org.dromara.property.service; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.property.domain.bo.ServiceWorkOrdersBo; +import org.dromara.property.domain.vo.ServeceCustomerCountVo; import org.dromara.property.domain.vo.ServiceWorkOrdersInfoVo; import org.dromara.property.domain.vo.ServiceWorkOrdersVo; @@ -66,4 +67,10 @@ public interface IServiceWorkOrdersService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 工单服务看板 + * @return + */ + ServeceCustomerCountVo counts(); } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CleanOrderServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CleanOrderServiceImpl.java index 37cad524..544446f2 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CleanOrderServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CleanOrderServiceImpl.java @@ -1,42 +1,36 @@ package org.dromara.property.service.impl; import cn.hutool.core.date.DateTime; -import cn.idev.excel.event.Order; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.Mapper; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -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.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +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.property.domain.Clean; +import org.dromara.property.domain.CleanOrder; import org.dromara.property.domain.CleanRelation; import org.dromara.property.domain.CleanserverOrder; -import org.dromara.property.domain.vo.CleanserverOrderVo; -import org.dromara.property.mapper.CleanMapper; -import org.dromara.property.mapper.CleanRelationMapper; -import org.dromara.property.mapper.CleanserverOrderMapper; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; import org.dromara.property.domain.bo.CleanOrderBo; import org.dromara.property.domain.vo.CleanOrderVo; -import org.dromara.property.domain.CleanOrder; +import org.dromara.property.mapper.CleanMapper; import org.dromara.property.mapper.CleanOrderMapper; +import org.dromara.property.mapper.CleanRelationMapper; +import org.dromara.property.mapper.CleanserverOrderMapper; import org.dromara.property.service.ICleanOrderService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.stringtemplate.v4.ST; -import java.time.LocalDateTime; -import java.util.*; +import java.util.Collection; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; -import static kotlin.reflect.jvm.internal.impl.builtins.StandardNames.FqNames.list; - /** * 保洁订单Service业务层处理 * @@ -102,7 +96,7 @@ public class CleanOrderServiceImpl implements ICleanOrderService { public TableDataInfo queryPageList(CleanOrderBo bo, PageQuery pageQuery) { // 构造条件查询器,返回的是一个集合 LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw,CleanOrderVo.class); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw, CleanOrderVo.class); // Page result = baseMapper.selectForPage(pageQuery.build(), lqw); return TableDataInfo.build(result); } @@ -158,8 +152,8 @@ public class CleanOrderServiceImpl implements ICleanOrderService { CleanOrder add = new CleanOrder(); validEntityBeforeSave(add); BeanUtils.copyProperties(bo, add); - add.setStarTime(String.valueOf(new DateTime(bo.getStarTime()).toLocalDateTime())); - add.setEndTime(String.valueOf(new DateTime(bo.getEndTime()).toLocalDateTime())); + add.setStarTime(bo.getStarTime()); + add.setEndTime(bo.getEndTime()); add.setIsUnbooking(NOTUNBOOKING); boolean flag = baseMapper.insert(add) > 0; @@ -209,8 +203,8 @@ public class CleanOrderServiceImpl implements ICleanOrderService { public Boolean updateByBo(CleanOrderBo bo) { CleanOrder update = MapstructUtils.convert(bo, CleanOrder.class); validEntityBeforeSave(update); - update.setStarTime(String.valueOf(new DateTime(bo.getStarTime()).toLocalDateTime())); - update.setEndTime(String.valueOf(new DateTime(bo.getStarTime()).toLocalDateTime())); + update.setStarTime(bo.getStarTime()); + update.setEndTime(bo.getStarTime()); return baseMapper.updateById(update) > 0; } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostCarChargeServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostCarChargeServiceImpl.java index e0ea615e..b775aa92 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostCarChargeServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostCarChargeServiceImpl.java @@ -1,5 +1,9 @@ package org.dromara.property.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -9,14 +13,23 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.property.domain.CostHouseCharge; +import org.dromara.property.domain.CostPayFeeAudit; +import org.dromara.property.domain.CostReturnPayFee; +import org.dromara.property.domain.bo.CostChargeReturnFeeBo; +import org.dromara.property.domain.enums.ChargeStatusEnum; +import org.dromara.property.domain.vo.CostHouseChargeVo; import org.dromara.property.domain.vo.CostItemsVo; import org.dromara.property.mapper.CostItemsMapper; +import org.dromara.property.mapper.CostPayFeeAuditMapper; +import org.dromara.property.mapper.CostReturnPayFeeMapper; import org.springframework.stereotype.Service; import org.dromara.property.domain.bo.CostCarChargeBo; import org.dromara.property.domain.vo.CostCarChargeVo; import org.dromara.property.domain.CostCarCharge; import org.dromara.property.mapper.CostCarChargeMapper; import org.dromara.property.service.ICostCarChargeService; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.List; @@ -36,6 +49,8 @@ public class CostCarChargeServiceImpl implements ICostCarChargeService { private final CostCarChargeMapper baseMapper; private final CostItemsMapper costItemsMapper; + private final CostPayFeeAuditMapper costPayFeeAuditMapper; + private final CostReturnPayFeeMapper costReturnPayFeeMapper; /** @@ -98,19 +113,57 @@ public class CostCarChargeServiceImpl implements ICostCarChargeService { * @return 是否新增成功 */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(CostCarChargeBo bo) { CostCarCharge add = MapstructUtils.convert(bo, CostCarCharge.class); CostItemsVo costItemsVo = costItemsMapper.selectVoById(add.getCostItemsId()); BigDecimal unitPrice = costItemsVo.getUnitPrice(); add.setAmountReceivable(unitPrice); + add.setChargeStatus(ChargeStatusEnum.PAYMENT_IS_SUBJECT_TO_REVIEW.getValue()); validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setId(add.getId()); + //新增缴费记录 + var CostPayFeeAudit = new CostPayFeeAudit() + .setChargeId(add.getId()) + .setChargeType("2") + .setItemId(costItemsVo.getId()) + .setStartTime(add.getStarTime()) + .setEndTime(add.getEndTime()) + .setReceivableAmount(add.getAmountReceivable()) + .setState("0"); + costPayFeeAuditMapper.insert(CostPayFeeAudit); } return flag; } + /** + * 车辆退费 + * @param bo + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean returnFree(CostChargeReturnFeeBo bo) { + CostCarCharge costCarCharge = baseMapper.selectById(bo.getId()); + Assert.isTrue(ObjectUtil.isNotEmpty(costCarCharge),"该费用不存在"); + var CostReturnPayFee = new CostReturnPayFee() + .setChargeId(costCarCharge.getId()) + .setChargeType("2") + .setItemId(costCarCharge.getCostItemsId()) + .setReturnNo(RandomUtil.randomNumbers(11)) + .setReason(bo.getReason()) + .setUserId(costCarCharge.getPersonId()) + .setPayNo(costCarCharge.getId().toString()) + .setPayAcount(costCarCharge.getAmountReceivable()) + .setState("0") + ; + costReturnPayFeeMapper.insert(CostReturnPayFee); + costCarCharge.setChargeStatus(ChargeStatusEnum.REFUND_PENDING_REVIEW.getValue()); + return baseMapper.updateById(costCarCharge) > 0; + } + /** * 修改费用-车辆收费 * diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostHouseChargeServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostHouseChargeServiceImpl.java index a4aa0f12..8c23dee8 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostHouseChargeServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostHouseChargeServiceImpl.java @@ -1,6 +1,9 @@ package org.dromara.property.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -10,17 +13,17 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.property.domain.vo.CostHouseChargeDetailVo; -import org.dromara.property.domain.vo.CostItemsVo; -import org.dromara.property.domain.vo.TbRoomVo; -import org.dromara.property.mapper.CostItemsMapper; -import org.dromara.property.mapper.TbRoomMapper; +import org.dromara.property.domain.CostPayFeeAudit; +import org.dromara.property.domain.CostReturnPayFee; +import org.dromara.property.domain.bo.CostChargeReturnFeeBo; +import org.dromara.property.domain.enums.ChargeStatusEnum; +import org.dromara.property.domain.vo.*; +import org.dromara.property.mapper.*; import org.springframework.stereotype.Service; import org.dromara.property.domain.bo.CostHouseChargeBo; -import org.dromara.property.domain.vo.CostHouseChargeVo; import org.dromara.property.domain.CostHouseCharge; -import org.dromara.property.mapper.CostHouseChargeMapper; import org.dromara.property.service.ICostHouseChargeService; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; @@ -42,7 +45,9 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService { private final CostHouseChargeMapper baseMapper; private final CostItemsMapper costItemsMapper; private final TbRoomMapper tbRoomMapper; - + private final CostPayFeeAuditMapper costPayFeeAuditMapper; + private final CostReturnPayFeeMapper costReturnPayFeeMapper; + private final ResidentPersonMapper residentPersonMapper; /** * 查询房屋收费 * @@ -50,13 +55,15 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService { * @return 房屋收费 */ @Override - public CostHouseChargeDetailVo queryById(Long id){ + public CostHouseChargeDetailVo queryById(Long id) { CostHouseChargeVo costHouseChargeVo = baseMapper.selectVoById(id); CostHouseChargeDetailVo costHouseChargeDetailVo = BeanUtil.copyProperties(costHouseChargeVo, CostHouseChargeDetailVo.class); CostItemsVo costItemsVo = costItemsMapper.selectVoById(costHouseChargeDetailVo.getCostItemsId()); - costHouseChargeDetailVo.setCostItemsVo( costItemsVo ); + costHouseChargeDetailVo.setCostItemsVo(costItemsVo); TbRoomVo tbRoomVo = tbRoomMapper.selectVoById(costHouseChargeDetailVo.getRoomId()); costHouseChargeDetailVo.setRoomVo(tbRoomVo); + ResidentPersonVo residentPersonVo = residentPersonMapper.selectVoById(costHouseChargeVo.getPersonId()); + costHouseChargeDetailVo.setPersonName(residentPersonVo.getUserName()); return costHouseChargeDetailVo; } @@ -92,7 +99,6 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService { lqw.orderByAsc(CostHouseCharge::getId); lqw.eq(bo.getRoomId() != null, CostHouseCharge::getRoomId, bo.getRoomId()); lqw.eq(bo.getCostItemsId() != null, CostHouseCharge::getCostItemsId, bo.getCostItemsId()); - lqw.eq(StringUtils.isNotBlank(bo.getPayType()), CostHouseCharge::getPayType, bo.getPayType()); lqw.eq(StringUtils.isNotBlank(bo.getChargeCycle()), CostHouseCharge::getChargeCycle, bo.getChargeCycle()); lqw.eq(bo.getAmountReceivable() != null, CostHouseCharge::getAmountReceivable, bo.getAmountReceivable()); lqw.eq(bo.getStartTime() != null, CostHouseCharge::getStartTime, bo.getStartTime()); @@ -109,6 +115,7 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService { * @return 是否新增成功 */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(CostHouseChargeBo bo) { CostHouseCharge add = MapstructUtils.convert(bo, CostHouseCharge.class); //查询房间面积 @@ -117,26 +124,63 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService { CostItemsVo costItemsVo = costItemsMapper.selectVoById(add.getCostItemsId()); BigDecimal unitPrice = costItemsVo.getUnitPrice(); //向上取整 - if(costItemsVo.getRoundingMode().equals("1")){ - add.setAmountReceivable(area.multiply(unitPrice).add(costItemsVo.getSurcharge()).setScale(Integer.valueOf(costItemsVo.getCurrencyDecimals()), BigDecimal.ROUND_UP).longValue()); + if (costItemsVo.getRoundingMode().equals("1")) { + add.setAmountReceivable(area.multiply(unitPrice).add(costItemsVo.getSurcharge()).setScale(Integer.valueOf(costItemsVo.getCurrencyDecimals()), BigDecimal.ROUND_UP)); } //向下取整 - if(costItemsVo.getRoundingMode().equals("2")){ - add.setAmountReceivable( area.multiply(unitPrice).add(costItemsVo.getSurcharge()).setScale(Integer.valueOf(costItemsVo.getCurrencyDecimals()), BigDecimal.ROUND_DOWN).longValue()); + if (costItemsVo.getRoundingMode().equals("2")) { + add.setAmountReceivable(area.multiply(unitPrice).add(costItemsVo.getSurcharge()).setScale(Integer.valueOf(costItemsVo.getCurrencyDecimals()), BigDecimal.ROUND_DOWN)); } //四舍五入 - if(costItemsVo.getRoundingMode().equals("0")){ - add.setAmountReceivable(area.multiply(unitPrice).add(costItemsVo.getSurcharge()).setScale( Integer.valueOf(costItemsVo.getCurrencyDecimals()), RoundingMode.HALF_UP).longValue()); + if (costItemsVo.getRoundingMode().equals("0")) { + add.setAmountReceivable(area.multiply(unitPrice).add(costItemsVo.getSurcharge()).setScale(Integer.valueOf(costItemsVo.getCurrencyDecimals()), RoundingMode.HALF_UP)); } + add.setChargeStatus(ChargeStatusEnum.PAYMENT_IS_SUBJECT_TO_REVIEW.getValue()); //area validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setId(add.getId()); + //新增缴费记录 + var CostPayFeeAudit = new CostPayFeeAudit() + .setChargeId(add.getId()) + .setChargeType("1") + .setItemId(costItemsVo.getId()) + .setStartTime(add.getStartTime()) + .setEndTime(add.getEndTime()) + .setReceivableAmount(add.getAmountReceivable()) + .setState("0"); + costPayFeeAuditMapper.insert(CostPayFeeAudit); } return flag; } + /** + * 房屋退费 + * + * @param bo 房屋退费 + * @return 是否退费成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean returnFree(CostChargeReturnFeeBo bo) { + CostHouseChargeVo costHouseChargeVo = baseMapper.selectVoById(bo.getId()); + Assert.isTrue(ObjectUtil.isNotEmpty(costHouseChargeVo),"该费用不存在"); + var CostReturnPayFee = new CostReturnPayFee().setItemId(costHouseChargeVo.getCostItemsId()) + .setReturnNo(RandomUtil.randomNumbers(11)) + .setReason(bo.getReason()) + .setItemId(costHouseChargeVo.getCostItemsId()) + .setUserId(costHouseChargeVo.getPersonId()) + .setPayNo(costHouseChargeVo.getId().toString()) + .setPayAcount(costHouseChargeVo.getAmountReceivable()) + .setState("0") + ; + boolean flag = costReturnPayFeeMapper.insert(CostReturnPayFee) > 0; + CostHouseCharge costHouseCharge = BeanUtil.copyProperties(costHouseChargeVo, CostHouseCharge.class); + costHouseCharge.setChargeStatus(ChargeStatusEnum.REFUND_PENDING_REVIEW.getValue()); + return baseMapper.updateById(costHouseCharge) > 0; + } + /** * 修改房屋收费 * @@ -144,6 +188,7 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService { * @return 是否修改成功 */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean updateByBo(CostHouseChargeBo bo) { CostHouseCharge update = MapstructUtils.convert(bo, CostHouseCharge.class); validEntityBeforeSave(update); @@ -153,7 +198,7 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService { /** * 保存前的数据校验 */ - private void validEntityBeforeSave(CostHouseCharge entity){ + private void validEntityBeforeSave(CostHouseCharge entity) { //TODO 做一些数据校验,如唯一约束 } @@ -165,8 +210,10 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService { * @return 是否删除成功 */ @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostMeterWaterServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostMeterWaterServiceImpl.java index c8f8dcb1..777b0a06 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostMeterWaterServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostMeterWaterServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.property.service.impl; +import cn.hutool.core.bean.BeanUtil; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -136,4 +137,18 @@ public class CostMeterWaterServiceImpl implements ICostMeterWaterService { } return baseMapper.deleteByIds(ids) > 0; } + + /** + * 获取上月水电详情 + * @return + */ + @Override + public CostMeterWaterVo getUltimoWater(Long roomId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(CostMeterWater::getRoomId, roomId); + wrapper.orderByDesc(CostMeterWater::getCreateTime); + wrapper.last("LIMIT 1"); + CostMeterWater latestRecord = baseMapper.selectOne(wrapper); + return BeanUtil.copyProperties(latestRecord,CostMeterWaterVo.class); + } } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostPayFeeAuditServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostPayFeeAuditServiceImpl.java index fe2b5a04..5f0c836d 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostPayFeeAuditServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostPayFeeAuditServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.property.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import org.checkerframework.checker.units.qual.C; import org.dromara.common.core.utils.MapstructUtils; @@ -11,12 +12,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.property.domain.CostCarCharge; +import org.dromara.property.domain.CostHouseCharge; import org.dromara.property.domain.CostPayFeeAudit; import org.dromara.property.domain.bo.CostPayFeeAuditBo; +import org.dromara.property.domain.enums.ChargeStatusEnum; import org.dromara.property.domain.vo.*; -import org.dromara.property.mapper.CostItemsMapper; -import org.dromara.property.mapper.CostPayFeeAuditMapper; -import org.dromara.property.mapper.TbRoomMapper; +import org.dromara.property.mapper.*; import org.dromara.property.service.ICostPayFeeAuditService; import org.springframework.stereotype.Service; @@ -40,6 +42,8 @@ public class CostPayFeeAuditServiceImpl implements ICostPayFeeAuditService { private final CostPayFeeAuditMapper baseMapper; private final CostItemsMapper costItemsMapper; private final TbRoomMapper roomMapper; + private final CostHouseChargeMapper coinHouseChargeMapper; + private final CostCarChargeMapper costCarChargeMapper; /** * 查询费用-缴费审核 @@ -49,7 +53,13 @@ public class CostPayFeeAuditServiceImpl implements ICostPayFeeAuditService { */ @Override public CostPayFeeAuditVo queryById(Long id){ - return baseMapper.selectVoById(id); + CostPayFeeAuditVo costPayFeeAuditVo = baseMapper.selectVoById(id); + CostItemsVo costItemsVo = costItemsMapper.selectVoById(costPayFeeAuditVo.getItemId()); + costPayFeeAuditVo.setChargeItem(ObjectUtil.isNotEmpty(costItemsVo)? costItemsVo.getChargeItem() :null ); + costPayFeeAuditVo.setChargeCycle(ObjectUtil.isNotEmpty(costItemsVo)? costItemsVo.getChargeCycle() :null ); + //TbRoomVo roomVo = roomMapper.selectVoById(costPayFeeAuditVo.getChargeId()); + //costPayFeeAuditVo.setRoomNumber(ObjectUtil.isNotEmpty(roomVo)? roomVo.getRoomNumber() :null ); + return costPayFeeAuditVo; } /** @@ -63,12 +73,15 @@ public class CostPayFeeAuditServiceImpl implements ICostPayFeeAuditService { public TableDataInfo queryPageList(CostPayFeeAuditBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + if(CollUtil.isEmpty(result.getRecords())){ + return TableDataInfo.build(result); + } List itemIdList = result.getRecords().stream() .map(vo -> vo.getItemId()) .distinct() .collect(Collectors.toList()); List roomIdList = result.getRecords().stream() - .map(vo -> vo.getHouseChargeId()) + .map(vo -> vo.getChargeId()) .distinct() .collect(Collectors.toList()); List costItemsVoList = costItemsMapper.selectVoByIds(itemIdList); @@ -81,7 +94,7 @@ public class CostPayFeeAuditServiceImpl implements ICostPayFeeAuditService { s.setCostType(ObjectUtil.isNotEmpty(costItemsVo)?costItemsVo.getCostType():null); s.setChargeCycle(ObjectUtil.isNotEmpty(costItemsVo)?costItemsVo.getChargeCycle():null); TbRoomVo tbRoomVo = roomVoList.stream() - .filter(vo -> vo.getId() != null && vo.getId().equals(s.getHouseChargeId())).findFirst().orElse(null); + .filter(vo -> vo.getId() != null && vo.getId().equals(s.getChargeId())).findFirst().orElse(null); s.setRoomNumber(ObjectUtil.isNotEmpty(tbRoomVo)?tbRoomVo.getRoomNumber():null); costPayFeeAuditVoList.add(s); @@ -105,7 +118,7 @@ public class CostPayFeeAuditServiceImpl implements ICostPayFeeAuditService { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.orderByAsc(CostPayFeeAudit::getId); - lqw.eq(bo.getHouseChargeId() != null, CostPayFeeAudit::getHouseChargeId, bo.getHouseChargeId()); + lqw.eq(bo.getChargeId() != null, CostPayFeeAudit::getChargeId, bo.getChargeId()); lqw.eq(bo.getItemId() != null, CostPayFeeAudit::getItemId, bo.getItemId()); lqw.eq(bo.getStartTime() != null, CostPayFeeAudit::getStartTime, bo.getStartTime()); lqw.eq(bo.getEndTime() != null, CostPayFeeAudit::getEndTime, bo.getEndTime()); @@ -134,7 +147,7 @@ public class CostPayFeeAuditServiceImpl implements ICostPayFeeAuditService { } /** - * 修改费用-缴费审核 + * 修改费用-缴费审核修改状态 * * @param bo 费用-缴费审核 * @return 是否修改成功 @@ -142,7 +155,7 @@ public class CostPayFeeAuditServiceImpl implements ICostPayFeeAuditService { @Override public Boolean updateByBo(CostPayFeeAuditBo bo) { CostPayFeeAudit update = MapstructUtils.convert(bo, CostPayFeeAudit.class); - validEntityBeforeSave(update); + validEntityBeforeUpdate(update); return baseMapper.updateById(update) > 0; } @@ -152,6 +165,36 @@ public class CostPayFeeAuditServiceImpl implements ICostPayFeeAuditService { private void validEntityBeforeSave(CostPayFeeAudit entity){ //TODO 做一些数据校验,如唯一约束 } + /** + * 修改前的数据校验 + */ + private void validEntityBeforeUpdate(CostPayFeeAudit entity){ + //TODO 做一些数据校验,如唯一约束 + if(entity.getState().equals("1")){ + if(entity.getChargeType().equals("1")){ + CostHouseCharge costHouseCharge = coinHouseChargeMapper.selectById(entity.getChargeId()); + costHouseCharge.setChargeStatus(ChargeStatusEnum.THE_PAYMENT_WAS_APPROVED.getValue()); + coinHouseChargeMapper.updateById(costHouseCharge); + } + if(entity.getChargeType().equals("2")){ + CostCarCharge costCarCharge = costCarChargeMapper.selectById(entity.getChargeId()); + costCarCharge.setChargeStatus(ChargeStatusEnum.THE_PAYMENT_WAS_APPROVED.getValue()); + costCarChargeMapper.updateById(costCarCharge); + } + } + if(entity.getState().equals("2")){ + if(entity.getChargeType().equals("1")){ + CostHouseCharge costHouseCharge = coinHouseChargeMapper.selectById(entity.getChargeId()); + costHouseCharge.setChargeStatus(ChargeStatusEnum.THE_PAYMENT_REVIEW_FAILED.getValue()); + coinHouseChargeMapper.updateById(costHouseCharge); + } + if(entity.getChargeType().equals("2")){ + CostCarCharge costCarCharge = costCarChargeMapper.selectById(entity.getChargeId()); + costCarCharge.setChargeStatus(ChargeStatusEnum.THE_PAYMENT_REVIEW_FAILED.getValue()); + costCarChargeMapper.updateById(costCarCharge); + } + } + } /** * 校验并批量删除费用-缴费审核信息 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostReturnPayFeeServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostReturnPayFeeServiceImpl.java index 1c0aa394..0971fa67 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostReturnPayFeeServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostReturnPayFeeServiceImpl.java @@ -9,9 +9,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.property.domain.CostCarCharge; +import org.dromara.property.domain.CostHouseCharge; import org.dromara.property.domain.CostReturnPayFee; import org.dromara.property.domain.bo.CostReturnPayFeeBo; +import org.dromara.property.domain.enums.ChargeStatusEnum; import org.dromara.property.domain.vo.CostReturnPayFeeVo; +import org.dromara.property.mapper.CostCarChargeMapper; +import org.dromara.property.mapper.CostHouseChargeMapper; import org.dromara.property.mapper.CostReturnPayFeeMapper; import org.dromara.property.service.ICostReturnPayFeeService; import org.springframework.stereotype.Service; @@ -32,6 +37,8 @@ import java.util.Collection; public class CostReturnPayFeeServiceImpl implements ICostReturnPayFeeService { private final CostReturnPayFeeMapper baseMapper; + private final CostHouseChargeMapper coinHouseChargeMapper; + private final CostCarChargeMapper costCarChargeMapper; /** * 查询费用-抄类型 @@ -112,7 +119,7 @@ public class CostReturnPayFeeServiceImpl implements ICostReturnPayFeeService { @Override public Boolean updateByBo(CostReturnPayFeeBo bo) { CostReturnPayFee update = MapstructUtils.convert(bo, CostReturnPayFee.class); - validEntityBeforeSave(update); + validEntityBeforeUpdate(update); return baseMapper.updateById(update) > 0; } @@ -122,6 +129,36 @@ public class CostReturnPayFeeServiceImpl implements ICostReturnPayFeeService { private void validEntityBeforeSave(CostReturnPayFee entity){ //TODO 做一些数据校验,如唯一约束 } + /** + * 修改前的数据校验 + */ + private void validEntityBeforeUpdate(CostReturnPayFee entity){ + //TODO 做一些数据校验,如唯一约束 + if(entity.getState().equals("1")){ + if(entity.getChargeType().equals("1")){ + CostHouseCharge costHouseCharge = coinHouseChargeMapper.selectById(entity.getChargeId()); + costHouseCharge.setChargeStatus(ChargeStatusEnum. THE_REFUND_HAS_BEEN_APPROVED.getValue()); + coinHouseChargeMapper.updateById(costHouseCharge); + } + if(entity.getChargeType().equals("2")){ + CostCarCharge costCarCharge = costCarChargeMapper.selectById(entity.getChargeId()); + costCarCharge.setChargeStatus(ChargeStatusEnum.THE_REFUND_HAS_BEEN_APPROVED.getValue()); + costCarChargeMapper.updateById(costCarCharge); + } + } + if(entity.getState().equals("2")){ + if(entity.getChargeType().equals("1")){ + CostHouseCharge costHouseCharge = coinHouseChargeMapper.selectById(entity.getChargeId()); + costHouseCharge.setChargeStatus(ChargeStatusEnum.THE_REFUND_REVIEW_IS_NOT_PASSED.getValue()); + coinHouseChargeMapper.updateById(costHouseCharge); + } + if(entity.getChargeType().equals("2")){ + CostCarCharge costCarCharge = costCarChargeMapper.selectById(entity.getChargeId()); + costCarCharge.setChargeStatus(ChargeStatusEnum.THE_REFUND_REVIEW_IS_NOT_PASSED.getValue()); + costCarChargeMapper.updateById(costCarCharge); + } + } + } /** * 校验并批量删除费用-抄类型信息 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionPlanServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionPlanServiceImpl.java index 34a0f75d..8860f09e 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionPlanServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionPlanServiceImpl.java @@ -125,7 +125,6 @@ public class InspectionPlanServiceImpl implements IInspectionPlanService { lqw.eq(StringUtils.isNotBlank(bo.getSignType()), InspectionPlan::getSignType, bo.getSignType()); lqw.eq(StringUtils.isNotBlank(bo.getCanReexamine()), InspectionPlan::getCanReexamine, bo.getCanReexamine()); lqw.like(StringUtils.isNotBlank(bo.getState()), InspectionPlan::getState, bo.getState()); - lqw.eq(StringUtils.isNotBlank(bo.getSearchValue()), InspectionPlan::getSearchValue, bo.getSearchValue()); return lqw; } @@ -147,8 +146,9 @@ public class InspectionPlanServiceImpl implements IInspectionPlanService { if (CollectionUtil.isNotEmpty(inspectionPlanStaffBoList)) { for (InspectionPlanStaffBo staffBo : inspectionPlanStaffBoList) { staffBo.setInspectionPlanId(add.getId()); + InspectionPlanStaff convert = MapstructUtils.convert(staffBo, InspectionPlanStaff.class); + inspectionPlanStaffMapper.insert(convert); } - inspectionPlanStaffMapper.insertBatch(BeanUtil.copyToList(inspectionPlanStaffBoList, InspectionPlanStaff.class)); } } return flag; diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MachineTypeServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MachineTypeServiceImpl.java index eda62d62..ce2e4695 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MachineTypeServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MachineTypeServiceImpl.java @@ -1,24 +1,22 @@ package org.dromara.property.service.impl; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -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.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.property.domain.vo.MachineTypeTreeVo; -import org.springframework.stereotype.Service; -import org.dromara.property.domain.bo.MachineTypeBo; -import org.dromara.property.domain.vo.MachineTypeVo; +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.property.domain.MachineType; +import org.dromara.property.domain.bo.MachineTypeBo; +import org.dromara.property.domain.vo.MachineTypeTreeVo; +import org.dromara.property.domain.vo.MachineTypeVo; import org.dromara.property.mapper.MachineTypeMapper; import org.dromara.property.service.IMachineTypeService; +import org.springframework.stereotype.Service; import java.util.*; @@ -42,7 +40,7 @@ public class MachineTypeServiceImpl implements IMachineTypeService { * @return 设备类型 */ @Override - public MachineTypeVo queryById(Long id){ + public MachineTypeVo queryById(Long id) { return baseMapper.selectVoById(id); } @@ -117,7 +115,7 @@ public class MachineTypeServiceImpl implements IMachineTypeService { /** * 保存前的数据校验 */ - private void validEntityBeforeSave(MachineType entity){ + private void validEntityBeforeSave(MachineType entity) { //TODO 做一些数据校验,如唯一约束 } @@ -130,11 +128,12 @@ public class MachineTypeServiceImpl implements IMachineTypeService { */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; } + /** * 获取设备类型树列表 * @@ -146,15 +145,17 @@ public class MachineTypeServiceImpl implements IMachineTypeService { LambdaQueryWrapper lqw = buildQueryWrapper(type); List machineTypeVoList = baseMapper.selectVoList(lqw); if (CollUtil.isEmpty(machineTypeVoList)) { - return Collections.emptyList(); + return Collections.emptyList(); } - List machineTypeTreeVoList = BeanUtil.copyToList(machineTypeVoList, MachineTypeTreeVo.class); + List machineTypeTreeVoList = MapstructUtils.convert(machineTypeVoList, MachineTypeTreeVo.class); // 2. 构建树结构 return buildMachineTypeTree(machineTypeTreeVoList); } + /** * 构建设备类型树 + * * @param nodeList 所有节点 * @return 树形结构列表 */ @@ -185,4 +186,5 @@ public class MachineTypeServiceImpl implements IMachineTypeService { } } return treeList; - }} + } +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MeetBookingServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MeetBookingServiceImpl.java index c82cc5e5..a0a71154 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MeetBookingServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MeetBookingServiceImpl.java @@ -123,7 +123,7 @@ public class MeetBookingServiceImpl implements IMeetBookingService { if (CollectionUtil.isEmpty(meetBookings)) { return new ArrayList<>(); } - List meetBookingAppointmentVoList = BeanUtil.copyToList(meetBookings, MeetBookingAppointmentVo.class); + List meetBookingAppointmentVoList = MapstructUtils.convert(meetBookings, MeetBookingAppointmentVo.class); SimpleDateFormat df = new SimpleDateFormat("HH"); List units = meetBookingAppointmentVoList.stream() .map(vo -> vo.getUnit()) @@ -184,7 +184,7 @@ public class MeetBookingServiceImpl implements IMeetBookingService { if (CollectionUtil.isEmpty(meetBookingVoList)) { return new ArrayList<>(); } - List meetBookingWeekVoList = BeanUtil.copyToList(meetBookingVoList, MeetBookingWeekVo.class); + List meetBookingWeekVoList = MapstructUtils.convert(meetBookingVoList, MeetBookingWeekVo.class); String[] weekStr = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; List meetBookingWeekList = new ArrayList<>(); SimpleDateFormat df = new SimpleDateFormat("HH"); diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ResidentPersonServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ResidentPersonServiceImpl.java index c37d0989..7a4668e9 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ResidentPersonServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ResidentPersonServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.property.service.impl; +import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; @@ -115,15 +116,23 @@ public class ResidentPersonServiceImpl implements IResidentPersonService { @Override public Boolean updateByBo(ResidentPersonBo bo) { ResidentPerson update = MapstructUtils.convert(bo, ResidentPerson.class); - validEntityBeforeSave(update); + validEntityBeforeUpdate(update); return baseMapper.updateById(update) > 0; } + /** + * 保存前的数据校验 + */ + private void validEntityBeforeUpdate(ResidentPerson entity){ + //TODO 做一些数据校验,如唯一约束 + } /** * 保存前的数据校验 */ private void validEntityBeforeSave(ResidentPerson entity){ //TODO 做一些数据校验,如唯一约束 + boolean exists = baseMapper.exists(new LambdaQueryWrapper().eq(ResidentPerson::getUserId, entity.getUserId())); + Assert.isTrue(!exists,"该用户已入住!"); } /** diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java index 866ef1d5..de1569f5 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java @@ -1,9 +1,12 @@ package org.dromara.property.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; +import cn.idev.excel.event.Order; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; @@ -12,14 +15,19 @@ 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.common.satoken.utils.LoginHelper; +import org.dromara.property.domain.ResidentPerson; import org.dromara.property.domain.ServiceWorkOrders; +import org.dromara.property.domain.ServiceWorkOrdersRecord; import org.dromara.property.domain.ServiceWorkOrdersType; import org.dromara.property.domain.bo.ServiceWorkOrdersBo; import org.dromara.property.domain.vo.*; import org.dromara.property.mapper.ResidentPersonMapper; import org.dromara.property.mapper.ServiceWorkOrdersMapper; +import org.dromara.property.mapper.ServiceWorkOrdersRecordMapper; import org.dromara.property.mapper.ServiceWorkOrdersTypeMapper; import org.dromara.property.service.IServiceWorkOrdersService; +import org.dromara.system.api.model.LoginUser; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -40,6 +48,7 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { private final ServiceWorkOrdersMapper baseMapper; private final ServiceWorkOrdersTypeMapper typesMapper; private final ResidentPersonMapper residentPersonMapper; + private final ServiceWorkOrdersRecordMapper workOrdersRecordMapper; /** * 查询【工单处理】 @@ -51,20 +60,36 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { public ServiceWorkOrdersInfoVo queryById(Long id) { ServiceWorkOrdersVo serviceWorkOrdersVo = baseMapper.selectVoById(id); ServiceWorkOrdersInfoVo serviceWorkOrdersInfoVo = BeanUtil.copyProperties(serviceWorkOrdersVo, ServiceWorkOrdersInfoVo.class); + if(Objects.isNull(serviceWorkOrdersInfoVo)){ + return serviceWorkOrdersInfoVo; + } ServiceWorkOrdersTypeVo serviceWorkOrdersTypeVo = typesMapper.selectVoById(serviceWorkOrdersVo.getType()); if (Objects.nonNull(serviceWorkOrdersTypeVo)) { serviceWorkOrdersInfoVo.setTypeName(serviceWorkOrdersTypeVo.getOrderTypeName()); } - ResidentPersonVo residentPersonVo = residentPersonMapper.selectVoById(Long.valueOf(serviceWorkOrdersVo.getInitiatorName())); - if (Objects.nonNull(residentPersonVo)) { - serviceWorkOrdersInfoVo.setInitiatorNameText(residentPersonVo.getUserName()); - serviceWorkOrdersInfoVo.setInitiatorPhone(residentPersonVo.getPhone()); - } ResidentPersonVo residentPersonHandler = residentPersonMapper.selectVoById(Long.valueOf(serviceWorkOrdersVo.getHandler())); if (Objects.nonNull(residentPersonHandler)) { serviceWorkOrdersInfoVo.setHandlerText(residentPersonHandler.getUserName()); serviceWorkOrdersInfoVo.setHandlerPhone(residentPersonHandler.getPhone()); } + //查询工单处理记录 + List serviceWorkOrdersRecordVoList = workOrdersRecordMapper.selectVoList(new LambdaQueryWrapper().eq(ServiceWorkOrdersRecord::getOrderId, id)); + if (CollUtil.isNotEmpty(serviceWorkOrdersRecordVoList)) { + List serviceWorkOrdersRecordInfoVos = BeanUtil.copyToList(serviceWorkOrdersRecordVoList, ServiceWorkOrdersRecordInfoVo.class); + List residentPersonIdList = serviceWorkOrdersRecordInfoVos.stream().map(vo -> vo.getHandler()).distinct().collect(Collectors.toList()); + List residentPeople = residentPersonMapper.selectByIds(residentPersonIdList); + serviceWorkOrdersRecordInfoVos.stream().forEach(workOrdersRecordVo -> { + ResidentPerson residentPerson = residentPeople.stream().filter(vo -> vo.getId() != null && vo.getId().equals(serviceWorkOrdersVo.getHandler())).findFirst().orElse(null); + workOrdersRecordVo.setHandlerName(Objects.nonNull(residentPerson) ? residentPerson.getUserName() : null); + if (Objects.nonNull(serviceWorkOrdersTypeVo)) { + workOrdersRecordVo.setInitiatorPeople(serviceWorkOrdersVo.getInitiatorPeople()); + } + if(workOrdersRecordVo.getStatus().equals("1")||workOrdersRecordVo.getStatus().equals("2")){ + serviceWorkOrdersInfoVo.setDispatchTime(workOrdersRecordVo.getCreateTime()); + } + }); + serviceWorkOrdersInfoVo.setWorkOrdersRecordVoList(serviceWorkOrdersRecordInfoVos); + } return serviceWorkOrdersInfoVo; } @@ -82,16 +107,16 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { if (ObjectUtil.isEmpty(result.getRecords())) { return TableDataInfo.build(result); } - List typeList = result.getRecords().stream() - .map(vo -> vo.getType()) - .distinct() - .collect(Collectors.toList()); + List typeList = result.getRecords().stream().map(vo -> vo.getType()).distinct().collect(Collectors.toList()); List serviceWorkOrdersTypeVoList = typesMapper.selectVoByIds(typeList); + if (ObjectUtil.isEmpty(serviceWorkOrdersTypeVoList)) { + return TableDataInfo.build(result); + } List serviceWorkOrdersVoList = new ArrayList<>(); result.getRecords().stream().forEach(s -> { - ServiceWorkOrdersTypeVo serviceWorkOrdersTypeVo = serviceWorkOrdersTypeVoList.stream() - .filter(vo -> vo.getId() != null && vo.getId().equals(s.getType())).findFirst().orElse(null); - s.setTypeName(serviceWorkOrdersTypeVo.getOrderTypeName()); + ServiceWorkOrdersTypeVo serviceWorkOrdersTypeVo = serviceWorkOrdersTypeVoList.stream().filter(vo -> vo.getId() != null && vo.getId().equals(s.getType())).findFirst().orElse(null); + + s.setTypeName(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOrderTypeName() : null); serviceWorkOrdersVoList.add(s); }); return TableDataInfo.build(new Page().setRecords(serviceWorkOrdersVoList)); @@ -116,8 +141,8 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { lqw.eq(StringUtils.isNotBlank(bo.getOrderNo()), ServiceWorkOrders::getOrderNo, bo.getOrderNo()); lqw.like(StringUtils.isNotBlank(bo.getOrderName()), ServiceWorkOrders::getOrderName, bo.getOrderName()); lqw.eq(bo.getDispatchTime() != null, ServiceWorkOrders::getDispatchTime, bo.getDispatchTime()); - lqw.like(StringUtils.isNotBlank(bo.getInitiatorName()), ServiceWorkOrders::getInitiatorName, bo.getInitiatorName()); - lqw.eq(StringUtils.isNotBlank(bo.getHandler()), ServiceWorkOrders::getHandler, bo.getHandler()); + lqw.like(StringUtils.isNotBlank(bo.getInitiatorName()), ServiceWorkOrders::getInitiatorPeople, bo.getInitiatorName()); + lqw.eq(ObjectUtil.isNotEmpty(bo.getHandler()), ServiceWorkOrders::getHandler, bo.getHandler()); lqw.eq(StringUtils.isNotBlank(bo.getLocation()), ServiceWorkOrders::getLocation, bo.getLocation()); lqw.eq(bo.getPlanCompleTime() != null, ServiceWorkOrders::getPlanCompleTime, bo.getPlanCompleTime()); lqw.eq(bo.getCompleTime() != null, ServiceWorkOrders::getCompleTime, bo.getCompleTime()); @@ -137,11 +162,19 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(ServiceWorkOrdersBo bo) { ServiceWorkOrders add = MapstructUtils.convert(bo, ServiceWorkOrders.class); + LoginUser user = LoginHelper.getLoginUser(); add.setOrderNo("GD" + IdUtil.getSnowflakeNextIdStr()); + add.setStatus("0"); + add.setInitiatorPeople(user.getNickname()); validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setId(add.getId()); + ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord(); + serviceWorkOrdersRecord.setOrderId(add.getId()); + serviceWorkOrdersRecord.setStatus(add.getStatus()); + serviceWorkOrdersRecord.setHandler(add.getHandler()); + workOrdersRecordMapper.insert(serviceWorkOrdersRecord); } return flag; } @@ -156,7 +189,7 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { @Transactional(rollbackFor = Exception.class) public Boolean updateByBo(ServiceWorkOrdersBo bo) { ServiceWorkOrders update = MapstructUtils.convert(bo, ServiceWorkOrders.class); - validEntityBeforeSave(update); + validEntityBeforeUpdate(update); return baseMapper.updateById(update) > 0; } @@ -166,6 +199,25 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { private void validEntityBeforeSave(ServiceWorkOrders entity) { //TODO 做一些数据校验,如唯一约束 + + } + + /** + * 修改前的数据校验 + */ + private void validEntityBeforeUpdate(ServiceWorkOrders entity) { + LambdaQueryWrapper ordersLambdaQueryWrapper = new LambdaQueryWrapper<>(); + ordersLambdaQueryWrapper.eq(ServiceWorkOrdersRecord::getOrderId, entity.getId()); + ordersLambdaQueryWrapper.eq(ServiceWorkOrdersRecord::getStatus, entity.getStatus()); + boolean exists = workOrdersRecordMapper.exists(ordersLambdaQueryWrapper); + //TODO 做一些数据校验,如唯一约束 + if (!exists) { + ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord(); + serviceWorkOrdersRecord.setOrderId(entity.getId()); + serviceWorkOrdersRecord.setStatus(entity.getStatus()); + serviceWorkOrdersRecord.setHandler(entity.getHandler()); + workOrdersRecordMapper.insert(serviceWorkOrdersRecord); + } } /** @@ -183,4 +235,40 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { } return baseMapper.deleteByIds(ids) > 0; } + + /** + * 工单服务看板 + * @return + */ + @Override + public ServeceCustomerCountVo counts() { + List serviceWorkOrdersList = baseMapper.selectList(new QueryWrapper<>()); + // 总工单数 + int workOrdersTotal = serviceWorkOrdersList.size(); + + // 待派送工单 + int notWorkOrdersTotal = (int) serviceWorkOrdersList.stream().filter(order -> "0".equals(order.getStatus())).count(); + //未半结超时工单 + int novertimeOrdersTotal = (int) serviceWorkOrdersList.stream().filter(order -> !"4".equals(order.getStatus()) && "1".equals(order.getIsTimeOut())).count(); + // 处理中工单 + int inHandOrdersTotal = (int) serviceWorkOrdersList.stream().filter(order -> "3".equals(order.getStatus())).count(); + // 当月工单超时率 + int novertimeOrdersRate = (int) serviceWorkOrdersList.stream().filter(order -> "3".equals(order.getStatus())).count(); + // 当月工单数 + int monthOrdersTotal = (int) serviceWorkOrdersList.stream().filter(order -> "3".equals(order.getStatus())).count(); + // 超时工单数 + int outTimeOrdersTotal = (int) serviceWorkOrdersList.stream().filter(order -> "3".equals(order.getStatus())).count(); + // 当月满意度 + int monthoSatisfaction = (int) serviceWorkOrdersList.stream().filter(order -> "3".equals(order.getStatus())).count(); + // 满意数 + int satisfaction = (int) serviceWorkOrdersList.stream().filter(order -> "3".equals(order.getStatus())).count(); + + new ServeceCustomerCountVo() + .setWorkOrdersTotal(workOrdersTotal) + .setNotWorkOrdersTotal(notWorkOrdersTotal) + .setNovertimeOrdersTotal(novertimeOrdersTotal) + .setInHandOrdersTotal(inHandOrdersTotal); + + return null; + } } diff --git a/ruoyi-modules/Property/src/main/resources/mapper/Property/ServiceWorkOrdersRecordMapper.xml b/ruoyi-modules/Property/src/main/resources/mapper/Property/ServiceWorkOrdersRecordMapper.xml new file mode 100644 index 00000000..d32d4771 --- /dev/null +++ b/ruoyi-modules/Property/src/main/resources/mapper/Property/ServiceWorkOrdersRecordMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/Sis/pom.xml b/ruoyi-modules/Sis/pom.xml index 447bd87f..bce6a55e 100644 --- a/ruoyi-modules/Sis/pom.xml +++ b/ruoyi-modules/Sis/pom.xml @@ -122,6 +122,12 @@ 4.5.2_1 + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + 1.2.5 + + diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/TbFactoryController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/TbFactoryController.java similarity index 84% rename from ruoyi-modules/Property/src/main/java/org/dromara/property/controller/TbFactoryController.java rename to ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/TbFactoryController.java index bfa875ec..e589f2f4 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/TbFactoryController.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/TbFactoryController.java @@ -1,26 +1,27 @@ -package org.dromara.property.controller; +package org.dromara.sis.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.dromara.property.domain.bo.TbFactoryBo; -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 jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; 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.property.domain.vo.TbFactoryVo; -import org.dromara.property.service.ITbFactoryService; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.sis.domain.bo.TbFactoryBo; +import org.dromara.sis.domain.vo.TbFactoryVo; +import org.dromara.sis.service.ITbFactoryService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * 厂商管理 @@ -40,7 +41,7 @@ public class TbFactoryController extends BaseController { /** * 查询厂商管理列表 */ - @SaCheckPermission("property:factory:list") + @SaCheckPermission("sis:factory:list") @GetMapping("/list") public TableDataInfo list(TbFactoryBo bo, PageQuery pageQuery) { return tdFactoryService.queryPageList(bo, pageQuery); @@ -49,7 +50,7 @@ public class TbFactoryController extends BaseController { /** * 导出厂商管理列表 */ - @SaCheckPermission("property:factory:export") + @SaCheckPermission("sis:factory:export") @Log(title = "厂商管理", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(TbFactoryBo bo, HttpServletResponse response) { @@ -62,7 +63,7 @@ public class TbFactoryController extends BaseController { * * @param id 主键 */ - @SaCheckPermission("property:factory:query") + @SaCheckPermission("sis:factory:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("id") Long id) { @@ -72,7 +73,7 @@ public class TbFactoryController extends BaseController { /** * 新增厂商管理 */ - @SaCheckPermission("property:factory:add") + @SaCheckPermission("sis:factory:add") @Log(title = "厂商管理", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() @@ -83,7 +84,7 @@ public class TbFactoryController extends BaseController { /** * 修改厂商管理 */ - @SaCheckPermission("property:factory:edit") + @SaCheckPermission("sis:factory:edit") @Log(title = "厂商管理", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() @@ -96,7 +97,7 @@ public class TbFactoryController extends BaseController { * * @param ids 主键串 */ - @SaCheckPermission("property:factory:remove") + @SaCheckPermission("sis:factory:remove") @Log(title = "厂商管理", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public R remove(@NotEmpty(message = "主键不能为空") diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZKLmediaController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZKLmediaController.java index 08bfff36..2f9813eb 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZKLmediaController.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZKLmediaController.java @@ -3,6 +3,7 @@ package org.dromara.sis.controller.zkmedia; import cn.hutool.core.util.IdUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.R; +import org.dromara.sis.domain.enums.FactoryNoEnum; import org.dromara.sis.sdk.zkmedia.MediaServerUtils; import org.dromara.sis.sdk.zkmedia.ZLMediaKitService; import org.dromara.sis.sdk.zkmedia.model.AddStreamProxy; @@ -49,9 +50,9 @@ public class ZKLmediaController { proxy.setApp("realtime"); String s = IdUtil.fastSimpleUUID(); proxy.setStream(s); - if ("DS1010".equals(data.getFactoryNo())) { + if (FactoryNoEnum.HIK.getCode().equals(data.getFactoryNo())) { proxy.setUrl(String.format(HIK_REALTIME_RTSP_TEMPLATE, data.getAccount(), data.getPwd(), data.getVideoIp(), data.getVideoPort(), data.getChannelId())); - } else if ("DS1014".equals(data.getFactoryNo())) { + } else if (FactoryNoEnum.DAHUA.getCode().equals(data.getFactoryNo())) { proxy.setUrl(String.format(DAHUA_REALTIME_RTSP_TEMPLATE, data.getAccount(), data.getPwd(), data.getVideoIp(), data.getVideoPort(), data.getChannelId())); } else { throw new RuntimeException("未知的设备类型!"); diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZkMediaHookController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZkMediaHookController.java new file mode 100644 index 00000000..c88a72e3 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZkMediaHookController.java @@ -0,0 +1,80 @@ +package org.dromara.sis.controller.zkmedia; + +import com.alibaba.fastjson2.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.dromara.sis.sdk.zkmedia.MediaServerUtils; +import org.dromara.sis.sdk.zkmedia.model.*; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@Slf4j +@RestController +@RequestMapping("/index/hook") +public class ZkMediaHookController { + + /** + * 服务器定时上报时间,上报间隔可配置,默认10s上报一次 + */ + @ResponseBody + @PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8") + public HookResult onServerKeepalive(@RequestBody OnServerKeepaliveHookParam param) { + log.debug("ZLM心跳上报,params: {}", param); + return HookResult.SUCCESS(); + } + + /** + * rtsp/rtmp/rtp 推流鉴权事件。 + */ + @ResponseBody + @PostMapping(value = "/on_publish", produces = "application/json;charset=UTF-8") + public HookResult onPublish(@RequestBody OnPushParam param) { + log.info("rtsp/rtmp/rtp 推流鉴权,params: {}", param); + return HookResult.SUCCESS(); + } + + + /** + * 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件。 + */ + @ResponseBody + @PostMapping(value = "/on_play", produces = "application/json;charset=UTF-8") + public HookResult onPlay(@RequestBody OnPlayHookParam param) { + Map paramMap = MediaServerUtils.urlParamToMap(param.getParams()); + // 对于播放流进行鉴权 + log.info("播放器鉴权事件,params={}", JSONObject.toJSONString(param)); + return HookResult.SUCCESS(); + } + + /** + * rtsp/rtmp流注册或注销时触发此事件;此事件对回复不敏感。 + */ + @ResponseBody + @PostMapping(value = "/on_stream_changed", produces = "application/json;charset=UTF-8") + public HookResult onStreamChanged(@RequestBody OnStreamChangedHookParam param) { + log.info("[ZLM HOOK] 流注销, {}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream()); + return HookResult.SUCCESS(); + } + + /** + * 流无人观看时事件,用户可以通过此事件选择是否关闭无人看的流。 + */ + @ResponseBody + @PostMapping(value = "/on_stream_none_reader", produces = "application/json;charset=UTF-8") + public HookResult onStreamNoneReader(@RequestBody OnStreamNoneReaderHookParam param) { + log.info("[ZLM HOOK]流无人观看:{}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream()); + // TODO 关闭无人观看的流 + return HookResult.SUCCESS().setClose(true); + } + + /** + * 流未找到事件,用户可以在此事件触发时,立即去拉流,这样可以实现按需拉流;此事件对回复不敏感。 + */ + @ResponseBody + @PostMapping(value = "/on_stream_not_found", produces = "application/json;charset=UTF-8") + public HookResult onStreamNotFound(@RequestBody OnStreamNotFoundHookParam param) { + log.info("[ZLM HOOK] 流未找到:{}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream()); + return HookResult.SUCCESS(); + } + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceChannel.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceChannel.java index 167aa387..3132edd3 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceChannel.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceChannel.java @@ -50,7 +50,9 @@ public class SisDeviceChannel extends TenantEntity { /** * 设备端口 */ - private Long devicePort; + private Integer devicePort; + + private String factoryNo; /** * 设备账号 diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisElevatorFloorRef.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisElevatorFloorRef.java index a855f6c0..88ab627a 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisElevatorFloorRef.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisElevatorFloorRef.java @@ -35,7 +35,7 @@ public class SisElevatorFloorRef extends TenantEntity { /** * 楼层层数 */ - private Long floorNum; + private Long floorId; } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/TbFactory.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/TbFactory.java similarity index 79% rename from ruoyi-modules/Property/src/main/java/org/dromara/property/domain/TbFactory.java rename to ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/TbFactory.java index 3579da60..7d624037 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/TbFactory.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/TbFactory.java @@ -1,9 +1,10 @@ -package org.dromara.property.domain; +package org.dromara.sis.domain; -import org.dromara.common.tenant.core.TenantEntity; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; import java.io.Serial; @@ -15,7 +16,7 @@ import java.io.Serial; */ @Data @EqualsAndHashCode(callSuper = true) -@TableName("td_factory") +@TableName("tb_factory") public class TbFactory extends TenantEntity { @Serial diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAuthRecordBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAuthRecordBo.java index 555c120f..29a2eddd 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAuthRecordBo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAuthRecordBo.java @@ -9,7 +9,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; -import java.util.Collection; +import java.util.List; /** * 授权记录业务对象 sis_auth_record @@ -38,5 +38,5 @@ public class SisAuthRecordBo extends BaseEntity { * 授权设备idList */ @NotEmpty(message = "授权设备idList不能为空", groups = {AddGroup.class, EditGroup.class}) - private Collection deviceIds; + private List> deviceIds; } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceChannelBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceChannelBo.java index 24fd340a..8ea5aaac 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceChannelBo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceChannelBo.java @@ -37,6 +37,8 @@ public class SisDeviceChannelBo extends BaseEntity { */ private String channelName; + private String factoryNo; + /** * 通道分组组id */ @@ -53,7 +55,7 @@ public class SisDeviceChannelBo extends BaseEntity { * 设备端口 */ @NotNull(message = "设备端口不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long devicePort; + private Integer devicePort; /** * 设备账号 diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceManageBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceManageBo.java index c5e1fc48..f5cef48b 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceManageBo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceManageBo.java @@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.translation.annotation.Translation; import org.dromara.sis.domain.SisDeviceManage; /** diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisElevatorFloorRefBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisElevatorFloorRefBo.java index ce269482..921a38d7 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisElevatorFloorRefBo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisElevatorFloorRefBo.java @@ -38,7 +38,9 @@ public class SisElevatorFloorRefBo extends BaseEntity { * 楼层层数 */ @NotEmpty(message = "楼层层数不能为空", groups = { AddGroup.class, EditGroup.class }) - private Collection floorNums; + private Collection floorIds; + + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/TbFactoryBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/TbFactoryBo.java similarity index 85% rename from ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/TbFactoryBo.java rename to ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/TbFactoryBo.java index ff02c0a4..e3a13218 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/TbFactoryBo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/TbFactoryBo.java @@ -1,13 +1,14 @@ -package org.dromara.property.domain.bo; +package org.dromara.sis.domain.bo; -import org.dromara.property.domain.TbFactory; -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 jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.sis.domain.TbFactory; /** * 厂商管理业务对象 td_factory diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/enums/DeviceTypeEnum.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/enums/DeviceTypeEnum.java new file mode 100644 index 00000000..16984778 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/enums/DeviceTypeEnum.java @@ -0,0 +1,21 @@ +package org.dromara.sis.domain.enums; + +import lombok.Getter; + +/** + * 设备类型枚举 + * @author lxj + */ +@Getter +public enum DeviceTypeEnum { + IPC(1), + NVR(2), + DVR(3); + + private final Integer type; + + DeviceTypeEnum(Integer type) { + this.type = type; + } + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/enums/FactoryNoEnum.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/enums/FactoryNoEnum.java new file mode 100644 index 00000000..fb0734e6 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/enums/FactoryNoEnum.java @@ -0,0 +1,21 @@ +package org.dromara.sis.domain.enums; + +import lombok.Getter; + +/** + * 设备厂商类型枚举 + * @author lxj + */ +@Getter +public enum FactoryNoEnum { + + HIK("DS1013"), + DAHUA("DS1014"); + + private final String code; + + FactoryNoEnum(String code) { + this.code = code; + } + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceChannelVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceChannelVo.java index f7e084be..cb8136de 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceChannelVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceChannelVo.java @@ -46,6 +46,8 @@ public class SisDeviceChannelVo implements Serializable { @ExcelProperty(value = "设备名称") private String channelName; + private String factoryNo; + /** * 通道分组组id */ @@ -62,7 +64,7 @@ public class SisDeviceChannelVo implements Serializable { * 设备端口 */ @ExcelProperty(value = "设备端口") - private Long devicePort; + private Integer devicePort; /** * 设备账号 diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceManageVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceManageVo.java index adbf9402..0e0249d4 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceManageVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceManageVo.java @@ -4,6 +4,8 @@ import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; import org.dromara.sis.domain.SisDeviceManage; import java.io.Serial; @@ -69,14 +71,24 @@ public class SisDeviceManageVo implements Serializable { */ private Integer deviceType; + /** + * 设备类型 + */ + @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "deviceType", other = "sis_ipc_device_type") + private Integer deviceTypeName; + /** * 设备厂商编号 */ private String factoryNo; + private String factoryName; + /** * 设备组id */ private Long groupId; + private String groupName; + } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java index 6b8fd552..7558689f 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java @@ -38,10 +38,10 @@ public class SisElevatorFloorRefVo implements Serializable { private Long elevatorId; /** - * 楼层层数 + * 楼层id */ - @ExcelProperty(value = "楼层层数") - private Long floorNum; + @ExcelProperty(value = "楼层id") + private Long floorId; } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/TbFactoryVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/TbFactoryVo.java similarity index 91% rename from ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/TbFactoryVo.java rename to ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/TbFactoryVo.java index 2f43b1fc..81a045cb 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/TbFactoryVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/TbFactoryVo.java @@ -1,10 +1,10 @@ -package org.dromara.property.domain.vo; +package org.dromara.sis.domain.vo; -import org.dromara.property.domain.TbFactory; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; +import org.dromara.sis.domain.TbFactory; import java.io.Serial; import java.io.Serializable; diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java index da91c0c0..32775288 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java @@ -1,5 +1,6 @@ package org.dromara.sis.mapper; +import org.apache.ibatis.annotations.Mapper; import org.dromara.sis.domain.SisAuthRecord; import org.dromara.sis.domain.vo.SisAuthRecordVo; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; @@ -12,6 +13,7 @@ import java.util.List; * @author lsm * @since 2025-07-14 */ +@Mapper public interface SisAuthRecordMapper extends BaseMapperPlus { List checkAuth(Long personId); } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisDeviceManageMapper.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisDeviceManageMapper.java index 4e9f8018..f70b28da 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisDeviceManageMapper.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisDeviceManageMapper.java @@ -1,6 +1,9 @@ package org.dromara.sis.mapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; import org.dromara.sis.domain.SisDeviceManage; +import org.dromara.sis.domain.bo.SisDeviceManageBo; import org.dromara.sis.domain.vo.SisDeviceManageVo; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; @@ -12,4 +15,11 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; */ public interface SisDeviceManageMapper extends BaseMapperPlus { + /** + * 分页查询设备信息 + * @param build 分页对象 + * @param bo 查询对象 + * @return 返回分页数据 + */ + Page selectByPage(@Param("page") Page build,@Param("bo") SisDeviceManageBo bo); } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/TbFactoryMapper.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/TbFactoryMapper.java similarity index 67% rename from ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/TbFactoryMapper.java rename to ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/TbFactoryMapper.java index b7e99ad4..8718d0b9 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/TbFactoryMapper.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/TbFactoryMapper.java @@ -1,9 +1,9 @@ -package org.dromara.property.mapper; +package org.dromara.sis.mapper; import org.apache.ibatis.annotations.Mapper; -import org.dromara.property.domain.TbFactory; -import org.dromara.property.domain.vo.TbFactoryVo; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.sis.domain.TbFactory; +import org.dromara.sis.domain.vo.TbFactoryVo; /** * 厂商管理Mapper接口 diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/HikDeviceApplicationRunner.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/HikDeviceApplicationRunner.java index 9d5c1ac9..8cfb4fab 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/HikDeviceApplicationRunner.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/HikDeviceApplicationRunner.java @@ -72,10 +72,10 @@ public class HikDeviceApplicationRunner implements ApplicationRunner { return; } deviceList.forEach(item -> { - int handler = HikApiService.getInstance().login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDeviceAccount(), item.getDevicePwd()); - log.info("设备[{}]执行登录完成,result={}", item.getDeviceIp(), handler); - if (handler != -1) { - HikApiService.getInstance().setAlarmChan(handler); + boolean isLogin = HikApiService.getInstance().login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDeviceAccount(), item.getDevicePwd()); + log.info("设备[{}]执行登录完成,result={}", item.getDeviceIp(), isLogin); + if (isLogin) { + HikApiService.getInstance().setAlarmChan(item.getDeviceIp()); } }); } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java index 4280851a..6b680cec 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java @@ -51,13 +51,13 @@ public class HikApiService { * @param psw 设备密码 * @return 返回会否登录成功 */ - public int login(String ip, short port, String user, String psw) { + public boolean login(String ip, short port, String user, String psw) { int i = LoginService.loginDevice(ip, port, user, psw); boolean result = (i != SdkBaseServer.LOGIN_FAIL_CODE); if (result) { CACHE.put(ip, i); } - return i; + return result; } /** @@ -116,12 +116,33 @@ public class HikApiService { } boolean logout = LoginService.logout(lHandel); if (logout) { + log.info("设备[{}]注销完成", deviceIp); CACHE.remove(deviceIp); } return logout; } - public void setAlarmChan(int handler) { - SdkBaseServer.setAlarmChan(handler); + /** + * 设备报警 + * + * @param deviceIp + * @return + */ + public Boolean setAlarmChan(String deviceIp) { + Integer lHandel = CACHE.get(deviceIp); + return SdkBaseServer.setAlarmChan(lHandel); } + + /** + * 通过sdk 获取hik设备通道信息 + * + * @param deviceIp 设备ip + * @return 范湖通道信息 + */ + public Object getChannelInfo(String deviceIp) { + + + return null; + } + } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikSdkConstans.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikSdkConstans.java new file mode 100644 index 00000000..a2be010e --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikSdkConstans.java @@ -0,0 +1,12 @@ +package org.dromara.sis.sdk.hik; + +public class HikSdkConstans { + + /** + * IPc 的默认通道信息 + */ + public static final String DEFAULT_CHANNEL = "101"; + + public static final Integer DEFAULT_RTSP_PORT = 554; + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java index 0b93cfae..150de397 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java @@ -25,6 +25,7 @@ import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import java.util.List; +import java.util.Objects; import static org.dromara.sis.sdk.hik.HCNetSDK.*; @@ -356,11 +357,11 @@ public class HikAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 { // 获取电梯⇄楼层关联信息 List floorRefList = elevatorFloorRefService.queryByElevatorId(deviceId); // 获取楼层数组 - List layerArray = floorInfo.stream().map(RemoteFloorVo::getFloorNumber).sorted().toList(); + List layerArray = floorInfo.stream().map(RemoteFloorVo::getId).sorted().toList(); layerArray.forEach(layer -> { SisElevatorFloorRefVo floorRef = floorRefList.stream() - .filter(vo -> vo.getFloorNum().intValue() == layer) // 直接使用 layer + .filter(vo -> Objects.equals(vo.getFloorId(), layer)) // 直接使用 layer .findFirst() .orElse(null); if (floorRef == null) { diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/CamearService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/CamearService.java new file mode 100644 index 00000000..0c648632 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/CamearService.java @@ -0,0 +1,30 @@ +package org.dromara.sis.sdk.hik.service; + + +import com.sun.jna.ptr.IntByReference; +import lombok.extern.slf4j.Slf4j; +import org.dromara.sis.sdk.hik.HCNetSDK; + +import static org.dromara.sis.sdk.hik.HCNetSDK.NET_DVR_GET_IPPARACFG_V40; + +@Slf4j +public class CamearService extends SdkBaseServer { + + /** + * 获取设备通道信息 + * + * @return + */ + public static Object getDeviceChannelInfo(int lUserID) { + HCNetSDK.NET_DVR_IPPARACFG_V40 lpOutBuffer = new HCNetSDK.NET_DVR_IPPARACFG_V40(); + lpOutBuffer.read(); + lpOutBuffer.dwSize = lpOutBuffer.size(); + IntByReference bytesReturned = new IntByReference(0); + boolean success = getHcNetSDK().NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_IPPARACFG_V40, 0, lpOutBuffer.getPointer(), lpOutBuffer.size(), bytesReturned); + if (success) { + lpOutBuffer.read(); + } + return null; + } + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/domain/PowerFrame.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/domain/PowerFrame.java new file mode 100644 index 00000000..c65adc59 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/domain/PowerFrame.java @@ -0,0 +1,20 @@ +package org.dromara.sis.sdk.smartDevices.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @author lsm + * @apiNote PowerFrame + * @since 2025/7/20 + */ +@Data +@AllArgsConstructor +public class PowerFrame { + + private byte[] address; + + private byte controlCode; + + private byte[] data; +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/LightingUtil.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/LightingUtil.java new file mode 100644 index 00000000..d4fa6542 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/LightingUtil.java @@ -0,0 +1,139 @@ +package org.dromara.sis.sdk.smartDevices.utils; + + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttClient; +import org.eclipse.paho.client.mqttv3.MqttConnectOptions; +import org.eclipse.paho.client.mqttv3.MqttException; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; + +/** + * @author lsm + * @apiNote LightingUtil + * @since 2025/7/20 + */ +@Slf4j +public class LightingUtil { + private final MqttClient mqttClient; + private final String productKey; + private final String deviceName; + private final Gson gson = new Gson(); + + + // 初始化连接参数 + public LightingUtil(String brokerUrl, String productKey, String deviceName, + String username, String password) throws MqttException { + this.productKey = productKey; + this.deviceName = deviceName; + + MqttConnectOptions options = new MqttConnectOptions(); + options.setUserName(username); + options.setPassword(password.toCharArray()); + options.setCleanSession(true); + + mqttClient = new MqttClient(brokerUrl, deviceName, new MemoryPersistence()); + mqttClient.connect(options); + + // 订阅网关上报主题 + String subscribeTopic = "/sys/" + productKey + "/+/thing/event/+/post"; + mqttClient.subscribe(subscribeTopic, this::handleIncomingMessage); + } + + // 基础指令构造 + private JsonObject createBaseCommand(int code, String area, String address, String action) { + JsonObject command = new JsonObject(); + command.addProperty("code", code); + command.addProperty("deviceName", deviceName); + command.addProperty("area", area); + command.addProperty("address", address); + command.addProperty("action", action); + command.addProperty("identity", ""); + return command; + } + + // 灯具控制指令 + public void sendLightCommand(int code, String area, String address, String action, String params) + throws MqttException { + JsonObject command = createBaseCommand(code, area, address, action); + if (params != null) command.addProperty("params", params); + + String topic = "/" + productKey + "/" + deviceName + "/user/get"; + mqttClient.publish(topic, new MqttMessage(gson.toJson(command).getBytes())); + } + + // 常用快捷方法 + public void turnOnLight(String area, String groupAddress) throws MqttException { + sendLightCommand(200, area, groupAddress, "lightOn", null); + } + + public void turnOffLight(String area, String groupAddress) throws MqttException { + sendLightCommand(200, area, groupAddress, "lightOff", null); + } + + public void setBrightness(String area, String address, int brightness) throws MqttException { + sendLightCommand(200, area, address, "setHighBright", String.valueOf(brightness)); + } + + // 上报数据处理 + private void handleIncomingMessage(String topic, MqttMessage message) { + try { + JsonObject payload = gson.fromJson(new String(message.getPayload()), JsonObject.class); + String method = payload.get("method").getAsString(); + + switch (method) { + case "thing.event.heartbeat.post": + processHeartbeat(payload.getAsJsonObject("params")); + break; + case "thing.event.consumption.post": + processEnergyData(payload.getAsJsonObject("params")); + break; + case "thing.event.trigger.post": + processSensorTrigger(payload.getAsJsonObject("params")); + break; + // 添加其他事件处理... + } + } catch (Exception e) { + log.error("MQTT消息处理异常,topic: {}", topic, e); + } + } + + // 心跳处理 + private void processHeartbeat(JsonObject params) { + JsonObject value = params.getAsJsonObject("value"); + String uuid = value.get("uuid").getAsString(); + String area = value.get("area").getAsString(); + System.out.println("设备在线: " + uuid + " | 区域: " + area); + } + + // 能耗处理 + private void processEnergyData(JsonObject params) { + JsonObject value = params.getAsJsonObject("value"); + String uuid = value.get("uuid").getAsString(); + double power = value.get("power").getAsDouble(); + System.out.println("能耗报告: " + uuid + " | 功率: " + power + "W"); + } + + // 传感器触发处理 + private void processSensorTrigger(JsonObject params) { + JsonObject value = params.getAsJsonObject("value"); + long trigTime = value.get("trig_time").getAsLong(); + String area = value.get("area").getAsString(); + System.out.println("传感器触发: 区域=" + area + " | 时间=" + trigTime); + } + + // 网关管理 + public void rebootGateway(int delaySeconds) throws MqttException { + JsonObject command = createBaseCommand(400, "00 00", "FF FF", "reboot"); + command.addProperty("params", String.valueOf(delaySeconds)); + String topic = "/" + productKey + "/" + deviceName + "/user/get"; + mqttClient.publish(topic, new MqttMessage(gson.toJson(command).getBytes())); + } + + // 关闭连接 + public void disconnect() throws MqttException { + mqttClient.disconnect(); + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/PowerMeterUtil.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/PowerMeterUtil.java new file mode 100644 index 00000000..8f4a1f01 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/PowerMeterUtil.java @@ -0,0 +1,179 @@ +package org.dromara.sis.sdk.smartDevices.utils; + +import org.dromara.sis.sdk.smartDevices.domain.PowerFrame; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; + +/** + * @author lsm + * @apiNote PowerMeterUtil + * @since 2025/7/20 + */ +public class PowerMeterUtil { + + // 协议常量定义 + public static final byte FRAME_START = 0x68; + public static final byte FRAME_END = 0x16; + public static final byte[] PREAMBLE = {(byte) 0xFE, (byte) 0xFE, (byte) 0xFE, (byte) 0xFE}; + public static final int ADDR_LENGTH = 6; + public static final int MAX_READ_DATA_LEN = 200; + public static final int MAX_WRITE_DATA_LEN = 50; + + // 控制码功能定义 + public static final byte CTRL_BROADCAST_TIME = 0x08; + public static final byte CTRL_READ_DATA = 0x11; + public static final byte CTRL_READ_FOLLOW_DATA = 0x12; + public static final byte CTRL_WRITE_DATA = 0x14; + public static final byte CTRL_TRIP_CONTROL = 0x1C; + public static final byte CTRL_OUTPUT_CONTROL = 0x1D; + + // 地址通配符 + public static final byte ADDR_WILDCARD = (byte) 0xAA; + + /** + * 构建基础帧结构 + * + * @param address 6字节地址(高位在前,低位在后) + * @param ctrlCode 控制码 + * @param data 原始数据域(未加33H) + * @param isEncode 是否进行数据域处理 + * @return 完整帧数据 + */ + public byte[] buildFrame(byte[] address, byte ctrlCode, byte[] data, boolean isEncode) { + if (address.length != ADDR_LENGTH) { + throw new IllegalArgumentException("Address must be 6 bytes"); + } + + // 处理数据域:每个字节加0x33 + byte[] processedData = processDataDomain(data, isEncode); + + // 计算数据域长度 + int dataLen = (data != null) ? data.length : 0; + if (dataLen > MAX_READ_DATA_LEN) { + throw new IllegalArgumentException("Data length exceeds max limit"); + } + + // 计算总帧长度: 起始符(1) + 地址(6) + 起始符(1) + 控制码(1) + 长度(1) + 数据域 + 校验(1) + 结束符(1) + int totalLength = 11 + dataLen; + ByteBuffer buffer = ByteBuffer.allocate(totalLength) + .order(ByteOrder.LITTLE_ENDIAN); + + // 地址域处理 (传输顺序: 低字节在前) + byte[] reversedAddr = reverseAddress(address); + + // 构建帧 + buffer.put(FRAME_START) + .put(reversedAddr) + .put(FRAME_START) + .put(ctrlCode) + .put((byte) dataLen); + + if (dataLen > 0) { + buffer.put(processedData); + } + + // 计算校验码 (从第一个0x68到数据域结束) + byte[] frameWithoutCs = Arrays.copyOf(buffer.array(), buffer.position()); + byte cs = calculateChecksum(frameWithoutCs); + + buffer.put(cs) + .put(FRAME_END); + + return buffer.array(); + } + + /** + * 解析接收到的帧 + * @param frame 完整帧数据(包含前导符) + * @return 解析结果对象 + */ + public PowerFrame parseFrame(byte[] frame) { + // 跳过前导符 (0-3) + int startIndex = findFrameStart(frame); + if (startIndex == -1) { + throw new IllegalArgumentException("无效帧:未找到起始标记"); + } + + // 基本长度检查 + if (frame.length < startIndex + 12) { + throw new IllegalArgumentException("接受帧太短"); + } + + // 提取地址域 (传输顺序: 低字节在前) + byte[] reversedAddr = Arrays.copyOfRange(frame, startIndex + 1, startIndex + 7); + byte[] address = reverseAddress(reversedAddr); + + // 控制码 + byte ctrlCode = frame[startIndex + 8]; + + // 数据域长度 + int dataLen = frame[startIndex + 9] & 0xFF; + + // 数据域位置 + int dataStart = startIndex + 10; + int dataEnd = dataStart + dataLen; + + // 校验位位置 + int endPos = dataEnd + 1; + + // 验证结束符 + if (frame[endPos] != FRAME_END) { + throw new IllegalArgumentException("无效的帧结束标记"); + } + + // 提取原始数据域 (含33H处理) + byte[] rawData = Arrays.copyOfRange(frame, dataStart, dataEnd); + byte[] processedData = processDataDomain(rawData, false); + + // 验证校验和 + byte calculatedCs = calculateChecksum(Arrays.copyOfRange(frame, startIndex, dataEnd)); + byte receivedCs = frame[dataEnd]; + + if (calculatedCs != receivedCs) { + throw new IllegalArgumentException("校验和不匹配"); + } + + return new PowerFrame(address, ctrlCode, processedData); + } + + // 数据处理域:加/减33H + private byte[] processDataDomain(byte[] data, boolean isEncode) { + if (data == null || data.length == 0) return data; + + byte[] result = new byte[data.length]; + for (int i = 0; i < data.length; i++) { + result[i] = (byte) (isEncode ? (data[i] + 0x33) : (data[i] - 0x33)); + } + return result; + } + + // 地址反转 (传输顺序处理) + private byte[] reverseAddress(byte[] address) { + byte[] reversed = new byte[address.length]; + for (int i = 0; i < address.length; i++) { + reversed[i] = address[address.length - 1 - i]; + } + return reversed; + } + + // 计算校验和 (模256和) + private byte calculateChecksum(byte[] data) { + int sum = 0; + for (byte b : data) { + sum = (sum + (b & 0xFF)) & 0xFF; + } + return (byte) sum; + } + + // 在帧数据中查找起始符 + private int findFrameStart(byte[] data) { + for (int i = 0; i < data.length - 1; i++) { + if (data[i] == FRAME_START && data[i + 1] != FRAME_START) { + return i; + } + } + return -1; + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/WaterMeterUtil.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/WaterMeterUtil.java new file mode 100644 index 00000000..31fb0713 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/WaterMeterUtil.java @@ -0,0 +1,168 @@ +package org.dromara.sis.sdk.smartDevices.utils; + +import java.nio.ByteBuffer; +import java.util.Arrays; + +/** + * @author lsm + * @apiNote WaterMeterUtil + * @since 2025/7/20 + */ +public class WaterMeterUtil { + + // 协议常量定义 + public static final byte PREAMBLE = (byte) 0xFE; + public static final byte FRAME_START = 0x68; + public static final byte FRAME_END = 0x16; + public static final byte WATER_METER_TYPE = 0x10; + public static final byte CTRL_READ = 0x01; + public static final byte CTRL_RESPONSE = (byte) 0x81; + public static final byte UNIT_TON = 0x2C; + public static final int ADDRESS_LENGTH = 7; + + /** + * 构建读表数据命令帧 + * + * @param meterAddress 12位表计地址字符串(如"000000000000012") + * @param diHighFirst 数据标识字节序:true=901Fh(高字节在前), false=1F90h(低字节在前) + * @return 完整的命令帧字节数组 + */ + public static byte[] buildReadCommand(String meterAddress, boolean diHighFirst) { + // 1. 地址转换:12位字符串 -> 7字节BCD码(逆序分组) + byte[] addressBytes = convertAddress(meterAddress); + + // 2. 构建帧主体(不含前导符和帧尾) + ByteBuffer buffer = ByteBuffer.allocate(32); + buffer.put(FRAME_START); + buffer.put(WATER_METER_TYPE); + buffer.put(addressBytes); + buffer.put(CTRL_READ); + buffer.put((byte) 0x03); // 数据域长度 + + // 数据标识处理 + if (diHighFirst) { + buffer.put((byte) 0x90); + buffer.put((byte) 0x1F); + } else { + buffer.put((byte) 0x1F); + buffer.put((byte) 0x90); + } + + buffer.put((byte) 0x00); // 序列号 + + // 3. 计算校验码(从FRAME_START到序列号) + byte[] frameBody = Arrays.copyOf(buffer.array(), buffer.position()); + byte cs = calculateChecksum(frameBody, 0, frameBody.length); + + // 4. 组装完整帧 + buffer.put(cs); + buffer.put(FRAME_END); + + // 5. 添加前导符 + byte[] fullFrame = Arrays.copyOf(buffer.array(), buffer.position()); + return addPreamble(fullFrame); + } + + /** + * 解析读表响应数据 + * + * @param response 完整响应帧(含前导符) + * @return 解析后的累积流量值(单位:吨) + * @throws IllegalArgumentException 响应格式错误 + */ + public static double parseReadResponse(byte[] response) { + // 1. 跳过前导符(0xFE x3) + int startIndex = 3; + if (response[startIndex] != FRAME_START) { + throw new IllegalArgumentException("无效帧起始符"); + } + + // 2. 基础信息解析 + int pos = startIndex + 1; + byte meterType = response[pos++]; + byte[] address = Arrays.copyOfRange(response, pos, pos + ADDRESS_LENGTH); + pos += ADDRESS_LENGTH; + + byte ctrlCode = response[pos++]; + if (ctrlCode != CTRL_RESPONSE) { + throw new IllegalArgumentException("无效控制码"); + } + + // 3. 数据域解析 + int dataLen = response[pos++] & 0xFF; + byte[] di = {response[pos++], response[pos++]}; // 数据标识 + byte ser = response[pos++]; // 序列号 + + // 4. 累积流量解析 (4字节BCD) + byte[] currentFlow = Arrays.copyOfRange(response, pos, pos + 4); + pos += 4; + + // 5. 单位校验 + if (response[pos++] != UNIT_TON) { + throw new IllegalArgumentException("无效计量单位"); + } + + // 6. 流量值转换 + return parseFlowValue(currentFlow); + } + + /** + * 计算校验码 (CJ/T188-2004标准) + * + * @param data 待计算数据 + * @param offset 起始位置 + * @param length 数据长度 + * @return 校验码 + */ + public static byte calculateChecksum(byte[] data, int offset, int length) { + int sum = 0; + for (int i = offset; i < offset + length; i++) { + sum += (data[i] & 0xFF); + } + return (byte) (sum % 256); + } + + // 地址转换:12位字符串 -> 7字节BCD码(逆序分组) + private static byte[] convertAddress(String address) { + if (address.length() != 12) { + throw new IllegalArgumentException("地址长度必须为12位"); + } + + // 填充为14位(7字节*2) + String padded = "00" + address; + byte[] result = new byte[ADDRESS_LENGTH]; + + // 逆序分组转换 + for (int i = 0; i < ADDRESS_LENGTH; i++) { + int end = padded.length() - i * 2; + int start = end - 2; + String segment = padded.substring(start, end); + result[i] = (byte) Integer.parseInt(segment, 16); + } + return result; + } + + // 添加前导符 0xFE x3 + private static byte[] addPreamble(byte[] frame) { + byte[] result = new byte[frame.length + 3]; + result[0] = PREAMBLE; + result[1] = PREAMBLE; + result[2] = PREAMBLE; + System.arraycopy(frame, 0, result, 3, frame.length); + return result; + } + + // 解析BCD流量值(4字节 -> 浮点数) + private static double parseFlowValue(byte[] data) { + // 拼接BCD数字串 + StringBuilder sb = new StringBuilder(); + for (byte b : data) { + sb.append(String.format("%02X", b)); + } + + // 转换为数值(最后2位是小数位) + String numStr = sb.toString(); + return Double.parseDouble(numStr.substring(0, numStr.length() - 2) + + Double.parseDouble(numStr.substring(numStr.length() - 2)) / 100.0); + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/ZLMediaKitServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/ZLMediaKitServiceImpl.java index ba519235..5f3632bd 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/ZLMediaKitServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/ZLMediaKitServiceImpl.java @@ -14,8 +14,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +/** + * ZLMediaKit流媒体服务 + * + * @author lxj + */ @Slf4j -@Service("com.parkclouds.media.service.ZLMediaKitServiceImpl") +@Service public class ZLMediaKitServiceImpl implements ZLMediaKitService { @Resource @@ -141,7 +146,7 @@ public class ZLMediaKitServiceImpl implements ZLMediaKitService { commonParams.put("force", 1); R result = HttpClientUtil.get(getRequestUrl("close_streams"), commonParams, AddStreamProxyResp.class); if (result != null) { - String s =null; + String s = null; if (result.getCode() == 0) { s = "关闭流成功"; } @@ -149,7 +154,7 @@ public class ZLMediaKitServiceImpl implements ZLMediaKitService { if (result.getCode() == -1) { s = "关闭流失败"; } - log.info("{},关闭流数量:{}",s,result.getData()); + log.info("{},关闭流数量:{}", s, result.getData()); return s; } return null; diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/model/AddStreamProxy.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/model/AddStreamProxy.java index 58351c2b..afd1c406 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/model/AddStreamProxy.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/model/AddStreamProxy.java @@ -11,7 +11,6 @@ public class AddStreamProxy { @NotBlank private String videoIp; - @NotNull private Integer videoPort; @NotBlank @@ -31,6 +30,6 @@ public class AddStreamProxy { private String endTime; - private String stream; + private String stream; } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceChannelService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceChannelService.java index e917a499..f8b164e4 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceChannelService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceChannelService.java @@ -3,7 +3,9 @@ package org.dromara.sis.service; import org.dromara.common.core.domain.TreeNode; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.sis.domain.SisDeviceChannel; import org.dromara.sis.domain.bo.SisDeviceChannelBo; +import org.dromara.sis.domain.bo.SisDeviceManageBo; import org.dromara.sis.domain.vo.SisDeviceChannelVo; import java.util.Collection; @@ -50,6 +52,14 @@ public interface ISisDeviceChannelService { */ Boolean insertByBo(SisDeviceChannelBo bo); + /** + * 新增设备通道管理 + * + * @param channel 设备通道管理 + * @return 是否新增成功 + */ + Boolean insert(SisDeviceChannel channel); + /** * 修改设备通道管理 * @@ -75,4 +85,13 @@ public interface ISisDeviceChannelService { List> queryTree(); + Boolean handleHikDeviceChannel(SisDeviceManageBo bo); + + /** + * 通过设备ids 删除设备通道信息 + * @param deviceIds 设备ids + * @return 返回删除数量 + */ + Integer deleteByDeviceIds(List deviceIds); + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ITbFactoryService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ITbFactoryService.java similarity index 91% rename from ruoyi-modules/Property/src/main/java/org/dromara/property/service/ITbFactoryService.java rename to ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ITbFactoryService.java index 38755648..f0db0f31 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ITbFactoryService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ITbFactoryService.java @@ -1,9 +1,9 @@ -package org.dromara.property.service; +package org.dromara.sis.service; -import org.dromara.property.domain.bo.TbFactoryBo; -import org.dromara.property.domain.vo.TbFactoryVo; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.sis.domain.bo.TbFactoryBo; +import org.dromara.sis.domain.vo.TbFactoryVo; import java.util.Collection; import java.util.List; diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java index e5736ad3..d9a0d321 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java @@ -2,6 +2,7 @@ package org.dromara.sis.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; +import org.apache.dubbo.config.annotation.DubboReference; import org.dromara.common.core.domain.TreeNode; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -11,11 +12,15 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.property.api.RemoteFloorService; +import org.dromara.property.api.domain.vo.RemoteFloorVo; import org.dromara.sis.domain.bo.SisAccessControlBo; +import org.dromara.sis.domain.bo.SisElevatorFloorRefBo; import org.dromara.sis.domain.bo.SisElevatorInfoBo; import org.dromara.sis.domain.vo.SisAccessControlVo; import org.dromara.sis.domain.vo.SisElevatorInfoVo; import org.dromara.sis.service.ISisAccessControlService; +import org.dromara.sis.service.ISisElevatorFloorRefService; import org.dromara.sis.service.ISisElevatorInfoService; import org.springframework.stereotype.Service; import org.dromara.sis.domain.bo.SisAuthRecordBo; @@ -25,6 +30,7 @@ import org.dromara.sis.mapper.SisAuthRecordMapper; import org.dromara.sis.service.ISisAuthRecordService; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Collection; @@ -42,9 +48,13 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService { private final SisAuthRecordMapper baseMapper; + private final ISisElevatorFloorRefService elevatorFloorRefService; private final ISisAccessControlService accessControlService; private final ISisElevatorInfoService elevatorInfoService; + @DubboReference + private RemoteFloorService remoteFloorService; + /** * 查询授权记录 * @@ -106,11 +116,18 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService { // 每次授权先删除上一次授权信息 deleteByLibId(bo.getLibId()); + //取出需要授权的门禁id、电梯id、楼层id + List acIds = bo.getDeviceIds().get(0); + List eleIds = bo.getDeviceIds().get(1); + List floorIds = bo.getDeviceIds().get(2); + // 过滤不是设备的节点数据 // 门禁设备 - List acVoList = accessControlService.queryListByIds(bo.getDeviceIds()); + List acVoList = accessControlService.queryListByIds(acIds); // 电梯设备 - List eleVoList = elevatorInfoService.queryListByIds(bo.getDeviceIds()); + List eleVoList = elevatorInfoService.queryListByIds(eleIds); + // 楼层信息 + if (CollUtil.isEmpty(acVoList) || CollUtil.isEmpty(eleVoList)) { return false; } @@ -132,12 +149,24 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService { log.info("开始写入电梯授权记录,eleIds:{}", eleVoList); for (SisElevatorInfoVo ele : eleVoList) { SisAuthRecord authRecord = new SisAuthRecord(); + SisElevatorFloorRefBo refBo = new SisElevatorFloorRefBo(); authRecord.setDeviceType(2); authRecord.setLibId(bo.getLibId()); authRecord.setDeviceId(ele.getElevatorId()); flag = baseMapper.insert(authRecord) > 0; Assert.isTrue(flag, "写入电梯授权记录失败!"); + + log.info("开始写入电梯⇄楼层关联关系"); + // 获取该电梯所在单元的楼层信息 + List floorVoList = remoteFloorService.queryByUnitId(ele.getUnitId()); + // 该单元所有楼层id + List allFloors = floorVoList.stream().map(RemoteFloorVo::getId).toList(); + // 对比找出授权楼层id + List authFloors = floorIds.stream().filter(allFloors::contains).toList(); + refBo.setElevatorId(ele.getElevatorId()); + refBo.setFloorIds(authFloors); + elevatorFloorRefService.insertByBo(refBo); } log.info("写入电梯授权记录完成"); @@ -217,21 +246,21 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService { root.setLevel(0); root.setCode(0L); root.setParentCode(-1L); - root.setLabel("授权设备"); + root.setTitle("授权设备"); // 创建门禁设备父节点 TreeNode accessNode = new TreeNode<>(); accessNode.setLevel(1); accessNode.setCode(1L); accessNode.setParentCode(0L); - accessNode.setLabel("门禁设备"); + accessNode.setTitle("门禁设备"); // 创建电梯父节点 TreeNode elevatorNode = new TreeNode<>(); elevatorNode.setLevel(1); elevatorNode.setCode(2L); elevatorNode.setParentCode(0L); - elevatorNode.setLabel("电梯设备"); + elevatorNode.setTitle("电梯设备"); List acVoList = accessControlService.queryList(new SisAccessControlBo()); @@ -243,23 +272,43 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService { node.setLevel(2); node.setCode(item.getId()); node.setParentCode(1L); - node.setLabel(item.getAccessName()); + node.setLabel("accessControl"); + node.setTitle(item.getAccessName()); return node; }).toList(); - List> eleChildrenList = eleVoList.stream().map(item -> { - TreeNode node = new TreeNode<>(); - node.setLevel(2); - node.setCode(item.getElevatorId()); - node.setParentCode(2L); - node.setLabel(item.getElevatorName()); - return node; - }).toList(); + List> eleChildrenList = new ArrayList<>(); + eleVoList.forEach(item -> { + // 电梯子节点 + TreeNode eleNode = new TreeNode<>(); + eleNode.setLevel(2); + eleNode.setParentCode(2L); + eleNode.setLabel("elevator"); + eleNode.setCode(item.getElevatorId()); + eleNode.setTitle(item.getElevatorName()); + + // 楼层节点 + List> floorTree = new ArrayList<>(); + // 获取楼层 + List floorInfoList = remoteFloorService.queryByUnitId(item.getUnitId()); + floorInfoList.forEach(floor -> { + TreeNode floorNode = new TreeNode<>(); + floorNode.setLevel(3); + floorNode.setLabel("floor"); + floorNode.setCode(floor.getId()); + floorNode.setTitle(floor.getFloorName()); + floorNode.setParentCode(item.getElevatorId()); + floorTree.add(floorNode); + }); + eleNode.setChildren(floorTree); + eleChildrenList.add(eleNode); + }); // 将子节点列表分别添加到对应的父节点 accessNode.setChildren(acChildrenList); elevatorNode.setChildren(eleChildrenList); + // 最后将两个父节点添加到根节点 root.setChildren(List.of(accessNode, elevatorNode)); return List.of(root); diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceChannelServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceChannelServiceImpl.java index 164a8002..079b4225 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceChannelServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceChannelServiceImpl.java @@ -14,9 +14,13 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.sis.domain.SisDeviceChannel; import org.dromara.sis.domain.bo.SisDeviceChannelBo; +import org.dromara.sis.domain.bo.SisDeviceManageBo; +import org.dromara.sis.domain.enums.DeviceTypeEnum; import org.dromara.sis.domain.vo.SisDeviceChannelVo; import org.dromara.sis.domain.vo.SisDeviceGroupVo; import org.dromara.sis.mapper.SisDeviceChannelMapper; +import org.dromara.sis.sdk.hik.HikApiService; +import org.dromara.sis.sdk.hik.HikSdkConstans; import org.dromara.sis.service.ISisDeviceChannelService; import org.dromara.sis.service.ISisDeviceGroupService; import org.springframework.stereotype.Service; @@ -110,6 +114,11 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService { return flag; } + @Override + public Boolean insert(SisDeviceChannel channel) { + return baseMapper.insert(channel) > 0; + } + /** * 修改设备通道管理 * @@ -183,4 +192,42 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService { }); return TreeUtils.build(treeNodes, -1L); } + + @Override + public Boolean handleHikDeviceChannel(SisDeviceManageBo bo) { + if (DeviceTypeEnum.IPC.getType().equals(bo.getDeviceType())) { + // 只需要验证hik设备能能否登录即可 + // 调用hik sdk登录 + boolean isLogin = HikApiService.getInstance().login(bo.getDeviceIp(), bo.getDevicePort().shortValue(), bo.getDeviceAccount(), bo.getDevicePwd()); + if (!isLogin) { + throw new RuntimeException("海康设备添加失败."); + } + // 写入设备通道信息 + SisDeviceChannel channel = new SisDeviceChannel(); + channel.setDeviceId(bo.getId()); + channel.setChannelName(bo.getDeviceName()); + channel.setGroupId(bo.getGroupId()); + channel.setDeviceIp(bo.getDeviceIp()); + channel.setDevicePort(HikSdkConstans.DEFAULT_RTSP_PORT); + channel.setFactoryNo(bo.getFactoryNo()); + channel.setDeviceAccount(bo.getDeviceAccount()); + channel.setDevicePwd(bo.getDevicePwd()); + channel.setDeviceMac(bo.getDeviceMac()); + channel.setChannelNo(HikSdkConstans.DEFAULT_CHANNEL); + this.insert(channel); + return true; + } else if (DeviceTypeEnum.NVR.getType().equals(bo.getDeviceType())) { + //TODO + } else if (DeviceTypeEnum.DVR.getType().equals(bo.getDeviceType())) { + + } + return false; + } + + @Override + public Integer deleteByDeviceIds(List deviceIds) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(SisDeviceChannel::getDeviceId, deviceIds); + return baseMapper.delete(lqw); + } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java index e6042506..c386f461 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.sis.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -7,19 +8,24 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.TreeNode; import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; 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.sis.domain.SisDeviceManage; import org.dromara.sis.domain.bo.SisDeviceManageBo; +import org.dromara.sis.domain.enums.FactoryNoEnum; import org.dromara.sis.domain.vo.SisDeviceManageVo; import org.dromara.sis.mapper.SisDeviceManageMapper; +import org.dromara.sis.sdk.hik.HikApiService; +import org.dromara.sis.service.ISisDeviceChannelService; import org.dromara.sis.service.ISisDeviceManageService; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; -import java.util.Collection; -import java.util.List; -import java.util.Map; /** * 设备管理Service业务层处理 @@ -33,6 +39,7 @@ import java.util.Map; public class SisDeviceManageServiceImpl implements ISisDeviceManageService { private final SisDeviceManageMapper baseMapper; + private final ISisDeviceChannelService deviceChannelService; /** * 查询设备管理 @@ -54,8 +61,7 @@ public class SisDeviceManageServiceImpl implements ISisDeviceManageService { */ @Override public TableDataInfo queryPageList(SisDeviceManageBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + Page result = baseMapper.selectByPage(pageQuery.build(), bo); return TableDataInfo.build(result); } @@ -91,16 +97,25 @@ public class SisDeviceManageServiceImpl implements ISisDeviceManageService { * @return 是否新增成功 */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(SisDeviceManageBo bo) { SisDeviceManage add = MapstructUtils.convert(bo, SisDeviceManage.class); - validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setId(add.getId()); + // 获取设备通道信息 + handleDeviceChannelInfo(bo); } return flag; } + public void handleDeviceChannelInfo(SisDeviceManageBo bo) { + if (Objects.equals(bo.getFactoryNo(), FactoryNoEnum.HIK.getCode())) { + deviceChannelService.handleHikDeviceChannel(bo); + } + } + + /** * 修改设备管理 * @@ -128,14 +143,49 @@ public class SisDeviceManageServiceImpl implements ISisDeviceManageService { * @param isValid 是否进行有效性校验 * @return 是否删除成功 */ + @Transactional(rollbackFor = Exception.class) @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 + // 查询需要删除的设备 + List sisDeviceManages = baseMapper.selectByIds(ids); + if (CollUtil.isEmpty(sisDeviceManages)) { + return true; } - return baseMapper.deleteByIds(ids) > 0; + int i = baseMapper.deleteByIds(ids); + boolean flag = i > 0; + if (flag) { + SisDeviceManageServiceImpl aopProxy = SpringUtils.getAopProxy(this); + aopProxy.deleteDeviceRef(sisDeviceManages); + } + return flag; } + /** + * 异步删除设备的关联关系 + */ + @Async + public void deleteDeviceRef(List sisDeviceManages) { + List deviceIds = new ArrayList<>(sisDeviceManages.size()); + Map> factoryGroup = new HashMap<>(10); + sisDeviceManages.forEach(sisDeviceManage -> { + deviceIds.add(sisDeviceManage.getId()); + factoryGroup.computeIfAbsent(sisDeviceManage.getFactoryNo(), k -> new ArrayList<>()).add(sisDeviceManage); + + }); + // 删除设备通道 + int num = deviceChannelService.deleteByDeviceIds(deviceIds); + log.info("删除设备通道完成,num={}", num); + // 设备sdk注销 + for (Map.Entry> entry : factoryGroup.entrySet()) { + if (entry.getKey().equals(FactoryNoEnum.HIK.getCode())) { + entry.getValue().forEach(item -> { + HikApiService.getInstance().loginOut(item.getDeviceIp()); + }); + } + } + } + + @Override public SisDeviceManageVo queryVoByDeviceIp(Integer deviceCode) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisElevatorFloorRefServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisElevatorFloorRefServiceImpl.java index 3517d7be..566104de 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisElevatorFloorRefServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisElevatorFloorRefServiceImpl.java @@ -94,9 +94,9 @@ public class SisElevatorFloorRefServiceImpl implements ISisElevatorFloorRefServi baseMapper.deleteByIds(ids); boolean flag = false; - for (Long num : bo.getFloorNums()){ + for (Long num : bo.getFloorIds()){ SisElevatorFloorRef add = new SisElevatorFloorRef(); - add.setFloorNum(num); + add.setFloorId(num); add.setElevatorId(bo.getElevatorId()); flag = baseMapper.insert(add) > 0; } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbFactoryServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/TbFactoryServiceImpl.java similarity index 92% rename from ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbFactoryServiceImpl.java rename to ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/TbFactoryServiceImpl.java index a4429539..450127ae 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbFactoryServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/TbFactoryServiceImpl.java @@ -1,24 +1,24 @@ -package org.dromara.property.service.impl; +package org.dromara.sis.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.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.property.domain.TbFactory; -import org.dromara.property.domain.bo.TbFactoryBo; -import org.dromara.property.domain.vo.TbFactoryVo; +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.sis.domain.TbFactory; +import org.dromara.sis.domain.bo.TbFactoryBo; +import org.dromara.sis.domain.vo.TbFactoryVo; +import org.dromara.sis.mapper.TbFactoryMapper; +import org.dromara.sis.service.ITbFactoryService; import org.springframework.stereotype.Service; -import org.dromara.property.mapper.TbFactoryMapper; -import org.dromara.property.service.ITbFactoryService; +import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Collection; /** * 厂商管理Service业务层处理 diff --git a/ruoyi-modules/Sis/src/main/resources/application.yml b/ruoyi-modules/Sis/src/main/resources/application.yml index c2acc2b9..ed056a75 100644 --- a/ruoyi-modules/Sis/src/main/resources/application.yml +++ b/ruoyi-modules/Sis/src/main/resources/application.yml @@ -32,3 +32,5 @@ spring: - optional:nacos:application-common.yml - optional:nacos:datasource.yml - optional:nacos:${spring.application.name}.yml + + diff --git a/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisDeviceManageMapper.xml b/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisDeviceManageMapper.xml index 62440a20..56ea0b63 100644 --- a/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisDeviceManageMapper.xml +++ b/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisDeviceManageMapper.xml @@ -4,4 +4,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + diff --git a/ruoyi-modules/Sis/src/main/resources/mapper/sis/TbFactoryMapper.xml b/ruoyi-modules/Sis/src/main/resources/mapper/sis/TbFactoryMapper.xml new file mode 100644 index 00000000..eba69e09 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/resources/mapper/sis/TbFactoryMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml index 3e55175f..bb867d3f 100644 --- a/ruoyi-modules/pom.xml +++ b/ruoyi-modules/pom.xml @@ -15,7 +15,7 @@ ruoyi-resource ruoyi-workflow Property - Sis + ruoyi-modules diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties b/ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties index 7793dd73..9cc5f0dd 100644 --- a/ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties +++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties @@ -40,9 +40,9 @@ spring.sql.init.platform=mysql db.num=1 ### Connect URL of DB: -db.url.0=jdbc:mysql://47.109.37.87:3002/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true -db.user.0=by -db.password.0=123456 +db.url.0=jdbc:mysql://127.0.0.1:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true +db.user.0=root +db.password.0=root ### the maximum retry times for push nacos.config.push.maxRetryTime=50