McBasicCmtyController.java 11.6 KB
package com.chinagas.modules.schsf.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.util.MapUtils;
import com.alibaba.fastjson2.JSON;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.chinagas.common.core.domain.AjaxResult;
import com.chinagas.common.core.web.controller.BaseController;
import com.chinagas.common.core.web.page.TableDataInfo;
import com.chinagas.common.log.annotation.Log;
import com.chinagas.common.log.enums.BusinessType;
import com.chinagas.common.security.annotation.RequirePermission;
import com.chinagas.common.security.enums.Logical;
import com.chinagas.modules.schsf.domain.McBasicCmty;
import com.chinagas.modules.schsf.domain.dto.CompanyDto;
import com.chinagas.modules.schsf.domain.vo.McBasicCmtyVo;
import com.chinagas.modules.schsf.service.ICommonService;
import com.chinagas.modules.schsf.service.IMcBasicCmtyService;
import com.chinagas.modules.schsf.utils.listener.McBasicCmtyImportInspection;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;


/**
 * 基础数据-户数Controller
 *
 * @author cw
 * @date 2024-05-22
 */
@Slf4j
@RestController
@RequestMapping("/mcBasicCmty")
public class McBasicCmtyController extends BaseController {
    @Autowired
    private IMcBasicCmtyService mcBasicCmtyService;
    @Autowired
    private ICommonService commonService;

    /**
     * 查询基础数据-户数 项目公司组织级联
     */
//    @RequirePermission("schsf:mcBasicCmty:companyCascader")
    @RequirePermission(value = {"schsf:mcVisit:list", "schsf:mcIgnition:list", "schsf:mcConstruction:list"}, logical = Logical.OR)
    @GetMapping("/companyCascader")
    public AjaxResult companyCascader(Long fiscalYear) {
        McBasicCmtyVo mcBasicCmtyVo = new McBasicCmtyVo();
        mcBasicCmtyVo.setDefFlag("0");
        mcBasicCmtyVo.setFiscalYear(fiscalYear);
        List<CompanyDto> data = mcBasicCmtyService.selectCompanyCascader(mcBasicCmtyVo);
        return AjaxResult.success(data);
    }


    /**
     * 查询小区
     *
     * @param fiscalYear
     * @param regionName
     * @param groupName
     * @param companyName
     * @param companyCode
     * @return
     */
//    @RequirePermission("schsf:mcBasicCmty:vlgOrCmty")
    @RequirePermission(value = {"schsf:mcVisit:list", "schsf:mcIgnition:list", "schsf:mcConstruction:list"}, logical = Logical.OR)
    @GetMapping("/vlgOrCmty")
    public AjaxResult vlgOrCmty(
            @RequestParam(value = "fiscalYear", required = true) Long fiscalYear,
            @RequestParam(value = "regionName", required = true) String regionName,
            @RequestParam(value = "groupName", required = true) String groupName,
            @RequestParam(value = "companyName", required = true) String companyName,
            @RequestParam(value = "companyCode", required = true) String companyCode) {
        McBasicCmtyVo mcBasicCmtyVo = new McBasicCmtyVo();
        mcBasicCmtyVo.setDefFlag("0");
        mcBasicCmtyVo.setFiscalYear(fiscalYear);
        mcBasicCmtyVo.setRegionName(regionName);
        mcBasicCmtyVo.setGroupName(groupName);
        mcBasicCmtyVo.setCompanyName(companyName);
        mcBasicCmtyVo.setCompanyCode(companyCode);
        List<McBasicCmty> data = mcBasicCmtyService.selectVlgOrCmtyList(mcBasicCmtyVo);
        return AjaxResult.success(data);
    }

    /**
     * 查询基础数据-户数列表
     */
    @RequirePermission("schsf:mcBasicCmty:list")
    @GetMapping("/list")
    public TableDataInfo list(McBasicCmtyVo mcBasicCmtyVo) {
        startPage();
        mcBasicCmtyVo.setDefFlag("0");
        List<McBasicCmty> list = mcBasicCmtyService.selectMcBasicCmtyList(mcBasicCmtyVo);
        return getDataTable(list);
    }

    /**
     * 导入数据
     *
     * @param file
     * @return
     */
    @RequirePermission("schsf:mcBasicCmty:importData")
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file) {
        if (file.isEmpty()) {
            throw new RuntimeException("文件不能为空");
        }
        if (!"xls,xlsx".contains(file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1, file.getOriginalFilename().length()))) {
            throw new RuntimeException("只支持excel文件上传");
        }
        //限制文件5M
        if (file.getSize() > 5000 * 1024) {
            throw new RuntimeException("文件大小不得超过5M");
        }
        try {


            // 获取文件的输入流
            InputStream inputStream = file.getInputStream();
            List<McBasicCmty> list = EasyExcel.read(inputStream) //调用read方法
                    .registerReadListener(new McBasicCmtyImportInspection())
                    // 注册自定义监听器,字段校验可以在监听器内实现
                    .head(McBasicCmty.class) // 对应导入的实体类
                    .sheet(0) // 导入数据的sheet页编号,0代表第一个sheet页,如果不填,则会导入所有sheet页的数据
                    .headRowNumber(4) // 列表头行数,1代表列表头有1行,第二行开始为数据行
                    .doReadSync(); // 开始读Excel,返回一个List<T>集合,继续后续入库操作
            log.info("导入基础数据-户数总条数:{}", list == null ? 0 : list.size());

//            List<HashMap<String, String>> sysDeptAlls = commonService.selectSysDeptAll();


//            // 检验重复数据
//            Map<String, List<McBasicCmty>> collect = list.stream().collect(Collectors.groupingBy(o ->
//                    o.getRegionName() +
//                            o.getGroupName() +
//                            o.getCompanyName() +
//                            o.getCompanyCode()
//                            + o.getFiscalYear()
//                            + o.getProvince()
//                            + o.getCity()
//                            + o.getDistrict()
//                            + o.getStreet()
//                            + o.getVlgOrCmty()
//            ));
//            Set<String> strings = collect.keySet();
//            if (strings.size() < list.size()) {
//                throw new RuntimeException("表格中存在重复的数据");
//            }
            long startTime = System.currentTimeMillis(); // 记录任务开始时间
            // 插入数据库
            if (CollectionUtils.isNotEmpty(list)) {
//                Runnable task = () -> {
                for (McBasicCmty mcBasicCmty : list) {
                    mcBasicCmtyService.insertMcBasicCmty(mcBasicCmty);
                    System.out.println(list); // 注意:这里直接打印list可能不是最佳实践,具体看需求
                }
//                };
//                Thread backgroundThread = new Thread(task, "后台插入任务线程");
//                backgroundThread.setDaemon(true); // 设置为守护线程,随主线程结束而结束
//                backgroundThread.start();
//                try {
//                    backgroundThread.join(); // 等待线程执行完毕,确保能准确计算运行时长
//                } catch (InterruptedException e) {
//                    Thread.currentThread().interrupt(); // 恢复中断状态
//                    log.error("导入基础数据-户数,等待线程执行完毕时被中断", e);
//                }
            }
            long endTime = System.currentTimeMillis(); // 记录任务结束时间
            long duration = endTime - startTime; // 计算任务运行时长
            log.info("导入基础数据-户数,数据库插入任务运行时长:{}毫秒", duration);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error(e.getMessage());
        }
        return AjaxResult.success("数据导入成功");
    }


    /**
     * 模板
     *
     * @param response
     * @throws IOException
     */
    @RequirePermission(value = {"schsf:mcBasicCmty:exportTemplate", "schsf:mcBasicCmty:importData"}, logical = Logical.OR)
    @Log(title = "基础数据-户数", businessType = BusinessType.EXPORT)
    @PostMapping("/exportTemplate")
    public void exportTemplate(HttpServletResponse response) throws IOException {
        McBasicCmtyVo mcBasicCmtyVo = new McBasicCmtyVo();
        startPage();
        mcBasicCmtyVo.setDefFlag("0");
        List<McBasicCmty> list = mcBasicCmtyService.selectMcBasicCmtyList(mcBasicCmtyVo);
        try {
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("基础数据-户数", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
            // 这里需要设置不关闭流
            EasyExcel.write(response.getOutputStream(), McBasicCmty.class).autoCloseStream(Boolean.FALSE).sheet("客户信息列表").doWrite(list);
        } catch (Exception e) {
            // 重置response
            e.printStackTrace();
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, String> map = MapUtils.newHashMap();
            map.put("status", "failure");
            map.put("message", "下载文件失败" + e.getMessage());
            response.getWriter().println(JSON.toJSONString(map));
        }
    }



    @GetMapping("/summaryList")
    public TableDataInfo summaryList(McBasicCmtyVo mcBasicCmtyVo) {
        startPage();
        mcBasicCmtyVo.setDefFlag("0");
        List<McBasicCmty> list = mcBasicCmtyService.selectMcBasicCmtySummaryList(mcBasicCmtyVo);
        return getDataTable(list);
    }


    @PostMapping("/summaryExport")
    public void summaryExport(McBasicCmtyVo mcBasicCmtyVo,HttpServletResponse response) throws IOException {
        List<McBasicCmty> list = mcBasicCmtyService.selectMcBasicCmtySummaryList(mcBasicCmtyVo);
        try {
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("累加户数项目公司", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
            // 这里需要设置不关闭流
            EasyExcel.write(response.getOutputStream(), McBasicCmty.class).autoCloseStream(Boolean.FALSE).sheet("累加户数项目公司").doWrite(list);
        } catch (Exception e) {
            // 重置response
            e.printStackTrace();
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, String> map = MapUtils.newHashMap();
            map.put("status", "failure");
            map.put("message", "下载文件失败" + e.getMessage());
            response.getWriter().println(JSON.toJSONString(map));
        }
    }



}