Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

lg 6 dni temu
rodzic
commit
44aae84082
42 zmienionych plików z 1899 dodań i 329 usunięć
  1. 1 1
      qhse-common/src/main/java/com/rongwei/bscommon/system/config/MybatisConfig.java
  2. 1 150
      qhse-common/src/main/java/com/rongwei/bscommon/system/config/QuerySqlAdaptationInterceptor.java
  3. 24 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/dao/QhsePointsDetailsUserDao.java
  4. 16 8
      qhse-common/src/main/java/com/rongwei/bscommon/system/dao/QhsePointsRecordUserDao.java
  5. 9 3
      qhse-common/src/main/java/com/rongwei/bscommon/system/dao/QhsePointsUnitRecordDao.java
  6. 101 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/excelImportListener/UnitPointsRegistrationListener.java
  7. 104 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/excelImportListener/UserPointsRegistrationListener.java
  8. 14 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/ExcelImportService.java
  9. 4 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/PointService.java
  10. 13 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/QhseContractWorkersService.java
  11. 13 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/QhsePointsDetailsUserService.java
  12. 2 1
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/QhsePointsUnitDetailsService.java
  13. 6 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/QhsePointsUnitRecordService.java
  14. 194 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/ExcelImportServiceImpl.java
  15. 143 6
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/PointServiceImpl.java
  16. 22 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhseContractWorkersServiceImpl.java
  17. 22 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhsePointsDetailsUserServiceImpl.java
  18. 185 1
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhsePointsUnitDetailsServiceImpl.java
  19. 64 25
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhsePointsUnitRecordServiceImpl.java
  20. 2 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/RohhServiceImpl.java
  21. 6 6
      qhse-common/src/main/java/com/rongwei/bscommon/system/utils/QHSEConstant.java
  22. 27 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/utils/QHSEUtils.java
  23. 2 1
      qhse-common/src/main/resources/mybatis/system/QhseContractWorkersDao.xml
  24. 23 0
      qhse-common/src/main/resources/mybatis/system/QhsePointsDetailsUserDao.xml
  25. 92 0
      qhse-common/src/main/resources/mybatis/system/QhsePointsRecordUserDao.xml
  26. 101 11
      qhse-common/src/main/resources/mybatis/system/QhsePointsUnitRecordDao.xml
  27. 5 0
      qhse-entity/pom.xml
  28. 20 0
      qhse-entity/src/main/java/com/rongwei/bsentity/Dto/UnitPointsImportValidationResult.java
  29. 45 0
      qhse-entity/src/main/java/com/rongwei/bsentity/Dto/UnitPointsRegistrationImportDto.java
  30. 19 0
      qhse-entity/src/main/java/com/rongwei/bsentity/Dto/UserPointRegister.java
  31. 65 0
      qhse-entity/src/main/java/com/rongwei/bsentity/Dto/UserPointsRegistrationImportDto.java
  32. 134 0
      qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhsePointsDetailsUserDo.java
  33. 1 1
      qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhsePointsRecordUserDo.java
  34. 51 41
      qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhsePointsUnitDetailsDo.java
  35. 55 34
      qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhsePointsUnitRecordDo.java
  36. 44 28
      qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhseSubcontractorOutsourcingDo.java
  37. 36 0
      qhse-entity/src/main/java/com/rongwei/bsentity/vo/QhsePointsUnitDetailsVo.java
  38. 30 0
      qhse-entity/src/main/java/com/rongwei/bsentity/vo/QhsePointsUnitRecordVo.java
  39. 51 0
      qhse-server/src/main/java/com/rongwei/controller/ExcelImportController.java
  40. 33 3
      qhse-server/src/main/java/com/rongwei/controller/PointController.java
  41. 1 1
      qhse-server/src/main/java/com/rongwei/controller/RohhController.java
  42. 118 8
      qhse-server/src/main/resources/logback-spring.xml

+ 1 - 1
qhse-common/src/main/java/com/rongwei/bscommon/system/config/MybatisConfig.java

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.parser.ISqlParserFilter;
 import com.baomidou.mybatisplus.core.parser.SqlParserHelper;
 import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
 import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
-import com.rongwei.rwcommonconfig.config.interceptor.QuerySqlAdaptationInterceptor;
 import com.rongwei.rwcommonconfig.config.interceptor.SaasPaginationInterceptor;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.LongValue;
@@ -29,6 +28,7 @@ import java.util.List;
 public class MybatisConfig {
 
 
+
     @Value("${page.size:#{null}}")
     private Long pageSize;
     /**

+ 1 - 150
qhse-common/src/main/java/com/rongwei/bscommon/system/config/QuerySqlAdaptationInterceptor.java

@@ -1,22 +1,11 @@
 package com.rongwei.bscommon.system.config;
 
 import com.alibaba.druid.pool.DruidDataSource;
-import com.rongwei.commonservice.service.RedisService;
-import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.utils.SqlAdaptationUtil;
-import com.rongwei.rwcommon.utils.StringUtils;
-import org.apache.ibatis.binding.MapperMethod;
 import org.apache.ibatis.executor.statement.StatementHandler;
 import org.apache.ibatis.mapping.BoundSql;
 import org.apache.ibatis.plugin.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import javax.servlet.http.HttpServletRequest;
 import java.lang.reflect.Field;
 import java.sql.Connection;
 import java.util.Properties;
@@ -27,89 +16,26 @@ import java.util.Properties;
 @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
 public class QuerySqlAdaptationInterceptor implements Interceptor {
 
-    private static final Logger logger = LoggerFactory.getLogger(QuerySqlAdaptationInterceptor.class);
-
-    @Value("${saas.tenantmode:NONE}")
-    private String saasmode;
-
-    @Autowired
-    private RedisService redisService;
-
     @Autowired
     private DruidDataSource datasource;
 
     @Override
     public Object intercept(Invocation invocation) throws Throwable {
-//        DruidDataSource datasource = (DruidDataSource)DynamicDataSource.dataSourcesMap.get(DynamicDataSource.getDataSource());
         // 获取数据库类型
         String dbType = datasource.getDbType();
         // 方法一
         StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
-        //映射工具
-//        MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
-//        MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());
-        //先拦截到RoutingStatementHandler,里面有个StatementHandler类型的delegate变量,其实现类是BaseStatementHandler,然后就到BaseStatementHandler的成员变量mappedStatement
-//        MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
-        //id为执行的mapper方法的全路径名,如com.uv.dao.UserMapper.insertUser
         BoundSql boundSql = statementHandler.getBoundSql();
-
         //获取到原始sql语句
         String sql = boundSql.getSql();
         // dao参数
         Object parObj = statementHandler.getParameterHandler().getParameterObject();
         SqlAdaptationUtil sqlAdaptation = new SqlAdaptationUtil();
-        String mSql = sqlAdaptation.modifySql(sqlAdaptation.commonRuleAnalysis(sql),dbType,parObj);
+        String mSql = sqlAdaptation.modifySql(sqlAdaptation.commonRuleAnalysis(sql), dbType, parObj);
         //通过反射修改sql语句
         Field field = boundSql.getClass().getDeclaredField("sql");
         field.setAccessible(true);
-
-        // SaaS环境下schema切换
-        if("DATASOURCE".equals(saasmode)){
-            System.out.println("saas切换");
-            logger.info("saas切换");
-            String schema = null;
-            try{
-                schema = this.getSchema();
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            // 判断是否有参数(appointSchema)指定schema
-            if(parObj instanceof MapperMethod.ParamMap){
-                MapperMethod.ParamMap paramMap = (MapperMethod.ParamMap)parObj;
-                if(paramMap.containsKey("appointSchema") && paramMap.get("appointSchema") != null){
-                    String appointSchema = paramMap.get("appointSchema").toString();
-                    schema = appointSchema;
-                }
-            }
-            System.out.println("schema:"+schema);
-            logger.info("schema:"+schema);
-            if(StringUtils.isNotBlank(schema)){
-                // 多租户schema切换方案一:通过 USE databaseName; 实现切换
-                mSql = "USE " + schema + ";" + mSql;
-                System.out.println("mSql:"+mSql);
-                logger.info("mSql:"+mSql);
-                // 多租户schema切换方案二:直接获取Connection设置schema
-                /*Object[] objs = invocation.getArgs();
-                Connection conn = (Connection)objs[0];
-                conn.setSchema(schema);*/
-            }else{
-//                throw new Exception("SaaS模式下查不到相应schema");
-                System.out.println("SaaS模式下查不到相应schema");
-                logger.warn("SaaS模式下查不到相应schema");
-            }
-            /*Connection o = (Connection)invocation.getArgs()[0];
-            System.out.println("o.getSchema():"+o.getSchema());
-            o.setSchema(schema);
-            System.out.println("o.getSchema():"+o.getSchema());*/
-        }
-
         field.set(boundSql, mSql);
-        //sql语句类型 select、delete、insert、update
-        /*if(SqlCommandType.SELECT == mappedStatement.getSqlCommandType()){
-            System.out.println("sql:"+sql);
-        }*/
-
-        // 返回
         return invocation.proceed();
     }
 
@@ -122,79 +48,4 @@ public class QuerySqlAdaptationInterceptor implements Interceptor {
     public void setProperties(Properties properties) {
 
     }
-
-    /**
-     * SaaS模式下获取当前租户的数据库名
-     * @return
-     * @throws Exception
-     */
-    private String getSchema() throws Exception{
-        Long startTime = System.currentTimeMillis();
-        String schema = null;
-        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-        if(attributes == null){
-            logger.error("ServletRequestAttributes为null");
-            throw new Exception("ServletRequestAttributes为null");
-        }
-        HttpServletRequest request = attributes.getRequest();
-        if(request == null){
-            logger.error("HttpServletRequest为null");
-            throw new Exception("HttpServletRequest为null");
-        }
-
-        schema = request.getHeader("schema");
-        if(StringUtils.isNotBlank(schema)) {
-            return schema;
-        }
-
-        String token = request.getHeader("token");
-        System.out.println("token:"+token);
-        logger.info("token:"+token);
-//        if(StringUtils.isBlank(token)){
-//            String incontrolToken = request.getHeader("incontrol-token");
-//            Object tokenDskey = request.getAttribute(Constants.SAAS_LOGIN_TOKEN);
-//            // 登录功能特殊处理获取DsKey
-//            if(tokenDskey != null){
-//                logger.info("tokenDskey:"+tokenDskey);
-//                schema = (String) tokenDskey;
-//            }
-//            // 某些特殊功能incontrolToken也可以作为token
-//            else if(StringUtils.isNotBlank(incontrolToken)){
-//                logger.info("incontrolToken:"+incontrolToken);
-//                schema = getSchemaByToken(incontrolToken);
-//            }
-//            // 某些特殊功能token放入线程全局变量中
-//            else if(StringUtils.isNotBlank(ThreadLocalResource.token.get())){
-//                logger.info("ThreadToken:"+ThreadLocalResource.token.get());
-//                token = ThreadLocalResource.token.get();
-//                schema = getSchemaByToken(token);
-//            }
-//        } else{
-//            schema = getSchemaByToken(token);
-//            System.out.println("Dskey:"+schema);
-//        }
-        schema = getSchemaByToken(token);
-        System.out.println("Dskey:"+schema);
-        Long endTime = System.currentTimeMillis();
-        System.out.println("查找schema时间为:"+(endTime-startTime));
-        return schema;
-    }
-
-    /**
-     * 根据token获取多租户模式的schema
-     * @param token
-     * @return
-     */
-    private String getSchemaByToken(String token){
-        SysUserVo currUser = null;
-        if(StringUtils.isNotEmpty(token)){
-            currUser = redisService.getLoginUser(token);
-        }
-        String schema = null;
-        if(currUser != null){
-            schema = currUser.getTenantDo().getDskey();
-        }
-        return schema;
-    }
-
 }

+ 24 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/dao/QhsePointsDetailsUserDao.java

@@ -0,0 +1,24 @@
+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;
+
+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);
+}
+
+
+
+

+ 16 - 8
qhse-common/src/main/java/com/rongwei/bscommon/system/dao/QhsePointsRecordUserDao.java

@@ -1,20 +1,28 @@
 package com.rongwei.bscommon.system.dao;
 
 import com.rongwei.bsentity.domain.QhsePointsRecordUserDo;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.rongwei.bsentity.dto.UserPointRegister;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
-* @author libai
-* @description 针对表【qhse_points_record_user(安全积分-人员积分清单)】的数据库操作Mapper
-* @createDate 2025-09-04 13:34:10
-* @Entity generator.domain.QhsePointsRecordUser
-*/
+ * @author libai
+ * @description 针对表【qhse_points_record_user(安全积分-人员积分清单)】的数据库操作Mapper
+ * @createDate 2025-09-04 13:34:10
+ * @Entity generator.domain.QhsePointsRecordUser
+ */
+@Mapper
 public interface QhsePointsRecordUserDao extends QHSEMapper<QhsePointsRecordUserDo> {
 
-    void  updateCurrentpointAndStatus(@Param("id") String id, @Param("changePoint") int changePoint,
-                                      @Param("modifyuserid") String modifyuserid, @Param("modifyusername")String modifyusername);
+    void updateCurrentpointAndStatus(@Param("id") String id, @Param("changePoint") int changePoint,
+                                     @Param("modifyuserid") String modifyuserid, @Param("modifyusername") String modifyusername);
+
+    void saveUserPoint(@Param("saveList") List<UserPointRegister> saveList,@Param("user") SysUserVo currentUser);
 
+    void updateDataAfterDeletion(@Param("updateList") List<QhsePointsRecordUserDo> saveList );
 }
 
 

+ 9 - 3
qhse-common/src/main/java/com/rongwei/bscommon/system/dao/QhsePointsUnitRecordDao.java

@@ -1,11 +1,13 @@
 package com.rongwei.bscommon.system.dao;
 
 import com.rongwei.bsentity.domain.QhsePointsUnitRecordDo;
-import com.rongwei.rwcommon.base.R;
+import com.rongwei.bsentity.vo.QhsePointsUnitDetailsVo;
+import com.rongwei.bsentity.vo.QhsePointsUnitRecordVo;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import org.apache.ibatis.annotations.Param;
-import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
+import java.util.Set;
 
 
 public interface QhsePointsUnitRecordDao extends QHSEMapper<QhsePointsUnitRecordDo> {
@@ -13,7 +15,11 @@ public interface QhsePointsUnitRecordDao extends QHSEMapper<QhsePointsUnitRecord
 
     List<QhsePointsUnitRecordDo> getUnitPointInitializationDtata(@Param("year")int year);
 
-    int updateScoreInfo(@Param("list") List<QhsePointsUnitRecordDo> list);
+    int updateScoreInfo(@Param("list") List<QhsePointsUnitRecordDo> list, @Param("currentUser")  SysUserVo currentUser);
 
     int addUnitFiles(@Param("list") List<String> ids,@Param("attachment") String attachment);
+
+    List<QhsePointsUnitRecordVo> getRecordByYear(@Param("years") List<String> years);
+
+  List<QhsePointsUnitDetailsVo> getDetailsByYear(@Param("years")  List<String> years);
 }

+ 101 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/excelImportListener/UnitPointsRegistrationListener.java

@@ -0,0 +1,101 @@
+package com.rongwei.bscommon.system.excelImportListener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.rongwei.bsentity.domain.QhsePointsUnitDetailsDo;
+import com.rongwei.bsentity.dto.UnitPointsRegistrationImportDto;
+import com.rongwei.bsentity.vo.QhsePointsUnitDetailsVo;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import static com.rongwei.bscommon.system.utils.QHSEConstant.DatePattern.DATE_PATTERN_YMD;
+
+/**
+ * UserPointsEegistrationListener class
+ *
+ * @author XH
+ * @date 2025/09/10
+ */
+public class UnitPointsRegistrationListener extends AnalysisEventListener<UnitPointsRegistrationImportDto> {
+    private static final Logger log = LoggerFactory.getLogger(UnitPointsRegistrationListener.class);
+    private final List<QhsePointsUnitDetailsVo> saveList = new ArrayList<>();
+    public static LocalDate now = LocalDate.now();
+    private static final SimpleDateFormat format = new SimpleDateFormat(DATE_PATTERN_YMD);
+
+
+
+    @Override
+    public void invoke(UnitPointsRegistrationImportDto currentRowDto, AnalysisContext analysisContext) {
+
+        // 必填项校验
+        if (StringUtils.isBlank(currentRowDto.getUnitname()) ||
+                StringUtils.isBlank(currentRowDto.getDepartmentname()) ||
+                StringUtils.isBlank(currentRowDto.getDescription()) ||
+                currentRowDto.getPoints() == null ||
+                currentRowDto.getHappentime() == null
+        ) {
+            log.error("第{}行的数据,存在必填项未填的数据", analysisContext.readRowHolder().getRowIndex());
+            throw new RuntimeException("存在必填字段为空的数据");
+        }
+        // 发送时间比当前时间晚 抛出异常
+        if (currentRowDto.getHappentime().isAfter(now)) {
+            throw new RuntimeException("存在发生日期大于当前日期的数据");
+        }
+
+        /**
+         * 发生时间校验
+         *  当前时间为1月份 可以导入 前一年的数据
+         *  为其他月份只可以导入当前年份的数据
+         */
+        if (now.getMonth().getValue() == 1) {
+            if (!(currentRowDto.getHappentime().getYear() + 1 == now.getYear() || currentRowDto.getHappentime().getYear() == now.getYear())) {
+                throw new RuntimeException("发生日期不能早于" + (now.getYear() - 1));
+            }
+        } else {
+            if (currentRowDto.getHappentime().getYear() != now.getYear()) {
+                throw new RuntimeException("存在发生日期所在的年份和当前年份不一致的数据");
+            }
+        }
+
+
+        Instant instant = currentRowDto.getHappentime().atTime(LocalTime.MIDNIGHT).atZone(ZoneId.systemDefault()).toInstant();
+        QhsePointsUnitDetailsVo qhsePointsUnitDetailsVo = new QhsePointsUnitDetailsVo();
+
+        qhsePointsUnitDetailsVo.setPoints(currentRowDto.getPoints())
+                .setDescription(currentRowDto.getDescription())
+                .setHappentime(Date.from(instant));
+        qhsePointsUnitDetailsVo.setUnitname(currentRowDto.getUnitname());
+        qhsePointsUnitDetailsVo.setDepartmentname(currentRowDto.getDepartmentname());
+
+        //年份
+        String format1 = format.format(qhsePointsUnitDetailsVo.getHappentime());
+        qhsePointsUnitDetailsVo.setHappentimestr(format1);
+        qhsePointsUnitDetailsVo.setPointsyear(format1.split("-")[0]);
+        saveList.add(qhsePointsUnitDetailsVo);
+
+
+              ;
+
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+    }
+
+    // 获取Excel 中的数据
+    public List<QhsePointsUnitDetailsVo> getData() {
+        return saveList;
+    }
+
+}

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

@@ -0,0 +1,104 @@
+package com.rongwei.bscommon.system.excelImportListener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.rongwei.bsentity.domain.QhsePointsDetailsUserDo;
+import com.rongwei.bsentity.dto.UserPointsRegistrationImportDto;
+import com.rongwei.rwcommon.base.exception.CustomException;
+import org.apache.commons.lang.StringUtils;
+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
+ *
+ * @author XH
+ * @date 2025/09/10
+ */
+public class UserPointsRegistrationListener extends AnalysisEventListener<UserPointsRegistrationImportDto> {
+    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) {
+
+        // 必填项校验
+        if (StringUtils.isBlank(currentRowDto.getName()) ||
+                StringUtils.isBlank(currentRowDto.getJobNo()) ||
+                StringUtils.isBlank(currentRowDto.getDesc()) ||
+                currentRowDto.getDateOfOccurrence() == null ||
+                currentRowDto.getPoint() == null
+        ) {
+            log.error("第{}行的数据,存在必填项未填的数据", analysisContext.readRowHolder().getRowIndex());
+            throw new RuntimeException("存在必填字段为空的数据");
+        }
+        // 发送时间比当前时间晚 抛出异常
+        if (currentRowDto.getDateOfOccurrence().isAfter(now)) {
+            throw new RuntimeException("存在发生日期大于当前日期的数据");
+        }
+
+        /**
+         * 发生时间校验
+         *  当前时间为1月份 可以导入 前一年的数据
+         *  为其他月份只可以导入当前年份的数据
+         */
+        if (now.getMonth().getValue() == 1) {
+            if (!(currentRowDto.getDateOfOccurrence().getYear() + 1 == now.getYear() || currentRowDto.getDateOfOccurrence().getYear() == now.getYear())) {
+                throw new RuntimeException("发生日期不能早于" + (now.getYear() - 1));
+            }
+        } else {
+            if (currentRowDto.getDateOfOccurrence().getYear() != now.getYear()) {
+                throw new RuntimeException("存在发生日期所在的年份和当前年份不一致的数据");
+            }
+        }
+        Instant instant = currentRowDto.getDateOfOccurrence().atTime(LocalTime.MIDNIGHT).atZone(ZoneId.systemDefault()).toInstant();
+
+        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)));
+    }
+
+    @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 + "存在数据重复!请重新维护");
+        }
+
+    }
+
+    // 获取Excel 中的数据
+    public List<QhsePointsDetailsUserDo> getData() {
+        return saveList;
+    }
+
+}

+ 14 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/service/ExcelImportService.java

@@ -0,0 +1,14 @@
+package com.rongwei.bscommon.system.service;
+
+import com.rongwei.rwcommon.base.R;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * ExcelImportService class
+ *
+ * @author XH
+ * @date 2025/09/10
+ */
+public interface ExcelImportService {
+    R userPointsRegistration(MultipartFile file);
+}

+ 4 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/service/PointService.java

@@ -14,4 +14,8 @@ public interface PointService {
     R userPointExchange(String id);
 
     R userPointInitialization();
+
+    R userPointEegister(List<String> ids);
+
+    R userPointRemove(List<String> id);
 }

+ 13 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/service/QhseContractWorkersService.java

@@ -0,0 +1,13 @@
+package com.rongwei.bscommon.system.service;
+
+import com.rongwei.bsentity.domain.QhseContractWorkersDo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author libai
+* @description 针对表【qhse_contract_workers(劳务人员表)】的数据库操作Service
+* @createDate 2025-09-05 10:47:29
+*/
+public interface QhseContractWorkersService extends IService<QhseContractWorkersDo> {
+
+}

+ 13 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/service/QhsePointsDetailsUserService.java

@@ -0,0 +1,13 @@
+package com.rongwei.bscommon.system.service;
+
+import com.rongwei.bsentity.domain.QhsePointsDetailsUserDo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author libai
+* @description 针对表【qhse_points_details_user(安全积分-人员加扣分记录)】的数据库操作Service
+* @createDate 2025-09-09 09:53:41
+*/
+public interface QhsePointsDetailsUserService extends IService<QhsePointsDetailsUserDo> {
+
+}

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

@@ -2,7 +2,7 @@ package com.rongwei.bscommon.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.rongwei.bsentity.domain.QhsePointsUnitDetailsDo;
-import com.rongwei.bsentity.domain.QhsePointsUnitRecordDo;
+import com.rongwei.bsentity.vo.QhsePointsUnitDetailsVo;
 import com.rongwei.rwcommon.base.R;
 
 import java.util.List;
@@ -17,5 +17,6 @@ import java.util.List;
 public interface QhsePointsUnitDetailsService extends IService<QhsePointsUnitDetailsDo> {
 
 
+    R ProcessImportedData(List<QhsePointsUnitDetailsVo> parsedData);
 }
 

+ 6 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/service/QhsePointsUnitRecordService.java

@@ -3,6 +3,7 @@ package com.rongwei.bscommon.system.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.rongwei.bsentity.domain.QhsePointsUnitRecordDo;
 import com.rongwei.bsentity.dto.QhsePointsUnitFileDto;
+import com.rongwei.bsentity.vo.QhsePointsUnitDetailsVo;
 import com.rongwei.rwcommon.base.R;
 
 import java.util.List;
@@ -22,5 +23,10 @@ public interface QhsePointsUnitRecordService extends IService<QhsePointsUnitReco
     R calUnitScore(List<String> ids);
 
     R addUnitFiles(QhsePointsUnitFileDto qhsePointsUnitFileDto);
+
+    R delUnitScore(List<String> ids);
+
+
+
 }
 

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

@@ -0,0 +1,194 @@
+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.UnitPointsRegistrationListener;
+import com.rongwei.bscommon.system.excelImportListener.UserPointsRegistrationListener;
+import com.rongwei.bscommon.system.service.ExcelImportService;
+import com.rongwei.bscommon.system.service.QhsePointsUnitDetailsService;
+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.UnitPointsRegistrationImportDto;
+import com.rongwei.bsentity.dto.UserPointsRegistrationImportDto;
+import com.rongwei.bsentity.vo.QhsePointsUnitDetailsVo;
+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;
+
+/**
+ * ExcelImportServiceImpl class
+ *
+ * @author XH
+ * @date 2025/09/10
+ */
+@Service
+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;
+    @Autowired
+    private QhsePointsUnitDetailsService qhsePointsUnitDetailsService;
+
+    @Override
+    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(tempFile, UserPointsRegistrationImportDto.class, userPointsRegistrationListener).sheet(0).doRead();
+        // 解析后的数据
+        List<QhsePointsDetailsUserDo> analysisDataList = userPointsRegistrationListener.getData();
+        List<String> personCodes = analysisDataList.stream().map(QhsePointsDetailsUserDo::getPersoncode).collect(Collectors.toList());
+
+
+        List<QhseContractWorkersDo> qhseContractWorkersDos = qhseContractWorkersService
+                .list(new LambdaQueryWrapper<QhseContractWorkersDo>()
+                        .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.getPersoncode()))
+                .map(data -> data.getPointsyear() + data.getPersoncode()).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 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 = checkExistsData.parallelStream().filter(dataBaseDatas::contains).collect(Collectors.joining(";"));
+        if (StringUtils.isNotBlank(errorMsg)) {
+            throw new RuntimeException("excel中以下数据" + errorMsg + "已存在");
+        }
+    }
+
+
+    /**
+     * 员工工号校验
+     *
+     * @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);
+        }
+    }
+
+
+    public R unitPointsRegistration(MultipartFile file) {
+        UnitPointsRegistrationListener listener = new UnitPointsRegistrationListener();
+
+        try {
+            EasyExcel.read(file.getInputStream())
+                    .head(UnitPointsRegistrationImportDto.class)
+                    .registerReadListener(listener)
+                    .sheet()
+                    .doRead();
+        }catch (Exception e){
+            throw new RuntimeException("读取单位积分文件失败");
+        }
+
+        // 3. 读取完成后获取数据(此时数据已完整)
+        List<QhsePointsUnitDetailsVo> parsedData = listener.getData();
+        return qhsePointsUnitDetailsService.ProcessImportedData(parsedData);
+    }
+}

+ 143 - 6
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/PointServiceImpl.java

@@ -1,12 +1,16 @@
 package com.rongwei.bscommon.system.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.google.common.collect.Lists;
 import com.rongwei.bscommon.system.dao.QhseContractWorkersDao;
 import com.rongwei.bscommon.system.service.PointService;
 import com.rongwei.bscommon.system.service.QhsePointsRedemptionService;
 import com.rongwei.bscommon.system.utils.QHSEUtils;
 import com.rongwei.bsentity.domain.*;
+import com.rongwei.bsentity.dto.UserPointRegister;
 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;
@@ -14,9 +18,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import java.time.LocalDate;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * PointServiceImpl class
@@ -34,11 +43,8 @@ public class PointServiceImpl implements PointService {
     private QhsePointsRecordUserServiceImpl qhsePointsRecordUserService;
     @Autowired
     private QhseContractWorkersDao qhseContractWorkersDao;
-
-
-
-
-
+    @Autowired
+    private QhsePointsDetailsUserServiceImpl qhsePointsDetailsUserService;
 
     @Override
     public R userPointExchange(String id) {
@@ -58,6 +64,10 @@ public class PointServiceImpl implements PointService {
             log.error("无法根据ID:{}获取到用户积分信息", mainid);
             return R.error("无法获取用户积分信息");
         }
+        if (pointsRecordUserDo.getCurrentpoint() <= 100) {
+            log.error("当前可用积分为0");
+            return R.error("当前用户可用积分为0");
+        }
         SysUserVo currentUser = QHSEUtils.getCurrentUser();
         // 本次兑换使用的积分
         int usepoints = redemptionDo.getUsepoints() == null ? 0 : redemptionDo.getUsepoints();
@@ -77,7 +87,7 @@ public class PointServiceImpl implements PointService {
         }
         SysUserVo currentUser = QHSEUtils.getCurrentUser();
         QhsePointsRecordUserDo qhsePointsRecordUserDo;
-        List<QhsePointsRecordUserDo> saveList= new ArrayList<>(uninitializedData.size());
+        List<QhsePointsRecordUserDo> saveList = new ArrayList<>(uninitializedData.size());
         for (QhseContractWorkersDo uninitializedDatum : uninitializedData) {
             qhsePointsRecordUserDo = new QhsePointsRecordUserDo();
             QHSEUtils.initModelGeneralParameters(qhsePointsRecordUserDo, currentUser);
@@ -101,4 +111,131 @@ public class PointServiceImpl implements PointService {
         return R.ok("生成成功");
     }
 
+    /**
+     * 用户积分登记
+     *
+     * @return
+     */
+    @Override
+    @Transactional
+    public R userPointEegister(List<String> ids) {
+        if (ids.isEmpty() || ids.stream().allMatch(StringUtils::isBlank)) {
+            log.error("加扣分信息ID为空");
+            return R.error("参数异常");
+        }
+        List<QhsePointsDetailsUserDo> pointsDetailsUserDos = qhsePointsDetailsUserService.list(new LambdaQueryWrapper<QhsePointsDetailsUserDo>()
+                .eq(QhsePointsDetailsUserDo::getState, 0).in(QhsePointsDetailsUserDo::getId, ids));
+        if (pointsDetailsUserDos.isEmpty()) {
+            log.error("无法通过id:{}获取到对应的加扣分记录", ids);
+            return R.error("无法获取加扣分信息");
+        }
+        // 按照人员积分记录分组
+        Map<String, List<QhsePointsDetailsUserDo>> dataGroupByMainId = pointsDetailsUserDos.stream()
+                .collect(Collectors.groupingBy(QhsePointsDetailsUserDo::getMainid));
+        List<UserPointRegister> saveList = new ArrayList<>();
+
+        dataGroupByMainId.forEach((mainId, ponitList) -> {
+            // 对相同用户的加扣分按照 大于0 小于0 等于0 分组
+            Map<Integer, Integer> dataGroupByPointType = ponitList.stream()
+                    .collect(Collectors.groupingBy(item -> {
+                        // 自定义分组规则
+                        if (item.getPoints() > 0) return 1;  // 大于0
+                        else if (item.getPoints() < 0) return -1;  // 小于0
+                        else return 0;  // 等于0
+                    }, Collectors.summingInt(QhsePointsDetailsUserDo::getPoints)));
+            UserPointRegister userPointRegister = new UserPointRegister();
+            int currentUserPoint = ponitList.stream().mapToInt(QhsePointsDetailsUserDo::getPoints).sum();
+            userPointRegister.setId(mainId);
+            userPointRegister.setPoint(currentUserPoint);
+            userPointRegister.setBonusPoint(dataGroupByPointType.getOrDefault(1, 0));
+            userPointRegister.setDeductPoint(dataGroupByPointType.getOrDefault(-1, 0));
+            saveList.add(userPointRegister);
+        });
+        SysUserVo currentUser = QHSEUtils.getCurrentUser();
+        // 数据保存
+        qhsePointsRecordUserService.getBaseMapper().saveUserPoint(saveList, currentUser);
+        qhsePointsDetailsUserService.update(new LambdaUpdateWrapper<QhsePointsDetailsUserDo>()
+                .in(QhsePointsDetailsUserDo::getId, ids)
+                .set(QhsePointsDetailsUserDo::getState, 1)
+                .set(BaseDo::getModifydate, new Date())
+                .set(BaseDo::getModifyuserid, currentUser.getId())
+                .set(BaseDo::getModifyusername, currentUser.getName())
+        );
+        return R.ok();
+    }
+
+    /**
+     * 用户扣分记录删除
+     *
+     * @param ids
+     * @return
+     */
+    @Override
+    @Transactional
+    public R userPointRemove(List<String> ids) {
+        List<QhsePointsDetailsUserDo> qhsePointsDetailsUserDos = qhsePointsDetailsUserService.list(new LambdaQueryWrapper<QhsePointsDetailsUserDo>()
+                .eq(QhsePointsDetailsUserDo::getState, 1).in(QhsePointsDetailsUserDo::getId, ids));
+        if (qhsePointsDetailsUserDos.isEmpty()) {
+            log.error("无法获取用户积分信息");
+            return R.error("参数异常");
+        }
+        // 获取用户所选择的扣分记录信息
+        List<String> userRecordId = qhsePointsDetailsUserDos.stream().map(QhsePointsDetailsUserDo::getMainid).distinct().collect(Collectors.toList());
+
+        List<QhsePointsRecordUserDo> qhsePointsUnitRecordDos = qhsePointsRecordUserService.getBaseMapper().selectBatchIds(userRecordId);
+
+
+        // 需要处理用户积分的加扣分数据
+        List<QhsePointsDetailsUserDo> dataToModifyScore;
+        List<QhsePointsRecordUserDo> dataUpdateList = new ArrayList<>();
+        QhsePointsRecordUserDo updateDo;
+        SysUserVo currentUser = QHSEUtils.getCurrentUser();
+
+        for (QhsePointsRecordUserDo qhsePointsRecordUserDo : qhsePointsUnitRecordDos) {
+            // 最近一次积分重置时间
+            Date resetRime = qhsePointsRecordUserDo.getResettime();
+            updateDo = new QhsePointsRecordUserDo();
+            updateDo.setId(qhsePointsRecordUserDo.getId());
+            // 默认当前分数不变
+            updateDo.setCurrentpoint(0);
+            // 扣分
+            updateDo.setDeductpoints(0);
+            //加分
+            updateDo.setBonuspoints(0);
+            updateDo.setModifyuserid(currentUser.getId());
+            updateDo.setModifyusername(currentUser.getName());
+
+            dataToModifyScore = qhsePointsDetailsUserDos.stream().filter(data -> data.getMainid().equals(qhsePointsRecordUserDo.getId())).collect(Collectors.toList());
+            if (resetRime == null) {
+                // 1. 没有重置过的时候 更新 当前分数 以及对应用户的加扣分数量
+                updateDo.setCurrentpoint(dataToModifyScore.stream().mapToInt(data -> -data.getPoints()).sum());
+                updateDo.setDeductpoints(dataToModifyScore.stream().filter(data -> data.getPoints() < 0).mapToInt(data -> -data.getPoints()).sum());
+                updateDo.setBonuspoints(dataToModifyScore.stream().filter(data -> data.getPoints() > 0).mapToInt(data -> -data.getPoints()).sum());
+            } else {
+                // 2. 本次积分在重置之前 不更新当前分数  更新当前用户的加扣分记录
+                dataToModifyScore = dataToModifyScore.stream().filter(data -> resetRime.after(data.getCreatedate())).collect(Collectors.toList());
+                if (!dataToModifyScore.isEmpty()) {
+                    // 重置时间 大于加扣分登记的创建时间
+                    updateDo.setDeductpoints(dataToModifyScore.stream().filter(data -> data.getPoints() < 0).mapToInt(data -> -data.getPoints()).sum());
+                    updateDo.setBonuspoints(dataToModifyScore.stream().filter(data -> data.getPoints() > 0).mapToInt(data -> -data.getPoints()).sum());
+                }
+
+                dataToModifyScore = dataToModifyScore.stream().filter(data -> resetRime.before(data.getCreatedate())).collect(Collectors.toList());
+                if (!dataToModifyScore.isEmpty()) {
+                    // 重置时间 小于加扣分登记的创建时间
+                    updateDo.setCurrentpoint(dataToModifyScore.stream().mapToInt(data -> -data.getPoints()).sum());
+                    updateDo.setDeductpoints(dataToModifyScore.stream().filter(data -> data.getPoints() < 0).mapToInt(data -> -data.getPoints()).sum());
+                    updateDo.setBonuspoints(dataToModifyScore.stream().filter(data -> data.getPoints() > 0).mapToInt(data -> -data.getPoints()).sum());
+                }
+            }
+            dataUpdateList.add(updateDo);
+        }
+
+        // 用户扣分记录删除
+        qhsePointsDetailsUserService.removeByIds(ids);
+        if (!dataUpdateList.isEmpty()) {
+            qhsePointsRecordUserService.getBaseMapper().updateDataAfterDeletion(dataUpdateList);
+        }
+        return R.ok();
+    }
 }

+ 22 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhseContractWorkersServiceImpl.java

@@ -0,0 +1,22 @@
+package com.rongwei.bscommon.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.rongwei.bscommon.system.dao.QhseContractWorkersDao;
+import com.rongwei.bscommon.system.service.QhseContractWorkersService;
+import com.rongwei.bsentity.domain.QhseContractWorkersDo;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author libai
+ * @description 针对表【qhse_contract_workers(劳务人员表)】的数据库操作Service实现
+ * @createDate 2025-09-05 10:47:29
+ */
+@Service
+public class QhseContractWorkersServiceImpl extends ServiceImpl<QhseContractWorkersDao, QhseContractWorkersDo>
+        implements QhseContractWorkersService {
+
+}
+
+
+
+

+ 22 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhsePointsDetailsUserServiceImpl.java

@@ -0,0 +1,22 @@
+package com.rongwei.bscommon.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.rongwei.bscommon.system.dao.QhsePointsDetailsUserDao;
+import com.rongwei.bscommon.system.service.QhsePointsDetailsUserService;
+import com.rongwei.bsentity.domain.QhsePointsDetailsUserDo;
+import org.springframework.stereotype.Service;
+
+/**
+* @author libai
+* @description 针对表【qhse_points_details_user(安全积分-人员加扣分记录)】的数据库操作Service实现
+* @createDate 2025-09-09 09:53:41
+*/
+@Service
+public class QhsePointsDetailsUserServiceImpl extends ServiceImpl<QhsePointsDetailsUserDao, QhsePointsDetailsUserDo>
+    implements QhsePointsDetailsUserService {
+
+}
+
+
+
+

+ 185 - 1
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhsePointsUnitDetailsServiceImpl.java

@@ -2,16 +2,200 @@ package com.rongwei.bscommon.system.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.system.dao.QhsePointsUnitDetailsDao;
+import com.rongwei.bscommon.system.dao.QhsePointsUnitRecordDao;
 import com.rongwei.bscommon.system.service.QhsePointsUnitDetailsService;
+import com.rongwei.bscommon.system.utils.QHSEUtils;
 import com.rongwei.bsentity.domain.QhsePointsUnitDetailsDo;
+import com.rongwei.bsentity.domain.QhsePointsUnitRecordDo;
+import com.rongwei.bsentity.dto.UnitPointsImportValidationResult;
+import com.rongwei.bsentity.vo.QhsePointsUnitDetailsVo;
+import com.rongwei.bsentity.vo.QhsePointsUnitRecordVo;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.utils.SecurityUtil;
+import org.springframework.beans.BeanUtils;
+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.util.List;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class QhsePointsUnitDetailsServiceImpl extends
         ServiceImpl<QhsePointsUnitDetailsDao, QhsePointsUnitDetailsDo> implements QhsePointsUnitDetailsService {
 
+    @Autowired
+    private QhsePointsUnitRecordDao qhsePointsUnitRecordDao;
+
+
+
+
+    @Override
+    @Transactional
+    public R ProcessImportedData(List<QhsePointsUnitDetailsVo> parsedData) {
+
+        if (parsedData.isEmpty()) {
+            return R.error("无有效数据需要处理");
+        }
+
+        SysUserVo currentUser = QHSEUtils.getCurrentUser();
+
+        //校验数据
+        UnitPointsImportValidationResult unitPointsImportValidationResult=  validateImportedData(parsedData,currentUser);
+        if (unitPointsImportValidationResult.isValid()){
+            return R.error(unitPointsImportValidationResult.getErrorMsg());
+        }
+
+        //根据加入的子表记录计算应该修改的加扣分信息
+        List<QhsePointsUnitRecordDo> qhsePointsUnitRecordDos = calMainTablePoint(unitPointsImportValidationResult.getValidData());
+
+        //更新子表
+        this.getBaseMapper().insertBatchSomeColumn( unitPointsImportValidationResult.getValidData());
+
+        //更新主表.
+        qhsePointsUnitRecordDao.updateScoreInfo(qhsePointsUnitRecordDos,currentUser);
+        return R.ok();
+
+    }
+
+    private List<QhsePointsUnitRecordDo> calMainTablePoint(List<QhsePointsUnitDetailsDo> validData) {
+
+        //获取对应的加分记录数据
+        Map<String, List<QhsePointsUnitDetailsDo>> details =validData.stream().collect(Collectors.groupingBy(
+                QhsePointsUnitDetailsDo::getPointsunitid
+        ));
+
+        QhsePointsUnitRecordDo qhsePointsUnitRecordDo =null;
+        List<QhsePointsUnitRecordDo> mainUpdates =new ArrayList<>();
+
+        for (String key: details.keySet()){
+            qhsePointsUnitRecordDo = new QhsePointsUnitRecordDo();
+            qhsePointsUnitRecordDo.setId(key);
+            qhsePointsUnitRecordDo.setBonuspoints(0);
+            qhsePointsUnitRecordDo.setBonusdescription("");
+            qhsePointsUnitRecordDo.setDeductionpoints(0);
+            qhsePointsUnitRecordDo.setDeductiondescription("");
+            qhsePointsUnitRecordDo.setCumulativescore(0);
+            //分值大于0 累加到 加分分值,加分描述追加 ,反之 累加 扣分分值,扣分描述
+            for (QhsePointsUnitDetailsDo qhsePointsUnitDetailsDo : details.get(key)) {
+                if (qhsePointsUnitDetailsDo.getPoints()>0){
+                    qhsePointsUnitRecordDo.setBonuspoints(qhsePointsUnitDetailsDo.getPoints()+qhsePointsUnitRecordDo.getBonuspoints());
+                }else{
+                    qhsePointsUnitRecordDo.setDeductionpoints(qhsePointsUnitDetailsDo.getPoints()+qhsePointsUnitRecordDo.getDeductionpoints());
+                }
+                qhsePointsUnitRecordDo.setCumulativescore(qhsePointsUnitRecordDo.getCumulativescore() + qhsePointsUnitDetailsDo.getPoints());
+            }
+
+            mainUpdates.add(qhsePointsUnitRecordDo);
+        }
+        return mainUpdates;
+    }
+
+    /**
+     * 校验数据
+     *
+     * @param parsedData
+     * @param currentUser
+     * @return
+     */
+    private UnitPointsImportValidationResult validateImportedData(List<QhsePointsUnitDetailsVo> parsedData, SysUserVo currentUser) {
+
+        UnitPointsImportValidationResult unitPointsImportValidationResult = new UnitPointsImportValidationResult();
+        List<QhsePointsUnitDetailsDo> insertList = new ArrayList<>();
+        QhsePointsUnitDetailsDo detailsDo;
+        String recordKey ="",detailKey ="";
+
+        //1.查询 主表 年度+单位名称记录 分组
+        Map<String, List<QhsePointsUnitRecordVo>> recordMap = loadAnnualUnits();
+        //2.查询子表已存在的记录  单位名称+ 描述 + 发生时间 分组
+        Map<String, List<QhsePointsUnitDetailsVo>> detailMap = loadAnnualDetails();
+
+        //是否有相同的单位名称,子表是否有相同的记录
+        boolean notSameUnitName =false,sameDetail =false;
+        StringBuilder errors = new StringBuilder();
+        //循环校验
+        for (QhsePointsUnitDetailsVo vo:parsedData){
+            //校验单位名称 年度 + 单位名称
+            recordKey = vo.getPointsyear()+"-"+vo.getUnitname();
+            if (recordMap.get(recordKey)==null && !sameDetail){
+                errors.append("【").append(vo.getUnitname()).append("】");
+                notSameUnitName=true;
+                continue;
+            }
+
+            //校验子表唯一值  单位+描述 +时间
+            detailKey = vo.getUnitname()+"-"+vo.getDescription()+"-"+vo.getHappentimestr();
+            if (detailMap.get(detailKey)!=null && !notSameUnitName){
+                errors.append("【").append(vo.getUnitname()).append(vo.getDescription()).append(vo.getHappentimestr()).append("】");
+                sameDetail =true;
+                continue;
+            }
+
+            //生成新的实体DO
+            detailsDo =new QhsePointsUnitDetailsDo();
+            convertToDo(detailsDo,vo,currentUser,recordMap.get(recordKey).get(0).getId());
+            insertList.add(detailsDo);
+        }
+
+        if(notSameUnitName || sameDetail){
+            unitPointsImportValidationResult.setValid(true);
+        }
+
+        if(notSameUnitName ){
+            errors.append("单位不在对应年度清单中,请检查再导入");
+            unitPointsImportValidationResult.setErrorMsg(errors.toString());
+        }
+
+        if(sameDetail ){
+            errors.append("加扣分说明已存在,请重新维护");
+            unitPointsImportValidationResult.setErrorMsg("该年度"+errors);
+        }
+
+        unitPointsImportValidationResult.setValidData(insertList);
+
+        return unitPointsImportValidationResult;
+    }
+
+    private void convertToDo(QhsePointsUnitDetailsDo detailsDo, QhsePointsUnitDetailsVo vo, SysUserVo currentUser, String pointsunitid) {
+        BeanUtils.copyProperties(vo,detailsDo);
+        detailsDo.setId(SecurityUtil.getUUID());
+        detailsDo.setDeleted("0");
+        detailsDo.setSource("1"); //人工导入
+        detailsDo.setPointsunitid(pointsunitid);
+        detailsDo.setState("1"); //默认生成了 主表信息
+        QHSEUtils.initModelGeneralParameters(detailsDo, currentUser);
+    }
+
+    private List<String> getValidYears() {
+        List<String> years = new ArrayList<>();
+        int currentYear = LocalDate.now().getYear();
+        years.add(String.valueOf(currentYear));
+
+        if (LocalDate.now().getMonthValue() == 1) {
+            years.add(String.valueOf(currentYear - 1));
+        }
+        return years;
+    }
+
+    private Map<String, List<QhsePointsUnitRecordVo>> loadAnnualUnits() {
+        List<String> years = getValidYears();
+        return Optional.ofNullable(qhsePointsUnitRecordDao.getRecordByYear(years))
+                .filter(list -> !list.isEmpty())
+                .map(list -> list.stream()
+                        .collect(Collectors.groupingBy(QhsePointsUnitRecordVo::getUniquevalue)))
+                .orElse(Collections.emptyMap());
+    }
+
+    private Map<String, List<QhsePointsUnitDetailsVo>> loadAnnualDetails() {
+        List<String> years = getValidYears();
+        return Optional.ofNullable(qhsePointsUnitRecordDao.getDetailsByYear(years))
+                .filter(list -> !list.isEmpty())
+                .map(list -> list.stream()
+                        .collect(Collectors.groupingBy(QhsePointsUnitDetailsVo::getUniquevalue)))
+                .orElse(Collections.emptyMap());
+    }
 
 }

+ 64 - 25
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhsePointsUnitRecordServiceImpl.java

@@ -12,18 +12,17 @@ import com.rongwei.bscommon.system.utils.QHSEUtils;
 import com.rongwei.bsentity.domain.QhsePointsUnitDetailsDo;
 import com.rongwei.bsentity.domain.QhsePointsUnitRecordDo;
 import com.rongwei.bsentity.dto.QhsePointsUnitFileDto;
+import com.rongwei.bsentity.vo.QhsePointsUnitDetailsVo;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.R;
 import com.rongwei.rwcommon.utils.SecurityUtil;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -38,8 +37,8 @@ public class QhsePointsUnitRecordServiceImpl extends ServiceImpl<QhsePointsUnitR
 
     @Autowired
     private QhsePointsUnitRecordDao qhsePointsUnitRecordDao;
-
-
+    @Autowired
+    private QhsePointsUnitDetailsDao qhsePointsUnitDetailsDao;
 
 
     @Autowired
@@ -61,7 +60,7 @@ public class QhsePointsUnitRecordServiceImpl extends ServiceImpl<QhsePointsUnitR
             qhsePointsUnitRecordDo = new QhsePointsUnitRecordDo();
             QHSEUtils.initModelGeneralParameters(qhsePointsUnitRecordDo, currentUser);
             qhsePointsUnitRecordDo.setSubcontractorid(uninitializedDatum.getId());
-            qhsePointsUnitRecordDo.setPointsyear(year);
+            qhsePointsUnitRecordDo.setPointsyear(String.valueOf(year));
             qhsePointsUnitRecordDo.setId(SecurityUtil.getUUID());
             saveList.add(qhsePointsUnitRecordDo);
         }
@@ -77,23 +76,16 @@ public class QhsePointsUnitRecordServiceImpl extends ServiceImpl<QhsePointsUnitR
     public R calUnitScore(List<String> ids) {
         //获取要更新的主表信息
         List<QhsePointsUnitRecordDo> mainUpdates =new ArrayList<>();
-        List<String> detailIds =new ArrayList<>();
         QhsePointsUnitRecordDo qhsePointsUnitRecordDo =null;
 
         //获取对应的加分记录数据
         Map<String, List<QhsePointsUnitDetailsDo>> details = qhsePointsUnitDetailsService.getBaseMapper().selectList(
                 new LambdaQueryWrapper<QhsePointsUnitDetailsDo>().eq(QhsePointsUnitDetailsDo::getDeleted, "0")
-                        .in(QhsePointsUnitDetailsDo::getPointsunitid, ids)
+                        .in(QhsePointsUnitDetailsDo::getId, ids)
                         .ne(QhsePointsUnitDetailsDo::getPoints, 0)).stream().collect(Collectors.groupingBy(
-                QhsePointsUnitDetailsDo::getPointsunitid, Collectors.collectingAndThen(
-                        Collectors.toList(),
-                        list -> {
-                            // 按inserttime降序排序
-                            list.sort(Comparator.comparing(QhsePointsUnitDetailsDo::getCreatedate));
-                            return list;
-                        }
-                )
+                QhsePointsUnitDetailsDo::getPointsunitid
         ));
+        SysUserVo currentUser = QHSEUtils.getCurrentUser();
 
         for (String key: details.keySet()){
             qhsePointsUnitRecordDo = new QhsePointsUnitRecordDo();
@@ -105,26 +97,20 @@ public class QhsePointsUnitRecordServiceImpl extends ServiceImpl<QhsePointsUnitR
             qhsePointsUnitRecordDo.setCumulativescore(0);
             //分值大于0 累加到 加分分值,加分描述追加 ,反之 累加 扣分分值,扣分描述
             for (QhsePointsUnitDetailsDo qhsePointsUnitDetailsDo : details.get(key)) {
-                String  description ="分值:"+ qhsePointsUnitDetailsDo.getPoints() + " 描述:" +qhsePointsUnitDetailsDo.getRuledescription() +";";
                 if (qhsePointsUnitDetailsDo.getPoints()>0){
                     qhsePointsUnitRecordDo.setBonuspoints(qhsePointsUnitDetailsDo.getPoints()+qhsePointsUnitRecordDo.getBonuspoints());
-                    qhsePointsUnitRecordDo.setBonusdescription(qhsePointsUnitRecordDo.getBonusdescription()+description);
                 }else{
                     qhsePointsUnitRecordDo.setDeductionpoints(qhsePointsUnitDetailsDo.getPoints()+qhsePointsUnitRecordDo.getDeductionpoints());
-                    qhsePointsUnitRecordDo.setDeductiondescription(qhsePointsUnitRecordDo.getDeductiondescription()+description);
                 }
                 qhsePointsUnitRecordDo.setCumulativescore(qhsePointsUnitRecordDo.getCumulativescore() + qhsePointsUnitDetailsDo.getPoints());
-                detailIds.add(qhsePointsUnitRecordDo.getId());
-
             }
             mainUpdates.add(qhsePointsUnitRecordDo);
-
         }
         //更新主表
-        qhsePointsUnitRecordDao.updateScoreInfo(mainUpdates);
+        qhsePointsUnitRecordDao.updateScoreInfo(mainUpdates,currentUser);
         //更新子表
         LambdaUpdateWrapper<QhsePointsUnitDetailsDo> wrapper = new LambdaUpdateWrapper<>();
-        wrapper.in(QhsePointsUnitDetailsDo::getId, detailIds).set(QhsePointsUnitDetailsDo::getState, "1");
+        wrapper.in(QhsePointsUnitDetailsDo::getId, ids).set(QhsePointsUnitDetailsDo::getState, "1");
         qhsePointsUnitDetailsService.update(wrapper);
         return R.ok();
     }
@@ -140,5 +126,58 @@ public class QhsePointsUnitRecordServiceImpl extends ServiceImpl<QhsePointsUnitR
         return R.ok();
 
     }
+
+    @Override
+    @Transactional
+    public R delUnitScore(List<String> ids) {
+        List<QhsePointsUnitDetailsDo> qhsePointsUnitDetailsDos = qhsePointsUnitDetailsService.list(new LambdaQueryWrapper<QhsePointsUnitDetailsDo>()
+                .eq(QhsePointsUnitDetailsDo::getState, 1).in(QhsePointsUnitDetailsDo::getId, ids));
+        if(qhsePointsUnitDetailsDos.isEmpty()){
+            log.error("无法获取单位积分信息");
+            return R.error("参数异常");
+        }
+
+        Map<String, List<QhsePointsUnitDetailsDo>> details = qhsePointsUnitDetailsDos.stream().collect(Collectors.groupingBy(
+                QhsePointsUnitDetailsDo::getPointsunitid
+        ));
+
+        //获取要更新的主表信息
+        List<QhsePointsUnitRecordDo> mainUpdates =new ArrayList<>();
+        QhsePointsUnitRecordDo qhsePointsUnitRecordDo =null;
+
+        for (String key: details.keySet()){
+            qhsePointsUnitRecordDo = new QhsePointsUnitRecordDo();
+            qhsePointsUnitRecordDo.setId(key);
+            qhsePointsUnitRecordDo.setBonuspoints(0);
+            qhsePointsUnitRecordDo.setBonusdescription("");
+            qhsePointsUnitRecordDo.setDeductionpoints(0);
+            qhsePointsUnitRecordDo.setDeductiondescription("");
+            qhsePointsUnitRecordDo.setCumulativescore(0);
+            //分值大于0 累加到 加分分值,反之 累加 扣分分值  //删除功能 数据全部负数
+            for (QhsePointsUnitDetailsDo qhsePointsUnitDetailsDo : details.get(key)) {
+                if (qhsePointsUnitDetailsDo.getPoints()>0){
+                    qhsePointsUnitRecordDo.setBonuspoints( qhsePointsUnitRecordDo.getBonuspoints() - qhsePointsUnitDetailsDo.getPoints() );
+                }else{
+                    qhsePointsUnitRecordDo.setDeductionpoints(qhsePointsUnitDetailsDo.getPoints() - qhsePointsUnitRecordDo.getDeductionpoints());
+                }
+                qhsePointsUnitRecordDo.setCumulativescore(qhsePointsUnitDetailsDo.getPoints()-qhsePointsUnitRecordDo.getCumulativescore() );
+            }
+
+            mainUpdates.add(qhsePointsUnitRecordDo);
+        }
+
+        //更新主表
+        SysUserVo currentUser = QHSEUtils.getCurrentUser();
+        qhsePointsUnitRecordDao.updateScoreInfo(mainUpdates,currentUser);
+        // 用户扣分记录删除
+        qhsePointsUnitDetailsService.removeByIds(ids);
+
+        return R.ok();
+    }
+
+
+
+
+
 }
 

+ 2 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/RohhServiceImpl.java

@@ -113,6 +113,8 @@ public class RohhServiceImpl implements RohhService {
     public void createRPEvent(ROHHEventVo rohhEventVo) {
         QhseRohhEventDo qhseRohhEventDo = new QhseRohhEventDo();
         SysUserVo currentUser = QHSEUtils.getCurrentUser();
+
+        QhseRohhDo qhseRohhDo = rohhCheck(rohhEventVo.getRohhid());
         QHSEUtils.initModelGeneralParameters(qhseRohhEventDo, currentUser);
         qhseRohhEventDo.setId(SecurityUtil.getUUID());
         qhseRohhEventDo.setRohhid(rohhEventVo.getRohhid());

+ 6 - 6
qhse-common/src/main/java/com/rongwei/bscommon/system/utils/QHSEConstant.java

@@ -39,17 +39,17 @@ public class QHSEConstant {
     }
 
     public static class ContentType {
-
         public static final String STREAM = " application/octet-stream";
         public static final String ZIP = " application/zip";
-        public static final String PDF="application/pdf";
+        public static final String PDF = "application/pdf";
         public static final String PNG = "image/png";
         public static final String JPG = "image/jpeg";
-
     }
-    public static final String DEFAULT_WATER_MARK="ZPMC-NT-%s-%s";
 
-    public static final String OK_LOWER_CASE="OK";
-    public static final String ERROR_LOWER_CASE="ERROR";
+
+    public static final String DEFAULT_WATER_MARK = "ZPMC-NT-%s-%s";
+
+    public static final String OK_LOWER_CASE = "OK";
+    public static final String ERROR_LOWER_CASE = "ERROR";
 }
 

+ 27 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/utils/QHSEUtils.java

@@ -45,9 +45,18 @@ public class QHSEUtils {
                 }
             }
         }
+        if(currUser==null){
+            currUser = new SysUserVo();
+        }
         return currUser;
     }
 
+    /**
+     * 通用数据初始化
+     * @param t
+     * @param userVo
+     * @param <T>
+     */
     public static <T extends BaseDo> void initModelGeneralParameters(T t, SysUserDo userVo) {
         if (userVo == null) {
             userVo = getCurrentUser();
@@ -63,6 +72,24 @@ public class QHSEUtils {
         t.setDeleted("0");
     }
 
+    /**
+     * 修改数据初始化
+     * @param t
+     * @param userVo
+     * @param <T>
+     */
+    public static <T extends BaseDo> void initModelModifyParameters(T t, SysUserDo userVo) {
+        if (userVo == null) {
+            userVo = getCurrentUser();
+        }
+        t.setModifydate(new Date());
+        if (userVo != null) {
+            t.setModifyuserid(userVo.getId());
+            t.setModifyusername(userVo.getName());
+        }
+        t.setDeleted("0");
+    }
+
     public static BigDecimal CALCULATE_Y3(BigDecimal x1, BigDecimal y1, BigDecimal x2, BigDecimal y2, BigDecimal x3) {
         // 检查x1是否等于x2,以避免除以零的错误
         if (x1.compareTo(x2) == 0) {

+ 2 - 1
qhse-common/src/main/resources/mybatis/system/QhseContractWorkersDao.xml

@@ -49,7 +49,8 @@
         AND b.POINTYEAR = #{year,jdbcType=INTEGER}
         <where>
         a.DELETED = '0'
-        AND b.HOLDERID IS NULL;
+        AND b.HOLDERID IS NULL
+        and a.WORKTYPE='1'
         </where>
     </select>
 </mapper>

+ 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>

+ 92 - 0
qhse-common/src/main/resources/mybatis/system/QhsePointsRecordUserDao.xml

@@ -12,6 +12,7 @@
             ELSE '2'
             END,
             MODIFYDATE=SYSDATE,
+            EXCHANGENUM=EXCHANGENUM+1,
             MODIFYUSERID=#{modifyuserid},
             MODIFYUSERNAME=#{modifyusername}
         </set>
@@ -19,4 +20,95 @@
             ID=#{id}
         </where>
     </update>
+    <update id="saveUserPoint">
+        <foreach item="data" index="index" collection="saveList" separator=";">
+            UPDATE qhse_points_record_user
+            <set>
+                MODIFYUSERID=#{user.modifyuserid},
+                MODIFYUSERNAME=#{user.modifyusername},
+                MODIFYDATE=SYSDATE,
+                CURRENTPOINT = CURRENTPOINT+ #{data.point,jdbcType=INTEGER},
+                BONUSPOINTS = BONUSPOINTS+ #{data.bonusPoint,jdbcType=INTEGER},
+                DEDUCTPOINTS= DEDUCTPOINTS+ #{data.deductPoint,jdbcType=INTEGER},
+                STATUS=
+                CASE
+                WHEN CURRENTPOINT+ #{data.point,jdbcType=INTEGER}>=90 THEN '1'
+                WHEN CURRENTPOINT+ #{data.point,jdbcType=INTEGER} &lt; 80 THEN '3'
+                ELSE '2'
+                END
+                <if test=" data.bonusPoint != null and data.bonusPoint > 0">
+                    , BONUSPOINTSDESC= (
+                    <include refid="getBonusDescription">
+                        <property name="mainId" value="${data.id}"/>
+                    </include>
+                    )
+                </if>
+                <if test=" data.deductPoint != null and data.deductPoint &lt; 0">
+                    , DEDUCTPOINTSDESC=(
+                    <include refid="getDeductDescription">
+                        <property name="mainId" value="${data.id}"/>
+                    </include>
+                    )
+                </if>
+            </set>
+            <where>
+                id = #{data.id,jdbcType=VARCHAR};
+            </where>
+        </foreach>
+    </update>
+
+    <update id="updateDataAfterDeletion">
+        <foreach item="data" index="index" collection="updateList" separator=";">
+            UPDATE qhse_points_record_user
+            <set>
+                MODIFYUSERID=#{data.modifyuserid},
+                MODIFYUSERNAME=#{data.modifyusername},
+                MODIFYDATE=SYSDATE,
+                CURRENTPOINT = CURRENTPOINT+ #{data.currentpoint,jdbcType=INTEGER},
+                BONUSPOINTS = BONUSPOINTS+ #{data.bonuspoints,jdbcType=INTEGER},
+                DEDUCTPOINTS= DEDUCTPOINTS+ #{data.deductpoints,jdbcType=INTEGER},
+                STATUS=
+                CASE
+                WHEN CURRENTPOINT+ #{data.currentpoint,jdbcType=INTEGER}>=90 THEN '1'
+                WHEN CURRENTPOINT+ #{data.currentpoint,jdbcType=INTEGER} &lt; 80 THEN '3'
+                ELSE '2'
+                END , BONUSPOINTSDESC= (
+                <include refid="getBonusDescription">
+                    <property name="mainId" value="${data.id}"/>
+                </include>
+                ) , DEDUCTPOINTSDESC=(
+                <include refid="getDeductDescription">
+                    <property name="mainId" value="${data.id}"/>
+                </include>
+                )
+            </set>
+            <where>
+                id = #{data.id,jdbcType=VARCHAR};
+            </where>
+        </foreach>
+    </update>
+
+    <sql id="getBonusDescription">
+        SELECT LISTAGG(TEXT, ' ') WITHIN GROUP (ORDER BY NUM)
+        FROM (SELECT CONCAT(POINTS, ':', DESCRIPTION) AS TEXT,
+                     MAINID,
+                     ROW_NUMBER() OVER (ORDER BY CREATEDATE)                           AS NUM
+              FROM qhse_points_details_user
+              WHERE DELETED = '0'
+                and MAINID = '${mainId}'
+                AND POINTS > 0) a
+        GROUP BY MAINID
+    </sql>
+    <sql id="getDeductDescription">
+        SELECT LISTAGG(TEXT, ' ') WITHIN GROUP (ORDER BY NUM)
+        FROM (SELECT CONCAT(POINTS, ':', DESCRIPTION) AS TEXT ,
+                     MAINID,
+                     ROW_NUMBER() OVER (ORDER BY CREATEDATE)                           AS NUM
+              FROM qhse_points_details_user
+              WHERE DELETED = '0'
+                and MAINID = '${mainId}'
+                AND POINTS &lt; 0) a
+        GROUP BY MAINID
+    </sql>
+
 </mapper>

+ 101 - 11
qhse-common/src/main/resources/mybatis/system/QhsePointsUnitRecordDao.xml

@@ -22,27 +22,117 @@
     <update id="updateScoreInfo">
             <foreach collection="list" item="item" separator=";">
                 UPDATE qhse_points_unit_record
-                SET
-                BONUSPOINTS = #{item.bonuspoints},
-                BONUSDESCRIPTION = #{item.bonusdescription},
-                DEDUCTIONPOINTS = #{item.deductionpoints},
-                DEDUCTIONDESCRIPTION =#{item.deductiondescription},
-                CUMULATIVESCORE =#{item.cumulativescore}
-                WHERE ID = #{item.id}
+                 <set>
+                MODIFYUSERID= #{currentUser.id},
+                MODIFYUSERNAME=#{currentUser.name},
+                MODIFYDATE=SYSDATE,
+                BONUSPOINTS = COALESCE(BONUSPOINTS,0) + #{item.bonuspoints},
+                DEDUCTIONPOINTS =  COALESCE(DEDUCTIONPOINTS,0) + #{item.deductionpoints},
+                CUMULATIVESCORE = COALESCE(CUMULATIVESCORE,0) + #{item.cumulativescore},
+                STATUS=
+                CASE
+                WHEN  COALESCE(CUMULATIVESCORE,0) + #{item.cumulativescore} >=90 THEN '1'
+                WHEN  COALESCE(CUMULATIVESCORE,0) + #{item.cumulativescore} &lt; 80 THEN '3'
+                ELSE '2'
+                END
+                     , DEDUCTIONDESCRIPTION=(
+                     <include refid="getDeductDescription">
+                         <property name="mainId" value="${item.id}"/>
+                         <property name="tableName" value="qhse_points_unit_details"/>
+                     </include>
+                     )
+                    ,
+                     BONUSDESCRIPTION= (
+                     <include refid="getBonusDescription">
+                         <property name="mainId" value="${item.id}"/>
+                         <property name="tableName" value="qhse_points_unit_details"/>
+                     </include>
+                     )
+                 </set>
+                <where>
+                    id = #{item.id,jdbcType=VARCHAR}
+                </where>
             </foreach>
     </update>
 
+
+
+    <sql id="getBonusDescription">
+        SELECT LISTAGG(TEXT, ' ') WITHIN GROUP (ORDER BY NUM)
+        FROM (SELECT CONCAT(POINTS, ':', DESCRIPTION)        AS TEXT,
+                     POINTSUNITID,
+                     ROW_NUMBER() OVER (ORDER BY CREATEDATE) AS NUM
+              FROM ${tableName}
+              WHERE DELETED = '0'
+                and POINTSUNITID = '${mainId}'
+                AND POINTS > 0) a
+        GROUP BY POINTSUNITID
+    </sql>
+    <sql id="getDeductDescription">
+        SELECT LISTAGG(TEXT, ' ') WITHIN GROUP (ORDER BY NUM)
+        FROM (SELECT CONCAT(POINTS, ':', DESCRIPTION) AS TEXT ,
+                     POINTSUNITID,
+                     ROW_NUMBER() OVER (ORDER BY CREATEDATE)       AS NUM
+              FROM ${tableName}
+              WHERE DELETED = '0'
+                and POINTSUNITID = '${mainId}'
+                AND POINTS &lt; 0) a
+        GROUP BY POINTSUNITID
+    </sql>
+
     <update id="addUnitFiles">
+
         UPDATE qhse_points_unit_details
         SET ATTACHMENT = CASE
-        WHEN ATTACHMENT IS NULL OR ATTACHMENT = '' THEN #{attachment}
-        ELSE CONCAT(ATTACHMENT, CONCAT('^_^', #{attachment}))
+        WHEN COALESCE(TRIM(ATTACHMENT), '') = ''  THEN #{attachment}
+        ELSE ATTACHMENT || '^_^' || #{attachment}
         END
         WHERE ID IN
-        <foreach collection="list" item="id" separator=",">
-            (#{id})
+        <foreach collection="list" item="id" open="(" separator="," close=")">
+            #{id}
         </foreach>
 
     </update>
 
+
+    <select id="getRecordByYear" resultType="com.rongwei.bsentity.vo.QhsePointsUnitRecordVo">
+
+            SELECT
+            a.*,
+            b.UNITNAME,
+            CONCAT_WS('-', a.POINTSYEAR,b.UNITNAME ) AS UNIQUEVALUE
+            FROM
+            qhse_points_unit_record a
+            INNER JOIN "qhse_subcontractor_outsourcing" b   ON b.ID = a.SUBCONTRACTORID  AND b.DELETED = '0'
+            WHERE
+            a.DELETED = '0'
+            AND  a.POINTSYEAR IN
+            <foreach collection="years" item="year" open="(" separator="," close=")">
+                #{year}
+            </foreach>
+
+    </select>
+    <select id="getDetailsByYear" resultType="com.rongwei.bsentity.vo.QhsePointsUnitDetailsVo">
+
+
+        SELECT
+        a.*,
+        b.UNITNAME,
+        b.DEPARTMENTNAME,
+        CONCAT_WS('-', b.UNITNAME, a.DESCRIPTION,  DATE_FORMAT(a.HAPPENTIME, '%Y-%m-%d')) AS UNIQUEVALUE
+        FROM
+        qhse_points_unit_details a
+        INNER JOIN qhse_points_unit_record c ON c.DELETED='0' and a.POINTSUNITID= c.ID
+        INNER JOIN "qhse_subcontractor_outsourcing" b   ON b.ID = c.SUBCONTRACTORID  AND b.DELETED = '0'
+        WHERE
+        a.DELETED = '0'
+        AND  a.POINTSYEAR IN
+        <foreach collection="years" item="year" open="(" separator="," close=")">
+            #{year}
+        </foreach>
+
+
+    </select>
+
+
 </mapper>

+ 5 - 0
qhse-entity/pom.xml

@@ -39,5 +39,10 @@
             <artifactId>spring-web</artifactId>
             <version>5.3.7</version>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>4.0.3</version>
+        </dependency>
     </dependencies>
 </project>

+ 20 - 0
qhse-entity/src/main/java/com/rongwei/bsentity/Dto/UnitPointsImportValidationResult.java

@@ -0,0 +1,20 @@
+package com.rongwei.bsentity.dto;
+
+import com.rongwei.bsentity.domain.QhsePointsUnitDetailsDo;
+import com.rongwei.bsentity.vo.QhsePointsUnitDetailsVo;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 积分单位导入校验返回结果
+ */
+@Data
+public class UnitPointsImportValidationResult {
+
+    private  boolean valid = false;
+
+    private  List<QhsePointsUnitDetailsDo> validData;
+
+    private String errorMsg;
+}

+ 45 - 0
qhse-entity/src/main/java/com/rongwei/bsentity/Dto/UnitPointsRegistrationImportDto.java

@@ -0,0 +1,45 @@
+package com.rongwei.bsentity.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+/**
+ * UserPointsRegistrationImportDto class
+ *
+ * @author XH
+ * @date 2025/09/10
+ */
+@Data
+public class UnitPointsRegistrationImportDto {
+    /**
+     * 单位名称
+     */
+    @ExcelProperty(index = 0)
+    private String unitname;
+    /**
+     * 所属部门
+     */
+    @ExcelProperty(index = 1)
+    private String departmentname;
+
+
+    /**
+     * 加扣分说明
+     */
+    @ExcelProperty(index = 2)
+    private String description;
+
+    /**
+     * 加扣分分值
+     */
+    @ExcelProperty(index = 3)
+    private Integer points;
+
+    /**
+     * 发生时间
+     */
+    @ExcelProperty(index = 4)
+    private LocalDate happentime;
+}

+ 19 - 0
qhse-entity/src/main/java/com/rongwei/bsentity/Dto/UserPointRegister.java

@@ -0,0 +1,19 @@
+package com.rongwei.bsentity.dto;
+
+import lombok.Data;
+
+/**
+ * UserPointRegister class
+ *
+ * @author XH
+ * @date 2025/09/09
+ */
+@Data
+public class UserPointRegister {
+    private String id;
+
+    private int point;
+
+    private int bonusPoint;
+    private int deductPoint;
+}

+ 65 - 0
qhse-entity/src/main/java/com/rongwei/bsentity/Dto/UserPointsRegistrationImportDto.java

@@ -0,0 +1,65 @@
+package com.rongwei.bsentity.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.util.Date;
+
+/**
+ * UserPointsRegistrationImportDto class
+ *
+ * @author XH
+ * @date 2025/09/10
+ */
+@Data
+public class UserPointsRegistrationImportDto {
+    /**
+     * 姓名
+     */
+    @ExcelProperty(index = 0)
+    private String name;
+    /**
+     * 工号
+     */
+    @ExcelProperty(index = 1)
+    private String jobNo;
+
+    /**
+     * 身份证
+     */
+    @ExcelProperty(index = 2)
+    private String idCard;
+
+
+    /**
+     * 所属部门
+     */
+    @ExcelProperty(index = 3)
+    private String deptName;
+
+
+    /**
+     * 所属分包商
+     */
+    @ExcelProperty(index = 4)
+    private String subcontractor;
+
+    /**
+     * 加扣分说明
+     */
+    @ExcelProperty(index = 5)
+    private String desc;
+
+    /**
+     * 加扣分分值
+     */
+    @ExcelProperty(index = 6)
+    private Integer point;
+
+    /**
+     * 发生事件
+     */
+    @ExcelProperty(index = 7)
+    private LocalDate dateOfOccurrence;
+}

+ 134 - 0
qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhsePointsDetailsUserDo.java

@@ -0,0 +1,134 @@
+package com.rongwei.bsentity.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.rongwei.rwcommon.base.BaseDo;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * 安全积分-人员加扣分记录
+ *
+ * @TableName qhse_points_details_user
+ */
+@TableName(value = "qhse_points_details_user")
+@Data
+@Accessors(chain = true)
+public class QhsePointsDetailsUserDo extends BaseDo {
+    /**
+     * 主键
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 租户ID
+     */
+    private String tenantid;
+
+    /**
+     * 扩展json格式配置
+     */
+    private String roption;
+
+    /**
+     * 积分年度
+     */
+    private int pointsyear;
+
+    /**
+     * 人员ID
+     */
+    private String personid;
+
+    /**
+     * 姓名
+     */
+    private String personname;
+
+    /**
+     * 工号
+     */
+    private String personcode;
+
+    /**
+     * 人员分类
+     */
+    private String persontype;
+
+    /**
+     * 部门ID
+     */
+    private String departmentid;
+
+    /**
+     * 所属部门
+     */
+    private String departmentname;
+
+    /**
+     * 所属分包商ID
+     */
+    private String subcontractorid;
+
+    /**
+     * 所属分包商
+     */
+    private String subcontractorname;
+
+    /**
+     * 加扣分描述
+     */
+    private String description;
+
+    /**
+     * 发生时间
+     */
+    private Date happentime;
+
+    /**
+     * 加扣分分值
+     */
+    private Integer points;
+
+    /**
+     * 申诉处理后加扣分分值
+     */
+    private Integer afterappealpoints;
+
+    /**
+     * 规则ID
+     */
+    private String ruleid;
+
+    /**
+     * 规则编码
+     */
+    private String rulecode;
+
+    /**
+     * 规则说明
+     */
+    private String ruledescription;
+
+    /**
+     * 积分编号
+     */
+    private String pointscode;
+
+    /**
+     * 附件
+     */
+    private String attachment;
+
+    /**
+     * 主表ID(qhse_points_record_user)
+     */
+    private String mainid;
+
+    private int state;
+
+    private String idcard;
+}

+ 1 - 1
qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhsePointsRecordUserDo.java

@@ -75,7 +75,7 @@ public class QhsePointsRecordUserDo extends BaseDo {
     /**
      * 上次重置时间
      */
-    private Date resetteie;
+    private Date resettime;
 
     /**
      * 加分说明

+ 51 - 41
qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhsePointsUnitDetailsDo.java

@@ -1,83 +1,93 @@
 package com.rongwei.bsentity.domain;
 
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.rongwei.rwcommon.base.BaseDo;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 import java.util.Date;
 
 @Data
 @TableName(value = "qhse_points_unit_details")
+@Accessors(chain = true)
 public class QhsePointsUnitDetailsDo extends BaseDo implements Serializable {
-
-    @JsonProperty("ID")
+    /**
+     * 主键
+     */
+    @TableId
     private String id;
 
-    @JsonProperty("TENANTID")
+    /**
+     * 租户ID
+     */
     private String tenantid;
 
-    @JsonProperty("ROPTION")
+    /**
+     * 扩展json格式配置
+     */
     private String roption;
 
-    @JsonProperty("DELETED")
-    private String deleted;
-
-    @JsonProperty("REMARK")
-    private String remark;
-
-    @JsonProperty("CREATEDATE")
-    @JsonSerialize(using = ToStringSerializer.class)
-    private Date createdate;
-
-    @JsonProperty("CREATEUSERID")
-    private String createuserid;
-
-    @JsonProperty("MODIFYDATE")
-    @JsonSerialize(using = ToStringSerializer.class)
-    private Date modifydate;
-
-    @JsonProperty("MODIFYUSERID")
-    private String modifyuserid;
-
-    @JsonProperty("CREATEUSERNAME")
-    private String createusername;
-
-    @JsonProperty("MODIFYUSERNAME")
-    private String modifyusername;
-
-    @JsonProperty("POINTSYEAR")
+    /**
+     * 积分年度
+     */
     private String pointsyear;
 
-    @JsonProperty("DESCRIPTION")
+    /**
+     * 加扣分描述
+     */
     private String description;
 
-    @JsonProperty("HAPPENTIME")
-    @JsonSerialize(using = ToStringSerializer.class)
+    /**
+     * 发生时间
+     */
     private Date happentime;
 
-    @JsonProperty("POINTS")
+    /**
+     * 加扣分分值
+     */
     private Integer points;
 
-    @JsonProperty("RULEID")
+    /**
+     * 规则ID
+     */
     private String ruleid;
 
-    @JsonProperty("RULECODE")
+    /**
+     * 规则编码
+     */
     private String rulecode;
 
-    @JsonProperty("RULEDESCRIPTION")
+    /**
+     * 规则说明
+     */
     private String ruledescription;
 
-    @JsonProperty("ATTACHMENT")
+    /**
+     * 附件
+     */
     private String attachment;
 
-    @JsonProperty("POINTSUNITID")
+    /**
+     * 积分单位ID
+     */
     private String pointsunitid;
 
-    @JsonProperty("STATE")
+
+    /**
+     *是否已生成对应的记录信息
+     */
     private String state;
 
+
+    /**
+     *来源(默认 人工导入 1)
+     */
+    private String source;
+
+
 }

+ 55 - 34
qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhsePointsUnitRecordDo.java

@@ -1,6 +1,7 @@
 package com.rongwei.bsentity.domain;
 
 
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.rongwei.rwcommon.base.BaseDo;
 import lombok.Data;
@@ -13,55 +14,75 @@ import java.util.Date;
  * @author makejava
  * @since 2025-09-05 15:15:03
  */
-@SuppressWarnings("serial")
+
 @Data
 @TableName(value ="qhse_points_unit_record")
-
 public class QhsePointsUnitRecordDo extends BaseDo {
-
-
-//主键
+    /**
+     * 主键
+     */
+    @TableId
     private String id;
-//租户ID
+
+    /**
+     * 租户ID
+     */
     private String tenantid;
-//扩展json格式配置
+
+    /**
+     * 扩展json格式配置
+     */
     private String roption;
-//是否删除Y/N
-    private String deleted;
-//备注
-    private String remark;
-//创建时间
-    private Date createdate;
-//创建用户ID
-    private String createuserid;
-//修改日期
-    private Date modifydate;
-//修改用户ID
-    private String modifyuserid;
-//创建人名称
-    private String createusername;
-//修改人名称
+
+    /**
+     * 修改人名称
+     */
     private String modifyusername;
-//积分编号
+
+    /**
+     * 积分编号
+     */
     private String pointscode;
-//积分年度
-    private Integer pointsyear;
-//分包商ID
+
+    /**
+     * 积分年度
+     */
+    private String pointsyear;
+
+    /**
+     * 分包商ID
+     */
     private String subcontractorid;
-//加分
+
+    /**
+     * 加分
+     */
     private Integer bonuspoints;
-//加分描述
+
+    /**
+     * 加分描述
+     */
     private String bonusdescription;
-//扣分
-    private Integer deductionpoints;
-//扣分描述
-    private String deductiondescription;
-//累计分值
-    private Integer cumulativescore;
 
+    /**
+     * 扣分
+     */
+    private Integer deductionpoints;
 
+    /**
+     * 扣分描述
+     */
+    private String deductiondescription;
 
+    /**
+     * 累计分值
+     */
+    private Integer cumulativescore;
 
+    /**
+     * 预警状态
+     */
+    private String status;
 
 }
 

+ 44 - 28
qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhseSubcontractorOutsourcingDo.java

@@ -1,10 +1,13 @@
 package com.rongwei.bsentity.domain;
 
 
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.rongwei.rwcommon.base.BaseDo;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.Date;
 
 /**
@@ -15,44 +18,57 @@ import java.util.Date;
  */
 @Data
 @TableName(value ="qhse_subcontractor_outsourcing")
-public class QhseSubcontractorOutsourcingDo extends Model<QhseSubcontractorOutsourcingDo> {
-//主键
+public class QhseSubcontractorOutsourcingDo extends BaseDo implements Serializable {
+    /**
+     * 主键
+     */
+    @TableId
     private String id;
-//租户ID
+
+    /**
+     * 租户ID
+     */
     private String tenantid;
-//扩展json格式配置
-    private String roption;
-//是否删除Y/N
-    private String deleted;
-//备注
-    private String remark;
-//创建时间
-    private Date createdate;
-//创建用户ID
-    private String createuserid;
-//修改日期
-    private Date modifydate;
-//修改用户ID
-    private String modifyuserid;
-//创建人名称
-    private String createusername;
-//修改人名称
-    private String modifyusername;
-//单位名称
+
+    /**
+     * 单位名称
+     */
     private String unitname;
-//单位编号
+
+    /**
+     * 单位编号
+     */
     private String unitcode;
-//分包商/合作方
+
+    /**
+     * 分包商/合作方
+     */
     private String subcontractorpartner;
-//状态
+
+    /**
+     * 状态
+     */
     private String status;
-//单位类型(分包商/外协)
+
+    /**
+     * 单位类型(分包商/外协)
+     */
     private String unittype;
-//部门ID
+
+    /**
+     * 部门ID
+     */
     private String departmentid;
-//所属部门
+
+    /**
+     * 所属部门
+     */
     private String departmentname;
 
+    /**
+     * 扩展json格式配置
+     */
+    private String roption;
 
 }
 

+ 36 - 0
qhse-entity/src/main/java/com/rongwei/bsentity/vo/QhsePointsUnitDetailsVo.java

@@ -0,0 +1,36 @@
+package com.rongwei.bsentity.vo;
+
+import com.rongwei.bsentity.domain.QhsePointsUnitDetailsDo;
+import com.rongwei.bsentity.domain.QhsePointsUnitRecordDo;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+public class QhsePointsUnitDetailsVo extends QhsePointsUnitDetailsDo {
+
+    /**
+     * 单位名称
+     */
+    private String unitname;
+
+    /**
+     * 所属部门
+     */
+    private String departmentname;
+
+    /**
+     * 唯一key
+     */
+    private String uniquevalue;
+
+
+    /**
+     * 发生时间 年月日
+     */
+    private String happentimestr;
+
+
+
+
+}

+ 30 - 0
qhse-entity/src/main/java/com/rongwei/bsentity/vo/QhsePointsUnitRecordVo.java

@@ -0,0 +1,30 @@
+package com.rongwei.bsentity.vo;
+
+import com.rongwei.bsentity.domain.QhsePointsUnitDetailsDo;
+import com.rongwei.bsentity.domain.QhsePointsUnitRecordDo;
+import lombok.Data;
+
+@Data
+public class QhsePointsUnitRecordVo extends QhsePointsUnitRecordDo {
+
+    /**
+     * 单位名称
+     */
+    private String unitname;
+
+    /**
+     * 所属部门
+     */
+    private String departmentname;
+
+
+    /**
+     * 唯一key
+     */
+    private String uniquevalue;
+
+
+
+
+
+}

+ 51 - 0
qhse-server/src/main/java/com/rongwei/controller/ExcelImportController.java

@@ -0,0 +1,51 @@
+package com.rongwei.controller;
+
+import com.rongwei.bscommon.system.service.QhsePointsUnitDetailsService;
+import com.rongwei.bscommon.system.service.impl.ExcelImportServiceImpl;
+import com.rongwei.bscommon.system.service.impl.QhsePointsUnitDetailsServiceImpl;
+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.*;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * ExcelImportController class
+ *
+ * @author XH
+ * @date 2025/09/10
+ */
+@RestController
+@RequestMapping("/excel/import")
+public class ExcelImportController {
+    private static final Logger log = LoggerFactory.getLogger(ExcelImportController.class);
+
+    @Autowired
+    private ExcelImportServiceImpl excelImportService;
+
+    @Autowired
+    private QhsePointsUnitDetailsServiceImpl qhsePointsUnitDetailsService;
+
+    /**
+     * 开始用户积分兑换
+     *
+     * @param fileId 文件Id
+     * @return 结果
+     */
+    @PostMapping("/user/point")
+    public R userPointsRegistration(@RequestParam("file") MultipartFile file) {
+        log.info("开始用户积分导入");
+        return excelImportService.userPointsRegistration(file);
+    }
+
+    /**
+     * 开始单位积分导入
+     * @return 结果
+     */
+    @PostMapping("/unit/point")
+    public R unitPointsRegistration(@RequestParam("file") MultipartFile file){
+        log.info("开始单位积分导入");
+        return excelImportService.unitPointsRegistration(file);
+    }
+}

+ 33 - 3
qhse-server/src/main/java/com/rongwei/controller/PointController.java

@@ -28,7 +28,7 @@ public class PointController {
     private QhsePointsUnitRecordService qhsePointsUnitRecordService;
 
     /**
-     * 用户积分重置
+     * 开始用户积分兑换
      *
      * @param ids 物资出厂参数
      * @return 结果
@@ -39,6 +39,29 @@ public class PointController {
         return pointService.userPointExchange(id);
     }
 
+    /**
+     * 用户扣分记录删除
+     * @param id
+     * @return
+     */
+    @PostMapping("/user/remove")
+    public R userPointRemove(@RequestBody List<String> ids) {
+        log.info("开始用户积分兑换");
+        return pointService.userPointRemove(ids);
+    }
+
+    /**
+     * 用户积分登记
+     *
+     * @param ids 物资出厂参数
+     * @return 结果
+     */
+    @GetMapping("/user/register")
+    public R userPointEegister(@RequestBody List<String> ids) {
+        log.info("开始用户积分登记");
+        return pointService.userPointEegister(ids);
+    }
+
 
     /**
      * 当前年度用户积分初始化
@@ -55,6 +78,7 @@ public class PointController {
 
     /**
      * 当前年度用户积分初始化
+     *
      * @return 结果
      */
     @GetMapping("/unit/initialization")
@@ -74,6 +98,14 @@ public class PointController {
         return qhsePointsUnitRecordService.calUnitScore(ids);
     }
 
+
+    @PostMapping("/unit/delUnitScore")
+    public R delUnitScore(@RequestBody List<String> ids) {
+        log.info("删除扣分记录 {}",ids.toString());
+        return qhsePointsUnitRecordService.delUnitScore(ids);
+    }
+
+
     /**
      * 单位加扣分附件补录
      * @return
@@ -84,6 +116,4 @@ public class PointController {
         return qhsePointsUnitRecordService.addUnitFiles(qhsePointsUnitFileDto);
     }
 
-
-
 }

+ 1 - 1
qhse-server/src/main/java/com/rongwei/controller/RohhController.java

@@ -89,7 +89,7 @@ public class RohhController {
     }
 
     /**
-     * 任务转派 整改
+     * 任务转派 复证
      *
      * @param id
      * @return

+ 118 - 8
qhse-server/src/main/resources/logback-spring.xml

@@ -11,26 +11,136 @@
 
     <!-- 文件输出 -->
     <appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <prudent>false</prudent> <!-- 关闭安全写入 -->
+        <prudent>false</prudent>
         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
             <fileNamePattern>qhse-log/%d{yyyy-MM-dd}/app.%i.log</fileNamePattern>
             <maxFileSize>5MB</maxFileSize>
-            <maxHistory>30</maxHistory> <!-- 可选:保留30天日志 -->
+            <maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
-            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%X{traceId}] [%thread] %-5level -%msg%n</pattern>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%X{traceId}] [%thread] %-5level - %msg%n</pattern>
         </encoder>
     </appender>
 
-    <!-- 包级别日志 -->
-    <logger name="com.rongwei" level="info" additivity="false">
+    <!-- SQL日志专用Appender (简化格式) -->
+    <appender name="sqlFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <prudent>false</prudent>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>qhse-log/%d{yyyy-MM-dd}/sql.%i.log</fileNamePattern>
+            <maxHistory>7</maxHistory> <!-- SQL日志保留7天 -->
+            <maxFileSize>5MB</maxFileSize>
+        </rollingPolicy>
+        <encoder>
+            <!-- 简化输出格式,只保留时间和消息 -->
+            <pattern>%d{yyyy-MM-dd HH:mm:ss} | %msg%n</pattern>
+        </encoder>
+
+    </appender>
+
+    <!-- MyBatis SQL日志配置 -->
+    <logger name="org.mybatis" level="DEBUG" additivity="false">
+        <appender-ref ref="sqlFile"/>
+         <appender-ref ref="console"/>
+    </logger>
+
+    <!-- 如果你的MyBatis Mapper接口在特定包下,也可以直接配置该包 -->
+    <logger name="com.rongwei.bscommon.system.dao" level="DEBUG" additivity="false">
+        <appender-ref ref="sqlFile"/>
+    </logger>
+
+    <!-- JDBC连接池等相关日志过滤掉,避免过多无关信息 -->
+    <logger name="java.sql.Connection" level="WARN"/>
+    <logger name="java.sql.ResultSet" level="WARN"/>
+
+    <!-- 原有业务日志配置保持不变 -->
+    <logger name="com.rongwei" level="INFO" additivity="false">
         <appender-ref ref="console"/>
         <appender-ref ref="logFile"/>
     </logger>
 
-    <!-- 全局日志级别 -->
-    <root level="info">
+    <root level="INFO">
         <appender-ref ref="console"/>
         <appender-ref ref="logFile"/>
     </root>
-</configuration>
+</configuration>
+
+<!--        <?xml version="1.0" encoding="UTF-8"?>-->
+<!--<configuration scan="true" scanPeriod="60 seconds" debug="false">-->
+<!--<contextName>logback</contextName>-->
+
+<!--&lt;!&ndash; 控制台输出 &ndash;&gt;-->
+<!--<appender name="console" class="ch.qos.logback.core.ConsoleAppender">-->
+<!--    <encoder>-->
+<!--        <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>-->
+<!--    </encoder>-->
+<!--</appender>-->
+
+<!--&lt;!&ndash; 文件输出 &ndash;&gt;-->
+<!--<appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
+<!--    <prudent>false</prudent>-->
+<!--    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
+<!--        <fileNamePattern>qhse-log/%d{yyyy-MM-dd}/app.%i.log</fileNamePattern>-->
+<!--        <maxFileSize>5MB</maxFileSize>-->
+<!--        <maxHistory>30</maxHistory>-->
+<!--    </rollingPolicy>-->
+<!--    <encoder>-->
+<!--        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%X{traceId}] [%thread] %-5level - %msg%n</pattern>-->
+<!--    </encoder>-->
+<!--</appender>-->
+
+<!--&lt;!&ndash; SQL日志专用Appender (简化格式) &ndash;&gt;-->
+<!--<appender name="sqlFile" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
+<!--    <prudent>false</prudent>-->
+<!--    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
+<!--        <fileNamePattern>qhse-log/%d{yyyy-MM-dd}/sql.%i.log</fileNamePattern>-->
+<!--        <maxHistory>7</maxHistory> &lt;!&ndash; SQL日志保留7天 &ndash;&gt;-->
+<!--        <maxFileSize>5MB</maxFileSize>-->
+<!--    </rollingPolicy>-->
+<!--    <encoder>-->
+<!--        &lt;!&ndash; 简化输出格式,只保留时间和消息 &ndash;&gt;-->
+<!--        <pattern>%d{yyyy-MM-dd HH:mm:ss} | %msg%n</pattern>-->
+<!--    </encoder>-->
+
+<!--    &lt;!&ndash; 添加过滤器以确保只记录SQL相关关键信息 &ndash;&gt;-->
+<!--    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">-->
+<!--        <evaluator>-->
+<!--            <expression>-->
+<!--                return message.contains("Preparing") ||-->
+<!--                message.contains("Parameters") ||-->
+<!--                message.contains("Total") ||-->
+<!--                message.contains("==>") ||-->
+<!--                message.contains("<==");-->
+<!--            </expression>-->
+<!--        </evaluator>-->
+<!--        <OnMismatch>DENY</OnMismatch> &lt;!&ndash; 不匹配时拒绝记录 &ndash;&gt;-->
+<!--        <OnMatch>NEUTRAL</OnMatch> &lt;!&ndash; 匹配时让后续过滤器决定 &ndash;&gt;-->
+<!--    </filter>-->
+<!--</appender>-->
+
+<!--&lt;!&ndash; MyBatis SQL日志配置 &ndash;&gt;-->
+<!--<logger name="org.mybatis" level="DEBUG" additivity="false">-->
+<!--    <appender-ref ref="sqlFile"/> &lt;!&ndash; 输出到专用SQL文件 &ndash;&gt;-->
+<!--    &lt;!&ndash; 如果需要在控制台也查看SQL,可以取消下一行注释 &ndash;&gt;-->
+<!--    &lt;!&ndash; <appender-ref ref="console"/> &ndash;&gt;-->
+<!--</logger>-->
+
+<!--&lt;!&ndash; 如果你的MyBatis Mapper接口在特定包下,也可以直接配置该包 &ndash;&gt;-->
+<!--<logger name="com.rongwei.mapper" level="DEBUG" additivity="false">-->
+<!--    <appender-ref ref="sqlFile"/>-->
+<!--</logger>-->
+
+<!--&lt;!&ndash; JDBC连接池等相关日志过滤掉,避免过多无关信息 &ndash;&gt;-->
+<!--<logger name="java.sql.Connection" level="WARN"/>-->
+<!--<logger name="java.sql.ResultSet" level="WARN"/>-->
+
+<!--&lt;!&ndash; 原有业务日志配置保持不变 &ndash;&gt;-->
+<!--<logger name="com.rongwei" level="INFO" additivity="false">-->
+<!--    <appender-ref ref="console"/>-->
+<!--    <appender-ref ref="logFile"/>-->
+<!--</logger>-->
+
+<!--<root level="INFO">-->
+<!--    <appender-ref ref="console"/>-->
+<!--    <appender-ref ref="logFile"/>-->
+<!--</root>-->
+<!--</configuration>-->