McBasicMoneyController.java 9.25 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.McBasicMoney;
import com.chinagas.modules.schsf.domain.vo.McBasicCmtyVo;
import com.chinagas.modules.schsf.domain.vo.McBasicMoneyVo;
import com.chinagas.modules.schsf.service.ICommonService;
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.*;
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;


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


    /**
     * 查询基础数据-金额列表
     */
    @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());
            List<HashMap<String, String>> userSysDeptAll = commonService.selectUserSysDeptAll(new BaseEntity());

            long startTime = System.currentTimeMillis(); // 记录任务开始时间
            // 插入数据库
            if (CollectionUtils.isNotEmpty(list) && CollectionUtils.isNotEmpty(userSysDeptAll)) {
                // 使用 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 (McBasicMoney mcBasicCmty : list) {
                    String companyCode = mcBasicCmty.getCompanyCode();
                    if (!deptMap.containsKey(companyCode)) {
                        throw new ServiceException("导入项目公司错误,请检查!");
                    }
                }
                // 插入数据库
                for (McBasicMoney mcBasicCmty : list) {
                    mcBasicMoneyService.insertMcBasicMoney(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("数据导入成功");
    }

    /**
     * 导出基础数据-金额列表模板
     */
    @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));
        }
    }


    @RequirePermission("schsf:mcBasicMoney:summaryList")
    @GetMapping("/summaryList")
    public TableDataInfo summaryList(McBasicMoneyVo mcBasicMoneyVo) {
        startPage();
        mcBasicMoneyVo.setDefFlag("0");
        List<McBasicMoney> list = mcBasicMoneyService.selectMcBasicMoneySummaryList(mcBasicMoneyVo);
        return getDataTable(list);
    }

    @RequirePermission("schsf:mcBasicMoney:summaryExport")
    @PostMapping("/summaryExport")
    public void summaryExport(@RequestBody McBasicMoneyVo mcBasicMoneyVo, HttpServletResponse response) throws IOException {
        mcBasicMoneyVo.setDefFlag("0");
        List<McBasicMoney> list = mcBasicMoneyService.selectMcBasicMoneySummaryList(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));
        }
    }


}