McBasicCmtyController.java 11.3 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.exceptions.ServiceException;
import com.chinagas.common.core.web.controller.BaseController;
import com.chinagas.common.core.web.domain.BaseEntity;
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.McBasicCmtySheetWriteHandler;
import com.chinagas.modules.schsf.utils.listener.McBasicCmtyImportInspection;
import lombok.extern.slf4j.Slf4j;
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.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 基础数据-户数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>> userSysDeptAll = commonService.selectUserSysDeptAll(new BaseEntity());
            long startTime = System.currentTimeMillis(); // 记录任务开始时间
            if (CollectionUtils.isNotEmpty(userSysDeptAll) && CollectionUtils.isNotEmpty(list)) {
                // 使用 Map 来存储 companyCode 及其对应的部门信息
                Map<String, HashMap<String, String>> deptMap = new HashMap<>();
                for (HashMap<String, String> dept : userSysDeptAll) {
                    String companyCode = String.valueOf(dept.get("deptId"));
                    if (companyCode != null) {
                        deptMap.put(companyCode, dept);
                    }
                }
                for (McBasicCmty mcBasicCmty : list) {
                    String companyCode = mcBasicCmty.getCompanyCode();
                    if (!deptMap.containsKey(companyCode)) {
                        throw new ServiceException("导入项目公司错误,请检查!");
                    }
                }
                // 插入数据库
                for (McBasicCmty mcBasicCmty : list) {
                    mcBasicCmtyService.insertMcBasicCmty(mcBasicCmty);
                }
            }
            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");
            //测试数据,实际开发中一般查询查询库,调用Service查询获得
            List<String> xllist = new ArrayList<>();
            xllist.add("乡燃");
            xllist.add("城燃");
            // 这里需要设置不关闭流
            EasyExcel.write(response.getOutputStream(), McBasicCmty.class)
                    .registerWriteHandler(new McBasicCmtySheetWriteHandler(xllist, 11))
                    .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));
        }
    }


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

    @RequirePermission("schsf:mcBasicCmty:summaryExport")
    @PostMapping("/summaryExport")
    public void summaryExport(@RequestBody 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));
        }
    }


}