Browse Source

feature 安全积分相关逻辑提交

xiahan 1 week ago
parent
commit
bd4ac4f813
20 changed files with 658 additions and 193 deletions
  1. 0 158
      qhse-common/src/main/java/com/rongwei/bscommon/system/config/MybatisConfig.java
  2. 18 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/dao/QhsePointsDetailsUserDao.java
  3. 16 8
      qhse-common/src/main/java/com/rongwei/bscommon/system/dao/QhsePointsRecordUserDao.java
  4. 4 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/PointService.java
  5. 13 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/QhseContractWorkersService.java
  6. 13 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/QhsePointsDetailsUserService.java
  7. 149 9
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/PointServiceImpl.java
  8. 22 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhseContractWorkersServiceImpl.java
  9. 22 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhsePointsDetailsUserServiceImpl.java
  10. 2 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/RohhServiceImpl.java
  11. 6 6
      qhse-common/src/main/java/com/rongwei/bscommon/system/utils/QHSEConstant.java
  12. 3 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/utils/QHSEUtils.java
  13. 2 1
      qhse-common/src/main/resources/mybatis/system/QhseContractWorkersDao.xml
  14. 92 0
      qhse-common/src/main/resources/mybatis/system/QhsePointsRecordUserDao.xml
  15. 19 0
      qhse-entity/src/main/java/com/rongwei/bsentity/Dto/UserPointRegister.java
  16. 130 0
      qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhsePointsDetailsUserDo.java
  17. 1 1
      qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhsePointsRecordUserDo.java
  18. 27 1
      qhse-server/src/main/java/com/rongwei/controller/PointController.java
  19. 1 1
      qhse-server/src/main/java/com/rongwei/controller/RohhController.java
  20. 118 8
      qhse-server/src/main/resources/logback-spring.xml

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

@@ -1,158 +0,0 @@
-package com.rongwei.bscommon.system.config;
-
-import com.baomidou.mybatisplus.core.parser.ISqlParser;
-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;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.reflection.MetaObject;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by duyisong on 17/5/28.
- */
-@EnableTransactionManagement
-@Configuration
-@MapperScan("com.rongwei.bscommon.system.dao")
-public class MybatisConfig {
-
-
-    @Value("${page.size:#{null}}")
-    private Long pageSize;
-    /**
-     * 自定义查询sql多数据库适配
-     * @return
-     */
-    @Bean
-    public QuerySqlAdaptationInterceptor querySqlAdaptationInterceptor(){
-        QuerySqlAdaptationInterceptor sqlAdaptation = new QuerySqlAdaptationInterceptor();
-        return sqlAdaptation;
-    }
-
-    /*
-     * 分页插件,自动识别数据库类型
-     * 多租户,请参考官网【插件扩展】
-     */
-    @Bean
-    public SaasPaginationInterceptor paginationInterceptor() {
-        SaasPaginationInterceptor paginationInterceptor = new SaasPaginationInterceptor();
-        /*
-         * 【测试多租户】 SQL 解析处理拦截器<br>
-         * 这里固定写成住户 1 实际情况你可以从cookie读取,因此数据看不到 【 麻花藤 】 这条记录( 注意观察 SQL )<br>
-         */
-        List<ISqlParser> sqlParserList = new ArrayList<>();
-        TenantSqlParser tenantSqlParser = new TenantSqlParser();
-        tenantSqlParser.setTenantHandler(new TenantHandler() {
-            @Override
-            public Expression getTenantId(boolean a) {
-                // 该 where 条件 3.2.0 版本开始添加的,用于分区是否为在 where 条件中使用
-                // 此判断用于支持返回多个租户 ID 场景,具体使用查看示例工程
-                // 查询redis缓存的租户ID
-                return new LongValue(1L);
-            }
-
-            @Override
-            public String getTenantIdColumn() {
-                return "TENANTID";
-            }
-
-            @Override
-            public boolean doTableFilter(String tableName) {
-                // 这里可以判断是否过滤表,true表示过滤、false不过滤
-                /*
-                if ("user".equals(tableName)) {
-                    return true;
-                }*/
-                return true;
-            }
-        });
-        sqlParserList.add(tenantSqlParser);
-        paginationInterceptor.setSqlParserList(sqlParserList);
-        paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
-            @Override
-            public boolean doFilter(MetaObject metaObject) {
-                MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
-                // 过滤自定义查询此时无租户信息约束【 麻花藤 】出现
-                if ("com.rongwei.rwadmincommon.system.dao.getAll".equals(ms.getId())) {
-                    return true;
-                }
-                return false;
-            }
-        });
-        paginationInterceptor.setLimit(pageSize == null ? 10000 :pageSize);
-        return paginationInterceptor;
-    }
-
-    /**
-     * 打印 sql
-     */
-    /*@Bean
-    public PerformanceInterceptor performanceInterceptor() {
-        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
-        //格式化sql语句
-        Properties properties = new Properties();
-        properties.setProperty("format", "true");
-        performanceInterceptor.setProperties(properties);
-        return performanceInterceptor;
-    }*/
-
-    /*@Bean
-    public MapperScannerConfigurer mapperScannerConfigurer() {
-        log.info("[config] 注册 tkMtBatis");
-        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
-        mapperScannerConfigurer.setBasePackage("com.rongwei.rwadmin.system.dao");
-        Properties properties = new Properties();
-        properties.setProperty("markerInterface", "com.rongwei.rwadmin.common.mapper.BaseDao");
-        mapperScannerConfigurer.setProperties(properties);
-        return mapperScannerConfigurer;
-    }
-
-    @Bean
-    public PageHelper pageHelper(DataSource dataSource) {
-        log.info("[config] 注册 MyBatis分页插件PageHelper");
-        PageHelper pageHelper = new PageHelper();
-        Properties p = new Properties();
-        p.setProperty("offsetAsPageNum", "true");
-        p.setProperty("rowBoundsWithCount", "true");
-        p.setProperty("reasonable", "true");
-        pageHelper.setProperties(p);
-        return pageHelper;
-    }*/
-
-
-    // 配置sqlSessionFactory
-    /*@Bean(name = "sqlSessionFactory")
-    public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource
-            ,QuerySqlAdaptationInterceptor sqlAdaptation,PaginationInterceptor paginationInterceptor) {
-        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
-        bean.setDataSource(dataSource);
-        if(StringUtils.isNotBlank(typeAliasesPackage)){
-            bean.setTypeAliasesPackage(typeAliasesPackage);
-        }
-
-        // 自定义的sql日志拦截器
-        Interceptor sqlLogInterceptor = new SqlLogInterceptor();
-        Interceptor[] plugins =  new Interceptor[]{ sqlLogInterceptor};
-        bean.setPlugins(plugins);
-        try {
-            bean.setMapperLocations(resolver.getResources(xmlLocation));
-            return bean.getObject();
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new RuntimeException(e);
-        }
-    }*/
-
-}

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

@@ -0,0 +1,18 @@
+package com.rongwei.bscommon.system.dao;
+
+import com.rongwei.bsentity.domain.QhsePointsDetailsUserDo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author libai
+* @description 针对表【qhse_points_details_user(安全积分-人员加扣分记录)】的数据库操作Mapper
+* @createDate 2025-09-09 09:53:41
+* @Entity generator.domain.QhsePointsDetailsUser
+*/
+public interface QhsePointsDetailsUserDao extends BaseMapper<QhsePointsDetailsUserDo> {
+
+}
+
+
+
+

+ 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 );
 }
 
 

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

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

@@ -1,28 +1,32 @@
 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.dao.QhsePointsUnitRecordDao;
 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.QhseContractWorkersDo;
-import com.rongwei.bsentity.domain.QhsePointsRecordUserDo;
-import com.rongwei.bsentity.domain.QhsePointsRedemptionDo;
-import com.rongwei.bsentity.domain.QhsePointsUnitRecordDo;
+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;
-import org.apache.commons.lang.ArrayUtils;
 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
@@ -40,13 +44,12 @@ public class PointServiceImpl implements PointService {
     private QhsePointsRecordUserServiceImpl qhsePointsRecordUserService;
     @Autowired
     private QhseContractWorkersDao qhseContractWorkersDao;
-
     @Autowired
     private QhsePointsUnitRecordDao qhsePointsUnitRecordDao;
-
-
     @Autowired
     private QhsePointsUnitRecordServiceImpl qhsePointsUnitRecordService;
+    @Autowired
+    private QhsePointsDetailsUserServiceImpl qhsePointsDetailsUserService;
 
     @Override
     public R userPointExchange(String id) {
@@ -66,6 +69,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();
@@ -85,7 +92,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);
@@ -109,6 +116,139 @@ 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::getPointsyear).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 id
+     * @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();
+    }
+
+    /**
+     * 单位积分初始化
+     *
+     * @return
+     */
     public R unitPointInitialization() {
         int year = LocalDate.now().getYear();
         List<QhsePointsUnitRecordDo> uninitializedData = qhsePointsUnitRecordDao.getUnitPointInitializationDtata(year);

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

+ 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";
 }
 

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

@@ -45,6 +45,9 @@ public class QHSEUtils {
                 }
             }
         }
+        if(currUser==null){
+            currUser = new SysUserVo();
+        }
         return currUser;
     }
 

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

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

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

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

@@ -0,0 +1,130 @@
+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 java.util.Date;
+
+/**
+ * 安全积分-人员加扣分记录
+ *
+ * @TableName qhse_points_details_user
+ */
+@TableName(value = "qhse_points_details_user")
+@Data
+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;
+}

+ 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;
 
     /**
      * 加分说明

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

@@ -7,6 +7,8 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * PointController class
  *
@@ -21,7 +23,7 @@ public class PointController {
     private PointServiceImpl pointService;
 
     /**
-     * 用户积分重置
+     * 开始用户积分兑换
      *
      * @param ids 物资出厂参数
      * @return 结果
@@ -32,6 +34,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);
+    }
+
 
     /**
      * 当前年度用户积分初始化
@@ -48,6 +73,7 @@ public class PointController {
 
     /**
      * 当前年度用户积分初始化
+     *
      * @return 结果
      */
     @GetMapping("/unit/initialization")

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