SpringBoot实现导入功能

2023-11-10

实体类-->MeetRestaurantArrange

package com.krt.meet.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.krt.common.core.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * 餐厅安排实体类
 *
 * @author lf
 * @date 2022-06-07
 */
@ApiModel(value = "会务安排餐厅安排")
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@TableName("meet_restaurant_arrange")
public class MeetRestaurantArrange extends BaseEntity {

    /**
     * 会务ID
     */
    @ApiModelProperty(value = "会务ID 关联meet_information表的id")
    private Integer meetId;

    /**
     * 关联人员信息ID
     */
    @ApiModelProperty(value = "关联人员信息ID")
    private Integer restId;

    /**
     * 餐厅名称
     */
    @ApiModelProperty(value = "餐厅名称")
    private String diningName;

    /**
     * 座位号
     */
    @ApiModelProperty(value = "座位号")
    private String seatMember;

    /**
     *餐厅地址
     */
    @ApiModelProperty(value = "餐厅地址")
    private String mapAddress;

    /**
     * 经度
     */
    @ApiModelProperty(value = "经度")
    private String lng;

    /**
     * 纬度
     */
    @ApiModelProperty(value = "纬度")
    private String lat;

    /**
     * 用餐时间
     */
    @ApiModelProperty(value = "用餐时间")
    private Date time;

    /**
     * 批次id
     */
    @ApiModelProperty(value = "批次id")
    private String uuid;

}

需要导入的Excel字段-->ExcelInRestauratVO

package com.krt.meet.VO;

import cn.afterturn.easypoi.excel.annotation.Excel;
import com.krt.common.core.annotation.KrtDataMaskingClass;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * 导入餐厅安排数据VO
 *
 * @author lf
 * @version 1.0
 * @date 2022年06月07日
 */
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@KrtDataMaskingClass
public class ExcelInRestaurantVO {
    /**
     * 人员姓名
     */
    @Excel(name = "姓名")
    private String personName;

    /**
     * 联系方式
     */
    @Excel(name = "联系方式")
    private String phone;

    /**
     * 餐厅名称
     */
    @Excel(name = "餐厅名称")
    private String diningName;

    /**
     * 座位号
     */
    @Excel(name = "座位号")
    private String seatMember;

    /**
     * 用餐时间
     */
    @Excel(name = "用餐时间")
    private Date time;
}

控制层部分代码-->MraController

    /**
     * 会务安排管理餐厅安排导入
     * @param file
     * @return
     */
    @KrtLog("会务安排管理餐厅安排导入")
    @PostMapping("/api/meet/enrollPerson/excelInRestaurant")
    @ApiOperation(value = "餐厅安排数据导入", notes = "餐厅安排数据导入")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "form", name = "file", value = "文件", dataType = "__file", required = true),
            @ApiImplicitParam(paramType = "form", name = "meetId", value = "对应导入会务id")
    })
    public ReturnBean excelInRestaurant(Integer meetId,@RequestParam("file") MultipartFile file){
        if (file.isEmpty()) {
            return ReturnBean.error("导入文件不能为空");
        }
        String fileName = file.getOriginalFilename();
        if (fileName.indexOf(".xls") == -1 && fileName.indexOf(".xlsx") == -1) {
            return ReturnBean.error("导入文件必须是Excel");
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(1);
        params.setHeadRows(1);
        params.setNeedSave(false);

        try{
            //读取excel
            List<ExcelInRestaurantVO> excelList = ExcelImportUtil.importExcel(file.getInputStream(),ExcelInRestaurantVO.class,params);
            //保存
            return iMraService.excelInRestaurant(meetId,excelList);
        }catch (Exception e){
            log.debug("导入餐厅安排数据失败",e);
            return ReturnBean.error("导入餐厅安排数据失败");
        }
    }

服务接口层-->IMraService

package com.krt.meet.service;

import com.krt.common.core.base.IBaseService;
import com.krt.common.core.bean.ReturnBean;
import com.krt.meet.VO.ExcelInRestaurantVO;
import com.krt.meet.entity.MeetRestaurantArrange;

import java.util.List;

/**
 * 餐厅安排服务接口层
 *
 * @author lf
 * @date 2022-06-07
 */
public interface IMraService extends IBaseService<MeetRestaurantArrange> {

    ReturnBean excelInRestaurant(Integer meetId,List<ExcelInRestaurantVO> excelList);
}

接口实现层-->MraServiceImpl

package com.krt.meet.service.impl;

import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.krt.common.core.base.BaseServiceImpl;
import com.krt.common.core.bean.ReturnBean;
import com.krt.meet.VO.ExcelInRestaurantVO;
import com.krt.meet.entity.EnrollPerson;
import com.krt.meet.entity.MeetRestaurantArrange;
import com.krt.meet.mapper.MraMapper;
import com.krt.meet.service.IEnrollPersonService;
import com.krt.meet.service.IMeetHotelArrangeService;
import com.krt.meet.service.IMraService;
import com.krt.meet.utils.StringUtil;
import lombok.extern.slf4j.Slf4j;
import net.hasor.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 餐厅安排接口实现层
 *
 * @author lf
 * @date 2022-06-07
 */
@Slf4j
@Service
public class MraServiceImpl extends BaseServiceImpl<MraMapper, MeetRestaurantArrange> implements IMraService {

    @Autowired
    private IMeetHotelArrangeService hotelArrangeService;

    @Override
    public ReturnBean excelInRestaurant(Integer meetId,List<ExcelInRestaurantVO> excelList) {
        //生成导入批次
        String uuid = IdUtil.simpleUUID();

        ArrayList<MeetRestaurantArrange> restaurantArrangeList = new ArrayList<>();
        //解析数据,判断导入的姓名及手机号是否为空
        for (int i = 0;i < excelList.size();i++) {
            ExcelInRestaurantVO excelInRestaurantVO = excelList.get(i);
            if (StringUtils.isBlank(excelInRestaurantVO.getPersonName()) || StringUtils.isBlank(excelInRestaurantVO.getPersonName().trim())) {
                return ReturnBean.error("第" + (i + 1) + "行人员姓名为空");
            }
            if (StringUtils.isBlank(excelInRestaurantVO.getPhone()) || StringUtils.isBlank(excelInRestaurantVO.getPhone().trim())) {
                return ReturnBean.error("第" + (i + 1) + "行人员手机号为空");
            }

            /**
             * 将excel导入的数据与meet_enroll_person(手机号及姓名做匹配),查询出id.
             * 查询id的目的:meet_enroll_person的id关联meet_restaurant_arrange的id.
             */
            EnrollPerson enrollPerson = hotelArrangeService.selectPerson(excelInRestaurantVO.getPersonName().trim(), excelInRestaurantVO.getPhone().trim(),meetId);

            if (enrollPerson == null) {
                return ReturnBean.error("存在导入的数据在人员信息中找不到!");
            }

            /**
             * 通过meet_id去中间表meet_restaurant_service查询rest_id,
             * 再通过rest_id关联meet_restaurant的id查询出餐厅名称,判断导入的餐厅名称是否存在.如果不存在,提示!
             */
            List<MeetRestaurantArrange> meetRestaurantArranges = baseMapper.selectByRestName(meetId);
            boolean flag = true;
            for (MeetRestaurantArrange restaurantArrange : meetRestaurantArranges) {
                if (excelInRestaurantVO.getDiningName().equals(restaurantArrange.getDiningName())) {
                    restaurantArrange.setUuid(uuid);
                    restaurantArrange.setRestId(enrollPerson.getId());
                    restaurantArrange.setMeetId(meetId);
                    restaurantArrange.setDiningName(excelInRestaurantVO.getDiningName());
                    restaurantArrange.setSeatMember(StringUtil.replaceBlank(excelInRestaurantVO.getSeatMember()));
                    restaurantArrange.setTime(excelInRestaurantVO.getTime());
                    restaurantArrangeList.add(restaurantArrange);
                    flag = false;
                    break;
                }
            }
            if (flag){
                return ReturnBean.error("第" + (i + 3) +"行导入的餐厅名称不匹配!");
            }
        }

        //保存数据
        if (restaurantArrangeList.size()>0){
            this.saveBatch(restaurantArrangeList);
        }
        return ReturnBean.ok();
    }
}

映射层-->MraMapper

package com.krt.meet.mapper;

import com.krt.common.core.base.BaseMapper;
import com.krt.meet.entity.MeetRestaurantArrange;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 餐厅安排映射层
 *
 * @author lf
 * @version 1.0
 * @date 2022年06月07日
 */
@Mapper
public interface MraMapper extends BaseMapper<MeetRestaurantArrange> {

    /**
     * 查询餐厅名称
     * @param meetId
     * @return
     */
    List<MeetRestaurantArrange> selectByRestName(Integer meetId);

}

sql-->MraMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.krt.meet.mapper.MraMapper">

    <sql id="Base_Column_List">
        t3.dining_name,t3.map_address,t3.lat,t3.lng
    </sql>

    <select id="selectByRestName" resultType="com.krt.meet.entity.MeetRestaurantArrange">
        SELECT
        <include refid="Base_Column_List"/>
        FROM meet_restaurant_service t2
        LEFT JOIN meet_restaurant t3 ON t3.id = t2.restaurant_id
        WHERE
        t2.meet_id = #{meetId}
    </select>
</mapper>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot实现导入功能 的相关文章

  • Oracle Java 教程 - 回答问题时可能出现错误

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • Base36 编码字符串?

    我一直在网上查找 但找不到解决此问题的方法 在 Python Ruby 或 Java 中 如何对以下字符串进行 Base 36 编码 nOrG9Eh0uyeilM8Nnu5pTywj3935kW 5 Ruby 以 36 为基数 s unpa
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • 从 MS Access 中提取 OLE 对象(Word 文档)

    我有一个 Microsoft Access 数据库 其中包含一个包含 Microsoft Word 文档的 OLE 对象字段 我试图找到代码来检索保存在 OLE 对象中的文件 以便用户可以从我的 JavaFx 应用程序中的按钮下载它 但没有
  • 在 Struts 2 中传递 URL 参数而不使用查询字符串

    我想使用类似的 URL host ActionName 123 abc 而不是像这样传递查询字符串 host ActionName parm1 123 parm2 abc 我怎样才能在 Struts 2 中做到这一点 我按照下面的方法做了
  • 在 MongoDB 和 Apache Solr 之间同步数据的简单方法

    我最近开始使用 MongoDB 和 Apache Solr 我使用 MongoDB 作为数据存储 并且希望 Apache Solr 为我的数据创建索引 以实现应用程序中的搜索功能 经过一些研究 我发现 基本上有两种方法可以在 MongoDB
  • 是否可以从 servlet 内部以编程方式设置请求上下文路径?

    这是一个特殊情况 我陷入了处理 企业 网络应用程序的困境 企业应用程序正在调用request getContext 并将其与另一个字符串进行比较 我发现我可以使用 getServletContext getContextPath 获取 se
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • Java、Spring:使用 Mockito 测试 DAO 的 DataAccessException

    我正在尝试增加测试覆盖率 所以我想知道 您将如何测试 DAO 中抛出的 DataAccessExceptions 例如在一个简单的 findAll 方法中 该方法仅返回数据源中的所有数据 就我而言 我使用 Spring JdbcTempla
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向

随机推荐