Compare commits

...

17 Commits

Author SHA1 Message Date
c4495d2cf2 Merge pull request '修改了车辆收费bug' (#1) from master into prod
All checks were successful
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Successful in 11m47s
Reviewed-on: #1
2025-08-26 13:57:40 +08:00
a16c333759 修改了车辆收费bug 2025-08-26 13:12:50 +08:00
6e84a1c646 发布
All checks were successful
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Successful in 16m48s
2025-08-26 10:52:59 +08:00
a6b0277ff6 fix:绿植租赁方案删除 2025-08-26 10:26:47 +08:00
ef0976c621 Merge remote-tracking branch 'origin/master' 2025-08-26 09:50:12 +08:00
e949122b37 修改了车辆收费bug 2025-08-26 09:47:32 +08:00
638a98a4c6 Merge remote-tracking branch 'origin/master' 2025-08-25 18:35:32 +08:00
360f87ea0d 更新 .gitea/workflows/master.yml 2025-08-25 18:35:30 +08:00
555de9f5aa refactor(property): 1 2025-08-25 18:34:30 +08:00
da131cda5c 修改了物业一些bug
Some checks failed
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Failing after 12m36s
2025-08-25 17:31:33 +08:00
c86f887d3e 更新 .gitea/workflows/master.yml
All checks were successful
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Successful in 17m20s
2025-08-25 16:31:56 +08:00
2c127576a0 删除 .gitea/workflows/dev.yml
Some checks failed
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Has been cancelled
2025-08-25 16:31:11 +08:00
15a0f3f884 更新 ruoyi-modules/Property/Dockerfile
All checks were successful
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Successful in 6m25s
2025-08-24 17:51:22 +08:00
0d4754eef9 Merge remote-tracking branch 'origin/master'
All checks were successful
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Successful in 6m51s
2025-08-24 16:58:14 +08:00
dad6666107 feat(ImageUtil): 添加图片压缩方向处理功能 2025-08-24 16:58:03 +08:00
dy
87b77b26d1 Merge branch 'master' of http://47.109.37.87:3000/by2025/SmartParks
All checks were successful
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Successful in 6m22s
2025-08-23 22:55:22 +08:00
dy
0584a44601 H5新增访客 2025-08-23 22:55:11 +08:00
68 changed files with 724 additions and 372 deletions

View File

@@ -1,210 +0,0 @@
run-name: ${{ gitea.actor }} 构建镜像并推送不含JAR依赖上传🚀
on:
push:
branches:
- main
jobs:
build-parent-pom:
runs-on: ubuntu
steps:
- name: 拉取代码仓库
uses: http://git.missmoc.top/mocheng/checkout@v4
- name: 配置环境变量(绝对路径)
run: |
export JAVA_HOME="/java17/java17"
export MAVEN_HOME="/maven/apache-maven-3.9.11"
if [ ! -f "$JAVA_HOME/bin/java" ]; then
echo "错误JDK可执行文件不存在于 $JAVA_HOME/bin/java"
exit 1
fi
if [ ! -f "$MAVEN_HOME/bin/mvn" ]; then
echo "错误Maven可执行文件不存在于 $MAVEN_HOME/bin/mvn"
exit 1
fi
echo "JAVA_HOME=$JAVA_HOME" >> $GITHUB_ENV
echo "$JAVA_HOME/bin" >> $GITHUB_PATH
echo "MAVEN_HOME=$MAVEN_HOME" >> $GITHUB_ENV
echo "$MAVEN_HOME/bin" >> $GITHUB_PATH
"$JAVA_HOME/bin/java" -version
"$MAVEN_HOME/bin/mvn" -v
- name: 配置Maven仓库
run: |
mkdir -p ~/.m2
cat > ~/.m2/settings.xml << EOF
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<localRepository>/root/.m2/repository</localRepository>
<profiles>
<profile>
<id>multi-repo</id>
<repositories>
<repository>
<id>local-repo</id>
<url>file:///root/.m2/repository</url>
</repository>
<repository>
<id>aliyun-public</id>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>multi-repo</activeProfile>
</activeProfiles>
</settings>
EOF
- name: 构建主POM仅本地安装不上传
run: |
MAIN_POM_ABSOLUTE_PATH="${GITHUB_WORKSPACE}/pom.xml"
if [ ! -f "$MAIN_POM_ABSOLUTE_PATH" ]; then
echo "错误主POM文件不存在"
exit 1
fi
retries=3
count=0
until "$MAVEN_HOME/bin/mvn" clean install -U -DskipTests -f "$MAIN_POM_ABSOLUTE_PATH"; do
count=$((count + 1))
if [ $count -ge $retries ]; then
echo "错误主POM构建失败"
exit 1
fi
sleep 10
done
# build-common-modules:
# needs: build-parent-pom
# runs-on: ubuntu
# steps:
# - name: 拉取代码仓库
# uses: http://git.missmoc.top/mocheng/checkout@v4
# - name: 配置环境变量
# run: |
# export JAVA_HOME="/java17/java17"
# export MAVEN_HOME="/maven/apache-maven-3.9.11"
# echo "JAVA_HOME=$JAVA_HOME" >> $GITHUB_ENV
# echo "$JAVA_HOME/bin" >> $GITHUB_PATH
# echo "MAVEN_HOME=$MAVEN_HOME" >> $GITHUB_ENV
# echo "$MAVEN_HOME/bin" >> $GITHUB_PATH
# - name: 构建通用模块(仅本地使用,不上传)
# run: |
# COMMON_MODULES=(
# "ruoyi-common"
# "ruoyi-api"
# "ruoyi-common-bom"
# "ruoyi-common-alibaba-bom"
# "ruoyi-api-bom"
# )
# for module in "${COMMON_MODULES[@]}"; do
# MODULE_POM_ABSOLUTE_PATH="${GITHUB_WORKSPACE}/${module}/pom.xml"
# if [ ! -f "$MODULE_POM_ABSOLUTE_PATH" ]; then
# echo "警告:模块 $module 不存在,跳过"
# continue
# fi
# retries=3
# count=0
# until "$MAVEN_HOME/bin/mvn" clean compile install -U -DskipTests -f "$MODULE_POM_ABSOLUTE_PATH"; do
# count=$((count + 1))
# if [ $count -ge $retries ]; then
# echo "错误:模块 $module 构建失败"
# exit 1
# fi
# sleep 10
# done
# done
build-and-push-services:
needs: build-common-modules
runs-on: ubuntu
strategy:
matrix:
service:
- ruoyi-auth
- ruoyi-gateway
- ruoyi-modules/Property
- ruoyi-modules/ruoyi-gen
- ruoyi-modules/ruoyi-job
- ruoyi-modules/ruoyi-resource
- ruoyi-modules/ruoyi-system
- ruoyi-modules/ruoyi-workflow
- ruoyi-modules/Sis
- ruoyi-visual/ruoyi-monitor
- ruoyi-visual/ruoyi-nacos
- ruoyi-seata-server
- ruoyi-sentinel-dashboard
- ruoyi-snailjob-server
steps:
- name: 拉取代码仓库
uses: http://git.missmoc.top/mocheng/checkout@v4
- name: 配置环境变量
run: |
export JAVA_HOME="/java17/java17"
export MAVEN_HOME="/maven/apache-maven-3.9.11"
echo "JAVA_HOME=$JAVA_HOME" >> $GITHUB_ENV
echo "$JAVA_HOME/bin" >> $GITHUB_PATH
echo "MAVEN_HOME=$MAVEN_HOME" >> $GITHUB_ENV
echo "$MAVEN_HOME/bin" >> $GITHUB_PATH
- name: 构建服务模块
run: |
SERVICE_NAME="${{ matrix.service }}"
SERVICE_POM_ABSOLUTE_PATH="${GITHUB_WORKSPACE}/${SERVICE_NAME}/pom.xml"
if [ ! -f "$SERVICE_POM_ABSOLUTE_PATH" ]; then
echo "错误:服务 $SERVICE_NAME 的POM文件不存在"
exit 1
fi
"$MAVEN_HOME/bin/mvn" clean package -U -DskipTests -f "$SERVICE_POM_ABSOLUTE_PATH"
- name: 配置Docker Buildx
uses: http://git.missmoc.top/mocheng/setup-buildx-action@v3
- name: 登录到容器仓库
uses: http://git.missmoc.top/mocheng/login-action@v3
with:
registry: ${{ secrets.REGISTRY_URL }}
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_PASS }}
- name: 确定Dockerfile路径
id: dockerfile-path
run: |
SERVICE_NAME="${{ matrix.service }}"
DOCKERFILE_ABSOLUTE_PATH="${GITHUB_WORKSPACE}/${SERVICE_NAME}/Dockerfile"
if [ -f "$DOCKERFILE_ABSOLUTE_PATH" ]; then
echo "dockerfile_path=$DOCKERFILE_ABSOLUTE_PATH" >> $GITHUB_OUTPUT
else
echo "dockerfile_path=${GITHUB_WORKSPACE}/Dockerfile" >> $GITHUB_OUTPUT
fi
- name: 构建并推送Docker镜像仅推送镜像不上传JAR
uses: http://git.missmoc.top/mocheng/build-push-action@v5
with:
context: "${{ github.workspace }}"
file: ${{ github.workspace }}/${{ matrix.service }}/Dockerfile
tags: 172.100.10.45:3000/by2025/smartparks/${{ matrix.service }}:latest
# tags: ${{ secrets.REGISTRY_URL }}/by2025/$(echo ${{ matrix.service }} | tr 'A-Z' 'a-z'):${{ github.sha }}
# tags: ${{ secrets.REGISTRY_URL }}/by2025/${{ matrix.service }}:2.0.4
push: true
cache-from: type=gha
cache-to: type=gha,mode=max
- name: 重启服务
id: dockerfile-path
run: |
kubectl rollout restart deployment sis -n smartparks
kubectl rollout restart deployment property -n smartparks

View File

@@ -3,7 +3,7 @@ name: Build and Push to Target Registry
# 监听master分支的推送事件
on:
push:
branches: [ master ]
branches: [ prod ]
jobs:
build-and-deploy:
@@ -87,8 +87,8 @@ jobs:
echo "===== 清理操作 ====="
docker system prune -f
echo "===== 所有操作完成 ===="
- name: 重启服务
run: |
kubectl rollout restart deployment sis -n smartparks
kubectl rollout restart deployment property -n smartparks
kubectl rollout restart deployment property -n smartparks

View File

@@ -11,7 +11,7 @@ RUN mkdir -p /ruoyi/Property/logs \
WORKDIR /ruoyi/Property
ENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
ENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="-Duser.timezone=Asia/Shanghai"
EXPOSE ${SERVER_PORT}

View File

@@ -26,7 +26,7 @@ import java.util.List;
/**
* 【业务管理-工单处理】
* 前端访问路由地址为:/system/workOrders
* 前端访问路由地址为:/property/workOrders
*
* @author mocheng
* @date 2025-07-07
@@ -42,7 +42,7 @@ public class ServiceWorkOrdersController extends BaseController {
/**
* 查询【工单处理】列表
*/
//@SaCheckPermission("system:workOrders:list")
@SaCheckPermission("property:workOrders:list")
@GetMapping("/list")
public TableDataInfo<ServiceWorkOrdersVo> list(ServiceWorkOrdersBo bo, PageQuery pageQuery) {
return serviceWorkOrdersService.queryPageList(bo, pageQuery);
@@ -51,7 +51,7 @@ public class ServiceWorkOrdersController extends BaseController {
/**
* 导出【工单处理】列表
*/
// @SaCheckPermission("system:workOrders:export")
@SaCheckPermission("property:workOrders:export")
@Log(title = "【工单处理】", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ServiceWorkOrdersBo bo, HttpServletResponse response) {
@@ -64,7 +64,7 @@ public class ServiceWorkOrdersController extends BaseController {
*
* @param id 主键
*/
// @SaCheckPermission("system:workOrders:query")
@SaCheckPermission("property:workOrders:query")
@GetMapping("/{id}")
public R<ServiceWorkOrdersInfoVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable("id") Long id) {
@@ -74,7 +74,7 @@ public class ServiceWorkOrdersController extends BaseController {
/**
* 新增【工单处理】
*/
// @SaCheckPermission("system:workOrders:add")
@SaCheckPermission("property:workOrders:add")
@Log(title = "【工单处理】", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
@@ -85,20 +85,40 @@ public class ServiceWorkOrdersController extends BaseController {
/**
* 修改【工单处理】
*/
//@SaCheckPermission("system:workOrders:edit")
@SaCheckPermission("property:workOrders:edit")
@Log(title = "【工单处理】", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ServiceWorkOrdersBo bo) {
return toAjax(serviceWorkOrdersService.updateByBo(bo));
}
/**
* 派单【工单处理】
*/
@SaCheckPermission("property:workOrders:dispatch")
@Log(title = "【工单处理】", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("/dispatch")
public R<Void> dispatch(@Validated(EditGroup.class) @RequestBody ServiceWorkOrdersBo bo) {
return toAjax(serviceWorkOrdersService.updateByBo(bo));
}
/**
* 抢单【工单处理】
*/
@SaCheckPermission("property:workOrders:grab")
@Log(title = "【工单处理】", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("grab")
public R<Void> grab(@Validated(EditGroup.class) @RequestBody ServiceWorkOrdersBo bo) {
return toAjax(serviceWorkOrdersService.updateByBo(bo));
}
/**
* 删除【工单处理】
*
* @param ids 主键串
*/
// @SaCheckPermission("system:workOrders:remove")
@SaCheckPermission("property:workOrders:remove")
@Log(title = "【工单处理】", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")

View File

@@ -149,6 +149,24 @@ public class TbVisitorManagementController extends BaseController {
return toAjax(tbVisitorManagementService.insertByBo(bo));
}
/**
* h5端新增访客管理
* @param bo
* @return
*/
@SaCheckPermission("property:visitorManagement:addH5VistorManagement")
@Log(title = "访客管理", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/addH5VistorManagement")
public R<Void> addH5VistorManagement(@Validated(AddGroup.class) @RequestBody TbVisitorManagementBo bo) {
QrCodeInfo info = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY +"Qrcode" + bo.getQrCodeId());
if (info==null){
return R.fail("请确认Qr码有效");
}
bo.setType(0);
return toAjax(tbVisitorManagementService.insertH5ByBo(bo));
}
/**
* pc端新增访客管理
*/

View File

@@ -47,7 +47,7 @@ public class ServiceWorkOrders extends TenantEntity {
private Long type;
/**
* 状态
* 状态(0创建工单,1已派单2已抢单3处理中,4已完成,5已评价)
*/
private String status;

View File

@@ -38,7 +38,7 @@ public class ServiceWorkOrdersType extends TenantEntity {
private String orderTypeName;
/**
* 运作模式
* 运作模式(0派单+抢单,1派单,2自动派单)
*/
private String operationMode;
@@ -56,7 +56,10 @@ public class ServiceWorkOrdersType extends TenantEntity {
* 是否支持转单(0支持,1不支持)
*/
private Integer isTransfers;
/**
* 权重(1一般2紧急3危急)
*/
private String processingWeight;
/**
* 搜索值
*/

View File

@@ -50,6 +50,11 @@ public class CostCarChargeBo extends BaseEntity {
* 车位
*/
private String location;
/**
* 车位名称
*/
private String locationName;
/**
* 缴费状态
*/

View File

@@ -54,7 +54,10 @@ public class ServiceWorkOrdersTypeBo extends BaseEntity {
*/
@NotNull(message = "完成时效不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer completionNumber;
/**
* 权重(1一般2紧急3危急)
*/
private String processingWeight;
/**
* 是否支持转单(0支持,1不支持)
*/

View File

@@ -1,6 +1,6 @@
package org.dromara.property.domain.bo.smartDevicesBo;
import org.dromara.property.domain.TbLightInfo;
import org.dromara.property.domain.entity.smartDevices.TbLightInfo;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;

View File

@@ -1,6 +1,6 @@
package org.dromara.property.domain.bo.smartDevicesBo;
import org.dromara.property.domain.TbMeterConfig;
import org.dromara.property.domain.entity.smartDevices.TbMeterConfig;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;

View File

@@ -1,6 +1,6 @@
package org.dromara.property.domain.bo.smartDevicesBo;
import org.dromara.property.domain.TbMeterInfo;
import org.dromara.property.domain.entity.smartDevices.TbMeterInfo;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;

View File

@@ -1,6 +1,6 @@
package org.dromara.property.domain.bo.smartDevicesBo;
import org.dromara.property.domain.TbMeterRecord;
import org.dromara.property.domain.entity.smartDevices.TbMeterRecord;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
@@ -8,13 +8,15 @@ import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
/**
* 抄记录业务对象 tb_meter_record
*
* @author lsm
* @date 2025-07-19
* @since 2025-07-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
@@ -33,6 +35,12 @@ public class TbMeterRecordBo extends BaseEntity {
@NotBlank(message = "仪表编号不能为空", groups = { AddGroup.class, EditGroup.class })
private String meterId;
/**
* 设备类型(1-电表2-水表3-气表)
*/
@NotNull(message = "仪表类型不能为空", groups = { AddGroup.class, EditGroup.class })
private Long meterType;
/**
* 抄表员ID
*/
@@ -49,18 +57,13 @@ public class TbMeterRecordBo extends BaseEntity {
* 当前读数
*/
@NotNull(message = "当前读数不能为空", groups = { AddGroup.class, EditGroup.class })
private Long currentReading;
private BigDecimal currentReading;
/**
* 上次读数
*/
@NotNull(message = "上次读数不能为空", groups = { AddGroup.class, EditGroup.class })
private Long previousReading;
/**
* 用量
*/
private Long consumption;
private BigDecimal previousReading;
/**
* 抄表方式(1手动 2自动 3用户上报)
@@ -71,7 +74,7 @@ public class TbMeterRecordBo extends BaseEntity {
/**
* 抄表照片
*/
private Long imgOssid;
private Long imgOssId;
}

View File

@@ -1,6 +1,6 @@
package org.dromara.property.domain.bo.smartDevicesBo;
import org.dromara.property.domain.TbMeterRoom;
import org.dromara.property.domain.entity.smartDevices.TbMeterRoom;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;

View File

@@ -1,4 +1,4 @@
package org.dromara.property.domain;
package org.dromara.property.domain.entity.smartDevices;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;

View File

@@ -1,4 +1,4 @@
package org.dromara.property.domain;
package org.dromara.property.domain.entity.smartDevices;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;

View File

@@ -1,4 +1,4 @@
package org.dromara.property.domain;
package org.dromara.property.domain.entity.smartDevices;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;

View File

@@ -1,11 +1,12 @@
package org.dromara.property.domain;
package org.dromara.property.domain.entity.smartDevices;
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;
import java.io.Serial;
@@ -13,7 +14,7 @@ import java.io.Serial;
* 抄记录对象 tb_meter_record
*
* @author lsm
* @date 2025-07-19
* @since 2025-07-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
@@ -34,6 +35,11 @@ public class TbMeterRecord extends TenantEntity {
*/
private String meterId;
/**
* 设备类型(1-电表2-水表3-气表)
*/
private Long meterType;
/**
* 抄表员ID
*/
@@ -47,17 +53,17 @@ public class TbMeterRecord extends TenantEntity {
/**
* 当前读数
*/
private Long currentReading;
private BigDecimal currentReading;
/**
* 上次读数
*/
private Long previousReading;
private BigDecimal previousReading;
/**
* 用量
*/
private Long consumption;
private BigDecimal consumption;
/**
* 抄表方式(1手动 2自动 3用户上报)
@@ -67,7 +73,7 @@ public class TbMeterRecord extends TenantEntity {
/**
* 抄表照片
*/
private Long imgOssid;
private Long imgOssId;
}

View File

@@ -1,4 +1,4 @@
package org.dromara.property.domain;
package org.dromara.property.domain.entity.smartDevices;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;

View File

@@ -0,0 +1,30 @@
package org.dromara.property.domain.enums;
/**
* 收费类型枚举
*/
public enum ChargeTypeEnum {
/**
* 房屋收费
*/
HOUS_CHARGES("房屋收费", "1"),
/**
* 车辆收费
*/
CARD_CHARGES("车辆收费", "2");
private final String name;
private final String value;
ChargeTypeEnum(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return this.name;
}
public String getValue() {
return this.value;
}
}

View File

@@ -0,0 +1,28 @@
package org.dromara.property.domain.enums;
/**
* 工单上报类型
*/
public enum OrderReportingTypeEnum {
TELEPHONE_REPORT("电话上报", "1"),
SCENE_REPORT("现场上报", "2"),
SYSTEM_REPORT("系统上报", "3"),
PHONE_REPORT("手机上报", "4");
private final String name;
private final String value;
OrderReportingTypeEnum(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return this.name;
}
public String getValue() {
return this.value;
}
}

View File

@@ -0,0 +1,28 @@
package org.dromara.property.domain.enums;
/**
* @Author:yuyongle
* @Date:2025/7/4 10:35
* @Description:工单类型运作模式
**/
public enum OrderTypeOperationEnum {
DISPATCH_ORDERS_AND_GRAB_ORDERS("派单+抢单", "0"),
DISPATCH("派单", "1"),
AUTOMATE_DISPATCH("自动派单", "2");
private final String name;
private final String value;
OrderTypeOperationEnum(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return this.name;
}
public String getValue() {
return this.value;
}
}

View File

@@ -35,6 +35,10 @@ public class CostHouseChargeDetailVo implements Serializable {
*/
@ExcelProperty(value = "房屋")
private Long roomId;
/**
* 房屋名称
*/
private String roomName;
/**
* 业主
*/

View File

@@ -42,6 +42,11 @@ public class CostHouseChargeVo implements Serializable {
*/
@ExcelProperty(value = "房屋")
private Long roomId;
/**
* 房屋名称
*/
private String roomName;
/**
* 业主
*/

View File

@@ -45,6 +45,10 @@ public class CostMeterWaterVo implements Serializable {
* 费用类型
*/
private String costType;
/**
* 费用名称
*/
private String costTypeName;
/**
* 房间id
*/

View File

@@ -53,8 +53,12 @@ public class CostPayFeeAuditVo implements Serializable {
/**
* 房间号(如101,202)
*/
@ExcelProperty(value = "房间号(如101,202)")
@ExcelProperty(value = "房间号")
private String roomNumber;
/**
* 车牌号
*/
private String carNumber;
/**
* 费用项目id

View File

@@ -57,7 +57,10 @@ public class ServiceWorkOrdersInfoVo implements Serializable {
*/
@ExcelProperty(value = "权重")
private String processingWeight;
/**
* 运作模式(0派单+抢单,1派单,2自动派单)
*/
private String operationMode;
/**
* 状态
*/

View File

@@ -68,7 +68,10 @@ public class ServiceWorkOrdersTypeVo implements Serializable {
*/
@ExcelProperty(value = "是否支持转单(0支持,1不支持)")
private Integer isTransfers;
/**
* 权重(1一般2紧急3危急)
*/
private String processingWeight;
/**
* 搜索值

View File

@@ -67,7 +67,7 @@ public class ServiceWorkOrdersVo implements Serializable {
/**
* 状态
*/
@ExcelProperty(value = "状态")
@ExcelProperty(value = "状态(0创建工单,1已派单2已抢单3处理中,4已完成,5已评价)")
private String status;
/**
@@ -75,7 +75,10 @@ public class ServiceWorkOrdersVo implements Serializable {
*/
@ExcelProperty(value = "派单时间")
private Date dispatchTime;
/**
* 运作模式(0派单+抢单,1派单,2自动派单)
*/
private String operationMode;
/**
* 发起人
*/

View File

@@ -1,6 +1,6 @@
package org.dromara.property.domain.vo.smartDevicesVo;
import org.dromara.property.domain.TbLightInfo;
import org.dromara.property.domain.entity.smartDevices.TbLightInfo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
@@ -10,8 +10,6 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**

View File

@@ -1,6 +1,6 @@
package org.dromara.property.domain.vo.smartDevicesVo;
import org.dromara.property.domain.TbMeterConfig;
import org.dromara.property.domain.entity.smartDevices.TbMeterConfig;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;

View File

@@ -2,7 +2,7 @@ package org.dromara.property.domain.vo.smartDevicesVo;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import org.dromara.property.domain.TbMeterInfo;
import org.dromara.property.domain.entity.smartDevices.TbMeterInfo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;

View File

@@ -1,8 +1,9 @@
package org.dromara.property.domain.vo.smartDevicesVo;
import java.math.BigDecimal;
import java.util.Date;
import org.dromara.property.domain.TbMeterRecord;
import org.dromara.property.domain.entity.smartDevices.TbMeterRecord;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
@@ -16,7 +17,7 @@ import java.io.Serializable;
* 抄记录视图对象 tb_meter_record
*
* @author lsm
* @date 2025-07-19
* @since 2025-07-19
*/
@Data
@ExcelIgnoreUnannotated
@@ -38,6 +39,12 @@ public class TbMeterRecordVo implements Serializable {
@ExcelProperty(value = "仪表编号")
private String meterId;
/**
* 设备类型(1-电表2-水表3-气表)
*/
@ExcelProperty(value = "仪表类型")
private Long meterType;
/**
* 抄表员ID
*/
@@ -54,19 +61,19 @@ public class TbMeterRecordVo implements Serializable {
* 当前读数
*/
@ExcelProperty(value = "当前读数")
private Long currentReading;
private BigDecimal currentReading;
/**
* 上次读数
*/
@ExcelProperty(value = "上次读数")
private Long previousReading;
private BigDecimal previousReading;
/**
* 用量
*/
@ExcelProperty(value = "用量")
private Long consumption;
private BigDecimal consumption;
/**
* 抄表方式(1手动 2自动 3用户上报)
@@ -78,7 +85,7 @@ public class TbMeterRecordVo implements Serializable {
* 抄表照片
*/
@ExcelProperty(value = "抄表照片")
private Long imgOssid;
private Long imgOssId;
}

View File

@@ -1,6 +1,6 @@
package org.dromara.property.domain.vo.smartDevicesVo;
import org.dromara.property.domain.TbMeterRoom;
import org.dromara.property.domain.entity.smartDevices.TbMeterRoom;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;

View File

@@ -17,6 +17,7 @@ import java.util.List;
public interface PlantsPlanProductMapper extends BaseMapperPlus<PlantsPlanProduct, PlantsPlanProductVo> {
void deleteByPlanId(Long planId);
void deleteByPlanIds(List<Long> planIds);
List<PlantsPlanProductVo> queryProductsInfo(Long planId);
}

View File

@@ -20,5 +20,5 @@ public interface TbRoomMapper extends BaseMapperPlus<TbRoom, TbRoomVo> {
//查询房间名称
String queryRoomName(Long roomId);
Map<Long,String> queryRoomNameList(@Param("ids") List<Long> ids);
List<String> queryRoomNameList(@Param("ids") List<Long> ids);
}

View File

@@ -1,7 +1,7 @@
package org.dromara.property.mapper.smartDevicesMapper;
import org.apache.ibatis.annotations.Mapper;
import org.dromara.property.domain.TbLightInfo;
import org.dromara.property.domain.entity.smartDevices.TbLightInfo;
import org.dromara.property.domain.vo.smartDevicesVo.TbLightInfoVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;

View File

@@ -1,7 +1,7 @@
package org.dromara.property.mapper.smartDevicesMapper;
import org.apache.ibatis.annotations.Mapper;
import org.dromara.property.domain.TbMeterConfig;
import org.dromara.property.domain.entity.smartDevices.TbMeterConfig;
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterConfigVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;

View File

@@ -1,6 +1,6 @@
package org.dromara.property.mapper.smartDevicesMapper;
import org.dromara.property.domain.TbMeterInfo;
import org.dromara.property.domain.entity.smartDevices.TbMeterInfo;
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterInfoVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;

View File

@@ -1,6 +1,7 @@
package org.dromara.property.mapper.smartDevicesMapper;
import org.dromara.property.domain.TbMeterRecord;
import org.apache.ibatis.annotations.Mapper;
import org.dromara.property.domain.entity.smartDevices.TbMeterRecord;
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterRecordVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
@@ -8,8 +9,9 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
* 抄记录Mapper接口
*
* @author lsm
* @date 2025-07-19
* @since 2025-07-19
*/
@Mapper
public interface TbMeterRecordMapper extends BaseMapperPlus<TbMeterRecord, TbMeterRecordVo> {
}

View File

@@ -1,7 +1,7 @@
package org.dromara.property.mapper.smartDevicesMapper;
import org.apache.ibatis.annotations.Mapper;
import org.dromara.property.domain.TbMeterRoom;
import org.dromara.property.domain.entity.smartDevices.TbMeterRoom;
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterRoomVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;

View File

@@ -67,6 +67,12 @@ public interface IPlantsPlanProductService {
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 根据方案id删除方案产品
* @param ids
*/
void deleteByPlanIds(List<Long> ids);
/**
* 批量保存租赁方案植物
*

View File

@@ -9,6 +9,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 房间信息Service接口
@@ -76,5 +77,11 @@ public interface ITbRoomService {
* @return 房间名称
*/
String queryRoomName(Long roomId);
/**
* 获取详细房间名称
* @param ids 房间id集合
* @return 房间名称
*/
List<String> queryRoomNameList(List<Long> ids);
}

View File

@@ -56,6 +56,14 @@ public interface ITbVisitorManagementService {
*/
Boolean insertByBo(TbVisitorManagementBo bo);
/**
* 新增访客管理
*
* @param bo 访客管理
* @return 是否新增成功
*/
Boolean insertH5ByBo(TbVisitorManagementBo bo);
Boolean insertVistorManagementByBo(TbVisitorManagementBo bo);

View File

@@ -73,7 +73,7 @@ public class AssetTypeServiceImpl implements IAssetTypeService {
private LambdaQueryWrapper<AssetType> buildQueryWrapper(AssetTypeBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<AssetType> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(AssetType::getId);
lqw.orderByAsc(AssetType::getSort);
lqw.like(StringUtils.isNotBlank(bo.getAssetTypeName()), AssetType::getAssetTypeName, bo.getAssetTypeName());
lqw.eq(bo.getSort() != null, AssetType::getSort, bo.getSort());
return lqw;

View File

@@ -81,7 +81,9 @@ public class CostCarChargeServiceImpl implements ICostCarChargeService {
Page<CostCarChargeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
// List<Long> residentPersonIdList = result.getRecords().stream().map(vo -> vo.getPersonId()).distinct().collect(Collectors.toList());
// List<RemoteUserVo> remoteUserVos = remoteUserService.selectListByIds(residentPersonIdList);
List<ResidentPerson> residentPeoplelist = residentPersonMapper.selectList();
// List<String> roomNames = roomService.queryRoomNameList(idList);
result.getRecords().stream().forEach(s -> {
if (CollUtil.isNotEmpty(residentPeoplelist)) {
ResidentPerson residentPerson = residentPeoplelist.stream()

View File

@@ -55,6 +55,7 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
private final ResidentPersonMapper residentPersonMapper;
@DubboReference
private RemoteUserService remoteUserService;
/**
* 查询房屋收费
*
@@ -66,12 +67,14 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
CostHouseChargeVo costHouseChargeVo = baseMapper.selectVoById(id);
CostHouseChargeDetailVo costHouseChargeDetailVo = BeanUtil.copyProperties(costHouseChargeVo, CostHouseChargeDetailVo.class);
CostItemsVo costItemsVo = costItemsMapper.selectVoById(costHouseChargeDetailVo.getCostItemsId());
costHouseChargeDetailVo.setCostItemsVo(ObjectUtil.isNotEmpty(costItemsVo)?costItemsVo:null);
costHouseChargeDetailVo.setCostItemsVo(ObjectUtil.isNotEmpty(costItemsVo) ? costItemsVo : null);
TbRoomVo tbRoomVo = tbRoomMapper.selectVoById(costHouseChargeDetailVo.getRoomId());
costHouseChargeDetailVo.setRoomVo(ObjectUtil.isNotEmpty(tbRoomVo)?tbRoomVo:null);
ResidentPersonVo residentPersonVo = residentPersonMapper.selectVoById(costHouseChargeVo.getPersonId());
costHouseChargeDetailVo.setRoomVo(ObjectUtil.isNotEmpty(tbRoomVo) ? tbRoomVo : null);
ResidentPersonVo residentPersonVo = residentPersonMapper.selectVoById(costHouseChargeVo.getPersonId());
//RemoteUserVo userInfo = remoteUserService.getUserInfoById(costHouseChargeVo.getPersonId());
costHouseChargeDetailVo.setPersonName(ObjectUtil.isNotEmpty(residentPersonVo)?residentPersonVo.getUserName():null);
String roomName = tbRoomMapper.queryRoomName(costHouseChargeDetailVo.getRoomId());
costHouseChargeDetailVo.setRoomName(StringUtils.isNotBlank(roomName) ? roomName : null);
costHouseChargeDetailVo.setPersonName(ObjectUtil.isNotEmpty(residentPersonVo) ? residentPersonVo.getUserName() : null);
return costHouseChargeDetailVo;
}
@@ -91,7 +94,9 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
if (CollUtil.isNotEmpty(residentPeoplelist)) {
ResidentPerson residentPerson = residentPeoplelist.stream()
.filter(vo -> vo.getId() != null && vo.getId().equals(s.getPersonId())).findFirst().orElse(null);
s.setPersonName(ObjectUtil.isNotEmpty(residentPerson)?residentPerson.getUserName():null);
s.setPersonName(ObjectUtil.isNotEmpty(residentPerson) ? residentPerson.getUserName() : null);
String roomName = tbRoomMapper.queryRoomName(s.getRoomId());
s.setRoomName(StringUtils.isNotBlank(roomName) ? roomName : null);
}
});
return TableDataInfo.build(result);
@@ -181,7 +186,7 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
@Transactional(rollbackFor = Exception.class)
public Boolean returnFree(CostChargeReturnFeeBo bo) {
CostHouseChargeVo costHouseChargeVo = baseMapper.selectVoById(bo.getId());
Assert.isTrue(ObjectUtil.isNotEmpty(costHouseChargeVo),"该费用不存在");
Assert.isTrue(ObjectUtil.isNotEmpty(costHouseChargeVo), "该费用不存在");
var CostReturnPayFee = new CostReturnPayFee().setItemId(costHouseChargeVo.getCostItemsId())
.setReturnNo(RandomUtil.randomNumbers(11))
.setReason(bo.getReason())
@@ -189,8 +194,7 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
.setUserId(costHouseChargeVo.getPersonId())
.setPayNo(costHouseChargeVo.getId().toString())
.setPayAcount(costHouseChargeVo.getAmountReceivable())
.setState("0")
;
.setState("0");
boolean flag = costReturnPayFeeMapper.insert(CostReturnPayFee) > 0;
CostHouseCharge costHouseCharge = BeanUtil.copyProperties(costHouseChargeVo, CostHouseCharge.class);
costHouseCharge.setChargeStatus(ChargeStatusEnum.REFUND_PENDING_REVIEW.getValue());

View File

@@ -1,6 +1,8 @@
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;
@@ -10,6 +12,8 @@ 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.CostMeterTypeVo;
import org.dromara.property.mapper.CostMeterTypeMapper;
import org.springframework.stereotype.Service;
import org.dromara.property.domain.bo.CostMeterWaterBo;
import org.dromara.property.domain.vo.CostMeterWaterVo;
@@ -35,6 +39,7 @@ import java.util.Collection;
public class CostMeterWaterServiceImpl implements ICostMeterWaterService {
private final CostMeterWaterMapper baseMapper;
private final CostMeterTypeMapper costMeterTypeMapper;
/**
* 查询费用-水电抄
@@ -58,6 +63,16 @@ public class CostMeterWaterServiceImpl implements ICostMeterWaterService {
public TableDataInfo<CostMeterWaterVo> queryPageList(CostMeterWaterBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CostMeterWater> lqw = buildQueryWrapper(bo);
Page<CostMeterWaterVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
if (CollUtil.isNotEmpty(result.getRecords())){
//收集抄表类型id
List<Long> meterTypeIds = result.getRecords().stream().map(CostMeterWaterVo::getMeterTypeId).toList();
List<CostMeterTypeVo> costMeterTypeVos = costMeterTypeMapper.selectVoByIds(meterTypeIds);
result.getRecords().stream().forEach(s -> {
//查找抄表类型名称
CostMeterTypeVo costMeterTypeVo = costMeterTypeVos.stream().filter(vo -> vo.getId() != null && vo.getId().equals(s.getMeterTypeId())).findFirst().orElse(null);
s.setCostTypeName(ObjectUtil.isNotEmpty(costMeterTypeVo)?costMeterTypeVo.getName():null);
});
}
return TableDataInfo.build(result);
}
@@ -79,6 +94,7 @@ public class CostMeterWaterServiceImpl implements ICostMeterWaterService {
lqw.orderByAsc(CostMeterWater::getId);
lqw.eq(bo.getItemId() != null, CostMeterWater::getItemId, bo.getItemId());
lqw.eq(bo.getMeterTypeId() != null, CostMeterWater::getMeterTypeId, bo.getMeterTypeId());
lqw.eq(StringUtils.isNotBlank(bo.getCostType()), CostMeterWater::getCostType, bo.getCostType());
lqw.like(StringUtils.isNotBlank(bo.getObjName()), CostMeterWater::getObjName, bo.getObjName());
lqw.eq(StringUtils.isNotBlank(bo.getCurDegrees()), CostMeterWater::getCurDegrees, bo.getCurDegrees());
lqw.eq(StringUtils.isNotBlank(bo.getPreDegrees()), CostMeterWater::getPreDegrees, bo.getPreDegrees());

View File

@@ -18,6 +18,7 @@ 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.enums.ChargeTypeEnum;
import org.dromara.property.domain.vo.*;
import org.dromara.property.mapper.*;
import org.dromara.property.service.ICostPayFeeAuditService;
@@ -59,7 +60,18 @@ public class CostPayFeeAuditServiceImpl implements ICostPayFeeAuditService {
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());
if (costPayFeeAuditVo.getChargeType().equals(ChargeTypeEnum.HOUS_CHARGES.getValue())) {
CostHouseCharge costHouseCharge = coinHouseChargeMapper.selectById(costPayFeeAuditVo.getChargeId());
if (ObjectUtil.isNotEmpty(costHouseCharge)) {
String queryRoomName = roomMapper.queryRoomName(costHouseCharge.getRoomId());
costPayFeeAuditVo.setRoomNumber(ObjectUtil.isNotEmpty(queryRoomName) ? queryRoomName : null);
}
}
if (costPayFeeAuditVo.getChargeType().equals(ChargeTypeEnum.CARD_CHARGES.getValue())) {
CostCarCharge costCarCharge = costCarChargeMapper.selectById(costPayFeeAuditVo.getChargeId());
costPayFeeAuditVo.setCarNumber(ObjectUtil.isNotEmpty(costCarCharge) ? costCarCharge.getCarNumber() : null);
}
// TbRoomVo roomVo = roomMapper.selectVoById(costPayFeeAuditVo.getChargeId());
//costPayFeeAuditVo.setRoomNumber(ObjectUtil.isNotEmpty(roomVo)? roomVo.getRoomNumber() :null );
return costPayFeeAuditVo;
}
@@ -92,7 +104,7 @@ public class CostPayFeeAuditServiceImpl implements ICostPayFeeAuditService {
}
if (CollUtil.isNotEmpty(roomVoList)) {
TbRoomVo tbRoomVo = roomVoList.stream()
.filter(vo -> vo.getId() != null && vo.getId().equals(s.getChargeId())).findFirst().orElse(null);
.filter(vo -> vo.getId() != null && vo.getId().equals(s.getRoomNumber())).findFirst().orElse(null);
s.setRoomNumber(ObjectUtil.isNotEmpty(tbRoomVo) ? tbRoomVo.getRoomNumber() : null);
}
costPayFeeAuditVoList.add(s);
@@ -175,13 +187,13 @@ public class CostPayFeeAuditServiceImpl implements ICostPayFeeAuditService {
private void validEntityBeforeUpdate(CostPayFeeAudit entity) {
//TODO 做一些数据校验,如唯一约束
if (entity.getState().equals("1")) {
if (entity.getChargeType().equals("1")) {
if (entity.getChargeType().equals(ChargeTypeEnum.HOUS_CHARGES.getValue())) {
CostHouseCharge costHouseCharge = coinHouseChargeMapper.selectById(entity.getChargeId());
Assert.isTrue(ObjectUtil.isNotEmpty(costHouseCharge), "该房屋收费项不存在!");
costHouseCharge.setChargeStatus(ChargeStatusEnum.THE_PAYMENT_WAS_APPROVED.getValue());
coinHouseChargeMapper.updateById(costHouseCharge);
}
if (entity.getChargeType().equals("2")) {
if (entity.getChargeType().equals(ChargeTypeEnum.CARD_CHARGES.getValue())) {
CostCarCharge costCarCharge = costCarChargeMapper.selectById(entity.getChargeId());
Assert.isTrue(ObjectUtil.isNotEmpty(costCarCharge), "该车辆收费项为空");
@@ -190,13 +202,13 @@ public class CostPayFeeAuditServiceImpl implements ICostPayFeeAuditService {
}
}
if (entity.getState().equals("2")) {
if (entity.getChargeType().equals("1")) {
if (entity.getChargeType().equals(ChargeTypeEnum.HOUS_CHARGES.getValue())) {
CostHouseCharge costHouseCharge = coinHouseChargeMapper.selectById(entity.getChargeId());
Assert.isTrue(ObjectUtil.isNotEmpty(costHouseCharge), "该房屋收费项为空");
costHouseCharge.setChargeStatus(ChargeStatusEnum.THE_PAYMENT_REVIEW_FAILED.getValue());
coinHouseChargeMapper.updateById(costHouseCharge);
}
if (entity.getChargeType().equals("2")) {
if (entity.getChargeType().equals(ChargeTypeEnum.CARD_CHARGES.getValue())) {
CostCarCharge costCarCharge = costCarChargeMapper.selectById(entity.getChargeId());
Assert.isTrue(ObjectUtil.isNotEmpty(costCarCharge), "该车辆收费项为空");
costCarCharge.setChargeStatus(ChargeStatusEnum.THE_PAYMENT_REVIEW_FAILED.getValue());

View File

@@ -85,11 +85,13 @@ public class MeetBookingServiceImpl implements IMeetBookingService {
public TableDataInfo<MeetBookingVo> queryPageList(MeetBookingBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<MeetBooking> lqw = buildQueryWrapper(bo);
Page<MeetBookingVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
List<MeetBookingVo> meetBookingVoList = new ArrayList<>();
if(CollUtil.isNotEmpty(result.getRecords())){
List<ResidentUnitVo> residentUnitVolist = residentUnitMapper.selectVoList();
List<Long> userId = result.getRecords().stream().map(vo -> vo.getPerson()).distinct().map(Long::parseLong).collect(Collectors.toList());
List<ResidentPersonVo> remoteUserVos = residentPersonMapper.selectVoByIds(userId);
// List<RemoteUserVo> remoteUserVos = remoteUserService.selectListByIds(userId);
List<MeetBookingVo> meetBookingVoList = new ArrayList<>();
result.getRecords().stream().forEach(s -> {
if (CollUtil.isNotEmpty(residentUnitVolist)) {
ResidentUnitVo residentUnitVo = residentUnitVolist.stream()
@@ -104,6 +106,7 @@ public class MeetBookingServiceImpl implements IMeetBookingService {
}
meetBookingVoList.add(s);
});
}
return TableDataInfo.build(new Page<MeetBookingVo>().setRecords(meetBookingVoList).setTotal(result.getTotal()));
}

View File

@@ -1,8 +1,10 @@
package org.dromara.property.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -12,11 +14,11 @@ 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.MeetAttach;
import org.dromara.property.domain.MeetBooking;
import org.dromara.property.domain.vo.MeetAttachVo;
import org.dromara.property.domain.vo.ResidentPersonVo;
import org.dromara.property.mapper.MeetBookingMapper;
import org.dromara.property.mapper.ResidentPersonMapper;
import org.dromara.property.mapper.TbRoomMapper;
import org.dromara.property.mapper.*;
import org.dromara.system.api.RemoteUserService;
import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.springframework.stereotype.Service;
@@ -24,7 +26,6 @@ import org.springframework.stereotype.Service;
import org.dromara.property.domain.bo.MeetBo;
import org.dromara.property.domain.vo.MeetVo;
import org.dromara.property.domain.Meet;
import org.dromara.property.mapper.MeetMapper;
import org.dromara.property.service.IMeetService;
import org.springframework.transaction.annotation.Transactional;
@@ -48,6 +49,7 @@ import java.util.stream.Collectors;
public class MeetServiceImpl implements IMeetService {
private final MeetMapper baseMapper;
private final MeetAttachMapper meetAttachMapper;
private final ResidentPersonMapper residentPersonMapper;
private final TbRoomMapper roomMapper;
private final MeetBookingMapper meetbookMapper;
@@ -63,16 +65,16 @@ public class MeetServiceImpl implements IMeetService {
@Override
public MeetVo queryById(Long id) {
MeetVo meetVo = baseMapper.selectVoById(id);
ResidentPersonVo residentPersonVo = residentPersonMapper.selectVoById(meetVo.getPrincipals());
if(ObjectUtil.isNotEmpty(residentPersonVo)){
meetVo.setPrincipalsName(residentPersonVo.getUserName());
meetVo.setPhoneNo(residentPersonVo.getPhone());
}
// RemoteUserVo userInfo = remoteUserService.getUserInfoById(Long.valueOf(meetVo.getPrincipals()));
// if (ObjectUtil.isNotEmpty(userInfo)) {
// meetVo.setPrincipalsName(userInfo.getNickName());
// meetVo.setPhoneNo(userInfo.getPhonenumber());
// ResidentPersonVo residentPersonVo = residentPersonMapper.selectVoById(meetVo.getPrincipals());
// if(ObjectUtil.isNotEmpty(residentPersonVo)){
// meetVo.setPrincipalsName(residentPersonVo.getUserName());
// meetVo.setPhoneNo(residentPersonVo.getPhone());
// }
RemoteUserVo userInfo = remoteUserService.getUserInfoById(Long.valueOf(meetVo.getPrincipals()));
if (ObjectUtil.isNotEmpty(userInfo)) {
meetVo.setPrincipalsName(userInfo.getNickName());
meetVo.setPhoneNo(userInfo.getPhonenumber());
}
String locationName = roomMapper.queryRoomName(Long.valueOf(meetVo.getLocation()));
meetVo.setLocationName(locationName);
return meetVo;
@@ -172,7 +174,7 @@ public class MeetServiceImpl implements IMeetService {
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(MeetBo bo) {
Meet add = MapstructUtils.convert(bo, Meet.class);
bo.setStatus(1);
bo.setStatus(0);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
@@ -216,6 +218,10 @@ public class MeetServiceImpl implements IMeetService {
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
boolean exists = meetAttachMapper.exists(new LambdaQueryWrapper<MeetAttach>().in(MeetAttach::getMeetId, ids));
Assert.isTrue(!exists, "会议室具有增值服务,不允许单独删除");
boolean meetbookExists = meetbookMapper.exists(new LambdaQueryWrapper<MeetBooking>().in(MeetBooking::getMeetId, ids));
Assert.isTrue(!meetbookExists, "会议室具有预约记录,不允许单独删除");
}
return baseMapper.deleteByIds(ids) > 0;
}

View File

@@ -159,6 +159,7 @@ public class PlantsPlanProductServiceImpl implements IPlantsPlanProductService {
/**
* 查询租赁方案植物数据
*
* @param planId
* @return
*/
@@ -166,4 +167,17 @@ public class PlantsPlanProductServiceImpl implements IPlantsPlanProductService {
public List<PlantsPlanProductVo> queryPlanProductsInfo(Long planId) {
return baseMapper.queryProductsInfo(planId);
}
/**
* 根据方案id删除方案产品
*
* @param ids 方案id
* @return
*/
@Override
public void deleteByPlanIds(List<Long> ids) {
if (CollectionUtils.isNotEmpty(ids)) {
baseMapper.deleteByPlanIds(ids);
}
}
}

View File

@@ -25,6 +25,7 @@ import org.dromara.property.domain.vo.PlantsRentalPlanVo;
import org.dromara.property.domain.PlantsRentalPlan;
import org.dromara.property.mapper.PlantsRentalPlanMapper;
import org.dromara.property.service.IPlantsRentalPlanService;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
@@ -166,6 +167,7 @@ public class PlantsRentalPlanServiceImpl implements IPlantsRentalPlanService {
* @return 是否删除成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
PlantsRentalOrderBo plantsRentalOrderBo = new PlantsRentalOrderBo();
@@ -174,6 +176,8 @@ public class PlantsRentalPlanServiceImpl implements IPlantsRentalPlanService {
if(CollectionUtils.isNotEmpty(plantsRentalOrderVos)){
throw new ServiceException("当前选中租赁方案不可删除");
}
//删除方案产品数据
planProductService.deleteByPlanIds(ids.stream().toList());
}
return baseMapper.deleteByIds(ids) > 0;
}

View File

@@ -1,5 +1,6 @@
package org.dromara.property.service.impl;
import cn.hutool.core.collection.CollUtil;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -18,9 +19,11 @@ import org.dromara.property.domain.ResidentUnit;
import org.dromara.property.mapper.ResidentUnitMapper;
import org.dromara.property.service.IResidentUnitService;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 入驻单位Service业务层处理
@@ -50,8 +53,18 @@ public class ResidentUnitServiceImpl implements IResidentUnitService {
ResidentUnitVo residentUnitVo = baseMapper.selectVoById(id);
//获取入驻位置详情
if(StringUtils.isNotBlank(residentUnitVo.getLocation())){
String roomName = roomService.queryRoomName(Long.valueOf(residentUnitVo.getLocation()));
residentUnitVo.setLocationDetail(roomName);
// 修改后的代码
List<Long> idList = Arrays.stream(residentUnitVo.getLocation().split(","))
.map(String::trim)
.map(Long::parseLong)
.collect(Collectors.toList());
List<String> roomNames = roomService.queryRoomNameList(idList);
// 元素用,拼接成字符串
if(CollUtil.isNotEmpty(roomNames)){
String locationDetail = String.join("", roomNames);
residentUnitVo.setLocationDetail(locationDetail);
}
}
Long num = personService.queryPersonCount(residentUnitVo.getId());
residentUnitVo.setNumber(num);

View File

@@ -2,6 +2,7 @@ package org.dromara.property.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -16,15 +17,20 @@ 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.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.property.domain.*;
import org.dromara.property.domain.bo.ServiceWorkOrdersBo;
import org.dromara.property.domain.bo.mobile.MServiceWorkOrdersBo;
import org.dromara.property.domain.enums.OrderReportingTypeEnum;
import org.dromara.property.domain.enums.OrderTypeOperationEnum;
import org.dromara.property.domain.enums.WorkOrderStatusEnum;
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.mapper.attendanceMapper.AttendanceUserGroupMapper;
import org.dromara.property.service.IServiceWorkOrdersService;
import org.dromara.system.api.RemoteUserService;
import org.dromara.system.api.domain.vo.RemoteUserVo;
@@ -54,6 +60,7 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
private final ServiceWorkOrdersRecordMapper workOrdersRecordMapper;
@DubboReference
private RemoteUserService remoteUserService;
private final AttendanceUserGroupMapper attendanceUserGroupMapper;
/**
* 查询【工单处理】
@@ -71,10 +78,12 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
ServiceWorkOrdersTypeVo serviceWorkOrdersTypeVo = typesMapper.selectVoById(serviceWorkOrdersVo.getType());
if (Objects.nonNull(serviceWorkOrdersTypeVo)) {
serviceWorkOrdersInfoVo.setTypeName(serviceWorkOrdersTypeVo.getOrderTypeName());
serviceWorkOrdersInfoVo.setOperationMode(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOperationMode() : null);
}
//ResidentPersonVo residentPersonHandler = residentPersonMapper.selectVoById(Long.valueOf(serviceWorkOrdersVo.getHandler()));
RemoteUserVo userInfo = remoteUserService.getUserInfoById(Long.valueOf(serviceWorkOrdersVo.getHandler()));
RemoteUserVo userInfo = remoteUserService.getUserInfoById(Long.valueOf(serviceWorkOrdersVo.getHandler()));
if (ObjectUtil.isNotEmpty(userInfo)) {
serviceWorkOrdersInfoVo.setHandlerText(userInfo.getNickName());
serviceWorkOrdersInfoVo.setHandlerPhone(userInfo.getPhonenumber());
@@ -89,7 +98,7 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
serviceWorkOrdersRecordInfoVos.stream().forEach(workOrdersRecordVo -> {
RemoteUserVo remoteUserVo = remoteUserVos.stream().filter(vo -> vo.getUserId() != null && vo.getUserId().equals(serviceWorkOrdersVo.getHandler())).findFirst().orElse(null);
workOrdersRecordVo.setHandlerName(Objects.nonNull(remoteUserVo) ? remoteUserVo.getNickName() : null);
workOrdersRecordVo.setInitiatorPeople(Objects.nonNull(serviceWorkOrdersTypeVo)?serviceWorkOrdersVo.getInitiatorPeople():null);
workOrdersRecordVo.setInitiatorPeople(Objects.nonNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersVo.getInitiatorPeople() : null);
if (workOrdersRecordVo.getStatus().equals("1") || workOrdersRecordVo.getStatus().equals("2")) {
serviceWorkOrdersInfoVo.setDispatchTime(workOrdersRecordVo.getCreateTime());
}
@@ -123,6 +132,7 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
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);
s.setOperationMode(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOperationMode() : null);
serviceWorkOrdersVoList.add(s);
});
return TableDataInfo.build(new Page<ServiceWorkOrdersVo>().setRecords(serviceWorkOrdersVoList).setTotal(result.getTotal()));
@@ -151,6 +161,7 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
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);
s.setOperationMode(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOperationMode() : null);
serviceWorkOrdersVoList.add(s);
});
return serviceWorkOrdersVoList;
@@ -159,15 +170,15 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
private LambdaQueryWrapper<ServiceWorkOrders> buildQueryWrapper(ServiceWorkOrdersBo bo) {
//查询类型下子类型id
LambdaQueryWrapper<ServiceWorkOrdersType> OrdersTypeWrapper = new LambdaQueryWrapper<>();
OrdersTypeWrapper.eq(ServiceWorkOrdersType::getParentId,bo.getType());
OrdersTypeWrapper.eq(ServiceWorkOrdersType::getParentId, bo.getType());
List<ServiceWorkOrdersType> serviceWorkOrdersTypes = typesMapper.selectList(OrdersTypeWrapper);
List<Long> typeIds = serviceWorkOrdersTypes.stream()
.map(ServiceWorkOrdersType::getId)
.collect(Collectors.toList());
typeIds.add(bo.getType());
List<String> statusList = new ArrayList<>();
if(StringUtils.isNotBlank(bo.getStatus())){
statusList = Arrays.asList(bo.getStatus().split(","));
if (StringUtils.isNotBlank(bo.getStatus())) {
statusList = Arrays.asList(bo.getStatus().split(","));
}
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ServiceWorkOrders> lqw = Wrappers.lambdaQuery();
@@ -197,11 +208,14 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(ServiceWorkOrdersBo bo) {
//查询工单类型
ServiceWorkOrdersType serviceWorkOrdersType = typesMapper.selectById(bo.getType());
ServiceWorkOrders add = MapstructUtils.convert(bo, ServiceWorkOrders.class);
LoginUser user = LoginHelper.getLoginUser();
add.setOrderNo("GD" + IdUtil.getSnowflakeNextIdStr());
add.setStatus("0");
add.setStatus(WorkOrderStatusEnum.CREATE_ORDER.getValue());
add.setInitiatorPeople(user.getNickname());
add.setProcessingWeight(serviceWorkOrdersType.getProcessingWeight());
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
@@ -210,11 +224,67 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
serviceWorkOrdersRecord.setOrderId(add.getId());
serviceWorkOrdersRecord.setStatus(add.getStatus());
//serviceWorkOrdersRecord.setHandler(add.getHandler());
workOrdersRecordMapper.insert(serviceWorkOrdersRecord);
boolean flags = workOrdersRecordMapper.insert(serviceWorkOrdersRecord) > 0;
if (flags) {
if (serviceWorkOrdersType.getOperationMode().equals(OrderTypeOperationEnum.AUTOMATE_DISPATCH.getValue())) {
handleServiceWorkOrder(add);
}
}
}
return flag;
}
//自动派单
private void handleServiceWorkOrder(ServiceWorkOrders serviceWorkOrders) {
LocalDate today = LocalDate.now();
// 1. 获取今日排班人员(优先查缓存,未命中则查询数据库并缓存)
List<AttendanceUserGroup> attendanceUserGroups = RedisUtils.getCacheList(DateUtil.today());
if (CollUtil.isEmpty(attendanceUserGroups)) {
attendanceUserGroups = attendanceUserGroupMapper.selectList(
new LambdaQueryWrapper<AttendanceUserGroup>()
.le(AttendanceUserGroup::getStartDate, today)
.ge(AttendanceUserGroup::getEndDate, today)
.orderByAsc(AttendanceUserGroup::getCreateTime)
);
Assert.isTrue(CollUtil.isNotEmpty(attendanceUserGroups),"暂无排班人员");
// 缓存当天排班数据(假设当天不会变)
RedisUtils.setCacheList(DateUtil.today(), attendanceUserGroups);
}
// 2. 获取并更新轮询索引(原子性很重要)
int currentIndex;
Integer lastScheduleId = RedisUtils.getCacheObject(DateUtil.today()+"LastScheduleId");
if (lastScheduleId == null || lastScheduleId < 0 || lastScheduleId >= attendanceUserGroups.size()) {
currentIndex = 0; // 越界或未设置重置为0
} else {
currentIndex = lastScheduleId + 1;
if (currentIndex >= attendanceUserGroups.size()) {
currentIndex = 0; // 循环轮询
}
}
RedisUtils.setCacheObject(DateUtil.today()+"LastScheduleId", currentIndex);
// 3. 分配处理人
AttendanceUserGroup assignedGroup = attendanceUserGroups.get(currentIndex);
Long employeeId = assignedGroup.getEmployeeId();
serviceWorkOrders.setHandler(employeeId);
serviceWorkOrders.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue());
// 4. 插入记录
ServiceWorkOrdersRecord record = new ServiceWorkOrdersRecord();
record.setOrderId(serviceWorkOrders.getId());
record.setHandler(employeeId);
record.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue());
workOrdersRecordMapper.insert(record);
// 5. 更新工单
serviceWorkOrders.setDispatchTime(new Date());
baseMapper.updateById(serviceWorkOrders);
log.info("成功派单,工单号:{}", serviceWorkOrders.getOrderNo());
}
/**
* 修改【工单处理】
*
@@ -242,17 +312,17 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
* 修改前的数据校验
*/
private void validEntityBeforeUpdate(ServiceWorkOrders entity) {
Assert.isTrue(ObjectUtil.isNotEmpty(entity.getStatus()),"状态不能为空!");
Assert.isTrue(ObjectUtil.isNotEmpty(entity.getStatus()), "状态不能为空!");
LambdaQueryWrapper<ServiceWorkOrdersRecord> ordersLambdaQueryWrapper = new LambdaQueryWrapper<>();
ordersLambdaQueryWrapper.eq(ServiceWorkOrdersRecord::getOrderId, entity.getId());
ordersLambdaQueryWrapper.eq(ServiceWorkOrdersRecord::getStatus, entity.getStatus());
boolean exists = workOrdersRecordMapper.exists(ordersLambdaQueryWrapper);
//TODO 做一些数据校验,如唯一约束
ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord();
serviceWorkOrdersRecord.setOrderId(entity.getId());
serviceWorkOrdersRecord.setStatus(entity.getStatus());
serviceWorkOrdersRecord.setHandler(entity.getHandler());
workOrdersRecordMapper.insert(serviceWorkOrdersRecord);
ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord();
serviceWorkOrdersRecord.setOrderId(entity.getId());
serviceWorkOrdersRecord.setStatus(entity.getStatus());
serviceWorkOrdersRecord.setHandler(entity.getHandler());
workOrdersRecordMapper.insert(serviceWorkOrdersRecord);
}
/**
@@ -497,16 +567,17 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
}
//小程序端新增
@Override
public Boolean insertMServiceWorkOrdersBo(MServiceWorkOrdersBo bo) {
//查询工单类型
ServiceWorkOrdersType serviceWorkOrdersType = typesMapper.selectById(bo.getType());
ServiceWorkOrders add = MapstructUtils.convert(bo, ServiceWorkOrders.class);
LoginUser user = LoginHelper.getLoginUser();
add.setOrderNo("GD" + IdUtil.getSnowflakeNextIdStr());
add.setOrderName("工单名称");
add.setStatus("0");
add.setStatus(WorkOrderStatusEnum.CREATE_ORDER.getValue());
add.setReportingType(OrderReportingTypeEnum.PHONE_REPORT.getValue());
add.setInitiatorPeople(user.getNickname());
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
@@ -515,15 +586,22 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord();
serviceWorkOrdersRecord.setOrderId(add.getId());
serviceWorkOrdersRecord.setStatus(add.getStatus());
workOrdersRecordMapper.insert(serviceWorkOrdersRecord);
boolean flags = workOrdersRecordMapper.insert(serviceWorkOrdersRecord) > 0;
if (flags) {
if (serviceWorkOrdersType.getOperationMode().equals(OrderTypeOperationEnum.AUTOMATE_DISPATCH.getValue())) {
handleServiceWorkOrder(add);
}
}
}
return flag;
}
public List<ServiceWorkOrders> getList() {
LambdaQueryWrapper<ServiceWorkOrders> serviceWorkOrdersWrapper = new LambdaQueryWrapper<>();
return baseMapper.selectList(serviceWorkOrdersWrapper);
}
@Override
public List<Map<Object, Object>> getServiceWorkOrdersHandler(String type) {
return switch (type) {

View File

@@ -158,5 +158,13 @@ public class TbRoomServiceImpl implements ITbRoomService {
@Override
public String queryRoomName(Long roomId) {
return baseMapper.queryRoomName(roomId);
} /**
* 获取房间名称
* @param
* @return 房间名称
*/
@Override
public List<String> queryRoomNameList(List<Long> ids) {
return baseMapper.queryRoomNameList(ids);
}
}

View File

@@ -159,6 +159,37 @@ public class TbVisitorManagementServiceImpl implements ITbVisitorManagementServi
}
/**
* H5端新增访客管理
*
* @param bo 访客管理
* @return 是否新增成功
*/
@Override
public Boolean insertH5ByBo(TbVisitorManagementBo bo) {
QrCodeInfo info = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + "Qrcode" + bo.getQrCodeId());
RedisUtils.deleteKeys(GlobalConstants.CAPTCHA_CODE_KEY + "Qrcode" + bo.getQrCodeId());
TbVisitorManagement add = MapstructUtils.convert(bo, TbVisitorManagement.class);
validEntityBeforeSave(add);
assert add != null;
add.setCreateById(info.getUserid());
RemoteUserVo userInfoById = remoteUserService.getUserInfoById(info.getUserid());
add.setTenantId(userInfoById.getTenantId());
add.setCreateBy(userInfoById.getUserId());
add.setUpdateById(userInfoById.getUserId());
add.setUpdateBy(userInfoById.getUserId());
add.setCreateDept(userInfoById.getDeptId());
boolean flag = baseMapper.insert(add) > 0;
if (flag){
bo.setId(add.getId());
Long e8Id = syncE8PlatVisitor(bo);
add.setEEightId(e8Id);
baseMapper.updateById(add);
}
return flag;
}
/**
* pc端新增访客管理
*

View File

@@ -15,7 +15,7 @@ import org.dromara.property.service.ITbFloorService;
import org.springframework.stereotype.Service;
import org.dromara.property.domain.bo.smartDevicesBo.TbLightInfoBo;
import org.dromara.property.domain.vo.smartDevicesVo.TbLightInfoVo;
import org.dromara.property.domain.TbLightInfo;
import org.dromara.property.domain.entity.smartDevices.TbLightInfo;
import org.dromara.property.mapper.smartDevicesMapper.TbLightInfoMapper;
import org.dromara.property.service.smartDevicesService.ITbLightInfoService;
import org.springframework.transaction.annotation.Transactional;

View File

@@ -11,7 +11,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterConfigBo;
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterConfigVo;
import org.dromara.property.domain.TbMeterConfig;
import org.dromara.property.domain.entity.smartDevices.TbMeterConfig;
import org.dromara.property.mapper.smartDevicesMapper.TbMeterConfigMapper;
import org.dromara.property.service.smartDevicesService.ITbMeterConfigService;

View File

@@ -12,7 +12,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterInfoBo;
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterInfoVo;
import org.dromara.property.domain.TbMeterInfo;
import org.dromara.property.domain.entity.smartDevices.TbMeterInfo;
import org.dromara.property.mapper.smartDevicesMapper.TbMeterInfoMapper;
import org.dromara.property.service.smartDevicesService.ITbMeterInfoService;

View File

@@ -12,7 +12,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterRecordBo;
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterRecordVo;
import org.dromara.property.domain.TbMeterRecord;
import org.dromara.property.domain.entity.smartDevices.TbMeterRecord;
import org.dromara.property.mapper.smartDevicesMapper.TbMeterRecordMapper;
import org.dromara.property.service.smartDevicesService.ITbMeterRecordService;
@@ -75,13 +75,13 @@ public class TbMeterRecordServiceImpl implements ITbMeterRecordService {
LambdaQueryWrapper<TbMeterRecord> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(TbMeterRecord::getId);
lqw.eq(StringUtils.isNotBlank(bo.getMeterId()), TbMeterRecord::getMeterId, bo.getMeterId());
lqw.eq(bo.getMeterType() != null, TbMeterRecord::getMeterType, bo.getMeterType());
lqw.eq(bo.getReaderId() != null, TbMeterRecord::getReaderId, bo.getReaderId());
lqw.eq(bo.getReadingTime() != null, TbMeterRecord::getReadingTime, bo.getReadingTime());
lqw.eq(bo.getCurrentReading() != null, TbMeterRecord::getCurrentReading, bo.getCurrentReading());
lqw.eq(bo.getPreviousReading() != null, TbMeterRecord::getPreviousReading, bo.getPreviousReading());
lqw.eq(bo.getConsumption() != null, TbMeterRecord::getConsumption, bo.getConsumption());
lqw.eq(bo.getReadingMethod() != null, TbMeterRecord::getReadingMethod, bo.getReadingMethod());
lqw.eq(bo.getImgOssid() != null, TbMeterRecord::getImgOssid, bo.getImgOssid());
lqw.eq(bo.getImgOssId() != null, TbMeterRecord::getImgOssId, bo.getImgOssId());
return lqw;
}

View File

@@ -11,7 +11,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterRoomBo;
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterRoomVo;
import org.dromara.property.domain.TbMeterRoom;
import org.dromara.property.domain.entity.smartDevices.TbMeterRoom;
import org.dromara.property.mapper.smartDevicesMapper.TbMeterRoomMapper;
import org.dromara.property.service.smartDevicesService.ITbMeterRoomService;

View File

@@ -9,10 +9,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.property.domain.AttendanceUserGroup;
import org.dromara.property.domain.ServiceWorkOrders;
import org.dromara.property.domain.ServiceWorkOrdersRecord;
import org.dromara.property.domain.ServiceWorkOrdersType;
import org.dromara.property.domain.enums.OrderTypeOperationEnum;
import org.dromara.property.domain.enums.WorkOrderStatusEnum;
import org.dromara.property.mapper.ServiceWorkOrdersTypeMapper;
import org.dromara.property.mapper.attendanceMapper.AttendanceUserGroupMapper;
import org.dromara.property.mapper.ServiceWorkOrdersMapper;
import org.dromara.property.mapper.ServiceWorkOrdersRecordMapper;
@@ -40,48 +44,81 @@ import org.springframework.web.bind.annotation.RestController;
//@RestController
//@RequestMapping("/serviceWorkOrderTasks")
public class ServiceWorkOrderTasks {
private ServiceWorkOrdersMapper workOrdersMapper;
private ServiceWorkOrdersRecordMapper workOrdersRecordMapper;
private AttendanceUserGroupMapper attendanceUserGroupMapper;
private final ServiceWorkOrdersMapper workOrdersMapper;
private final ServiceWorkOrdersTypeMapper workOrdersTypeMapper;
private final ServiceWorkOrdersRecordMapper workOrdersRecordMapper;
private final AttendanceUserGroupMapper attendanceUserGroupMapper;
/**
* 查询状态为创建工单的工单,查询当天排班人员,为工单自动派单
*/
@Transactional(rollbackFor = Exception.class)
@Scheduled(cron = "0 0 */1 * * ?")
@Scheduled(cron = "0 0,30 * * * ?")
//@GetMapping("/serviceWorkOrderTaskId")
private void handleServiceWorkOrder() {
List<ServiceWorkOrders> serviceWorkOrderList = workOrdersMapper.selectList(
new LambdaQueryWrapper<ServiceWorkOrders>()
.eq(ServiceWorkOrders::getStatus, WorkOrderStatusEnum.CREATE_ORDER.getValue()));
if(CollUtil.isNotEmpty(serviceWorkOrderList)){
LocalDate today = LocalDate.now();
List<AttendanceUserGroup> attendanceUserGroups = attendanceUserGroupMapper.selectList(
new LambdaQueryWrapper<AttendanceUserGroup>()
//查询今天上班的人员
.le(AttendanceUserGroup::getStartDate, today)
.ge(AttendanceUserGroup::getEndDate, today)
LocalDate today = LocalDate.now();
List<AttendanceUserGroup> attendanceUserGroups = attendanceUserGroupMapper.selectList(
new LambdaQueryWrapper<AttendanceUserGroup>()
//查询今天上班的人员
.le(AttendanceUserGroup::getStartDate, today)
.ge(AttendanceUserGroup::getEndDate, today)
);
if (CollUtil.isEmpty(attendanceUserGroups)) {
if (!RedisUtils.isExistsObject("today")) {
//缓存今天排班人员
RedisUtils.setCacheList("today", attendanceUserGroups);
}
//查询工单类型
List<ServiceWorkOrdersType> serviceWorkOrdersTypes = workOrdersTypeMapper.selectList(
new LambdaQueryWrapper<ServiceWorkOrdersType>()
.eq(ServiceWorkOrdersType::getOperationMode, OrderTypeOperationEnum.AUTOMATE_DISPATCH.getValue())
);
serviceWorkOrderList.stream().forEach(s->{
if(CollUtil.isNotEmpty(attendanceUserGroups)){
attendanceUserGroups.stream().forEach(s1->{
if (CollUtil.isEmpty(serviceWorkOrdersTypes)) {
//收集工单类型id
List<Long> typeIds = serviceWorkOrdersTypes.stream().map(ServiceWorkOrdersType::getId).toList();
List<ServiceWorkOrders> serviceWorkOrderList = workOrdersMapper.selectList(
new LambdaQueryWrapper<ServiceWorkOrders>()
.eq(ServiceWorkOrders::getStatus, WorkOrderStatusEnum.CREATE_ORDER.getValue())
.in(ServiceWorkOrders::getType, typeIds)
);
if (CollUtil.isNotEmpty(serviceWorkOrderList)) {
serviceWorkOrderList.stream().forEach(s -> {
//获取处理人
List<AttendanceUserGroup> attendanceUserGroupList = RedisUtils.getCacheList("today");
ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord();
//获取上次排班人员序号
if (!RedisUtils.isExistsObject("LastScheduleId")) {
RedisUtils.setCacheObject("LastScheduleId", 0);
serviceWorkOrdersRecord.setHandler(attendanceUserGroupList.get(0).getEmployeeId());
s.setHandler(attendanceUserGroupList.get(0).getEmployeeId());
} else {
Integer lastScheduleId = RedisUtils.getCacheObject("LastScheduleId");
int lastScheduleIdUpdate = lastScheduleId + 1;
AttendanceUserGroup attendanceUserGroup = attendanceUserGroupList.get(lastScheduleIdUpdate);
if (ObjectUtil.isNotEmpty(attendanceUserGroup)) {
serviceWorkOrdersRecord.setHandler(attendanceUserGroup.getEmployeeId());
s.setHandler(attendanceUserGroup.getEmployeeId());
RedisUtils.setCacheObject("LastScheduleId", lastScheduleIdUpdate);
} else {
serviceWorkOrdersRecord.setHandler(attendanceUserGroupList.get(0).getEmployeeId());
s.setHandler(attendanceUserGroupList.get(0).getEmployeeId());
RedisUtils.setCacheObject("LastScheduleId", 0);
}
}
serviceWorkOrdersRecord.setOrderId(s.getId());
serviceWorkOrdersRecord.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue());
serviceWorkOrdersRecord.setHandler(s1.getEmployeeId());
workOrdersRecordMapper.insert(serviceWorkOrdersRecord);
s.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue());
s.setHandler(s1.getEmployeeId());
workOrdersMapper.updateById(s);
log.info("派单工单号为:{}",s.getOrderNo());
log.info("处理人为:{}",s1.getEmployeeId());
log.info("派单工单号为:{}", s.getOrderNo());
});
}else {
log.info("当天无排班人员");
} else {
log.info("派单工单为:{}", serviceWorkOrderList.size());
}
});
}else {
log.info("派单工单为:{}",serviceWorkOrderList.size());
}
}
}
@@ -134,10 +171,10 @@ public class ServiceWorkOrderTasks {
for (AttendanceUserGroup group : attendanceUserGroups) {
Long employeeId = group.getEmployeeId();
// 可选:避免重新派给原处理人
if (employeeId.equals(latestRecord.getHandler())) {
log.debug("跳过原处理人:{}", employeeId);
continue;
}
if (employeeId.equals(latestRecord.getHandler())) {
log.debug("跳过原处理人:{}", employeeId);
continue;
}
// 创建新的派单记录
ServiceWorkOrdersRecord newRecord = new ServiceWorkOrdersRecord();
newRecord.setOrderId(workOrder.getId());
@@ -147,9 +184,9 @@ public class ServiceWorkOrderTasks {
workOrdersRecordMapper.insert(newRecord);
log.info("工单号:{} 已重新派发给员工ID{}", workOrder.getOrderNo(), employeeId);
// 6. 更新主工单状态(可选:若只保留最新记录状态,也可不更新主表)
workOrder.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue()); // 仍为已派单
workOrder.setHandler(employeeId); // 可清空,或设为最后一个人(根据业务)
workOrdersMapper.updateById(workOrder);
workOrder.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue()); // 仍为已派单
workOrder.setHandler(employeeId); // 可清空,或设为最后一个人(根据业务)
workOrdersMapper.updateById(workOrder);
}
});
}

View File

@@ -26,6 +26,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
delete from plants_plan_product p where p.plan_id=#{planId}
</delete>
<delete id="deleteByPlanIds" parameterType="java.util.List">
delete from plants_plan_product p where p.plan_id in
<foreach collection="list" item="planId" open="(" separator="," close=")">
#{planId}
</foreach>
</delete>
<select id="queryProductsInfo" resultMap="planProductMap">
select
c.id pid,

View File

@@ -15,9 +15,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where r.id=#{roomId}
</select>
<select id="queryRoomNameList" parameterType="list" resultType="java.util.Map">
<select id="queryRoomNameList" resultType="java.lang.String" parameterType="list">
SELECT
r.id,
concat(c.community_name, b.building_name, f.floor_name, r.room_number) AS room_name
FROM
tb_room r

View File

@@ -140,6 +140,12 @@
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.drewnoakes</groupId>
<artifactId>metadata-extractor</artifactId>
<version>2.18.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>

View File

@@ -1,17 +1,21 @@
package org.dromara.sis.sdk.e8.utils;
import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.Metadata;
import com.drew.metadata.MetadataException;
import com.drew.metadata.exif.ExifIFD0Directory;
import org.springframework.stereotype.Component;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.*;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.MemoryCacheImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Iterator;
/**
* @author lsm
@@ -22,7 +26,8 @@ import java.io.IOException;
public class ImageUtil {
public byte[] compressImageToRequirements(byte[] imageData) throws IOException {
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageData));
// 读取图片并处理方向
BufferedImage image = readAndFixOrientation(imageData);
// 第一步调整分辨率不超过1000x1000
if (image.getWidth() > 1000 || image.getHeight() > 1000) {
@@ -91,6 +96,124 @@ public class ImageUtil {
return resizedImage;
}
/**
* 读取图片并处理 EXIF 方向信息
*/
private BufferedImage readAndFixOrientation(byte[] imageData) throws IOException {
try {
// 使用 metadata-extractor 读取 EXIF 方向信息
Metadata metadata = ImageMetadataReader.readMetadata(new ByteArrayInputStream(imageData));
ExifIFD0Directory directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
int orientation = 1; // 默认正常方向
if (directory != null && directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
orientation = directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
}
// 读取图片
ImageInputStream input = ImageIO.createImageInputStream(new ByteArrayInputStream(imageData));
Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
if (!readers.hasNext()) {
throw new IOException("No ImageReader found for image data");
}
ImageReader reader = readers.next();
reader.setInput(input);
BufferedImage image = reader.read(0);
reader.dispose();
// 根据方向信息旋转图片
return rotateImageAccordingToOrientation(image, orientation);
} catch (ImageProcessingException e) {
throw new IOException("Failed to process image metadata", e);
} catch (MetadataException e) {
throw new RuntimeException(e);
}
}
/**
* 根据方向信息旋转图片
*/
private BufferedImage rotateImageAccordingToOrientation(BufferedImage image, int orientation) {
int width = image.getWidth();
int height = image.getHeight();
return switch (orientation) {
case 1 -> // 正常
image;
case 2 -> // 水平翻转
flipImage(image, true, false);
case 3 -> // 旋转180度
rotateImage(image, 180);
case 4 -> // 垂直翻转
flipImage(image, false, true);
case 5 -> {
image = flipImage(image, true, false);
yield rotateImage(image, 270);
}
case 6 -> // 旋转90度
rotateImage(image, 90);
case 7 -> {
image = flipImage(image, true, false);
yield rotateImage(image, 90);
}
case 8 -> // 旋转270度
rotateImage(image, 270);
default -> image;
};
}
/**
* 旋转图片
*/
private BufferedImage rotateImage(BufferedImage image, double degrees) {
double radians = Math.toRadians(degrees);
double sin = Math.abs(Math.sin(radians));
double cos = Math.abs(Math.cos(radians));
int width = image.getWidth();
int height = image.getHeight();
int newWidth = (int) Math.floor(width * cos + height * sin);
int newHeight = (int) Math.floor(height * cos + width * sin);
BufferedImage rotated = new BufferedImage(newWidth, newHeight, image.getType());
Graphics2D g = rotated.createGraphics();
g.translate((newWidth - width) / 2, (newHeight - height) / 2);
g.rotate(Math.toRadians(degrees), width / 2.0, height / 2.0);
g.drawRenderedImage(image, null);
g.dispose();
return rotated;
}
/**
* 翻转图片
*/
private BufferedImage flipImage(BufferedImage image, boolean horizontal, boolean vertical) {
int width = image.getWidth();
int height = image.getHeight();
BufferedImage flipped = new BufferedImage(width, height, image.getType());
Graphics2D g = flipped.createGraphics();
if (horizontal && vertical) {
g.drawImage(image, width, height, -width, -height, null);
} else if (horizontal) {
g.drawImage(image, width, 0, -width, height, null);
} else if (vertical) {
g.drawImage(image, 0, height, width, -height, null);
} else {
g.drawImage(image, 0, 0, null);
}
g.dispose();
return flipped;
}
private byte[] compressWithQuality(BufferedImage image, float quality) throws IOException {
// 获取JPEG编码器
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();

View File

@@ -40,9 +40,9 @@ spring.sql.init.platform=mysql
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://10.20.1.65:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
db.url.0=jdbc:mysql://192.168.159.129: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=By@2025!
db.password.0=123456
### the maximum retry times for push
nacos.config.push.maxRetryTime=50