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
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:
@@ -1,51 +1,203 @@
|
|||||||
name: Gitea Actions Demo
|
run-name: ${{ gitea.actor }} 构建镜像并推送(不含JAR依赖上传)🚀
|
||||||
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ master ] # 当main分支有推送时触发
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
Explore-Gitea-Actions:
|
build-parent-pom:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu
|
||||||
steps:
|
steps:
|
||||||
|
- name: 拉取代码仓库
|
||||||
|
uses: http://git.missmoc.top/mocheng/checkout@v4
|
||||||
|
|
||||||
- name: Checkout code
|
- name: 配置环境变量(绝对路径)
|
||||||
uses: http://47.109.37.87:3000/bichangxiong/checkout@v4 # 使用 Gitea 镜像
|
run: |
|
||||||
with:
|
export JAVA_HOME="/java17/java17"
|
||||||
fetch-depth: 1 # 只拉取最新一次提交
|
export MAVEN_HOME="/maven/apache-maven-3.9.11"
|
||||||
# - 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: Install dependencies
|
if [ ! -f "$JAVA_HOME/bin/java" ]; then
|
||||||
run: mvn clean package -DskipTests -Dmaven.repo.local=/home/runner/maven-repo
|
echo "错误:JDK可执行文件不存在于 $JAVA_HOME/bin/java"
|
||||||
- name: copy file via ssh password
|
exit 1
|
||||||
uses: appleboy/scp-action@v0.1.7
|
fi
|
||||||
with:
|
if [ ! -f "$MAVEN_HOME/bin/mvn" ]; then
|
||||||
host: 192.168.1.3
|
echo "错误:Maven可执行文件不存在于 $MAVEN_HOME/bin/mvn"
|
||||||
username: root
|
exit 1
|
||||||
password: by@2025!
|
fi
|
||||||
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
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
- 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
|
||||||
|
|
||||||
- run: echo "🍏 This job's status is ${{ job.status }}."
|
|
||||||
|
@@ -35,6 +35,7 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
|
|||||||
}
|
}
|
||||||
WebSocketSessionHolder.addSession(loginUser.getUserId(), session);
|
WebSocketSessionHolder.addSession(loginUser.getUserId(), session);
|
||||||
log.info("[connect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType());
|
log.info("[connect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType());
|
||||||
|
System.out.println(WebSocketSessionHolder.getSessions(loginUser.getUserId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -26,8 +26,10 @@ public class WebSocketSessionHolder {
|
|||||||
* @param session 要添加的WebSocket会话
|
* @param session 要添加的WebSocket会话
|
||||||
*/
|
*/
|
||||||
public static void addSession(Long sessionKey, WebSocketSession session) {
|
public static void addSession(Long sessionKey, WebSocketSession session) {
|
||||||
|
System.out.println(USER_SESSION_MAP);
|
||||||
removeSession(sessionKey);
|
removeSession(sessionKey);
|
||||||
USER_SESSION_MAP.put(sessionKey, session);
|
USER_SESSION_MAP.put(sessionKey, session);
|
||||||
|
System.out.println(USER_SESSION_MAP);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,6 +38,7 @@ public class WebSocketSessionHolder {
|
|||||||
* @param sessionKey 要移除的会话键
|
* @param sessionKey 要移除的会话键
|
||||||
*/
|
*/
|
||||||
public static void removeSession(Long sessionKey) {
|
public static void removeSession(Long sessionKey) {
|
||||||
|
System.out.println(USER_SESSION_MAP);
|
||||||
WebSocketSession session = USER_SESSION_MAP.remove(sessionKey);
|
WebSocketSession session = USER_SESSION_MAP.remove(sessionKey);
|
||||||
try {
|
try {
|
||||||
session.close(CloseStatus.BAD_DATA);
|
session.close(CloseStatus.BAD_DATA);
|
||||||
@@ -50,6 +53,7 @@ public class WebSocketSessionHolder {
|
|||||||
* @return 与给定会话键对应的WebSocket会话,如果不存在则返回null
|
* @return 与给定会话键对应的WebSocket会话,如果不存在则返回null
|
||||||
*/
|
*/
|
||||||
public static WebSocketSession getSessions(Long sessionKey) {
|
public static WebSocketSession getSessions(Long sessionKey) {
|
||||||
|
System.out.println(USER_SESSION_MAP);
|
||||||
return USER_SESSION_MAP.get(sessionKey);
|
return USER_SESSION_MAP.get(sessionKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -36,6 +36,7 @@ public class WebSocketUtils {
|
|||||||
*/
|
*/
|
||||||
public static void sendMessage(Long sessionKey, String message) {
|
public static void sendMessage(Long sessionKey, String message) {
|
||||||
WebSocketSession session = WebSocketSessionHolder.getSessions(sessionKey);
|
WebSocketSession session = WebSocketSessionHolder.getSessions(sessionKey);
|
||||||
|
|
||||||
sendMessage(session, message);
|
sendMessage(session, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -126,6 +126,10 @@
|
|||||||
<version>2.4.0</version>
|
<version>2.4.0</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.dromara</groupId>
|
||||||
|
<artifactId>ruoyi-common-websocket</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
@@ -7,6 +7,7 @@ import java.util.UUID;
|
|||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.alibaba.nacos.api.config.ConfigService;
|
import com.alibaba.nacos.api.config.ConfigService;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import jakarta.validation.constraints.*;
|
import jakarta.validation.constraints.*;
|
||||||
@@ -14,6 +15,9 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
|
|||||||
import org.apache.dubbo.config.annotation.DubboReference;
|
import org.apache.dubbo.config.annotation.DubboReference;
|
||||||
import org.dromara.common.core.constant.GlobalConstants;
|
import org.dromara.common.core.constant.GlobalConstants;
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
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.property.domain.bo.QrCodeInfo;
|
||||||
import org.dromara.resource.api.RemoteMessageService;
|
import org.dromara.resource.api.RemoteMessageService;
|
||||||
import org.dromara.system.api.RemoteConfigService;
|
import org.dromara.system.api.RemoteConfigService;
|
||||||
@@ -51,8 +55,6 @@ public class TbVisitorManagementController extends BaseController {
|
|||||||
@DubboReference
|
@DubboReference
|
||||||
private final RemoteConfigService remoteConfigService;
|
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 jsonObject = new JSONObject();
|
||||||
jsonObject.put("type","qrcode");
|
jsonObject.put("type","qrcode");
|
||||||
jsonObject.put("date",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("二维码可用");
|
return R.ok("二维码可用");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -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));
|
||||||
|
}
|
||||||
|
}
|
@@ -1,6 +1,4 @@
|
|||||||
package org.dromara.property.domain;
|
package org.dromara.property.domain;
|
||||||
|
|
||||||
import cn.idev.excel.annotation.ExcelProperty;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
@@ -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;
|
private BigDecimal unitPrice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -7,11 +7,11 @@ package org.dromara.property.domain.enums;
|
|||||||
**/
|
**/
|
||||||
public enum MeetAttachStatusEnum {
|
public enum MeetAttachStatusEnum {
|
||||||
/**
|
/**
|
||||||
* 待确认
|
* 上架
|
||||||
*/
|
*/
|
||||||
ENAABLE("上架", "0"),
|
ENAABLE("上架", "0"),
|
||||||
/**
|
/**
|
||||||
* 待提货
|
* 下架
|
||||||
*/
|
*/
|
||||||
DEACTIVATE("下架", "1");
|
DEACTIVATE("下架", "1");
|
||||||
|
|
||||||
|
@@ -3,7 +3,7 @@ package org.dromara.property.domain.enums;
|
|||||||
/**
|
/**
|
||||||
* @Author:yuyongle
|
* @Author:yuyongle
|
||||||
* @Date:2025/7/4 10:35
|
* @Date:2025/7/4 10:35
|
||||||
* @Description:
|
* @Description:会议室状态枚举
|
||||||
**/
|
**/
|
||||||
public enum MeetStatusEnum {
|
public enum MeetStatusEnum {
|
||||||
/**
|
/**
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
@@ -167,7 +167,7 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
|
|||||||
LocalDate endDate = vo.getEndDate();
|
LocalDate endDate = vo.getEndDate();
|
||||||
LocalDate currentDate = bo.getCurrentDate();
|
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表中的天数
|
//取出attendanceScheduleCycle表中的天数
|
||||||
List<Integer> cycleDaysList = scheduleCycleMapper.selectList(Wrappers.<AttendanceScheduleCycle>lambdaQuery().eq(AttendanceScheduleCycle::getGroupId, groupId)).stream().map(AttendanceScheduleCycle::getDayNumber).collect(Collectors.toList());
|
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)) {
|
if (date.isEqual(currentDate)) {
|
||||||
// 判断当前日期是cycleDays中的第几天
|
// 判断当前日期是cycleDays中的第几天
|
||||||
int dayNumber = date.getDayOfYear() - startDate.getDayOfYear() + 1;
|
int dayNumber = date.getDayOfYear() - startDate.getDayOfYear() + 1;
|
||||||
cycleDay = dayNumber % cycleDaysList.size();
|
cycleDay = dayNumber % count;
|
||||||
if (cycleDay == 0) {
|
if (cycleDay == 0) {
|
||||||
cycleDay = cycleDaysList.size();
|
cycleDay = count;
|
||||||
}
|
}
|
||||||
// 根据cycleDay查询出当前日期的班次信息
|
// 根据cycleDay查询出当前日期的班次信息
|
||||||
AttendanceScheduleCycle cycle = scheduleCycleMapper.selectOne(Wrappers.<AttendanceScheduleCycle>lambdaQuery()
|
AttendanceScheduleCycle cycle = scheduleCycleMapper.selectOne(Wrappers.<AttendanceScheduleCycle>lambdaQuery()
|
||||||
@@ -512,15 +512,6 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
|
|||||||
AttendanceArrangement update = MapstructUtils.convert(bo, AttendanceArrangement.class);
|
AttendanceArrangement update = MapstructUtils.convert(bo, AttendanceArrangement.class);
|
||||||
validEntityBeforeSave(update);
|
validEntityBeforeSave(update);
|
||||||
|
|
||||||
// judgeDate(bo, update);
|
|
||||||
|
|
||||||
//根据排班id获取人员id
|
|
||||||
//根据人员id删除人员信息
|
|
||||||
//新增人员信息
|
|
||||||
//根据排班id获取部门id
|
|
||||||
//根据部门id删除部门信息
|
|
||||||
//新增部门信息
|
|
||||||
|
|
||||||
//取出当前排班的id
|
//取出当前排班的id
|
||||||
assert update != null;
|
assert update != null;
|
||||||
Long ArrangementId = update.getId();
|
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))
|
List<Long> employeeIdList = userGroupMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, ArrangementId))
|
||||||
.stream().map(AttendanceUserGroup::getEmployeeId).toList();
|
.stream().map(AttendanceUserGroup::getEmployeeId).toList();
|
||||||
//根据employeeId和ArrangementId删除attendanceUserGroup表中的数据
|
//根据employeeId和ArrangementId删除attendanceUserGroup表中的数据
|
||||||
userGroupMapper.delete(Wrappers.<AttendanceUserGroup>lambdaQuery().in(AttendanceUserGroup::getEmployeeId, employeeIdList)
|
if (!employeeIdList.isEmpty()) {
|
||||||
.eq(AttendanceUserGroup::getScheduleId, ArrangementId));
|
userGroupMapper.delete(Wrappers.<AttendanceUserGroup>lambdaQuery().in(AttendanceUserGroup::getEmployeeId, employeeIdList)
|
||||||
|
.eq(AttendanceUserGroup::getScheduleId, ArrangementId));
|
||||||
|
}
|
||||||
|
|
||||||
//根据排班id获取部门id
|
//根据排班id获取部门id
|
||||||
List<Long> deptIdList = userGroupMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, ArrangementId))
|
List<Long> deptIdList = userGroupMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, ArrangementId))
|
||||||
.stream().map(AttendanceUserGroup::getDeptId).toList();
|
.stream().map(AttendanceUserGroup::getDeptId).toList();
|
||||||
//根据deptId和ArrangementId删除attendanceDeptGroup表中的数据
|
if (!deptIdList.isEmpty()) {
|
||||||
userGroupMapper.delete(Wrappers.<AttendanceUserGroup>lambdaQuery().in(AttendanceUserGroup::getDeptId, deptIdList)
|
//根据deptId和ArrangementId删除attendanceDeptGroup表中的数据
|
||||||
.eq(AttendanceUserGroup::getScheduleId, ArrangementId));
|
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表中批量插入数据
|
//用获取到的排班id向attendanceUserGroup表中批量插入数据
|
||||||
List<AttendanceUserGroup> userGroupList = bo.getUserGroupList();
|
List<AttendanceUserGroup> userGroupList = bo.getUserGroupList();
|
||||||
|
for (AttendanceUserGroup userGroup : userGroupList) {
|
||||||
|
userGroup.setScheduleId(bo.getId());
|
||||||
|
userGroup.setStartDate(oldStartDate);
|
||||||
|
userGroup.setEndDate(oldEndDate);
|
||||||
|
}
|
||||||
userGroupMapper.insertBatch(userGroupList);
|
userGroupMapper.insertBatch(userGroupList);
|
||||||
|
|
||||||
return baseMapper.updateById(update) > 0;
|
return baseMapper.updateById(update) > 0;
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
package org.dromara.property.service.impl;
|
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.MapstructUtils;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
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.constant.StatusConstant;
|
||||||
import org.dromara.property.domain.vo.AttendanceArrangementVo;
|
import org.dromara.property.domain.vo.AttendanceArrangementVo;
|
||||||
import org.dromara.property.mapper.*;
|
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.springframework.stereotype.Service;
|
||||||
import org.dromara.property.domain.bo.AttendanceUserGroupBo;
|
import org.dromara.property.domain.bo.AttendanceUserGroupBo;
|
||||||
import org.dromara.property.domain.vo.AttendanceUserGroupVo;
|
import org.dromara.property.domain.vo.AttendanceUserGroupVo;
|
||||||
@@ -48,6 +52,10 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi
|
|||||||
|
|
||||||
private final AttendanceScheduleCycleMapper scheduleCycleMapper;
|
private final AttendanceScheduleCycleMapper scheduleCycleMapper;
|
||||||
|
|
||||||
|
@DubboReference
|
||||||
|
private ISysUserService sysUserService;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询排班明细
|
* 查询排班明细
|
||||||
*
|
*
|
||||||
@@ -169,8 +177,10 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi
|
|||||||
|
|
||||||
// 根据查询出来的result取出scheduleId
|
// 根据查询出来的result取出scheduleId
|
||||||
Long scheduleId = vo.getScheduleId();
|
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查询出排班的详细信息
|
//根据scheduleId查询出排班的详细信息
|
||||||
AttendanceArrangement attendanceArrangement = arrangementMapper.selectOne(Wrappers.<AttendanceArrangement>lambdaQuery().eq(AttendanceArrangement::getId, scheduleId));
|
AttendanceArrangement attendanceArrangement = arrangementMapper.selectOne(Wrappers.<AttendanceArrangement>lambdaQuery().eq(AttendanceArrangement::getId, scheduleId));
|
||||||
|
@@ -99,9 +99,11 @@ public class CostCarChargeServiceImpl implements ICostCarChargeService {
|
|||||||
lqw.eq(bo.getFloorId() != null, CostCarCharge::getFloorId, bo.getFloorId());
|
lqw.eq(bo.getFloorId() != null, CostCarCharge::getFloorId, bo.getFloorId());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getLocation()), CostCarCharge::getLocation, bo.getLocation());
|
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.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.getCostItemsId() != null, CostCarCharge::getCostItemsId, bo.getCostItemsId());
|
||||||
lqw.eq(bo.getStarTime() != null, CostCarCharge::getStarTime, bo.getStarTime());
|
lqw.eq(bo.getStarTime() != null, CostCarCharge::getStarTime, bo.getStarTime());
|
||||||
lqw.eq(bo.getEndTime() != null, CostCarCharge::getEndTime, bo.getEndTime());
|
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());
|
lqw.eq(StringUtils.isNotBlank(bo.getSearchValue()), CostCarCharge::getSearchValue, bo.getSearchValue());
|
||||||
return lqw;
|
return lqw;
|
||||||
}
|
}
|
||||||
|
@@ -78,6 +78,7 @@ public class CostItemsServiceImpl implements ICostItemsService {
|
|||||||
lqw.orderByAsc(CostItems::getId);
|
lqw.orderByAsc(CostItems::getId);
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getCostType()), CostItems::getCostType, bo.getCostType());
|
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.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.getCostMark()), CostItems::getCostMark, bo.getCostMark());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getPaymentType()), CostItems::getPaymentType, bo.getPaymentType());
|
lqw.eq(StringUtils.isNotBlank(bo.getPaymentType()), CostItems::getPaymentType, bo.getPaymentType());
|
||||||
lqw.eq(bo.getChargeCycle() != null, CostItems::getChargeCycle, bo.getChargeCycle());
|
lqw.eq(bo.getChargeCycle() != null, CostItems::getChargeCycle, bo.getChargeCycle());
|
||||||
|
@@ -178,15 +178,16 @@ public class MachineMaintainPlanServiceImpl implements IMachineMaintainPlanServi
|
|||||||
*/
|
*/
|
||||||
private void validEntityBeforebo(Long id, MachineMaintainPlanBo bo) {
|
private void validEntityBeforebo(Long id, MachineMaintainPlanBo bo) {
|
||||||
//TODO 做一些数据校验,如唯一约束
|
//TODO 做一些数据校验,如唯一约束
|
||||||
Assert.isTrue(CollUtil.isNotEmpty(bo.getMachineMaintainPlanStaffBoList()), "巡检人员不存在");
|
if(CollUtil.isNotEmpty(bo.getMachineMaintainPlanStaffBoList())){
|
||||||
QueryWrapper<MachineMaintainPlanStaff> staffLambdaQueryWrapper = new QueryWrapper<>();
|
QueryWrapper<MachineMaintainPlanStaff> staffLambdaQueryWrapper = new QueryWrapper<>();
|
||||||
staffLambdaQueryWrapper.eq("maintain_plan_id", id);
|
staffLambdaQueryWrapper.eq("maintain_plan_id", id);
|
||||||
machineMaintainPlanStaffMapper.delete(staffLambdaQueryWrapper);
|
machineMaintainPlanStaffMapper.delete(staffLambdaQueryWrapper);
|
||||||
List<MachineMaintainPlanStaffBo> machineMaintainPlanStaffBoList = bo.getMachineMaintainPlanStaffBoList();
|
List<MachineMaintainPlanStaffBo> machineMaintainPlanStaffBoList = bo.getMachineMaintainPlanStaffBoList();
|
||||||
machineMaintainPlanStaffBoList.stream().forEach(s->{
|
machineMaintainPlanStaffBoList.stream().forEach(s->{
|
||||||
s.setMaintainPlanId(id);
|
s.setMaintainPlanId(id);
|
||||||
});
|
});
|
||||||
machineMaintainPlanStaffMapper.insertBatch(BeanUtil.copyToList(machineMaintainPlanStaffBoList, MachineMaintainPlanStaff.class));
|
machineMaintainPlanStaffMapper.insertBatch(BeanUtil.copyToList(machineMaintainPlanStaffBoList, MachineMaintainPlanStaff.class));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -105,6 +105,7 @@ public class TbVisitorManagementServiceImpl implements ITbVisitorManagementServi
|
|||||||
@Override
|
@Override
|
||||||
public Boolean insertByBo(TbVisitorManagementBo bo) {
|
public Boolean insertByBo(TbVisitorManagementBo bo) {
|
||||||
QrCodeInfo info = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY +"Qrcode" + bo.getQrCodeId());
|
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);
|
TbVisitorManagement add = MapstructUtils.convert(bo, TbVisitorManagement.class);
|
||||||
validEntityBeforeSave(add);
|
validEntityBeforeSave(add);
|
||||||
add.setCreateById(info.getUserid());
|
add.setCreateById(info.getUserid());
|
||||||
|
@@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil;
|
|||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.property.domain.InspectionPlanStaff;
|
import org.dromara.property.domain.InspectionPlanStaff;
|
||||||
import org.dromara.property.domain.InspectionTask;
|
import org.dromara.property.domain.InspectionTask;
|
||||||
import org.dromara.property.domain.bo.InspectionPlanBo;
|
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
|
* @Date:2025/7/11 15:28
|
||||||
* @Description: 巡检任务定时处理器
|
* @Description: 巡检任务定时处理器
|
||||||
**/
|
**/
|
||||||
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
//@Validated
|
//@Validated
|
||||||
|
@@ -8,6 +8,7 @@ import cn.hutool.core.util.RandomUtil;
|
|||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.property.domain.MachineMaintainPlanStaff;
|
import org.dromara.property.domain.MachineMaintainPlanStaff;
|
||||||
import org.dromara.property.domain.MachineMaintainTask;
|
import org.dromara.property.domain.MachineMaintainTask;
|
||||||
import org.dromara.property.domain.bo.MachineMaintainPlanBo;
|
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
|
* @Date:2025/7/17 09:25
|
||||||
* @Description:
|
* @Description:
|
||||||
**/
|
**/
|
||||||
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
//@Validated
|
//@Validated
|
||||||
@@ -64,6 +66,7 @@ public class MachineTasks {
|
|||||||
List<MachineMaintainPlanVo> machineMaintainPlanVoList = machineMaintainPlanService.queryList(machineMaintainPlanBo);
|
List<MachineMaintainPlanVo> machineMaintainPlanVoList = machineMaintainPlanService.queryList(machineMaintainPlanBo);
|
||||||
// 如果没有有效计划,直接返回
|
// 如果没有有效计划,直接返回
|
||||||
if (ObjectUtil.isEmpty(machineMaintainPlanVoList)) {
|
if (ObjectUtil.isEmpty(machineMaintainPlanVoList)) {
|
||||||
|
log.info("暂时没有有效的计划");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
machineMaintainPlanVoList.stream().forEach(plan->{
|
machineMaintainPlanVoList.stream().forEach(plan->{
|
||||||
|
@@ -2,17 +2,31 @@ package org.dromara.property.tasks;
|
|||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.property.domain.AttendanceUserGroup;
|
||||||
import org.dromara.property.domain.ServiceWorkOrders;
|
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.ServiceWorkOrdersMapper;
|
||||||
|
import org.dromara.property.mapper.ServiceWorkOrdersRecordMapper;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.dromara.common.log.annotation.Log;
|
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
|
* @Author:yuyongle
|
||||||
@@ -20,23 +34,123 @@ import org.dromara.common.log.annotation.Log;
|
|||||||
* @Description:自动派单
|
* @Description:自动派单
|
||||||
**/
|
**/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
//@Component
|
||||||
|
//@RequiredArgsConstructor
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/serviceWorkOrderTasks")
|
||||||
public class ServiceWorkOrderTasks {
|
public class ServiceWorkOrderTasks {
|
||||||
private ServiceWorkOrdersMapper workOrdersMapper;
|
private ServiceWorkOrdersMapper workOrdersMapper;
|
||||||
|
private ServiceWorkOrdersRecordMapper workOrdersRecordMapper;
|
||||||
|
private AttendanceUserGroupMapper attendanceUserGroupMapper;
|
||||||
|
|
||||||
//查询状态为创建工单的工单
|
/**
|
||||||
|
* 查询状态为创建工单的工单,查询当天排班人员,为工单自动派单
|
||||||
|
*/
|
||||||
|
// @Transactional(rollbackFor = Exception.class)
|
||||||
|
// @Scheduled(cron = "0 0 */1 * * ?")
|
||||||
|
@GetMapping("/serviceWorkOrderTaskId")
|
||||||
private void handleServiceWorkOrder() {
|
private void handleServiceWorkOrder() {
|
||||||
List<ServiceWorkOrders> serviceWorkOrderList = workOrdersMapper.selectList(
|
List<ServiceWorkOrders> serviceWorkOrderList = workOrdersMapper.selectList(
|
||||||
new LambdaQueryWrapper<ServiceWorkOrders>()
|
new LambdaQueryWrapper<ServiceWorkOrders>()
|
||||||
.eq(ServiceWorkOrders::getStatus, "0"));
|
.eq(ServiceWorkOrders::getStatus, WorkOrderStatusEnum.CREATE_ORDER.getValue()));
|
||||||
if(CollUtil.isNotEmpty(serviceWorkOrderList)){
|
if(CollUtil.isNotEmpty(serviceWorkOrderList)){
|
||||||
serviceWorkOrderList.stream().forEach(s->{
|
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 {
|
}else {
|
||||||
log.info("派单工单为:{}",serviceWorkOrderList.size());
|
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);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,12 +2,15 @@ package org.dromara.sis.controller;
|
|||||||
|
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.sis.sdk.unview.model.UvModel;
|
import org.dromara.sis.sdk.unview.model.UvModel;
|
||||||
import org.dromara.sis.sdk.unview.service.VideoAlarmService;
|
import org.dromara.sis.sdk.unview.service.VideoAlarmService;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 宇视告警书记上报
|
* 宇视告警书记上报
|
||||||
*
|
*
|
||||||
@@ -32,8 +35,9 @@ public class VideoAlarmController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/huawei/callback")
|
@PostMapping("/huawei/callback")
|
||||||
public void huaweiAlarm(@RequestBody Object data) {
|
public void huaweiAlarm(HttpServletRequest request) throws IOException {
|
||||||
log.info("华为上报消息,msg={}", data);
|
int read = request.getInputStream().read();
|
||||||
|
log.info("华为上报消息,msg={}", read);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -14,8 +14,8 @@
|
|||||||
<module>ruoyi-job</module>
|
<module>ruoyi-job</module>
|
||||||
<module>ruoyi-resource</module>
|
<module>ruoyi-resource</module>
|
||||||
<module>ruoyi-workflow</module>
|
<module>ruoyi-workflow</module>
|
||||||
<module>Property</module>
|
<!-- <module>Property</module>-->
|
||||||
<module>Sis</module>
|
<!-- <module>Sis</module>-->
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<artifactId>ruoyi-modules</artifactId>
|
<artifactId>ruoyi-modules</artifactId>
|
||||||
|
Reference in New Issue
Block a user