Parcourir la source

feature 代码提交

xiahan il y a 1 semaine
Parent
commit
e82872320e

+ 13 - 7
qhse-common/src/main/java/com/rongwei/bscommon/system/dao/QhsePointsDetailsUserDao.java

@@ -2,15 +2,21 @@ package com.rongwei.bscommon.system.dao;
 
 import com.rongwei.bsentity.domain.QhsePointsDetailsUserDo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
-/**
-* @author libai
-* @description 针对表【qhse_points_details_user(安全积分-人员加扣分记录)】的数据库操作Mapper
-* @createDate 2025-09-09 09:53:41
-* @Entity generator.domain.QhsePointsDetailsUser
-*/
-public interface QhsePointsDetailsUserDao extends BaseMapper<QhsePointsDetailsUserDo> {
+import java.util.List;
 
+/**
+ * @author libai
+ * @description 针对表【qhse_points_details_user(安全积分-人员加扣分记录)】的数据库操作Mapper
+ * @createDate 2025-09-09 09:53:41
+ * @Entity generator.domain.QhsePointsDetailsUser
+ */
+@Mapper
+public interface QhsePointsDetailsUserDao extends QHSEMapper<QhsePointsDetailsUserDo> {
+    List<String> checkExistsData(@Param("yearList") List<Integer> year,
+                                 @Param("personIdList") List<String> personId);
 }
 
 

+ 20 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/excelImportListener/UserPointsRegistrationListener.java

@@ -10,13 +10,17 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalTime;
 import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * UserPointsEegistrationListener class
@@ -28,6 +32,7 @@ public class UserPointsRegistrationListener extends AnalysisEventListener<UserPo
     private static final Logger log = LoggerFactory.getLogger(UserPointsRegistrationListener.class);
     private final List<QhsePointsDetailsUserDo> saveList = new ArrayList<>();
     public static LocalDate now = LocalDate.now();
+    public static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
 
     @Override
     public void invoke(UserPointsRegistrationImportDto currentRowDto, AnalysisContext analysisContext) {
@@ -66,6 +71,7 @@ public class UserPointsRegistrationListener extends AnalysisEventListener<UserPo
         saveList.add(new QhsePointsDetailsUserDo().setPoints(currentRowDto.getPoint())
                 .setPersonname(currentRowDto.getName())
                 .setPersoncode(currentRowDto.getJobNo())
+                .setPointsyear(currentRowDto.getDateOfOccurrence().getYear())
                 .setDescription(currentRowDto.getDesc())
                 .setPoints(currentRowDto.getPoint())
                 .setHappentime(Date.from(instant)));
@@ -73,6 +79,20 @@ public class UserPointsRegistrationListener extends AnalysisEventListener<UserPo
 
     @Override
     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        // 校验excel 是否存在重复的数据
+        Map<String, Long> collect = saveList.parallelStream().collect(Collectors.groupingBy(
+                data -> {
+                    return data.getPersoncode() + data.getDescription() + dateFormat.format(data.getHappentime()) + data.getPointsyear();
+                },
+                Collectors.counting()
+        ));
+        String errorKeys = collect.entrySet().stream()
+                .filter(entry -> entry.getValue() > 1)
+                .map(Map.Entry::getKey)
+                .collect(Collectors.joining(";"));
+        if (StringUtils.isNotBlank(errorKeys)) {
+            throw new RuntimeException("当前excel中" + errorKeys + "存在数据重复!请重新维护");
+        }
 
     }
 

+ 2 - 1
qhse-common/src/main/java/com/rongwei/bscommon/system/service/ExcelImportService.java

@@ -1,6 +1,7 @@
 package com.rongwei.bscommon.system.service;
 
 import com.rongwei.rwcommon.base.R;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * ExcelImportService class
@@ -9,5 +10,5 @@ import com.rongwei.rwcommon.base.R;
  * @date 2025/09/10
  */
 public interface ExcelImportService {
-    R userPointsRegistration(String fileId);
+    R userPointsRegistration(MultipartFile file);
 }

+ 132 - 14
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/ExcelImportServiceImpl.java

@@ -1,18 +1,36 @@
 package com.rongwei.bscommon.system.service.impl;
 
 import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.google.common.collect.Lists;
 import com.rongwei.bscommon.system.excelImportListener.UserPointsRegistrationListener;
 import com.rongwei.bscommon.system.service.ExcelImportService;
+import com.rongwei.bscommon.system.utils.QHSEUtils;
+import com.rongwei.bsentity.domain.QhseContractWorkersDo;
 import com.rongwei.bsentity.domain.QhsePointsDetailsUserDo;
+import com.rongwei.bsentity.domain.QhsePointsRecordUserDo;
 import com.rongwei.bsentity.dto.UserPointsRegistrationImportDto;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.base.BaseDo;
 import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
 import com.rongwei.rwcommonentity.commonservers.domain.SysFileItemDo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.text.SimpleDateFormat;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 import static com.rongwei.rwcommon.utils.UtilsChecks.parameterCheck;
 
@@ -27,29 +45,129 @@ public class ExcelImportServiceImpl implements ExcelImportService {
     @Autowired
     private QHSEFileItemServiceImpl qhseFileItemServiceImpl;
 
+    @Autowired
+    private QhseContractWorkersServiceImpl qhseContractWorkersService;
+    @Autowired
+    private QhsePointsDetailsUserServiceImpl qhsePointsDetailsUserService;
+    @Autowired
+    private QhsePointsRecordUserServiceImpl qhsePointsRecordUserService;
+    @Autowired
+    private PointServiceImpl pointServiceImpl;
+
     @Override
-    public R userPointsRegistration(String fileId) {
-        File file = fileCheck(fileId);
+    public R userPointsRegistration(MultipartFile file) {
+        Path tempPath;
+        try {
+            tempPath = Files.createTempFile(file.getOriginalFilename(), null);
+            file.transferTo(tempPath);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        File tempFile = tempPath.toFile();
         UserPointsRegistrationListener userPointsRegistrationListener = new UserPointsRegistrationListener();
-        EasyExcel.read(file, UserPointsRegistrationImportDto.class, userPointsRegistrationListener).sheet().doRead();
+        EasyExcel.read(tempFile, UserPointsRegistrationImportDto.class, userPointsRegistrationListener).sheet(0).doRead();
         // 解析后的数据
-        List<QhsePointsDetailsUserDo> parsedData = userPointsRegistrationListener.getData();
-        return null;
+        List<QhsePointsDetailsUserDo> analysisDataList = userPointsRegistrationListener.getData();
+        List<String> personCodes = analysisDataList.stream().map(QhsePointsDetailsUserDo::getPersoncode).collect(Collectors.toList());
+
+
+        List<QhseContractWorkersDo> qhseContractWorkersDos = qhseContractWorkersService
+                .list(new LambdaQueryWrapper<QhseContractWorkersDo>()
+                        .select(QhseContractWorkersDo::getId, QhseContractWorkersDo::getWorknumber,
+                                QhseContractWorkersDo::getWorkertype, QhseContractWorkersDo::getWorkername)
+                        .eq(BaseDo::getDeleted, 0)
+                        .in(QhseContractWorkersDo::getWorknumber, personCodes));
+        // 人员工号校验
+        checkPersonCode(qhseContractWorkersDos, personCodes);
+
+        LambdaQueryWrapper<QhsePointsRecordUserDo> searchWrapper = new LambdaQueryWrapper<>();
+        // 校验对应年份是否有该员工的积分信息
+        Map<Integer, List<String>> yearAndPersonCode = analysisDataList.stream().collect(Collectors.groupingBy(QhsePointsDetailsUserDo::getPointsyear, Collectors.mapping(QhsePointsDetailsUserDo::getPersoncode, Collectors.toList())));
+        searchWrapper.eq(BaseDo::getDeleted, "0");
+        yearAndPersonCode.forEach((k, v) -> {
+            searchWrapper.or(wrapper -> wrapper.eq(QhsePointsRecordUserDo::getPointyear, k).in(QhsePointsRecordUserDo::getHolderaccount, v));
+        });
+        List<QhsePointsRecordUserDo> mainTableData = qhsePointsRecordUserService.list(searchWrapper);
+        List<String> collect = mainTableData.parallelStream().map(data -> data.getPointyear() + data.getHolderaccount()).collect(Collectors.toList());
+        String errorMsg = analysisDataList.parallelStream().filter(data -> !collect.contains(data.getPointsyear() + data.getPointscode()))
+                .map(data -> data.getPointsyear() + data.getPointscode()).collect(Collectors.joining(";"));
+        if (StringUtils.isNotBlank(errorMsg)) {
+            throw new RuntimeException("以下用户在对应年份没有想对应的积分记录信息" + errorMsg);
+        }
+        //校验数据是否在数据库中存在
+        checkDataRepeat(analysisDataList, qhseContractWorkersDos);
+
+        dataProcessingBeforeSaving(analysisDataList, qhseContractWorkersDos, mainTableData);
+        // 删除临时文件
+        tempFile.delete();
+        return R.ok();
     }
 
+    public void dataProcessingBeforeSaving(List<QhsePointsDetailsUserDo> analysisDataList, List<QhseContractWorkersDo> qhseContractWorkersDos, List<QhsePointsRecordUserDo> mainTableData) {
+        QhseContractWorkersDo qhseContractWorkersDo;
+        SysUserVo currentUser = QHSEUtils.getCurrentUser();
+        QhsePointsRecordUserDo qhsePointsRecordUserDo;
+        // 增加基础数据
+        for (QhsePointsDetailsUserDo analysisData : analysisDataList) {
+            qhseContractWorkersDo = qhseContractWorkersDos.stream().filter(data -> data.getWorknumber().equals(analysisData.getPersoncode())).findFirst().orElse(null);
+            qhsePointsRecordUserDo = mainTableData.stream().filter(data -> data.getPointyear().equals(analysisData.getPointsyear()) && data.getHolderaccount().equals(analysisData.getPersoncode()))
+                    .findFirst().orElse(null);
+            analysisData.setId(SecurityUtil.getUUID());
+            QHSEUtils.initModelGeneralParameters(analysisData, currentUser);
+            if (qhsePointsRecordUserDo != null) {
+                analysisData.setMainid(qhsePointsRecordUserDo.getId());
+            }
+            if (qhseContractWorkersDo != null) {
+                analysisData.setPersonname(qhseContractWorkersDo.getWorkername());
+                analysisData.setPersonid(qhseContractWorkersDo.getId());
+                analysisData.setPersontype(qhseContractWorkersDo.getWorkertype());
+                analysisData.setDepartmentid(qhseContractWorkersDo.getDepartmentid());
+                analysisData.setDepartmentname(qhseContractWorkersDo.getDepartmentname());
+                analysisData.setSubcontractorid(qhseContractWorkersDo.getContractorid());
+                analysisData.setSubcontractorname(qhseContractWorkersDo.getContractor());
+            }
+        }
+        // 数据存表
+        for (List<QhsePointsDetailsUserDo> qhsePointsDetailsUserDos : Lists.partition(analysisDataList, 1000)) {
+            qhsePointsDetailsUserService.getBaseMapper().insertBatchSomeColumn(qhsePointsDetailsUserDos);
+        }
 
+        // 更新用户积分信息
+        pointServiceImpl.userPointEegister(analysisDataList.stream().map(QhsePointsDetailsUserDo::getId).collect(Collectors.toList()));
+    }
 
-    public File fileCheck(String fileId) {
-        parameterCheck(() -> StringUtils.isBlank(fileId), "请上传文件", "文件ID为空");
-        SysFileItemDo sysFileItemDo = qhseFileItemServiceImpl.getById(fileId);
-        parameterCheck(() -> sysFileItemDo == null, "文件解析有误!请联系管理员", "无法根据文件ID:{},获取到文件信息", fileId);
+    /**
+     * 校验检验数据是否重复
+     */
+    public void checkDataRepeat(List<QhsePointsDetailsUserDo> analysisDataList, List<QhseContractWorkersDo> qhseContractWorkersDos) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        List<Integer> years = analysisDataList.stream().map(QhsePointsDetailsUserDo::getPointsyear).collect(Collectors.toList());
+        List<String> personId = qhseContractWorkersDos.stream().map(QhseContractWorkersDo::getId).collect(Collectors.toList());
+        // 数据库中的数据
+        List<String> dataBaseDatas = qhsePointsDetailsUserService.getBaseMapper().checkExistsData(years, personId);
+        // excel 中的数据
+        List<String> checkExistsData = analysisDataList.stream().map(data -> data.getPersoncode() + data.getDescription() + sdf.format(data.getHappentime()))
+                .collect(Collectors.toList());
+        String errorMsg = dataBaseDatas.parallelStream().filter(checkExistsData::contains).collect(Collectors.joining(";"));
+        if (StringUtils.isNotBlank(errorMsg)) {
+            throw new RuntimeException("excel中以下数据" + errorMsg + "已存在");
+        }
+    }
 
-        String realPath = sysFileItemDo.getFullpath();
-        parameterCheck(() -> StringUtils.isBlank(realPath), "文件解析有误!请联系管理员", "根据文件ID:{},无法获取到文件路径", fileId);
-        File file = new File(realPath);
-        parameterCheck(() -> !file.exists(), "文件解析有误!请联系管理员", "根据文件地址:{},无法获取文件", realPath);
-        return file;
 
+    /**
+     * 员工工号校验
+     *
+     * @param qhseContractWorkersDos
+     * @param personCodes
+     */
+    public void checkPersonCode(List<QhseContractWorkersDo> qhseContractWorkersDos, List<String> personCodes) {
+        List<String> dataBaseWorkNum = qhseContractWorkersDos.stream().map(QhseContractWorkersDo::getWorknumber).collect(Collectors.toList());
+        String noExistsPersonCode = personCodes.parallelStream().filter(personCode -> !dataBaseWorkNum.contains(personCode)).collect(Collectors.joining(";"));
+        if (StringUtils.isNotBlank(noExistsPersonCode)) {
+            throw new RuntimeException("excel中以下员工工号不存在" + noExistsPersonCode);
+        }
     }
 
+
 }

+ 23 - 0
qhse-common/src/main/resources/mybatis/system/QhsePointsDetailsUserDao.xml

@@ -0,0 +1,23 @@
+<?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.rongwei.bscommon.system.dao.QhsePointsDetailsUserDao">
+    <select id="checkExistsData" resultType="java.lang.String">
+        select  CONCAT_WS('-', PERSONCODE, DESCRIPTION,  DATE_FORMAT(HAPPENTIME, '%Y-%m-%d'))   from qhse_points_details_user
+        <where>
+            DELETED='0'
+            and PERSONID in
+            <foreach collection="personIdList" separator="," item="personId" open="(" close=")">
+                #{personId}
+            </foreach>
+            and POINTSYEAR in
+            <foreach collection="yearList" separator="," item="year" open="(" close=")">
+                #{year,jdbcType=INTEGER}
+            </foreach>
+<!--            and  CONCAT_WS('-', a.PERSONID , a.POINTSYEAR , a.DESCRIPTION,  DATE_FORMAT(a.HAPPENTIME, '%Y-%m-%d')) IN-->
+<!--            <foreach collection="checkDataList" separator="," item="checkData" open="(" close=")">-->
+<!--                #{checkData}-->
+<!--            </foreach>-->
+        </where>
+    </select>
+
+</mapper>

+ 4 - 6
qhse-server/src/main/java/com/rongwei/controller/ExcelImportController.java

@@ -5,10 +5,8 @@ import com.rongwei.rwcommon.base.R;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * ExcelImportController class
@@ -31,8 +29,8 @@ public class ExcelImportController {
      * @return 结果
      */
     @PostMapping("/user/point")
-    public R userPointsRegistration(@RequestBody String fileId) {
+    public R userPointsRegistration(@RequestParam("file") MultipartFile file) {
         log.info("开始用户积分兑换");
-        return excelImportService.userPointsRegistration(fileId);
+        return excelImportService.userPointsRegistration(file);
     }
 }