ruoyi导入数据,第二次导入相同文件时,覆盖原数据;

news2024/12/25 9:13:20

考勤记录表——在导入时——应该做判断——避免重复导入成功报错

1.现在是,可以多次成功导入同一个文档,导致数据展示出错

期望:

导入文件时,如果这个文件名内数据select值不为0,那么覆盖表数据(update)

如果查数据为0,那么添加(insert)

思路:

1.impl--导入---添加数据(set)

2.导入做处理

select 查是否有数据

返回0  没数据,添加数据  insert

返回>0 有数据,覆盖源数据 update

第一步:

去数据库mapper.xml查看,是否都有值

count()  可以查看返回数据的数量

这是数据库初始查询语句,查询具体字段值

<sql id="selectTAttendRecordVo">
    select id, user_name, year, month, day, user_id, att_time, status, remark, section, type
    from t_attend_record
</sql>

<select id="selectTAttendRecordList" parameterType="TAttendRecord" resultMap="TAttendRecordResult">
    <include refid="selectTAttendRecordVo"/>
    <where>
        <if test="year != null ">and year = #{year}</if>
        <if test="month != null ">and month = #{month}</if>
        <if test="userName != null  and userName != ''"></if>
        <if test="day != null ">and day = #{day}</if>
        <if test="userId != null ">and user_id = #{userId}</if>
        <if test="attTime != null ">and att_time = #{attTime}</if>
        <if test="status != null ">and status = #{status}</if>
        <if test="section != null">and section = #{section}</if>
        <if test="type != null ">and type = #{type}</if>
    </where>
</select>

 我们需要的不是具体字段值是多少,而是需要他一共查询的数量

做法:

<select  id="selectTAttendRecordNum" resultType="int" >
    select count(*)
    from t_attend_record
    <where>
    <if test="year != null ">and year = #{year}</if>
    <if test="month != null ">and month = #{month}</if>
    <if test="day != null ">and day = #{day}</if>
    <if test="userId != null ">and user_id = #{userId}</if>
    <if test="section != null">and section = #{section}</if>
    <if test="type != null ">and type = #{type}</if>
    </where>
</select>

 这就查出来了你所查的数据有没有值,如果查询结果为0,那就是没值,接着insert,添加就好

如果>0,那就需要update

回到当前代码,你会发现,id="selectTAttendRecordNum",这句话爆红。

说明,没有这个mapper方法,你要去到mapper给他添加上。

第二部:Mapper.java

public int selectTAttendRecordNum(TAttendRecord tAttendRecord);

 

 第三步:service 调mapper(这一步你也可不用再单独写放方法,直接用之前的一些方法调用也可)

去service,再写一遍这个方法:

public int selectTAttendRecordNum(TAttendRecord tAttendRecord);

 然后去impl,实现这个接口

去到impl,你会发现爆红

 alt+enter-----

 

 

 

对应实现类就自己创建好了,对于数据的处理,我们写在这里面 

 第三步 直接在impl里调用mapper

因为我这个是查看导入情况,我们去找impl的导入方法

package com.jhsoft.product.wages.service.impl;

import com.jhsoft.product.record.domain.TAttendRecord;
import com.jhsoft.product.record.mapper.TAttendRecordMapper;
import com.jhsoft.product.wages.service.WorkExcelService;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.mapper.SysUserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;

@Service
public class WorkExcelServiceImpl implements WorkExcelService {

    @Autowired
    private TAttendRecordMapper tAttendRecordMapper;

    @Autowired
    private SysUserMapper userMapper;

    /**
     * 导入数据
     *
     * @param commoditList 数据列表
     * @return 结果
     */
    @Override
    @Transactional
    public String importworkExcel(List<Map<String, Object>> commoditList) {
        if (StringUtils.isNull(commoditList) || commoditList.size() == 0) {
            return "导入数据不能为空!";
        }
        System.out.println("导入数据");
        int failureNum = 0;
        for (Map map : commoditList) {
            List<String> check = (List<String>) map.get("check");
            int day = 1;
            for (int i = 0; i < check.size(); i++) {
                TAttendRecord tAttendRecord = new TAttendRecord();
                String stringCellValue = String.valueOf(map.get("stringCellValue"));
                String a = stringCellValue.replace("年", "-");
                stringCellValue = a.replace("月", "-").substring(0, 7);//年月
                String name = String.valueOf(map.get("name"));
                SysUser sysUser = userMapper.selectUserByUserame(name);
                sysUser.setAccountNumber(map.get("accountNumber").toString());
                userMapper.updateUser(sysUser);
                tAttendRecord.setUserName(sysUser.getUserName());
                tAttendRecord.setUserId(sysUser.getUserId());//用户id
                tAttendRecord.setYear(Long.valueOf(stringCellValue.substring(0, 4)));
                tAttendRecord.setMonth(Long.valueOf(stringCellValue.substring(5, stringCellValue.length())));
                Long sign = (Long) map.get("sign");
                tAttendRecord.setSection(sign);//上午或下午
                //拼接打卡年月日
                if (day < 10) {
                    stringCellValue += "-0" + day + " ";
                } else {
                    stringCellValue += "-" + day + " ";
                }
                tAttendRecord.setDay(Long.valueOf(day));//放入日
                day++;//日期加1
                //取考勤数据
                String che = check.get(i);
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                int leak = che.indexOf("漏刷");//判断是否包含条件文字  不包含<0
                int late = che.indexOf("迟到");
                int leaveEarly = che.indexOf("早退");
                int leave = che.indexOf("事假");
                if (leave >= 0) {
                    tAttendRecord.setType(6l);//事假

                } else if (leak >= 0 || "".equals(che)) {
                    tAttendRecord.setType(4l);//漏刷
                } else if (late >= 0) {
                    che = che.substring(0, 5);//取前五位
                    stringCellValue += che + ":00";//拼接成时间
                    try {
                        tAttendRecord.setAttTime(formatter.parse(stringCellValue));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    tAttendRecord.setType(1l);//迟到
                } else if (leaveEarly >= 0) {
                    che = che.substring(0, 5);
                    stringCellValue += che + ":00";
                    try {
                        tAttendRecord.setAttTime(formatter.parse(stringCellValue));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    tAttendRecord.setType(3l);//早退
                } else {
                    if (sign==0) {
                        //上午数据
                        stringCellValue += che + ":00";
                        try {
                            tAttendRecord.setAttTime(formatter.parse(stringCellValue));
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                        tAttendRecord.setType(0l);
                    } else {
                        //下午数据
                        stringCellValue += che + ":00";
                        //这里应该判断时间是否过8点  然后记加班,以后再改
                        try {
                            tAttendRecord.setAttTime(formatter.parse(stringCellValue));
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                        tAttendRecord.setType(2l);
                    }
                }
                tAttendRecord.setStatus(0L);
//                TAttendRecord tAttendRecord1 = tAttendRecordMapper.selectTAttendRecordById(tAttendRecord.getId());
//                if(tAttendRecord1.toString() !=""|tAttendRecord1 !=null){
//                    int i2 = tAttendRecordMapper.updateTAttendRecord(tAttendRecord);
//                }
           
               int i1 = tAttendRecordMapper.insertTAttendRecord(tAttendRecord);
            }
        }
        if (failureNum > 0) {
            System.out.println("很抱歉,导入失败!共 " + failureNum);
        } else {
            System.out.println("导入成功,0条失败");
        }
        return "操作成功,有" + failureNum + "条数据导入失败";
    }


}
package com.jhsoft.product.wages.service.impl;

import com.jhsoft.product.record.domain.TAttendRecord;
import com.jhsoft.product.record.mapper.TAttendRecordMapper;
import com.jhsoft.product.wages.service.WorkExcelService;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.mapper.SysUserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;

@Service
public class WorkExcelServiceImpl implements WorkExcelService {
//这一块是导入相关的文件
    @Autowired
    private TAttendRecordMapper tAttendRecordMapper;

    @Autowired
    private SysUserMapper userMapper;

    /**
     * 导入数据
     *
     * @param commoditList 数据列表
     * @return 结果
     */
    @Override
    @Transactional
//这一块是把导入的数据全部查出来
    public String importworkExcel(List<Map<String, Object>> commoditList) {
        if (StringUtils.isNull(commoditList) || commoditList.size() == 0) {
            return "导入数据不能为空!";
        }
        System.out.println("导入数据");
        int failureNum = 0;
        for (Map map : commoditList) {
            List<String> check = (List<String>) map.get("check");
            int day = 1;
            for (int i = 0; i < check.size(); i++) {
                TAttendRecord tAttendRecord = new TAttendRecord();
                String stringCellValue = String.valueOf(map.get("stringCellValue"));
                String a = stringCellValue.replace("年", "-");
                stringCellValue = a.replace("月", "-").substring(0, 7);//年月
                String name = String.valueOf(map.get("name"));
                SysUser sysUser = userMapper.selectUserByUserame(name);
                sysUser.setAccountNumber(map.get("accountNumber").toString());
                userMapper.updateUser(sysUser);
                tAttendRecord.setUserName(sysUser.getUserName());
                tAttendRecord.setUserId(sysUser.getUserId());//用户id
                tAttendRecord.setYear(Long.valueOf(stringCellValue.substring(0, 4)));
                tAttendRecord.setMonth(Long.valueOf(stringCellValue.substring(5, stringCellValue.length())));
                Long sign = (Long) map.get("sign");
                tAttendRecord.setSection(sign);//上午或下午
                //拼接打卡年月日
                if (day < 10) {
                    stringCellValue += "-0" + day + " ";
                } else {
                    stringCellValue += "-" + day + " ";
                }
                tAttendRecord.setDay(Long.valueOf(day));//放入日
                day++;//日期加1
                //取考勤数据
                String che = check.get(i);
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                int leak = che.indexOf("漏刷");//判断是否包含条件文字  不包含<0
                int late = che.indexOf("迟到");
                int leaveEarly = che.indexOf("早退");
                int leave = che.indexOf("事假");
                if (leave >= 0) {
                    tAttendRecord.setType(6l);//事假

                } else if (leak >= 0 || "".equals(che)) {
                    tAttendRecord.setType(4l);//漏刷
                } else if (late >= 0) {
                    che = che.substring(0, 5);//取前五位
                    stringCellValue += che + ":00";//拼接成时间
                    try {
                        tAttendRecord.setAttTime(formatter.parse(stringCellValue));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    tAttendRecord.setType(1l);//迟到
                } else if (leaveEarly >= 0) {
                    che = che.substring(0, 5);
                    stringCellValue += che + ":00";
                    try {
                        tAttendRecord.setAttTime(formatter.parse(stringCellValue));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    tAttendRecord.setType(3l);//早退
                } else {
                    if (sign==0) {
                        //上午数据
                        stringCellValue += che + ":00";
                        try {
                            tAttendRecord.setAttTime(formatter.parse(stringCellValue));
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                        tAttendRecord.setType(0l);
                    } else {
                        //下午数据
                        stringCellValue += che + ":00";
                        //这里应该判断时间是否过8点  然后记加班,以后再改
                        try {
                            tAttendRecord.setAttTime(formatter.parse(stringCellValue));
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                        tAttendRecord.setType(2l);
                    }
                }
                tAttendRecord.setStatus(0L);
//                TAttendRecord tAttendRecord1 = tAttendRecordMapper.selectTAttendRecordById(tAttendRecord.getId());
//                if(tAttendRecord1.toString() !=""|tAttendRecord1 !=null){
//                    int i2 = tAttendRecordMapper.updateTAttendRecord(tAttendRecord);
//                }
                //        查询数据返回数量

          
//原本是只有这一句,将上面获取到的数据,调用insert方法,把值全部放进去
//                int i1 = tAttendRecordMapper.insertTAttendRecord(tAttendRecord);

这一块,是调用上面写的,mapper的返回数据,如果没数据,就调用insert方法,有数据就调用update方法。
 int  havenum=tAttendRecordMapper.selectTAttendRecordNum(tAttendRecord);         
 if(havenum==0){ 
        int i1 = tAttendRecordMapper.insertTAttendRecord(tAttendRecord); 
        }{ 
        int i2 = tAttendRecordMapper.updateTAttendRecord(tAttendRecord);
         }
 }
        }
        if (failureNum > 0) {
            System.out.println("很抱歉,导入失败!共 " + failureNum);
        } else {
            System.out.println("导入成功,0条失败");
        }
        return "操作成功,有" + failureNum + "条数据导入失败";
    }


}

写在for循环里,是因为循环内走到的每一个数据分别做处理

 

int havenum=tAttendRecordMapper.selectTAttendRecordNum(tAttendRecord);
if(havenum==0){
    int i1 = tAttendRecordMapper.insertTAttendRecord(tAttendRecord);
}{
    int i2 = tAttendRecordMapper.updateTAttendRecord(tAttendRecord);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue组件库搭建报错问题(vue-loader报错、gulp打包css报错,包含组件库打包文件webpack及gulp)

1、vue-loader报错 报错详情 vue-loader 17.0.0运行webpack打包命令时会报错&#xff1a; 解决方法&#xff1a; 需适配版本&#xff1a;将package.json&#xff0c;vue-loader版本修改为 “vue-loader”: “^15.10.0”&#xff0c;删除本地node_modules文件夹&#xff0c;重…

这让人眼前一亮的MySQL14个小玩意

前言 我最近几年用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中…

整个网页设置为全灰

前段时间&#xff0c;不是全网变灰色了嘛&#xff0c;整个网页的按钮、文本框、图片、文字等等都变成了灰蒙蒙的了&#xff0c;这是怎么做到的呢&#xff1f; 案例如下&#xff1a; 我就随便写个普通的html网页吧&#xff0c;在网页里随便写点文字和随便放几张图片(大概意思下…

TensorFlow安装与配置教程(2022.12)

1. TensorFlow的安装 首先需要安装 Anaconda 环境&#xff0c;可以转至&#xff1a;Anaconda3安装与配置教程&#xff08;2022.11&#xff09;。 然后我们打开 Anaconda&#xff0c;创建一个 TensorFlow 环境&#xff1a; conda create -n TensorFlow python3.9进入 TensorF…

API接口相关设计及基础知识

接口开发 API接口是什么 接口&#xff1a;预先定义的函数逻辑&#xff0c;供其他系统请求&#xff0c;然后返回结果 为什么需要API接口 核心需求&#xff1a;利用现有接口降低开发成本&#xff0c;缩短开发时间 API接口的核心是什么 接口地址请求参数&#xff08;报文&am…

OPEN ALLIANCE TC2和TC9线束以太网测试标准?何种设备可以满足测试?除了矢量网分之外

OPEN ALLIANCE TC2和TC9线束以太网测试标准&#xff1f; 联盟中TC2汽车线束以太网线束定义标准&#xff1a; 100BASE-T1 Ethernet Channel & Components 100BASE-T1 offers a way to introduce modern signal processing in automotive, which allows optimal usage of th…

Prometheus Operator实战—— Prometheus、Alertmanager、Grafana 监控Springboot服务

1. Spring Boot 工程集成 Micrometer 1.1引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency><groupId>io.micrometer&l…

JVM简单介绍

JVMJVM内存区域划分JVM类加载机制JVM垃圾回收机制【哪些内存需要被JVM中垃圾回收机制回收】【JVM中垃圾回收机制的基本单位】【JVM中垃圾回收机制是如何判断对象是否是垃圾】【如何回收垃圾】JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。虚拟机是指通过软…

电巢:半导体ATE国产化产业探究(附国内外厂家汇总)

前言 2022年10月7日&#xff0c;美国BIS发布近年来范围最大半导体管制举措&#xff0c;管控范围包括芯片、设备、零部件、人员等。 12月6日下午&#xff0c;全球最大晶圆代工厂台积电&#xff0c;在美国亚利桑那州凤凰城高调举行了首批机台设备迁机仪式。 据联合早报12月8日报道…

分蛋糕

题目描述 SYCSYC在每个阶段结束(语言阶段、基础算法、提高算法)后,都会切蛋糕 现在MasMas有一个蛋糕,他希望将蛋糕分成nn份 规定一刀合法的蛋糕切法为符合以下两种条件之一 一刀的切痕迹是一条线段,线段两个端点在圆上,且线段经过圆心(切痕为圆的直径) 一刀的切痕迹是一条线…

[附源码]计算机毕业设计Python电商小程序(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

2023年数字信号处理前沿国际会议(CFDSP 2023)

2023年数字信号处理前沿国际会议&#xff08;CFDSP 2023&#xff09; 重要信息 会议网址&#xff1a;www.cfdsp.org 会议时间&#xff1a;2023年2月24-26日 召开地点&#xff1a;新加坡 截稿时间&#xff1a;2022年12月31日 录用通知&#xff1a;投稿后2周内 收录检索&am…

【OpenCV】SURF图像拼接和Stitcher拼接

介绍两种图像拼接的方法&#xff0c;一种是SURF算法的图像拼接&#xff0c;另一种是Stitcher硬拼接 首先先从简单的讲起 一、Stitcher直接拼接 可以实现多张图片一起拼接&#xff0c;只要两行代码就可以实现拼接&#xff1b; 1.首先准备多张图片&#xff0c;放入向量容器中…

PDF如何插入空白页?3 次点击在PDF中插入空白页!

由于工作和学习的需要&#xff0c;您可能需要在现有的PDF文件中插入一张空白页或几页PDF&#xff0c;使之成为一个完整的PDF文件。但是&#xff0c;PDF文件实际上是最终作品&#xff0c;似乎不可能向其添加额外的页面。事实上&#xff0c;将空白页或 PDF 文件插入现有 PDF 文件…

Conv2Former ~2

还是来说Conv2Former~~ 上次发了一次~~ 一种卷积调制模块&#xff0c;利用卷积来建立关系&#xff0c;这比注意力机制在处理高分辨率图像时更高效&#xff0c;称为 Conv2Former。作者在 ImageNet 分类、目标检测和语义分割方面的实验也表明&#xff0c;Conv2Former 比以前基于…

【2022.12.19】备战春招Day14——每日一题 + 234. 回文链表 + 860. 柠檬水找零

【每日一题】1971. 寻找图中是否存在路径 有一个具有 n 个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n -1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi之间的双向边。…

昆仑万维的AI作画简直就是业界天花板

AI作画的业界天花板被我找到了&#xff0c;AIGC模型揭秘 | 昆仑万维。 一、前景 1、AI和AIGC的关系 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的…

SpringMVC入门到实战------ 十一 拦截器的使用

1、拦截器的配置 拦截器用于拦截控制器方法的执行 拦截器需要实现HandlerInterceptor 拦截器必须在SpringMVC的配置文件中进行配置 1.1 和1.2 是对所有的请求进行拦截&#xff1b;1.3 对排出的请求不在拦截 1.1 不使用注解的情况 创建拦截器类 /*** 拦截器* author zyz* ve…

牛客竞赛每日俩题 - Day11

目录 错排问题 有理数运算 错排问题 年会抽奖__牛客网 全部都不获奖的概率必定是由 n个人都拿错的情况种数 除 n个人拿出的所有排列情况数。n个人拿出的所有排列情况数显然是n的阶乘。 假设a的名字没有被a拿到&#xff0c;其他n - 1个人都有可能拿到&#xff0c;即有n - 1种…

JavaScript 中的设计模式

目录 1. 单例模式 2. 策略模式 3. 代理模式 4. 装饰者模式 5. 组合模式 6. 工厂模式 7. 访问者模式 8. 发布订阅模式 9. 观察者模式 10. 参考链接 设计模式&#xff08;Design Pattern&#xff09;是从许多优秀的软件系统中&#xff0c;总结出的成功的、能够实现可维…