diff --git a/.gitea/workflows/dev.yml b/.gitea/workflows/dev.yml index c0b66ecd..13c24388 100644 --- a/.gitea/workflows/dev.yml +++ b/.gitea/workflows/dev.yml @@ -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 + + + $HOME/.m2/repository + + + multi-repo + + + local-repo + file://$HOME/.m2/repository + + + aliyun-public + https://maven.aliyun.com/repository/public + + + + + + multi-repo + + + 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 + \ No newline at end of file diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java index 557ed8eb..abb35061 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java @@ -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())); } /** diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java index 9c2372b8..5d286dfa 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java @@ -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); } diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java index 35320c6e..be9bfe6c 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java @@ -36,6 +36,7 @@ public class WebSocketUtils { */ public static void sendMessage(Long sessionKey, String message) { WebSocketSession session = WebSocketSessionHolder.getSessions(sessionKey); + sendMessage(session, message); } diff --git a/ruoyi-modules/Property/pom.xml b/ruoyi-modules/Property/pom.xml index 1436b359..a062fa82 100644 --- a/ruoyi-modules/Property/pom.xml +++ b/ruoyi-modules/Property/pom.xml @@ -126,6 +126,10 @@ 2.4.0 compile + + org.dromara + ruoyi-common-websocket + diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/TbVisitorManagementController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/TbVisitorManagementController.java index f7edb234..42da562b 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/TbVisitorManagementController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/TbVisitorManagementController.java @@ -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("二维码可用"); } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MInspectionPointController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MInspectionPointController.java new file mode 100644 index 00000000..def57270 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MInspectionPointController.java @@ -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 edit(@Validated(EditGroup.class) @RequestBody InspectionPointBo bo) { + return toAjax(inspectionPointService.updateByBo(bo)); + } +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrders.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrders.java index de379feb..99a7d889 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrders.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrders.java @@ -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; diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostItemsBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostItemsBo.java index 38980488..4cde0894 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostItemsBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CostItemsBo.java @@ -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; /** diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/MeetAttachStatusEnum.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/MeetAttachStatusEnum.java index 925bd048..1c4c6734 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/MeetAttachStatusEnum.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/MeetAttachStatusEnum.java @@ -7,11 +7,11 @@ package org.dromara.property.domain.enums; **/ public enum MeetAttachStatusEnum { /** - * 待确认 + * 上架 */ ENAABLE("上架", "0"), /** - * 待提货 + * 下架 */ DEACTIVATE("下架", "1"); diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/MeetStatusEnum.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/MeetStatusEnum.java index 9fc74f3d..c7ddacf5 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/MeetStatusEnum.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/MeetStatusEnum.java @@ -3,7 +3,7 @@ package org.dromara.property.domain.enums; /** * @Author:yuyongle * @Date:2025/7/4 10:35 - * @Description: + * @Description:会议室状态枚举 **/ public enum MeetStatusEnum { /** diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/WorkOrderStatusEnum.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/WorkOrderStatusEnum.java new file mode 100644 index 00000000..40966af6 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/WorkOrderStatusEnum.java @@ -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; + } +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java index 11457675..823732b7 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java @@ -167,7 +167,7 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS LocalDate endDate = vo.getEndDate(); LocalDate currentDate = bo.getCurrentDate(); // //统计当前考勤组有多少条数据 -// int count = Math.toIntExact(scheduleCycleMapper.selectCount(Wrappers.lambdaQuery().eq(AttendanceScheduleCycle::getGroupId, groupId))); + int count = Math.toIntExact(scheduleCycleMapper.selectCount(Wrappers.lambdaQuery().eq(AttendanceScheduleCycle::getGroupId, groupId))); //取出attendanceScheduleCycle表中的天数 List cycleDaysList = scheduleCycleMapper.selectList(Wrappers.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.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 employeeIdList = userGroupMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, ArrangementId)) .stream().map(AttendanceUserGroup::getEmployeeId).toList(); //根据employeeId和ArrangementId删除attendanceUserGroup表中的数据 - userGroupMapper.delete(Wrappers.lambdaQuery().in(AttendanceUserGroup::getEmployeeId, employeeIdList) - .eq(AttendanceUserGroup::getScheduleId, ArrangementId)); + if (!employeeIdList.isEmpty()) { + userGroupMapper.delete(Wrappers.lambdaQuery().in(AttendanceUserGroup::getEmployeeId, employeeIdList) + .eq(AttendanceUserGroup::getScheduleId, ArrangementId)); + } //根据排班id获取部门id List deptIdList = userGroupMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, ArrangementId)) .stream().map(AttendanceUserGroup::getDeptId).toList(); - //根据deptId和ArrangementId删除attendanceDeptGroup表中的数据 - userGroupMapper.delete(Wrappers.lambdaQuery().in(AttendanceUserGroup::getDeptId, deptIdList) - .eq(AttendanceUserGroup::getScheduleId, ArrangementId)); + if (!deptIdList.isEmpty()) { + //根据deptId和ArrangementId删除attendanceDeptGroup表中的数据 + userGroupMapper.delete(Wrappers.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 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; diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java index 63c4d027..a4703391 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java @@ -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 userGroupList = baseMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, scheduleId)); + + //根据employeeId查询出用户的详细信息 + SysUserVo sysUserVo = sysUserService.selectUserById(vo.getEmployeeId()); + vo.setSysUser(sysUserVo); //根据scheduleId查询出排班的详细信息 AttendanceArrangement attendanceArrangement = arrangementMapper.selectOne(Wrappers.lambdaQuery().eq(AttendanceArrangement::getId, scheduleId)); diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostCarChargeServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostCarChargeServiceImpl.java index 5797df16..05dbd42c 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostCarChargeServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostCarChargeServiceImpl.java @@ -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; } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostItemsServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostItemsServiceImpl.java index 8cf98820..20a614dc 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostItemsServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CostItemsServiceImpl.java @@ -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()); diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MachineMaintainPlanServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MachineMaintainPlanServiceImpl.java index f58714aa..94bb107d 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MachineMaintainPlanServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MachineMaintainPlanServiceImpl.java @@ -178,15 +178,16 @@ public class MachineMaintainPlanServiceImpl implements IMachineMaintainPlanServi */ private void validEntityBeforebo(Long id, MachineMaintainPlanBo bo) { //TODO 做一些数据校验,如唯一约束 - Assert.isTrue(CollUtil.isNotEmpty(bo.getMachineMaintainPlanStaffBoList()), "巡检人员不存在"); - QueryWrapper staffLambdaQueryWrapper = new QueryWrapper<>(); - staffLambdaQueryWrapper.eq("maintain_plan_id", id); - machineMaintainPlanStaffMapper.delete(staffLambdaQueryWrapper); - List machineMaintainPlanStaffBoList = bo.getMachineMaintainPlanStaffBoList(); - machineMaintainPlanStaffBoList.stream().forEach(s->{ - s.setMaintainPlanId(id); - }); - machineMaintainPlanStaffMapper.insertBatch(BeanUtil.copyToList(machineMaintainPlanStaffBoList, MachineMaintainPlanStaff.class)); + if(CollUtil.isNotEmpty(bo.getMachineMaintainPlanStaffBoList())){ + QueryWrapper staffLambdaQueryWrapper = new QueryWrapper<>(); + staffLambdaQueryWrapper.eq("maintain_plan_id", id); + machineMaintainPlanStaffMapper.delete(staffLambdaQueryWrapper); + List machineMaintainPlanStaffBoList = bo.getMachineMaintainPlanStaffBoList(); + machineMaintainPlanStaffBoList.stream().forEach(s->{ + s.setMaintainPlanId(id); + }); + machineMaintainPlanStaffMapper.insertBatch(BeanUtil.copyToList(machineMaintainPlanStaffBoList, MachineMaintainPlanStaff.class)); + } } /** diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbVisitorManagementServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbVisitorManagementServiceImpl.java index 3accd7ed..63dd52d0 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbVisitorManagementServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbVisitorManagementServiceImpl.java @@ -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()); diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/InspectionTasks.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/InspectionTasks.java index ebd3d47c..a15a866d 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/InspectionTasks.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/InspectionTasks.java @@ -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 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/MachineTasks.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/MachineTasks.java index af701d25..c3f8b73f 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/MachineTasks.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/MachineTasks.java @@ -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 machineMaintainPlanVoList = machineMaintainPlanService.queryList(machineMaintainPlanBo); // 如果没有有效计划,直接返回 if (ObjectUtil.isEmpty(machineMaintainPlanVoList)) { + log.info("暂时没有有效的计划"); return; } machineMaintainPlanVoList.stream().forEach(plan->{ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/ServiceWorkOrderTasks.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/ServiceWorkOrderTasks.java index a0ad8082..20b673ef 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/ServiceWorkOrderTasks.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/ServiceWorkOrderTasks.java @@ -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 serviceWorkOrderList = workOrdersMapper.selectList( new LambdaQueryWrapper() - .eq(ServiceWorkOrders::getStatus, "0")); + .eq(ServiceWorkOrders::getStatus, WorkOrderStatusEnum.CREATE_ORDER.getValue())); if(CollUtil.isNotEmpty(serviceWorkOrderList)){ serviceWorkOrderList.stream().forEach(s->{ - + //查询今天上班的人员 + LocalDate today = LocalDate.now(); + List attendanceUserGroups = attendanceUserGroupMapper.selectList( + new LambdaQueryWrapper() + .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 serviceWorkOrderList = workOrdersMapper.selectList( + new LambdaQueryWrapper() + .eq(ServiceWorkOrders::getStatus, WorkOrderStatusEnum.DISPATCHED.getValue()) + ); + LocalDate today = LocalDate.now(); + // 2. 查询今天有排班的人员 + List attendanceUserGroups = attendanceUserGroupMapper.selectList( + new LambdaQueryWrapper() + .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() + .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); + } + }); } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/VideoAlarmController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/VideoAlarmController.java index 07bb40b2..54a1d276 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/VideoAlarmController.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/VideoAlarmController.java @@ -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); } diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml index 3e55175f..267aca5a 100644 --- a/ruoyi-modules/pom.xml +++ b/ruoyi-modules/pom.xml @@ -14,8 +14,8 @@ ruoyi-job ruoyi-resource ruoyi-workflow - Property - Sis + + ruoyi-modules