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