ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TMissionController.java
@@ -7,11 +7,16 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.dto.TMissionUserDto; import com.ruoyi.system.model.TAppUser; import com.ruoyi.system.model.TMission; import com.ruoyi.system.model.TMissionReassign; import com.ruoyi.system.model.TMissionUser; import com.ruoyi.system.service.TAppUserService; import com.ruoyi.system.service.TMissionReassignService; import com.ruoyi.system.service.TMissionService; import com.ruoyi.system.vo.MissionTotalVo; import com.ruoyi.system.vo.TotalHistoryVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -37,14 +42,15 @@ private final TokenService tokenService; private final TAppUserService appUserService; private final TMissionService missionService; private final RedisCache redisCache; private final TMissionReassignService missionReassignService; @Autowired public TMissionController(TokenService tokenService, TAppUserService appUserService, TMissionService missionService,RedisCache redisCache) { public TMissionController(TokenService tokenService, TAppUserService appUserService, TMissionService missionService, RedisCache redisCache, TMissionReassignService missionReassignService) { this.tokenService = tokenService; this.appUserService = appUserService; this.missionService = missionService; this.redisCache = redisCache; this.missionReassignService = missionReassignService; } @@ -89,6 +95,14 @@ } @ApiOperation(value = "获取任务列表--历史任务汇总", response = TotalHistoryVo.class) @PostMapping(value = "/t-mission/totalHistory") public R<TotalHistoryVo> totalHistory() { String userId = tokenService.getLoginUserApplet().getUserId(); // String userId ="1"; return R.ok(missionService.totalHistory(userId)); } /** * 添加任务 */ @@ -114,22 +128,25 @@ */ @ApiOperation(value = "获取任务列表--抢单任务", response = TMission.class) @PostMapping(value = "/api/t-mission/grabMission") public R<?> grabMission(@RequestBody String param) { public R<String> grabMission(@RequestBody String param) { String missionId = JSON.parseObject(param, String.class); String userId = tokenService.getLoginUserApplet().getUserId(); missionService.grabMission(missionId,userId); return R.ok(); return R.ok( missionService.grabMission(missionId,userId)); } /** * 申请支援 */ @ApiOperation(value = "获取任务列表--申请支援", response = TMission.class) @ApiOperation(value = "获取任务列表--申请支援/改派", response = TMission.class) @PostMapping(value = "/api/t-mission/requestSupport") public R<?> requestSupport(@RequestBody String param) { String missionId = JSON.parseObject(param, String.class); TMissionReassign tMissionReassign = JSON.parseObject(param, TMissionReassign.class); String userId = tokenService.getLoginUserApplet().getUserId(); missionService.grabMission(missionId,userId); TAppUser appUser = appUserService.getById(userId); tMissionReassign.setCommitUserId(userId); tMissionReassign.setCommitTime(LocalDateTime.now()); tMissionReassign.setCommitUserName(appUser.getNickName()); missionReassignService.save(tMissionReassign); return R.ok(); } @@ -143,9 +160,9 @@ @ApiOperation(value = "获取任务列表--完成任务汇报", response = TMission.class) @PostMapping(value = "/api/t-mission/successMission") public R<?> successMission(@RequestBody String param) { String missionId = JSON.parseObject(param, String.class); String userId = tokenService.getLoginUserApplet().getUserId(); missionService.successMission(missionId,userId); TMissionUserDto dto = JSON.parseObject(param, TMissionUserDto.class); // String userId = tokenService.getLoginUserApplet().getUserId(); missionService.successMission(dto); return R.ok(); } ruoyi-applet/src/main/resources/application-test.yml
@@ -95,7 +95,7 @@ druid: # 主库数据源 master: url: jdbc:mysql://127.0.0.1:3306/intelligent_dispatching?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai url: jdbc:mysql://192.168.110.34:3306/intelligent_dispatching?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 # 从库数据源 ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java
@@ -1,7 +1,6 @@ package com.ruoyi.common.utils.poi; import javafx.scene.control.Cell; /** * Excel数据格式处理适配器 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -118,7 +118,7 @@ "/applet/changepwd", "/captchaImage","/getCode","/loginCode", "/operations/getBySingleNum/**", "/user/getUserInfoByNumber/**", "/wxLogin/**","/cos/get/**" "/wxLogin/**","/cos/get/**","/t-mission/**" ).permitAll() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() ruoyi-system/src/main/java/com/ruoyi/system/dto/TMissionUserDto.java
New file @@ -0,0 +1,67 @@ package com.ruoyi.system.dto; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; import java.time.LocalDateTime; import java.util.Date; /** * <p> * 任务用户 * </p> * * @author xiaochen * @since 2025-09-28 */ @Data @ApiModel("完成汇报Dto") public class TMissionUserDto{ @TableId(value = "id", type = IdType.ASSIGN_ID) private String id; @ApiModelProperty(value = "接单用户") @TableField("app_user_id") private String appUserId; @ApiModelProperty(value = "任务id") @TableField("mission_id") private String missionId; @ApiModelProperty(value = "任务状态 1已完成 2未完成") private Integer status; @ApiModelProperty(value = "战损备注") @TableField("loss_remark") private String lossRemark; @ApiModelProperty(value = "战果备注") @TableField("victory_remark") private String victoryRemark; @ApiModelProperty(value = "战损json详情") @TableField("loss_text") private String lossText; @ApiModelProperty(value = "战果json详情") @TableField("victory_text") private String victoryText; @ApiModelProperty(value = "任务结果") private String result; @ApiModelProperty(value = "任务结果图片") @TableField("result_img") private String resultImg; @ApiModelProperty(value = "任务结果视频") @TableField("result_video") private String resultVideo; @ApiModelProperty(value = "任务结果音频") @TableField("result_voice") private String resultVoice; } ruoyi-system/src/main/java/com/ruoyi/system/model/TMission.java
@@ -128,7 +128,10 @@ private Integer isMissionPool; private Integer isMissionPool; @ApiModelProperty(value = "用户任务id") @TableField(exist = false) private String userMissionId; } ruoyi-system/src/main/java/com/ruoyi/system/model/TMissionUser.java
@@ -11,6 +11,7 @@ import java.io.Serializable; import java.time.LocalDateTime; import java.util.Date; /** * <p> @@ -46,6 +47,37 @@ @TableField("user_type") private Integer userType; @ApiModelProperty(value = "任务状态 0待完成 1已完成") @ApiModelProperty(value = "任务状态 0待完成 1已完成 2未完成") private Integer status; @ApiModelProperty(value = "任务完成时间") @TableField("success_time") private Date successTime; @ApiModelProperty(value = "战损备注") @TableField("loss_remark") private String lossRemark; @ApiModelProperty(value = "战果备注") @TableField("victory_remark") private String victoryRemark; @ApiModelProperty(value = "战损json详情") @TableField("loss_text") private String lossText; @ApiModelProperty(value = "战果json详情") @TableField("victory_text") private String victoryText; @ApiModelProperty(value = "任务结果") private String result; @ApiModelProperty(value = "任务结果图片") @TableField("result_img") private String resultImg; @ApiModelProperty(value = "任务结果视频") @TableField("result_video") private String resultVideo; @ApiModelProperty(value = "任务结果音频") @TableField("result_voice") private String resultVoice; } ruoyi-system/src/main/java/com/ruoyi/system/service/TMissionService.java
@@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.common.core.domain.BasePage; import com.ruoyi.system.dto.TMissionUserDto; import com.ruoyi.system.model.TMission; import com.ruoyi.system.query.TMissionQuery; import com.ruoyi.system.vo.MissionTotalVo; import com.ruoyi.system.vo.TMissionReassignVO; import com.ruoyi.system.vo.TMissionVO; import com.ruoyi.system.vo.TotalHistoryVo; /** * <p> @@ -28,7 +30,7 @@ MissionTotalVo missionTotal(String userId); void grabMission(String missionId, String userId); String grabMission(String missionId, String userId); PageInfo<TMission> pageNowList(BasePage query,String userId); @@ -55,4 +57,9 @@ */ PageInfo<TMissionVO> pageListMissionPool(TMissionQuery query); TotalHistoryVo totalHistory(String userId); void successMission(TMissionUserDto dto); } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TMissionServiceImpl.java
@@ -6,6 +6,7 @@ import com.ruoyi.common.core.domain.BaseModel; import com.ruoyi.common.core.domain.BasePage; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.system.dto.TMissionUserDto; import com.ruoyi.system.mapper.TMissionMapper; import com.ruoyi.system.mapper.TMissionUserMapper; import com.ruoyi.system.model.TMission; @@ -15,10 +16,14 @@ import com.ruoyi.system.vo.MissionTotalVo; import com.ruoyi.system.vo.TMissionReassignVO; import com.ruoyi.system.vo.TMissionVO; import com.ruoyi.system.vo.TotalHistoryVo; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.text.SimpleDateFormat; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.Objects; @@ -111,6 +116,46 @@ } @Override public TotalHistoryVo totalHistory(String userId) { TotalHistoryVo totalHistoryVo = new TotalHistoryVo(); List<TMissionUser> tMissionUsers = missionUserMapper.selectList(new LambdaQueryWrapper<TMissionUser>().eq(TMissionUser::getAppUserId, userId)); if(tMissionUsers.isEmpty()){ return totalHistoryVo; } long count = tMissionUsers.stream().filter(e -> e.getStatus() == 1).count(); BigDecimal successRate = new BigDecimal(count).divide(new BigDecimal(tMissionUsers.size()), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)); totalHistoryVo.setSuccessRate(successRate); long count1 = tMissionUsers.stream().filter(e -> e.getStatus() == 2).count(); BigDecimal failRate = new BigDecimal(count1).divide(new BigDecimal(tMissionUsers.size()), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)); totalHistoryVo.setFailRate(failRate); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM"); // 查询当前时间的年月日 String now = LocalDate.now().toString(); List<TMissionUser> todayMissionUsers = tMissionUsers.stream().filter(e -> now.equals(simpleDateFormat.format(e.getSuccessTime()))).collect(Collectors.toList()); totalHistoryVo.setTodaySuccessNum(todayMissionUsers.size()); // 查询当前时间的年月 String firstDayOfMonth = LocalDate.now().withDayOfMonth(1).toString().substring(0, 7); List<TMissionUser> monthMissionUsers = tMissionUsers.stream().filter(e -> firstDayOfMonth.equals(simpleDateFormat1.format(e.getSuccessTime()))).collect(Collectors.toList()); totalHistoryVo.setMonthSuccessNum(monthMissionUsers.size()); return totalHistoryVo; } @Override public void successMission(TMissionUserDto dto) { } @Override public PageInfo<TMissionVO> pageList(TMissionQuery query) { return null; } @Override public MissionTotalVo missionTotal(String userId) { MissionTotalVo missionTotalVo = new MissionTotalVo(); List<TMissionUser> tMissionUsers = missionUserMapper.selectList(new LambdaQueryWrapper<TMissionUser>().eq(TMissionUser::getAppUserId, userId).eq(TMissionUser::getStatus, 0)); @@ -130,7 +175,7 @@ } @Override public void grabMission(String missionId, String userId) { public String grabMission(String missionId, String userId) { try { boolean b = redisCache.trylockLoop(missionId, UUID.randomUUID().toString(), 30); if(b){ @@ -140,10 +185,13 @@ tMissionUser.setStatus(0); tMissionUser.setUserType(1); missionUserMapper.insert(tMissionUser); return tMissionUser.getMissionId(); } }finally { redisCache.unlock(missionId, UUID.randomUUID().toString()); } return null; } @Override ruoyi-system/src/main/java/com/ruoyi/system/vo/TotalHistoryVo.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.system.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel("app历史任务顶部汇总") public class TotalHistoryVo { @ApiModelProperty("任务完成率") private BigDecimal successRate=BigDecimal.ZERO; @ApiModelProperty("任务失败率") private BigDecimal failRate=BigDecimal.ZERO; @ApiModelProperty("今日完成数") private Integer todaySuccessNum=0; @ApiModelProperty("本月完成数") private Integer monthSuccessNum=0; } ruoyi-system/src/main/resources/mapper/system/TMissionMapper.xml
@@ -43,7 +43,7 @@ finish_time,is_mission_pool, create_time,update_time, create_by, update_by, disabled </sql> <select id="pageNowList" resultType="com.ruoyi.system.model.TMission"> select t2.* from t_mission_user t1 left join t_mission t2 on t1.mission_id =t2.id select t1.id as userMissionId,t2.* from t_mission_user t1 left join t_mission t2 on t1.mission_id =t2.id where t1.status =0 and t1.app_user_id = #{userId} and t2.status = 2 order by t2.create_time desc </select>