xuhy
2025-06-20 12aac2ade617f3bb4e40165176d009ab3fa15a52
点位导入
2个文件已添加
12个文件已修改
350 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TLocationController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTaskController.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/importExcel/TLocationImportExcel.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTaskMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TTask.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TTaskCleanService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTaskCleanServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/utils/CustomerImportFailedData.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/TaskListVO.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TTaskMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TLocationController.java
@@ -1,29 +1,46 @@
package com.ruoyi.web.controller.api;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.WebUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.system.dto.LocationDTO;
import com.ruoyi.system.importExcel.TLocationImportExcel;
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.LocationListQuery;
import com.ruoyi.system.query.LocationListTaskQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.utils.CustomerImportFailedData;
import com.ruoyi.system.vo.system.LocationListTaskVO;
import com.ruoyi.system.vo.system.LocationListVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -34,6 +51,7 @@
 * @author xiaochen
 * @since 2025-05-28
 */
@Slf4j
@Api(tags = "点位管理")
@RestController
@RequestMapping("/t-location")
@@ -191,5 +209,70 @@
        locationService.removeBatchByIds(Arrays.asList(split));
        return R.ok();
    }
    @ApiOperation(value = "点位导入模板下载")
    @GetMapping("/import-template")
    public void importTemplate() {
        List<TLocationImportExcel> locationImportExcels = new ArrayList<>();
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TLocationImportExcel.class, locationImportExcels);
        HttpServletResponse response = WebUtils.response();
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("点位导入模板.xls", "utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("点位导入模板下载失败!");
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @Log(title = "点位导入", businessType = BusinessType.INSERT)
    @ApiOperation(value = "点位导入")
    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
    @PostMapping("/importLocation")
    public R<List<CustomerImportFailedData>> importLocation(@RequestPart("file") MultipartFile file) {
        ImportParams params = new ImportParams();
        params.setTitleRows(2); // 标题行数
        params.setHeadRows(1); //表头行数
        InputStream inputStream = null;
        List<CustomerImportFailedData> failedData = new ArrayList<>();
        List<TLocationImportExcel> locationExcelList;
        try {
            inputStream = file.getInputStream();
            locationExcelList = ExcelImportUtil.importExcel(inputStream,
                    TLocationImportExcel.class, params);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("点位导入失败:{}", e.getMessage());
            throw new ServiceException("点位导入失败!");
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                throw new ServiceException(e.getMessage());
            }
        }
        if (CollectionUtils.isEmpty(locationExcelList)) {
            throw new ServiceException("点位数据为空!");
        }
        for (TLocationImportExcel locationExcel : locationExcelList) {
            System.err.println(locationExcel);
        }
//        locationService.saveOrUpdateBatch(saveOrUpdateList);
        return R.ok(failedData);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTaskController.java
@@ -1,7 +1,16 @@
package com.ruoyi.web.controller.api;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.hutool.core.io.resource.ClassPathResource;
import com.ruoyi.common.core.domain.BaseModel;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.WebUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.dto.TTaskAuditBatchDTO;
import com.ruoyi.system.dto.TTaskAuditDTO;
@@ -21,14 +30,15 @@
import com.ruoyi.system.vo.system.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -265,5 +275,98 @@
        return R.ok();
    }
    @Log(title = "任务记录导出", businessType = BusinessType.DELETE)
    @ApiOperation(value = "任务记录导出")
    @PostMapping(value = "/exportExcel")
    public void exportExcel(@RequestBody TaskListQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        List<TLocation> locationList = locationService.list();
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            List<String> deptIds = deptService.lambdaQuery().like(TDept::getDeptName, query.getDeptName()).list()
                    .stream().map(TDept::getId).collect(Collectors.toList());
            projectIds.addAll(deptIds);
            if (projectIds.isEmpty()){
                projectIds.add("-1");
            }
            if (StringUtils.hasLength(query.getPhonenumber())){
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().equals(query.getPhonenumber())
                                && projectIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
                    patrolInspectorIds.add(-1L);
                }
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
        }
        if (StringUtils.hasLength(query.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                patrolInspectorIds.add(-1L);
            }
        }
        if (query.getClearStatus()!=null){
            List<String> collect = tTaskDetailService.lambdaQuery().eq(TTaskDetail::getClearStatus, query.getClearStatus())
                    .list().stream().distinct().map(TTaskDetail::getTaskId).collect(Collectors.toList());
            query.setTaskIds(collect);
            if (collect.isEmpty()){
                collect.add("-1");
            }
        }
        if (query.getLocationType()!=null){
            List<String> collect = locationList.stream().filter(e -> e.getLocationType().equals(query.getLocationType())).map(TLocation::getId)
                    .collect(Collectors.toList());
            if (collect.isEmpty()){
                collect.add("-1");
            }
            query.setLocationIds(collect);
        }
        if (StringUtils.hasLength(query.getLocationName())){
            List<String> collect = locationList.stream().filter(e -> e.getLocationName().contains(query.getLocationName())).map(TLocation::getId)
                    .collect(Collectors.toList());
            if (collect.isEmpty()){
                collect.add("-1");
            }else{
                collect = collect.stream().filter(query.getLocationIds()::contains).collect(Collectors.toList());
                if (collect.isEmpty()){
                    collect.add("-1");
                }
                query.setLocationIds(collect);
            }
        }
        List<TaskListVO> list = taskCleanerService.exportList(query);
        //1.获取excel模板
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TaskListVO.class, list);
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("任务记录列表.xls", "utf-8");
            response.setHeader("Content-dispodition", "attachment;filename=" + fileName);
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java
@@ -190,7 +190,7 @@
    /**
     * 获取登录部门id
     */
    public Long getDeptId()
    public String getDeptId()
    {
        return getLoginUser().getDeptId();
    }
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java
@@ -24,7 +24,7 @@
    /**
     * 部门ID
     */
    private Long deptId;
    private String deptId;
    /**
     * 用户唯一标识
@@ -81,7 +81,7 @@
        this.permissions = permissions;
    }
    public LoginUser(Long userId, Long deptId, SysUser user, Set<String> permissions)
    public LoginUser(Long userId, String deptId, SysUser user, Set<String> permissions)
    {
        this.userId = userId;
        this.deptId = deptId;
@@ -99,12 +99,12 @@
        this.userId = userId;
    }
    public Long getDeptId()
    public String getDeptId()
    {
        return deptId;
    }
    public void setDeptId(Long deptId)
    public void setDeptId(String deptId)
    {
        this.deptId = deptId;
    }
ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java
@@ -35,7 +35,7 @@
    /**
     * 获取部门ID
     **/
    public static Long getDeptId()
    public static String getDeptId()
    {
        try
        {
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -219,7 +219,7 @@
            throw new ServiceException("短信验证码错误");
        }
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
        LoginUser loginUser = new LoginUser(user.getUserId(), Long.valueOf(user.getDeptId()), user, permissionService.getMenuPermission(user));
        LoginUser loginUser = new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
        recordLoginInfo(loginUser.getUserId());
        // 生成token
        return loginUser;
ruoyi-system/src/main/java/com/ruoyi/system/importExcel/TLocationImportExcel.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.system.importExcel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "点位导入excel")
public class TLocationImportExcel implements Serializable {
    @ApiModelProperty(value = "项目部编号")
    private String deptCode;
    @ApiModelProperty(value = "项目部名称")
    private String deptName;
    @ApiModelProperty(value = "基层管理员姓名  巡检员")
    private String nickName;
//    @ApiModelProperty(value = "保洁员部门编号")
//    private String nickName;
//    @ApiModelProperty(value = "基层管理员姓名  巡检员")
//    private String nickName;
//    @ApiModelProperty(value = "基层管理员姓名  巡检员")
//    private String nickName;
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTaskMapper.java
@@ -26,4 +26,11 @@
    List<TaskListVO> pageList(@Param("query")TaskListQuery query, @Param("pageInfo")PageInfo<TaskListVO> pageInfo);
    List<TaskUserListVO> pageListUser(@Param("query")TaskUserListQuery query, @Param("pageInfo")PageInfo<TaskUserListVO> pageInfo);
    /**
     * 导出任务记录
     * @param query
     * @return
     */
    List<TaskListVO> exportList(@Param("query")TaskListQuery query);
}
ruoyi-system/src/main/java/com/ruoyi/system/model/TTask.java
@@ -1,5 +1,6 @@
package com.ruoyi.system.model;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseModel;
@@ -34,6 +35,7 @@
    @TableField("project_id")
    private String projectId;
    @Excel(name = "任务状态", width = 20,orderNum = "8",replace = {"1_未执行","2_超时","3_待确认","4_待整改","5_整改完成","6_已完成"})
    @ApiModelProperty(value = "任务状态:1未执行、2超时、3待确认、4待整改、5整改完成、6已完成")
    @TableField("status")
    private Integer status;
ruoyi-system/src/main/java/com/ruoyi/system/service/TTaskCleanService.java
@@ -8,6 +8,8 @@
import com.ruoyi.system.query.TaskListQuery;
import com.ruoyi.system.vo.system.TaskListVO;
import java.util.List;
/**
 * <p>
 * 任务记录 服务类
@@ -23,4 +25,11 @@
    PageInfo<TaskUserListVO> pageListUser(TaskUserListQuery query);
    /**
     * 任务记录导出
     *
     * @param query
     * @return
     */
    List<TaskListVO> exportList(TaskListQuery query);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTaskCleanServiceImpl.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.BaseModel;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.applet.query.TaskUserListQuery;
import com.ruoyi.system.applet.vo.TaskUserListVO;
import com.ruoyi.system.mapper.TDeptMapper;
@@ -69,4 +70,26 @@
        pageInfo.setRecords(list);
        return pageInfo;
    }
    @Override
    public List<TaskListVO> exportList(TaskListQuery query) {
        List<TaskListVO> list = this.baseMapper.exportList(query);
        List<TTaskDetail> tTaskDetails = taskDetailMapper.selectList(new LambdaQueryWrapper<TTaskDetail>()
                .orderByDesc(BaseModel::getCreateTime)
                .in(TTaskDetail::getHandleType,Arrays.asList(1,4)));
        for (TaskListVO taskListVO : list) {
            TDept tDept = deptMapper.selectById(taskListVO.getPatrolInspectorDept());
            taskListVO.setDeptName(tDept.getDeptName());
            TTaskDetail tTaskDetail = tTaskDetails.stream().filter(e -> e.getTaskId().equals(taskListVO.getId())).findFirst().orElse(null);
            if (tTaskDetail!=null){
                taskListVO.setPicture(tTaskDetail.getPicture());
                taskListVO.setClearStatus(tTaskDetail.getClearStatus());
                taskListVO.setFinishTimeStr(DateUtils.localDateTimeToString(tTaskDetail.getCreateTime()));
                taskListVO.setRemark(tTaskDetail.getRemark());
            }
        }
        return list;
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/utils/CustomerImportFailedData.java
New file
@@ -0,0 +1,20 @@
package com.ruoyi.system.utils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author xiaochen
 * @date 2025/5/30
 */
@Data
@ApiModel(value = "点位导入失败原因")
public class CustomerImportFailedData {
    @ApiModelProperty(value = "行号")
    private Integer rowNum;
    @ApiModelProperty(value = "失败原因")
    private String failedReason;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/TaskListVO.java
@@ -1,5 +1,7 @@
package com.ruoyi.system.vo.system;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.system.model.TTask;
import com.ruoyi.system.model.TTemplate;
import io.swagger.annotations.ApiModel;
@@ -10,19 +12,31 @@
@ApiModel(value = "任务记录列表分页VO")
public class TaskListVO extends TTask {
    @Excel(name = "点位名称", width = 20,orderNum = "1")
    @ApiModelProperty(value = "点位名称")
    private String locationName;
    @Excel(name = "点位类型", width = 20,orderNum = "2")
    @ApiModelProperty(value = "点位类型名称")
    private String locationTypeName;
    @Excel(name = "所属项目部/部门", width = 20,orderNum = "3")
    @ApiModelProperty(value = "部门名称")
    private String deptName;
    @Excel(name = "巡查员", width = 20,orderNum = "4")
    @ApiModelProperty("巡查员名称")
    private String patrolInspectorName;
    @Excel(name = "联系电话", width = 20,orderNum = "5")
    @ApiModelProperty("电话")
    private String phonenumber;
    @ApiModelProperty("图片 多个逗号拼接")
    private String picture;
    @Excel(name = "清洁情况", width = 20,orderNum = "6",replace = {"1_合格","2_不合格"})
    @ApiModelProperty(value = "清洁情况 1合格2不合格")
    private Integer clearStatus;
    @Excel(name = "备注说明", width = 20,orderNum = "7")
    @ApiModelProperty(value = "备注")
    private String remark;
    @Excel(name = "完成日期", width = 20,orderNum = "9")
    @ApiModelProperty(value = "完成时间")
    private String finishTimeStr;
}
ruoyi-system/src/main/resources/mapper/system/TTaskMapper.xml
@@ -110,5 +110,40 @@
            and (t1.implement_time between #{query.startTime} and #{query.endTime})
        </if>
    </select>
    <select id="exportList" resultType="com.ruoyi.system.vo.system.TaskListVO">
        select t1.*,t2.location_name as locationName,t3.location_name as locationTypeName,
        t4.nick_name as patrolInspectorName,
        t4.phonenumber as phonenumber
        from t_task t1
        left join t_location t2 on t1.location_id = t2.id
        left join t_location_type t3 on t2.location_type = t3.id
        left join sys_user t4 on t1.patrol_inspector = t4.user_id
        where 1=1
        and t1.`disabled` = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        <if test="query.patrolInspectorIds != null and query.patrolInspectorIds.size()>0">
            AND t4.user_id IN
            <foreach collection="query.patrolInspectorIds" separator="," item="id" open="(" close=")">
                #{id}
            </foreach>
        </if>
        <if test="query.taskIds != null and query.taskIds.size()>0">
            AND t1.id IN
            <foreach collection="query.taskIds" separator="," item="id" open="(" close=")">
                #{id}
            </foreach>
        </if>
        <if test="query.locationIds != null and query.locationIds.size()>0">
            AND t1.location_id IN
            <foreach collection="query.locationIds" separator="," item="id" open="(" close=")">
                #{id}
            </foreach>
        </if>
        <if test="query.status != null">
            and t1.status = #{query.status}
        </if>
        <if test="query.startTime != null and startTime != ''">
            and (t1.implement_time between #{query.startTime} and #{query.endTime})
        </if>
    </select>
</mapper>