diff --git a/ruoyi-system/src/main/java/com/ruoyi/bgt/service/impl/BgtProjectRecruitApplyServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bgt/service/impl/BgtProjectRecruitApplyServiceImpl.java index 269da07..0fb69af 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/bgt/service/impl/BgtProjectRecruitApplyServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/bgt/service/impl/BgtProjectRecruitApplyServiceImpl.java @@ -27,6 +27,7 @@ import com.ruoyi.common.enums.RecruitStatus; import com.ruoyi.common.exception.BaseException; import com.ruoyi.common.service.IAnnexService; import com.ruoyi.common.service.IAsyncService; +import com.ruoyi.common.service.IWgzService; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.service.ISysDictTypeService; @@ -89,6 +90,9 @@ public class BgtProjectRecruitApplyServiceImpl extends ServicePlusImpl judMp = iWgzMessageService.JudgingRecruitment(recruit.getId(), recruit.getRecruitStaffNum(), recruit.getRecruitEndTime()); + String status = judMp.get("status").toString(); + switch (status) { case "1": //异步修改状态为已招满 iAsyncService.updateRecruitStatus(recruit); @@ -569,6 +574,15 @@ public class BgtProjectRecruitApplyServiceImpl extends ServicePlusImpl 0){ +// throw new RuntimeException("您已在其他工地!"); +// } + //数据库行级锁(是否进入其他工地) + Integer i = iWgzService.QueryWhetherTheCurrentUserHasAnOngoingProject(byUserId.getUserId()); + if (i>0) { + throw new RuntimeException("您已在其他工地!"); + } //3、更新报名状态、及更新消息的操作状态(用户同意更新进场时间、状态;用户拒绝更新状态) BgtProjectRecruitApply apply = new BgtProjectRecruitApply(); apply.setId(req.getRecruitApplyId()); diff --git a/ruoyi-system/src/main/java/com/ruoyi/common/mapper/WgzMapper.java b/ruoyi-system/src/main/java/com/ruoyi/common/mapper/WgzMapper.java new file mode 100644 index 0000000..7734a95 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/common/mapper/WgzMapper.java @@ -0,0 +1,25 @@ +package com.ruoyi.common.mapper; + +import com.ruoyi.bgt.domain.BgtProjectRecruitApply; +import com.ruoyi.common.core.mybatisplus.cache.MybatisPlusRedisCache; +import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.domain.Annex; +import org.apache.ibatis.annotations.CacheNamespace; +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 务工者Mapper接口 + * + * @author ruoyi + * @date 2025-02-14 + */ +// 如使需切换数据源 请勿使用缓存 会造成数据不一致现象 +@CacheNamespace(implementation = MybatisPlusRedisCache.class, eviction = MybatisPlusRedisCache.class) +public interface WgzMapper extends BaseMapperPlus { + + @Select("SELECT count(1) FROM bgt_project_recruit_apply WHERE user_id = #{userId} and status in ('3','5') FOR UPDATE") + @Options(useCache = false) // 禁用 MyBatis 缓存 + Integer QueryWhetherTheCurrentUserHasAnOngoingProject(@Param("userId") Long userId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/common/service/IWgzService.java b/ruoyi-system/src/main/java/com/ruoyi/common/service/IWgzService.java new file mode 100644 index 0000000..3221397 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/common/service/IWgzService.java @@ -0,0 +1,9 @@ +package com.ruoyi.common.service; + +import com.ruoyi.bgt.domain.BgtProjectRecruitApply; +import com.ruoyi.common.core.mybatisplus.core.IServicePlus; + +public interface IWgzService extends IServicePlus { + //行级锁-查询当前用户是否已有进行中项目 + Integer QueryWhetherTheCurrentUserHasAnOngoingProject(Long userId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/common/service/impl/WgzServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/common/service/impl/WgzServiceImpl.java new file mode 100644 index 0000000..b194bc6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/common/service/impl/WgzServiceImpl.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.service.impl; + +import com.ruoyi.bgt.domain.BgtProjectRecruitApply; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; +import com.ruoyi.common.mapper.WgzMapper; +import com.ruoyi.common.service.IWgzService; +import org.springframework.stereotype.Service; + +@Service +public class WgzServiceImpl extends ServicePlusImpl implements IWgzService { + + @Override + public Integer QueryWhetherTheCurrentUserHasAnOngoingProject(Long userId) { + return baseMapper.QueryWhetherTheCurrentUserHasAnOngoingProject(userId); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/res/WgzAppRegisteredProjectRes.java b/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/res/WgzAppRegisteredProjectRes.java index 967d1f7..7c18b99 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/res/WgzAppRegisteredProjectRes.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/res/WgzAppRegisteredProjectRes.java @@ -31,6 +31,7 @@ public class WgzAppRegisteredProjectRes implements Serializable { private String recruitName; @ApiModelProperty("创建时间/报名时间") + @JsonFormat(pattern = "yyyy-MM-dd", shape = JsonFormat.Shape.STRING) private LocalDateTime createTime; @ApiModelProperty("封面图(多个逗号分隔)") diff --git a/ruoyi-system/src/main/java/com/ruoyi/wgz/service/IWgzMessageService.java b/ruoyi-system/src/main/java/com/ruoyi/wgz/service/IWgzMessageService.java index bbabfed..9734257 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wgz/service/IWgzMessageService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wgz/service/IWgzMessageService.java @@ -15,6 +15,7 @@ import org.springframework.validation.annotation.Validated; import java.time.LocalDate; import java.util.Collection; import java.util.List; +import java.util.Map; /** * 消息Service接口 @@ -91,7 +92,7 @@ public interface IWgzMessageService extends IServicePlus { /** * 判断招工是否已招满或已过期 */ - String JudgingRecruitment(Long recruitId, int num, LocalDate recruitEndTime); + Map JudgingRecruitment(Long recruitId, int num, LocalDate recruitEndTime); /** * 修改已读未读状态 diff --git a/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzDailyClockServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzDailyClockServiceImpl.java index 97b5871..ae7368d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzDailyClockServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzDailyClockServiceImpl.java @@ -251,6 +251,7 @@ public class WgzDailyClockServiceImpl extends ServicePlusImpl 0 && req.getStatus().equals("1")){ WgzUser byId = wgzUserService.findByUserId(appUserId); Map mp = new HashMap<>(); + mp.put("userName",byId.getUsername()); mp.put("data",String.valueOf(LocalDate.now())); WgzMessage wgzMessage = new WgzMessage(). setSenderType(USERTYPE_SYSTEM). diff --git a/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzMessageServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzMessageServiceImpl.java index 375d6f9..59127da 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzMessageServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzMessageServiceImpl.java @@ -212,7 +212,8 @@ public class WgzMessageServiceImpl extends ServicePlusImpl stringObjectMap = JudgingRecruitment(byId.getTableId(), Integer.parseInt(byRecruitIdData.getRecruitStaffNum()), byRecruitIdData.getRecruitEndTime()); + byRecruitIdData.setFull(stringObjectMap.get("status").toString()); return byRecruitIdData; } @@ -231,15 +232,20 @@ public class WgzMessageServiceImpl extends ServicePlusImpl JudgingRecruitment(Long recruitId,int num,LocalDate recruitEndTime) { + Map mp = new HashMap<>(); //使用数据库行级锁 int count = baseMapper.countRecruitApply(recruitId); - if(count == num){ - return "1"; //已招满 - } + mp.put("count", count); if (LocalDate.now().isAfter(recruitEndTime)){ - return "2"; //已失效 + mp.put("status", "2"); + return mp; //已失效 } - return "0"; + if(count == num){ + mp.put("status", "1"); + return mp; //已招满 + } + mp.put("status", "0"); + return mp; } } diff --git a/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitMapper.xml b/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitMapper.xml index 574c73e..d02fc50 100644 --- a/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/bgt/BgtProjectRecruitMapper.xml @@ -65,6 +65,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" c.task_name, c.task_address, c.task_img, + c.create_time as taskCreateTime, d.dict_label AS typeOfWorkLabel, (SELECT count(1) FROM bgt_project_recruit_apply WHERE recruit_id = b.id) as numberOfRegistered FROM diff --git a/ruoyi-system/src/main/resources/mapper/common/WgzMapper.xml b/ruoyi-system/src/main/resources/mapper/common/WgzMapper.xml new file mode 100644 index 0000000..78ee59a --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/common/WgzMapper.xml @@ -0,0 +1,10 @@ + + + + + + + +