ServiceImpl.java.vm 10.6 KB
Newer Older
fangxinjiang's avatar
fangxinjiang committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/*
 *    Copyright (c) 2018-2025, lengleng All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * Neither the name of the yifu4cloud.com developer nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 * Author: lengleng (wangiegie@gmail.com)
 */
package ${package}.${moduleName}.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import ${package}.${moduleName}.entity.${className};
fangxinjiang's avatar
fangxinjiang committed
21
import ${package}.${moduleName}.vo.${className}Vo;
fangxinjiang's avatar
fangxinjiang committed
22 23
import ${package}.${moduleName}.mapper.${className}Mapper;
import ${package}.${moduleName}.service.${className}Service;
fangxinjiang's avatar
fangxinjiang committed
24
import lombok.extern.log4j.Log4j2;
fangxinjiang's avatar
fangxinjiang committed
25
import org.springframework.stereotype.Service;
fangxinjiang's avatar
fangxinjiang committed
26
import com.yifu.cloud.plus.v1.yifu.common.core.util.ErrorMessage;
fangxinjiang's avatar
fangxinjiang committed
27 28 29 30 31
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import ${package}.${moduleName}.vo.${className}SearchVo;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;
fangxinjiang's avatar
fangxinjiang committed
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ArrayUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.read.metadata.holder.ReadRowHolder;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.util.*;
import com.yifu.cloud.plus.v1.yifu.common.mybatis.base.BaseEntity;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
fangxinjiang's avatar
fangxinjiang committed
56 57 58 59 60 61
/**
 * ${comments}
 *
 * @author ${author}
 * @date ${datetime}
 */
fangxinjiang's avatar
fangxinjiang committed
62
@Log4j2
fangxinjiang's avatar
fangxinjiang committed
63 64
@Service
public class ${className}ServiceImpl extends ServiceImpl<${className}Mapper, ${className}> implements ${className}Service {
fangxinjiang's avatar
fangxinjiang committed
65 66 67 68 69 70
    /**
     * ${comments}简单分页查询
     * @param ${classname} ${comments}
     * @return
     */
    @Override
fangxinjiang's avatar
fangxinjiang committed
71
    public IPage<${className}> get${className}Page(Page<${className}> page, ${className}SearchVo ${classname}){
fangxinjiang's avatar
fangxinjiang committed
72 73
        return baseMapper.get${className}Page(page,${classname});
    }
fangxinjiang's avatar
fangxinjiang committed
74 75 76 77 78 79 80

    /**
     * ${comments}批量导出
     * @param ${classname} ${comments}
     * @return
     */
    @Override
fangxinjiang's avatar
fangxinjiang committed
81
    public void listExport(HttpServletResponse response, ${className}SearchVo searchVo){
fangxinjiang's avatar
fangxinjiang committed
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
        String fileName = "不良记录批量导出" + DateUtil.getThisTime() + ".xlsx";
        //获取要导出的列表
        List<${className}> list = new ArrayList<>();
        long count = noPageCountDiy(searchVo);
        ServletOutputStream out = null;
        try {
            out = response.getOutputStream();
            response.setContentType("multipart/form-data");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName  , "UTF-8"));
            // 这里 需要指定写用哪个class去写,然后写到第一个sheet,然后文件流会自动关闭
            //EasyExcel.write(out, TEmpBadRecord.class).sheet("不良记录").doWrite(list);
            ExcelWriter  excelWriter = EasyExcel.write(out, ${className}.class).build();
            int index = 0;
            if (count >  CommonConstants.ZERO_INT){
                for (int i = 0; i <= count; ) {
                    // 获取实际记录
                    searchVo.setLimitStart(i);
                    searchVo.setLimitEnd(CommonConstants.EXCEL_EXPORT_LIMIT);
                    list = noPageDiy(searchVo);
                    if (Common.isNotNull(list)){
                        ExcelUtil<${className}> util = new ExcelUtil<>(${className}.class);
                        for (${className} vo:list){
                            util.convertEntity(vo,null,null,null);
                        }
                    }
                    if (Common.isNotNull(list)){
fangxinjiang's avatar
fangxinjiang committed
109
                        WriteSheet writeSheet = EasyExcel.writerSheet("${comments}"+index).build();
fangxinjiang's avatar
fangxinjiang committed
110 111 112 113 114 115 116 117 118
                        excelWriter.write(list,writeSheet);
                        index++;
                    }
                    i = i + CommonConstants.EXCEL_EXPORT_LIMIT;
                    if (Common.isNotNull(list)){
                        list.clear();
                    }
                }
            }else {
fangxinjiang's avatar
fangxinjiang committed
119
                WriteSheet writeSheet = EasyExcel.writerSheet("${comments}"+index).build();
fangxinjiang's avatar
fangxinjiang committed
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
                excelWriter.write(list,writeSheet);
            }
            if (Common.isNotNull(list)){
                list.clear();
            }
            out.flush();
            excelWriter.finish();
        }catch (Exception e){
            log.error("执行异常" ,e);
        }finally {
            try {
                if (null != out) {
                    out.close();
                }
            } catch (IOException e) {
                log.error("执行异常", e);
            }
        }
    }

    @Override
    public List<${className}> noPageDiy(${className}SearchVo searchVo) {
        LambdaQueryWrapper<${className}> wrapper = buildQueryWrapper(searchVo);
        List<String> idList = Common.getList(searchVo.getIds());
        if (Common.isNotNull(idList)){
fangxinjiang's avatar
fangxinjiang committed
145
            wrapper.in(${className}::getId,idList);
fangxinjiang's avatar
fangxinjiang committed
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
        }
        if (searchVo.getLimitStart() >= 0 && searchVo.getLimitEnd() > 0){
            wrapper.last(" limit "+ searchVo.getLimitStart() +","+ searchVo.getLimitEnd());
        }
        wrapper.orderByDesc(BaseEntity::getCreateTime);
        return baseMapper.selectList(wrapper);
    }

    private  Long noPageCountDiy(${className}SearchVo searchVo) {
        LambdaQueryWrapper<${className}> wrapper = buildQueryWrapper(searchVo);
        List<String> idList = Common.getList(searchVo.getIds());
        if (Common.isNotNull(idList)){
            wrapper.in(${className}::getId,idList);
        }
        return baseMapper.selectCount(wrapper);
    }

    private LambdaQueryWrapper buildQueryWrapper(${className}SearchVo entity){
        LambdaQueryWrapper<${className}> wrapper = Wrappers.lambdaQuery();
        if (ArrayUtil.isNotEmpty(entity.getCreateTimes())) {
            wrapper.ge(${className}::getCreateTime, entity.getCreateTimes()[0])
                    .le(${className}::getCreateTime,
                            entity.getCreateTimes()[1]);
        }
        if (Common.isNotNull(entity.getCreateName())){
            wrapper.eq(${className}::getCreateName,entity.getCreateName());
        }
        return wrapper;
    }

    @Override
    public R<List<ErrorMessage>> importDiy(InputStream inputStream) {
        List<ErrorMessage> errorMessageList = new ArrayList<>();
        ExcelUtil<${className}Vo> util1 = new ExcelUtil<>(${className}Vo.class);;
        // 写法2
        // 匿名内部类 不用额外写一个DemoDataListener
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        try {
            EasyExcel.read(inputStream, ${className}Vo.class, new ReadListener<${className}Vo>() {
                /**
                 * 单次缓存的数据量
                 */
                public static final int BATCH_COUNT = CommonConstants.BATCH_COUNT;
                /**
                 *临时存储
                 */
                private List<${className}Vo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

                @Override
                public void invoke(${className}Vo data, AnalysisContext context) {
                    ReadRowHolder readRowHolder = context.readRowHolder();
                    Integer rowIndex = readRowHolder.getRowIndex();
                    data.setRowIndex(rowIndex+1);
                    ErrorMessage errorMessage = util1.checkEntity(data, data.getRowIndex());
                    if (Common.isNotNull(errorMessage)){
                        errorMessageList.add(errorMessage);
                    }else {
                        cachedDataList.add(data);
                    }
                    if (cachedDataList.size() >= BATCH_COUNT) {
                        saveData();
                        // 存储完成清理 list
                        cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
                    }
                }
                @Override
                public void doAfterAllAnalysed(AnalysisContext context) {
                    saveData();
                }

                /**
                 * 加上存储数据库
                 */
                private void saveData() {
                    log.info("{}条数据,开始存储数据库!", cachedDataList.size());
                    import${className}(cachedDataList,errorMessageList);
                    log.info("存储数据库成功!");
                }
            }).sheet().doRead();
        }catch (Exception e){
            log.error(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR,e);
            return R.failed(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR);
        }
        return  R.ok(errorMessageList);
    }
    private void import${className}(List<${className}Vo> excelVOList, List<ErrorMessage> errorMessageList) {
        // 个性化校验逻辑
        ErrorMessage errorMsg;
        // 执行数据插入操作 组装
        for (int i = 0; i < excelVOList.size(); i++) {
            ${className}Vo excel = excelVOList.get(i);
            // 数据合法情况 TODO

            // 插入
fangxinjiang's avatar
fangxinjiang committed
240
            insertExcel(excel);
fangxinjiang's avatar
fangxinjiang committed
241 242 243 244 245 246 247 248 249 250 251
            errorMessageList.add(new ErrorMessage(excel.getRowIndex(),CommonConstants.SAVE_SUCCESS));
        }
    }
    /**
     * 插入excel bad record
     */
    private void insertExcel(${className}Vo excel) {
        ${className} insert = new ${className}();
        BeanUtil.copyProperties(excel, insert);
        this.save(insert);
    }
fangxinjiang's avatar
fangxinjiang committed
252
}