liujie
2025-09-29 e13b68163f13019bea2d6c84f92ff07a5a9f15ec
app任务
9个文件已修改
2个文件已添加
235 ■■■■■ 已修改文件
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TMissionController.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/resources/application-test.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/TMissionUserDto.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TMission.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TMissionUser.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TMissionService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TMissionServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/TotalHistoryVo.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TMissionMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>