McBasicMoneyController.java 7.75 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.McBasicMoney;
import com.chinagas.modules.schsf.domain.vo.McBasicMoneyVo;
import com.chinagas.modules.schsf.service.IMcBasicMoneyService;
import com.chinagas.modules.schsf.utils.listener.McBasicMoneyImportInspection;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
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.List;
import java.util.Map;


/**
 * 基础数据-金额Controller
 *
 * @author cw
 * @date 2024-05-23
 */
@Slf4j
@RestController
@RequestMapping("/mcBasicMoney")
public class McBasicMoneyController extends BaseController {
    @Autowired
    private IMcBasicMoneyService mcBasicMoneyService;

    /**
     * 查询基础数据-金额列表
     */
    @RequirePermission("schsf:mcBasicMoney:list")
    @GetMapping("/list")
    public TableDataInfo list(McBasicMoneyVo mcBasicMoneyVo) {
        startPage();
        mcBasicMoneyVo.setDefFlag("0");
        List<McBasicMoney> list = mcBasicMoneyService.selectMcBasicMoneyList(mcBasicMoneyVo);
        return getDataTable(list);
    }


    /**
     * 导入基础数据-金额数据
     *
     * @param file
     * @return
     */
    @RequirePermission("schsf:mcBasicMoney: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<McBasicMoney> list = EasyExcel.read(inputStream) //调用read方法
                    .registerReadListener(new McBasicMoneyImportInspection())
                    // 注册自定义监听器,字段校验可以在监听器内实现
                    .head(McBasicMoney.class) // 对应导入的实体类
                    .sheet(0) // 导入数据的sheet页编号,0代表第一个sheet页,如果不填,则会导入所有sheet页的数据
                    .headRowNumber(4) // 列表头行数,1代表列表头有1行,第二行开始为数据行
                    .doReadSync(); // 开始读Excel,返回一个List<T>集合,继续后续入库操作
            log.info("导入基础数据-金额总条数:{}", list == null ? 0 : list.size());

//            // 检验重复数据
//            Map<String, List<McBasicMoney>> 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 (McBasicMoney mcBasicCmty : list) {
                        mcBasicMoneyService.insertMcBasicMoney(mcBasicCmty);
                    }
//                };
//                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("数据导入成功");
    }

    /**
     * 导出基础数据-金额列表模板
     */
    @RequirePermission(value = {"schsf:mcBasicMoney:exportTemplate","schsf:mcBasicMoney:importData"}, logical = Logical.OR)
    @Log(title = "基础数据-金额", businessType = BusinessType.EXPORT)
    @PostMapping("/exportTemplate")
    public void exportTemplate(HttpServletResponse response) throws IOException {
        startPage();
        McBasicMoneyVo mcBasicMoneyVo =new McBasicMoneyVo();
        mcBasicMoneyVo.setDefFlag("0");
        List<McBasicMoney> list = mcBasicMoneyService.selectMcBasicMoneyList(mcBasicMoneyVo);
        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(), McBasicMoney.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));
        }
    }
}