Merge branch 'master' of http://47.109.37.87:3000/by2025/SmartParks
Some checks failed
/ build-parent-pom (push) Successful in 1m51s
/ build-common-modules (push) Failing after 6m11s
/ build-and-push-services (ruoyi-auth) (push) Has been skipped
/ build-and-push-services (ruoyi-gateway) (push) Has been skipped
/ build-and-push-services (ruoyi-modules/Property) (push) Has been skipped
/ build-and-push-services (ruoyi-modules/Sis) (push) Has been skipped
/ build-and-push-services (ruoyi-modules/ruoyi-gen) (push) Has been skipped
/ build-and-push-services (ruoyi-modules/ruoyi-job) (push) Has been skipped
/ build-and-push-services (ruoyi-modules/ruoyi-resource) (push) Has been skipped
/ build-and-push-services (ruoyi-modules/ruoyi-system) (push) Has been skipped
/ build-and-push-services (ruoyi-modules/ruoyi-workflow) (push) Has been skipped
/ build-and-push-services (ruoyi-seata-server) (push) Has been skipped
/ build-and-push-services (ruoyi-sentinel-dashboard) (push) Has been skipped
/ build-and-push-services (ruoyi-snailjob-server) (push) Has been skipped
/ build-and-push-services (ruoyi-visual/ruoyi-monitor) (push) Has been skipped
/ build-and-push-services (ruoyi-visual/ruoyi-nacos) (push) Has been skipped

This commit is contained in:
lxj
2025-08-14 09:34:00 +08:00
23 changed files with 486 additions and 91 deletions

View File

@@ -1,51 +1,203 @@
name: Gitea Actions Demo
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
run-name: ${{ gitea.actor }} 构建镜像并推送不含JAR依赖上传🚀
on:
push:
branches: [ master ] # 当main分支有推送时触发
branches:
- master
jobs:
Explore-Gitea-Actions:
runs-on: ubuntu-latest
build-parent-pom:
runs-on: ubuntu
steps:
- name: Checkout code
uses: http://47.109.37.87:3000/bichangxiong/checkout@v4 # 使用 Gitea 镜像
with:
fetch-depth: 1 # 只拉取最新一次提交
# - name: Checkout code
# uses: actions/checkout@v4 # 拉取代码到工作目录
- name: Set up JDK 17
uses: http://47.109.37.87:3000/bichangxiong/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: maven
- name: Set up Maven
uses: stCarolas/setup-maven@v5
with:
maven-version: 3.8.2
- name: 拉取代码仓库
uses: http://git.missmoc.top/mocheng/checkout@v4
- name: Install dependencies
run: mvn clean package -DskipTests -Dmaven.repo.local=/home/runner/maven-repo
- name: copy file via ssh password
uses: appleboy/scp-action@v0.1.7
with:
host: 192.168.1.3
username: root
password: by@2025!
port: 22
source: "ruoyi-modules/Property/target/Property.jar,ruoyi-modules/Property/docker-compose.yml,ruoyi-modules/Property/Dockerfile"
target: "/project/runner/plus/"
- name: Deploy to server via SSH
uses: appleboy/ssh-action@v0.1.7
with:
host: 192.168.1.3
username: root
password: by@2025!
port: 22
script: |
cd /project/runner/plus/ruoyi-modules/Property
docker-compose up -d --force-recreate
- 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>$HOME/.m2/repository</localRepository>
<profiles>
<profile>
<id>multi-repo</id>
<repositories>
<repository>
<id>local-repo</id>
<url>file://$HOME/.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
- run: echo "🍏 This job's status is ${{ job.status }}."
- 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 package -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 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: ${{ steps.dockerfile-path.outputs.dockerfile_path }}
tags: ${{ secrets.REGISTRY_URL }}/by2025/${{ matrix.service }}:${{ github.sha }}
push: true
cache-from: type=gha
cache-to: type=gha,mode=max

View File

@@ -35,6 +35,7 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
}
WebSocketSessionHolder.addSession(loginUser.getUserId(), session);
log.info("[connect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType());
System.out.println(WebSocketSessionHolder.getSessions(loginUser.getUserId()));
}
/**

View File

@@ -26,8 +26,10 @@ public class WebSocketSessionHolder {
* @param session 要添加的WebSocket会话
*/
public static void addSession(Long sessionKey, WebSocketSession session) {
System.out.println(USER_SESSION_MAP);
removeSession(sessionKey);
USER_SESSION_MAP.put(sessionKey, session);
System.out.println(USER_SESSION_MAP);
}
/**
@@ -36,6 +38,7 @@ public class WebSocketSessionHolder {
* @param sessionKey 要移除的会话键
*/
public static void removeSession(Long sessionKey) {
System.out.println(USER_SESSION_MAP);
WebSocketSession session = USER_SESSION_MAP.remove(sessionKey);
try {
session.close(CloseStatus.BAD_DATA);
@@ -50,6 +53,7 @@ public class WebSocketSessionHolder {
* @return 与给定会话键对应的WebSocket会话如果不存在则返回null
*/
public static WebSocketSession getSessions(Long sessionKey) {
System.out.println(USER_SESSION_MAP);
return USER_SESSION_MAP.get(sessionKey);
}

View File

@@ -36,6 +36,7 @@ public class WebSocketUtils {
*/
public static void sendMessage(Long sessionKey, String message) {
WebSocketSession session = WebSocketSessionHolder.getSessions(sessionKey);
sendMessage(session, message);
}

View File

@@ -126,6 +126,10 @@
<version>2.4.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-websocket</artifactId>
</dependency>
</dependencies>

View File

@@ -7,6 +7,7 @@ import java.util.UUID;
import cn.dev33.satoken.stp.StpUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.config.ConfigService;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
@@ -14,6 +15,9 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.websocket.dto.WebSocketMessageDto;
import org.dromara.common.websocket.holder.WebSocketSessionHolder;
import org.dromara.common.websocket.utils.WebSocketUtils;
import org.dromara.property.domain.bo.QrCodeInfo;
import org.dromara.resource.api.RemoteMessageService;
import org.dromara.system.api.RemoteConfigService;
@@ -51,8 +55,6 @@ public class TbVisitorManagementController extends BaseController {
@DubboReference
private final RemoteConfigService remoteConfigService;
@DubboReference(stub = "true")
private final RemoteMessageService remoteMessageService;
@@ -97,7 +99,13 @@ public class TbVisitorManagementController extends BaseController {
JSONObject jsonObject = new JSONObject();
jsonObject.put("type","qrcode");
jsonObject.put("date",qrcode);
remoteMessageService.publishMessage(List.of(qrCodeInfo.getUserid()),jsonObject.toString());
System.out.println(WebSocketSessionHolder.getSessions(1L));
System.out.println(WebSocketSessionHolder.getSessionsAll());
WebSocketMessageDto webSocketMessage = new WebSocketMessageDto();
webSocketMessage.setMessage(jsonObject.toString());
webSocketMessage.setSessionKeys(List.of(qrCodeInfo.getUserid()));
WebSocketUtils.publishMessage(webSocketMessage);
// WebSocketUtils.sendMessage(qrCodeInfo.getUserid(),jsonObject.toString());
return R.ok("二维码可用");
}

View File

@@ -0,0 +1,47 @@
package org.dromara.property.controller.mobile;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.excel.utils.ExcelUtil;
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.property.domain.bo.InspectionPointBo;
import org.dromara.property.domain.vo.InspectionPointVo;
import org.dromara.property.service.IInspectionPointService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 巡检点
* 前端访问路由地址为:/property/point
*
* @author mocheng
* @date 2025-07-11
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/mobile/point")
public class MInspectionPointController extends BaseController {
private final IInspectionPointService inspectionPointService;
/**
* 扫码签到
*/
@PostMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody InspectionPointBo bo) {
return toAjax(inspectionPointService.updateByBo(bo));
}
}

View File

@@ -1,6 +1,4 @@
package org.dromara.property.domain;
import cn.idev.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

View File

@@ -97,7 +97,9 @@ public class CostItemsBo extends BaseEntity {
/**
* 计费单价
*/
@NotBlank(message = "计费单价", groups = { AddGroup.class, EditGroup.class })
@NotNull(message = "计费单价不能为空", groups = { AddGroup.class, EditGroup.class })
@DecimalMin(value = "0.00", inclusive = false, message = "计费单价必须大于0")
@ExcelProperty("计费单价")
private BigDecimal unitPrice;
/**

View File

@@ -7,11 +7,11 @@ package org.dromara.property.domain.enums;
**/
public enum MeetAttachStatusEnum {
/**
* 待确认
* 上架
*/
ENAABLE("上架", "0"),
/**
* 待提货
* 下架
*/
DEACTIVATE("下架", "1");

View File

@@ -3,7 +3,7 @@ package org.dromara.property.domain.enums;
/**
* @Author:yuyongle
* @Date:2025/7/4 10:35
* @Description:
* @Description:会议室状态枚举
**/
public enum MeetStatusEnum {
/**

View File

@@ -0,0 +1,33 @@
package org.dromara.property.domain.enums;
/**
* @Author:yuyongle
* @Date:2025/8/11 10:59
* @Description:工单状态枚举
**/
public enum WorkOrderStatusEnum {
CREATE_ORDER("创建工单", "0"),
DISPATCHED("已派单", "1"),
ROB_ORDER("已抢单", "2"),
IN_HAND("处理中", "3"),
DONE("已完成", "4"),
ABANDON("已废弃", "5");
private final String name;
private final String value;
WorkOrderStatusEnum(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return this.name;
}
public String getValue() {
return this.value;
}
}

View File

@@ -167,7 +167,7 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
LocalDate endDate = vo.getEndDate();
LocalDate currentDate = bo.getCurrentDate();
// //统计当前考勤组有多少条数据
// int count = Math.toIntExact(scheduleCycleMapper.selectCount(Wrappers.<AttendanceScheduleCycle>lambdaQuery().eq(AttendanceScheduleCycle::getGroupId, groupId)));
int count = Math.toIntExact(scheduleCycleMapper.selectCount(Wrappers.<AttendanceScheduleCycle>lambdaQuery().eq(AttendanceScheduleCycle::getGroupId, groupId)));
//取出attendanceScheduleCycle表中的天数
List<Integer> cycleDaysList = scheduleCycleMapper.selectList(Wrappers.<AttendanceScheduleCycle>lambdaQuery().eq(AttendanceScheduleCycle::getGroupId, groupId)).stream().map(AttendanceScheduleCycle::getDayNumber).collect(Collectors.toList());
@@ -177,9 +177,9 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
if (date.isEqual(currentDate)) {
// 判断当前日期是cycleDays中的第几天
int dayNumber = date.getDayOfYear() - startDate.getDayOfYear() + 1;
cycleDay = dayNumber % cycleDaysList.size();
cycleDay = dayNumber % count;
if (cycleDay == 0) {
cycleDay = cycleDaysList.size();
cycleDay = count;
}
// 根据cycleDay查询出当前日期的班次信息
AttendanceScheduleCycle cycle = scheduleCycleMapper.selectOne(Wrappers.<AttendanceScheduleCycle>lambdaQuery()
@@ -512,15 +512,6 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
AttendanceArrangement update = MapstructUtils.convert(bo, AttendanceArrangement.class);
validEntityBeforeSave(update);
// judgeDate(bo, update);
//根据排班id获取人员id
//根据人员id删除人员信息
//新增人员信息
//根据排班id获取部门id
//根据部门id删除部门信息
//新增部门信息
//取出当前排班的id
assert update != null;
Long ArrangementId = update.getId();
@@ -528,19 +519,35 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
List<Long> employeeIdList = userGroupMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, ArrangementId))
.stream().map(AttendanceUserGroup::getEmployeeId).toList();
//根据employeeId和ArrangementId删除attendanceUserGroup表中的数据
userGroupMapper.delete(Wrappers.<AttendanceUserGroup>lambdaQuery().in(AttendanceUserGroup::getEmployeeId, employeeIdList)
.eq(AttendanceUserGroup::getScheduleId, ArrangementId));
if (!employeeIdList.isEmpty()) {
userGroupMapper.delete(Wrappers.<AttendanceUserGroup>lambdaQuery().in(AttendanceUserGroup::getEmployeeId, employeeIdList)
.eq(AttendanceUserGroup::getScheduleId, ArrangementId));
}
//根据排班id获取部门id
List<Long> deptIdList = userGroupMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, ArrangementId))
.stream().map(AttendanceUserGroup::getDeptId).toList();
//根据deptId和ArrangementId删除attendanceDeptGroup表中的数据
userGroupMapper.delete(Wrappers.<AttendanceUserGroup>lambdaQuery().in(AttendanceUserGroup::getDeptId, deptIdList)
.eq(AttendanceUserGroup::getScheduleId, ArrangementId));
if (!deptIdList.isEmpty()) {
//根据deptId和ArrangementId删除attendanceDeptGroup表中的数据
userGroupMapper.delete(Wrappers.<AttendanceUserGroup>lambdaQuery().in(AttendanceUserGroup::getDeptId, deptIdList)
.eq(AttendanceUserGroup::getScheduleId, ArrangementId));
}
//根据当前排班的id查询出当前的开始时间和结束时间
AttendanceArrangement old = baseMapper.selectById(ArrangementId);
//根据old查询出开始时间
LocalDate oldStartDate = old.getStartDate();
//根据old查询出结束时间
LocalDate oldEndDate = old.getEndDate();
//用获取到的排班id向attendanceUserGroup表中批量插入数据
List<AttendanceUserGroup> userGroupList = bo.getUserGroupList();
for (AttendanceUserGroup userGroup : userGroupList) {
userGroup.setScheduleId(bo.getId());
userGroup.setStartDate(oldStartDate);
userGroup.setEndDate(oldEndDate);
}
userGroupMapper.insertBatch(userGroupList);
return baseMapper.updateById(update) > 0;

View File

@@ -1,5 +1,7 @@
package org.dromara.property.service.impl;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -14,6 +16,8 @@ import org.dromara.property.domain.bo.AttendanceArrangementBo;
import org.dromara.property.domain.constant.StatusConstant;
import org.dromara.property.domain.vo.AttendanceArrangementVo;
import org.dromara.property.mapper.*;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysUserService;
import org.springframework.stereotype.Service;
import org.dromara.property.domain.bo.AttendanceUserGroupBo;
import org.dromara.property.domain.vo.AttendanceUserGroupVo;
@@ -48,6 +52,10 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi
private final AttendanceScheduleCycleMapper scheduleCycleMapper;
@DubboReference
private ISysUserService sysUserService;
/**
* 查询排班明细
*
@@ -169,8 +177,10 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi
// 根据查询出来的result取出scheduleId
Long scheduleId = vo.getScheduleId();
// 根据排班的id查询出排班的人员详细信息
// List<AttendanceUserGroup> userGroupList = baseMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, scheduleId));
//根据employeeId查询出用户的详细信息
SysUserVo sysUserVo = sysUserService.selectUserById(vo.getEmployeeId());
vo.setSysUser(sysUserVo);
//根据scheduleId查询出排班的详细信息
AttendanceArrangement attendanceArrangement = arrangementMapper.selectOne(Wrappers.<AttendanceArrangement>lambdaQuery().eq(AttendanceArrangement::getId, scheduleId));

View File

@@ -99,9 +99,11 @@ public class CostCarChargeServiceImpl implements ICostCarChargeService {
lqw.eq(bo.getFloorId() != null, CostCarCharge::getFloorId, bo.getFloorId());
lqw.eq(StringUtils.isNotBlank(bo.getLocation()), CostCarCharge::getLocation, bo.getLocation());
lqw.eq(StringUtils.isNotBlank(bo.getState()), CostCarCharge::getState, bo.getState());
lqw.eq(StringUtils.isNotBlank(bo.getChargeStatus()), CostCarCharge::getChargeStatus, bo.getChargeStatus());
lqw.eq(bo.getCostItemsId() != null, CostCarCharge::getCostItemsId, bo.getCostItemsId());
lqw.eq(bo.getStarTime() != null, CostCarCharge::getStarTime, bo.getStarTime());
lqw.eq(bo.getEndTime() != null, CostCarCharge::getEndTime, bo.getEndTime());
lqw.eq(StringUtils.isNotBlank(bo.getState()), CostCarCharge::getState, bo.getState());
lqw.eq(StringUtils.isNotBlank(bo.getSearchValue()), CostCarCharge::getSearchValue, bo.getSearchValue());
return lqw;
}

View File

@@ -78,6 +78,7 @@ public class CostItemsServiceImpl implements ICostItemsService {
lqw.orderByAsc(CostItems::getId);
lqw.eq(StringUtils.isNotBlank(bo.getCostType()), CostItems::getCostType, bo.getCostType());
lqw.eq(StringUtils.isNotBlank(bo.getChargeItem()), CostItems::getChargeItem, bo.getChargeItem());
lqw.eq(StringUtils.isNotBlank(bo.getChargeNo()), CostItems::getChargeNo, bo.getChargeNo());
lqw.eq(StringUtils.isNotBlank(bo.getCostMark()), CostItems::getCostMark, bo.getCostMark());
lqw.eq(StringUtils.isNotBlank(bo.getPaymentType()), CostItems::getPaymentType, bo.getPaymentType());
lqw.eq(bo.getChargeCycle() != null, CostItems::getChargeCycle, bo.getChargeCycle());

View File

@@ -178,15 +178,16 @@ public class MachineMaintainPlanServiceImpl implements IMachineMaintainPlanServi
*/
private void validEntityBeforebo(Long id, MachineMaintainPlanBo bo) {
//TODO 做一些数据校验,如唯一约束
Assert.isTrue(CollUtil.isNotEmpty(bo.getMachineMaintainPlanStaffBoList()), "巡检人员不存在");
QueryWrapper<MachineMaintainPlanStaff> staffLambdaQueryWrapper = new QueryWrapper<>();
staffLambdaQueryWrapper.eq("maintain_plan_id", id);
machineMaintainPlanStaffMapper.delete(staffLambdaQueryWrapper);
List<MachineMaintainPlanStaffBo> machineMaintainPlanStaffBoList = bo.getMachineMaintainPlanStaffBoList();
machineMaintainPlanStaffBoList.stream().forEach(s->{
s.setMaintainPlanId(id);
});
machineMaintainPlanStaffMapper.insertBatch(BeanUtil.copyToList(machineMaintainPlanStaffBoList, MachineMaintainPlanStaff.class));
if(CollUtil.isNotEmpty(bo.getMachineMaintainPlanStaffBoList())){
QueryWrapper<MachineMaintainPlanStaff> staffLambdaQueryWrapper = new QueryWrapper<>();
staffLambdaQueryWrapper.eq("maintain_plan_id", id);
machineMaintainPlanStaffMapper.delete(staffLambdaQueryWrapper);
List<MachineMaintainPlanStaffBo> machineMaintainPlanStaffBoList = bo.getMachineMaintainPlanStaffBoList();
machineMaintainPlanStaffBoList.stream().forEach(s->{
s.setMaintainPlanId(id);
});
machineMaintainPlanStaffMapper.insertBatch(BeanUtil.copyToList(machineMaintainPlanStaffBoList, MachineMaintainPlanStaff.class));
}
}
/**

View File

@@ -105,6 +105,7 @@ public class TbVisitorManagementServiceImpl implements ITbVisitorManagementServi
@Override
public Boolean insertByBo(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);
add.setCreateById(info.getUserid());

View File

@@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil;
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.InspectionPlanStaff;
import org.dromara.property.domain.InspectionTask;
import org.dromara.property.domain.bo.InspectionPlanBo;
@@ -41,6 +42,7 @@ import static org.dromara.common.mybatis.core.mapper.BaseMapperPlus.log;
* @Date:2025/7/11 15:28
* @Description: 巡检任务定时处理器
**/
@Slf4j
@Component
@RequiredArgsConstructor
//@Validated

View File

@@ -8,6 +8,7 @@ import cn.hutool.core.util.RandomUtil;
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.MachineMaintainPlanStaff;
import org.dromara.property.domain.MachineMaintainTask;
import org.dromara.property.domain.bo.MachineMaintainPlanBo;
@@ -42,6 +43,7 @@ import static org.dromara.common.mybatis.core.mapper.BaseMapperPlus.log;
* @Date:2025/7/17 09:25
* @Description:
**/
@Slf4j
@Component
@RequiredArgsConstructor
//@Validated
@@ -64,6 +66,7 @@ public class MachineTasks {
List<MachineMaintainPlanVo> machineMaintainPlanVoList = machineMaintainPlanService.queryList(machineMaintainPlanBo);
// 如果没有有效计划,直接返回
if (ObjectUtil.isEmpty(machineMaintainPlanVoList)) {
log.info("暂时没有有效的计划");
return;
}
machineMaintainPlanVoList.stream().forEach(plan->{

View File

@@ -2,17 +2,31 @@ package org.dromara.property.tasks;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.property.domain.AttendanceUserGroup;
import org.dromara.property.domain.ServiceWorkOrders;
import org.dromara.property.domain.ServiceWorkOrdersRecord;
import org.dromara.property.domain.enums.WorkOrderStatusEnum;
import org.dromara.property.mapper.AttendanceUserGroupMapper;
import org.dromara.property.mapper.ServiceWorkOrdersMapper;
import org.dromara.property.mapper.ServiceWorkOrdersRecordMapper;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import org.dromara.common.log.annotation.Log;
import org.springframework.transaction.annotation.Transactional;
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
@@ -20,23 +34,123 @@ import org.dromara.common.log.annotation.Log;
* @Description:自动派单
**/
@Slf4j
@Component
//@Component
//@RequiredArgsConstructor
@RequiredArgsConstructor
@RestController
@RequestMapping("/serviceWorkOrderTasks")
public class ServiceWorkOrderTasks {
private ServiceWorkOrdersMapper workOrdersMapper;
private ServiceWorkOrdersRecordMapper workOrdersRecordMapper;
private AttendanceUserGroupMapper attendanceUserGroupMapper;
//查询状态为创建工单的工单
/**
* 查询状态为创建工单的工单,查询当天排班人员,为工单自动派单
*/
// @Transactional(rollbackFor = Exception.class)
// @Scheduled(cron = "0 0 */1 * * ?")
@GetMapping("/serviceWorkOrderTaskId")
private void handleServiceWorkOrder() {
List<ServiceWorkOrders> serviceWorkOrderList = workOrdersMapper.selectList(
new LambdaQueryWrapper<ServiceWorkOrders>()
.eq(ServiceWorkOrders::getStatus, "0"));
.eq(ServiceWorkOrders::getStatus, WorkOrderStatusEnum.CREATE_ORDER.getValue()));
if(CollUtil.isNotEmpty(serviceWorkOrderList)){
serviceWorkOrderList.stream().forEach(s->{
//查询今天上班的人员
LocalDate today = LocalDate.now();
List<AttendanceUserGroup> attendanceUserGroups = attendanceUserGroupMapper.selectList(
new LambdaQueryWrapper<AttendanceUserGroup>()
.eq(AttendanceUserGroup::getStartDate, today)
);
if(CollUtil.isNotEmpty(attendanceUserGroups)){
attendanceUserGroups.stream().forEach(s1->{
ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord();
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());
});
}else {
log.info("当天无排班人员");
}
});
}else {
log.info("派单工单为:{}",serviceWorkOrderList.size());
}
}
/**
* 处理超过30分钟的工单
*/
// @Transactional(rollbackFor = Exception.class)
// @Scheduled(cron = "0 0 */1 * * ?")
@GetMapping("/thirtyWorkOrderTaskId")
private void thirtyHandleServiceWorkOrder() {
// 1. 查询当前状态为“已派单”的工单
List<ServiceWorkOrders> serviceWorkOrderList = workOrdersMapper.selectList(
new LambdaQueryWrapper<ServiceWorkOrders>()
.eq(ServiceWorkOrders::getStatus, WorkOrderStatusEnum.DISPATCHED.getValue())
);
LocalDate today = LocalDate.now();
// 2. 查询今天有排班的人员
List<AttendanceUserGroup> attendanceUserGroups = attendanceUserGroupMapper.selectList(
new LambdaQueryWrapper<AttendanceUserGroup>()
.eq(AttendanceUserGroup::getStartDate, today)
);
if (CollUtil.isEmpty(serviceWorkOrderList) || CollUtil.isEmpty(attendanceUserGroups)) {
log.info("当前无可处理的超时工单或今日无排班人员");
return;
}
Date now = new Date();
// 3. 遍历超时工单
serviceWorkOrderList.forEach(workOrder -> {
// 查询该工单的最新记录(可能有多条记录)
ServiceWorkOrdersRecord latestRecord = workOrdersRecordMapper.selectOne(
new LambdaQueryWrapper<ServiceWorkOrdersRecord>()
.eq(ServiceWorkOrdersRecord::getOrderId, workOrder.getId())
.orderByDesc(ServiceWorkOrdersRecord::getCreateTime)
.last("LIMIT 1") // 获取最新一条记录
);
if (ObjectUtil.isEmpty(latestRecord) || latestRecord.getCreateTime() == null) {
return;
}
// 判断是否超过30分钟
long minutesElapsed = DateUtil.between(latestRecord.getCreateTime(), now, DateUnit.MINUTE);
if (minutesElapsed <= 30) {
return; // 未超时,跳过
}
// 4. 标记原记录为废弃
latestRecord.setStatus(WorkOrderStatusEnum.ABANDON.getValue());
workOrdersRecordMapper.updateById(latestRecord);
log.info("工单号:{} 的原记录已废弃,超时未处理", workOrder.getOrderNo());
// 5. 重新派单给今天所有排班人员(排除原处理人?根据业务决定)
boolean hasNewDispatch = false;
for (AttendanceUserGroup group : attendanceUserGroups) {
Long employeeId = group.getEmployeeId();
// 可选:避免重新派给原处理人
if (employeeId.equals(latestRecord.getHandler())) {
log.debug("跳过原处理人:{}", employeeId);
continue;
}
// 创建新的派单记录
ServiceWorkOrdersRecord newRecord = new ServiceWorkOrdersRecord();
newRecord.setOrderId(workOrder.getId());
newRecord.setHandler(employeeId);
newRecord.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue());
newRecord.setCreateTime(now);
workOrdersRecordMapper.insert(newRecord);
log.info("工单号:{} 已重新派发给员工ID{}", workOrder.getOrderNo(), employeeId);
// 6. 更新主工单状态(可选:若只保留最新记录状态,也可不更新主表)
workOrder.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue()); // 仍为已派单
workOrder.setHandler(employeeId); // 可清空,或设为最后一个人(根据业务)
workOrdersMapper.updateById(workOrder);
}
});
}
}

View File

@@ -2,12 +2,15 @@ package org.dromara.sis.controller;
import com.alibaba.fastjson2.JSONObject;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sis.sdk.unview.model.UvModel;
import org.dromara.sis.sdk.unview.service.VideoAlarmService;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
/**
* 宇视告警书记上报
*
@@ -32,8 +35,9 @@ public class VideoAlarmController {
}
@PostMapping("/huawei/callback")
public void huaweiAlarm(@RequestBody Object data) {
log.info("华为上报消息,msg={}", data);
public void huaweiAlarm(HttpServletRequest request) throws IOException {
int read = request.getInputStream().read();
log.info("华为上报消息,msg={}", read);
}

View File

@@ -14,8 +14,8 @@
<module>ruoyi-job</module>
<module>ruoyi-resource</module>
<module>ruoyi-workflow</module>
<module>Property</module>
<module>Sis</module>
<!-- <module>Property</module>-->
<!-- <module>Sis</module>-->
</modules>
<artifactId>ruoyi-modules</artifactId>