chenxiaofei 9 годин тому
батько
коміт
ba4ffa124f

+ 6 - 0
sckw-gateway/src/main/java/com/sckw/gateway/utils/GatewayExceptionUtil.java

@@ -1,5 +1,6 @@
 package com.sckw.gateway.utils;
 
+import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.gateway.pojo.HttpResult;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.server.reactive.ServerHttpRequest;
@@ -20,6 +21,11 @@ public class GatewayExceptionUtil {
 
         log.error("网关服务不可用异常: 路径={}, 方法={}, 异常信息={}", path, method, throwable.getMessage());
 
+        // 【新增】:如果是业务异常,直接提取里面的 code 和 message 透传给前端
+        if (throwable instanceof BusinessPlatfromException) {
+            BusinessPlatfromException bizEx = (BusinessPlatfromException) throwable;
+            return HttpResult.error(bizEx.getErrorCode(), bizEx.getErrorMsg());
+        }
         // 根据异常类型返回不同的错误信息
         if (throwable instanceof org.springframework.cloud.gateway.support.NotFoundException) {
             return HttpResult.error(60500, "目标服务不存在或未启动");

+ 6 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ParkingChangeStrategyUnitSaveParam.java

@@ -34,4 +34,10 @@ public class ParkingChangeStrategyUnitSaveParam extends PageReq implements Seria
     @Schema(description = "单位id")
     private List<Long> entIds;
 
+    /**
+     * 是否强制更新
+     */
+    @Schema(description = "是否强制更新")
+    private Boolean forceReplace = false;
+
 }

+ 17 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtParkingChangeStrategyUnitRepository.java

@@ -7,6 +7,7 @@ import com.sckw.transport.model.KwtParkingChargeStrategyUnit;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * @Author: 门卫车辆订单
@@ -32,4 +33,20 @@ public class KwtParkingChangeStrategyUnitRepository extends ServiceImpl<KwtParki
                         .eq(KwtParkingChargeStrategyUnit::getStrategyId, id));
     }
 
+
+    public void deleteByEntId(Set<Long> entIds) {
+        remove(
+                Wrappers.<KwtParkingChargeStrategyUnit>lambdaQuery()
+                        .in(KwtParkingChargeStrategyUnit::getEntId, entIds));
+    }
+
+
+    public List<KwtParkingChargeStrategyUnit> queryByStrategyIdAndEnt(Long strategyId, List<Long> entId) {
+        return list(
+                Wrappers.<KwtParkingChargeStrategyUnit>lambdaQuery()
+                        .ne(KwtParkingChargeStrategyUnit::getStrategyId, strategyId)
+                        .in(KwtParkingChargeStrategyUnit::getEntId, entId)
+                        .orderByDesc(KwtParkingChargeStrategyUnit::getId));
+    }
+
 }

+ 74 - 34
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/ParkingChangeStrategyService.java

@@ -26,11 +26,13 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -72,7 +74,7 @@ public class ParkingChangeStrategyService {
         Page<KwtParkingChargeStrategy> pageByStatus = parkingChangeStrategyRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
         List<KwtParkingChargeStrategy> records = pageByStatus.getRecords();
         if (CollectionUtils.isEmpty(records)) {
-            log.info("当前收费策略信息");
+            log.info("收费策略信息");
             return PageDataResult.empty(param.getPageNum(), param.getPageSize());
         }
         List<ParkingChangeStrategyResp> changeStrategyRespList = getChangeStrategyPageResult(records);
@@ -87,7 +89,8 @@ public class ParkingChangeStrategyService {
         return  Wrappers.<KwtParkingChargeStrategy>lambdaQuery()
                 .eq(param.getType() != null, KwtParkingChargeStrategy::getType, param.getType())
                 .like(StringUtils.isNotBlank(param.getStrategyName()), KwtParkingChargeStrategy::getStrategyName, param.getStrategyName())
-                .orderByDesc(KwtParkingChargeStrategy::getCreateBy);
+                .eq(KwtParkingChargeStrategy::getDelFlag, 0)
+                .orderByDesc(KwtParkingChargeStrategy::getCreateTime);
     }
 
     /**
@@ -169,18 +172,25 @@ public class ParkingChangeStrategyService {
      * 删除收费策略
      * @param id
      */
+    @Transactional(rollbackFor = Exception.class)
     public void deleteChangeStrategy(Long id) {
         log.info("删除收费策略,id:{}", id);
-        // 新增
+        // 1.s删除
         if (id == null) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_NOT_FOUND, "id不存在");
+            throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_NOT_FOUND, "id不能为空");
         }
         KwtParkingChargeStrategy changeStrategy = parkingChangeStrategyRepository.getById(id);
         if (changeStrategy == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_NOT_FOUND, "收费策略不存在");
         }
-        changeStrategy.setDelFlag(Global.YES);
-        parkingChangeStrategyRepository.updateById(changeStrategy);
+        parkingChangeStrategyRepository.removeById(changeStrategy);
+
+        // 2.删除分配公司
+        List<KwtParkingChargeStrategyUnit> strategyUnitList = parkingChangeStrategyUnitRepository.queryByStrategyId(id);
+        if (CollectionUtils.isNotEmpty(strategyUnitList)) {
+            Set<Long> ids = strategyUnitList.stream().map(KwtParkingChargeStrategyUnit::getId).collect(Collectors.toSet());
+            parkingChangeStrategyUnitRepository.removeBatchByIds(ids);
+        }
     }
 
     /**
@@ -202,8 +212,7 @@ public class ParkingChangeStrategyService {
                     resp.setEntId(unit.getEntId());
 
                     // 查询企业名称
-                    EntCacheResDto entCacheResDto = remoteSystemService.queryEntDetails(unit.getEntId());
-                    resp.setEntName(entCacheResDto.getFirmName());
+                    resp.setEntName(getEntName(unit.getEntId()));
                     return resp;
                 }).collect(Collectors.toList());
     }
@@ -214,26 +223,61 @@ public class ParkingChangeStrategyService {
      */
     public void saveChangeStrategyEnt(ParkingChangeStrategyUnitSaveParam param) {
         log.info("保存单位分配,param:{}", JSON.toJSONString(param));
-        // 如果企业id为空,删除所以的单位关联关系
+
+        // 清空逻辑
         if (CollectionUtils.isEmpty(param.getEntIds())) {
             parkingChangeStrategyUnitRepository.deleteByStrategyId(param.getStrategyId());
-        } else {
-            parkingChangeStrategyUnitRepository.deleteByStrategyId(param.getStrategyId());
-            // 构建关联表实体列表
-            List<KwtParkingChargeStrategyUnit> insertList = param.getEntIds().stream()
-                    .map(entId -> {
-                        KwtParkingChargeStrategyUnit unit = new KwtParkingChargeStrategyUnit();
-                        unit.setStrategyId(param.getStrategyId());
-                        unit.setEntId(entId);
-                        return unit;
-                    })
-                    .collect(Collectors.toList());
-
-            // 批量插入
-            parkingChangeStrategyUnitRepository.saveBatch(insertList);
+            return;
+        }
+
+        // 校验冲突
+        List<KwtParkingChargeStrategyUnit> existingRelations = parkingChangeStrategyUnitRepository.queryByStrategyIdAndEnt(param.getStrategyId(), param.getEntIds());
+        if (CollectionUtils.isNotEmpty(existingRelations) && !param.getForceReplace()) {
+            Set<Long> conflictIds = existingRelations.stream()
+                    .map(KwtParkingChargeStrategyUnit::getEntId)
+                    .collect(Collectors.toSet());
+            String conflictNames = conflictIds.stream().map(this::getEntName).collect(Collectors.joining(","));
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_SAVE_FAIL, conflictNames + "已存在策略, 是否确认替换?");
         }
+
+        // 如果是强制模式,先清理掉旧的关联关系(替换)
+        if (CollectionUtils.isNotEmpty(existingRelations) && param.getForceReplace()) {
+            Set<Long> conflictIds = existingRelations.stream()
+                    .map(KwtParkingChargeStrategyUnit::getEntId)
+                    .collect(Collectors.toSet());
+            // 删除这些单位原本关联的旧策略记录
+            parkingChangeStrategyUnitRepository.deleteByEntId(conflictIds);
+        }
+
+        // 正常流程
+        parkingChangeStrategyUnitRepository.deleteByStrategyId(param.getStrategyId());
+        List<KwtParkingChargeStrategyUnit> insertList = param.getEntIds().stream()
+                .map(entId -> {
+                    KwtParkingChargeStrategyUnit unit = new KwtParkingChargeStrategyUnit();
+                    unit.setStrategyId(param.getStrategyId());
+                    unit.setEntId(entId);
+                    return unit;
+                })
+                .collect(Collectors.toList());
+
+        // 批量插入
+        parkingChangeStrategyUnitRepository.saveBatch(insertList);
     }
 
+    /**
+     * 通过企业id查询企业名称
+     * @param entId
+     */
+    private String getEntName(Long entId) {
+        // 查询企业名称
+        EntCacheResDto entCacheResDto = remoteSystemService.queryEntDetails(entId);
+        if (entCacheResDto == null) {
+            return null;
+        }
+        return entCacheResDto.getFirmName();
+    }
+
+
     /**
      * 查询收费策略开关
      */
@@ -244,7 +288,7 @@ public class ParkingChangeStrategyService {
         resp.setStatus(Global.NO);
         KwtParkingStrategySwitch strategySwitch = parkingStrategySwitchRepository.queryParkingStrategySwitch();
         if (strategySwitch == null) {
-            return resp;
+           return resp;
         }
 
         resp.setId(strategySwitch.getId());
@@ -258,23 +302,19 @@ public class ParkingChangeStrategyService {
      * 修改收费策略开关
      */
     public void updateSwitch(ParkingStrategySwitchSaveParam param) {
-        log.info("修改收费策略开关,param:{}", JSON.toJSONString(param));
+        log.info("修改收费策略开关");
 
         KwtParkingStrategySwitch strategySwitch = parkingStrategySwitchRepository.getById(param.getId());
         if (strategySwitch == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_NOT_FOUND, "收费策略开关不存在");
         }
 
-        if (Objects.equals(param.getStatus(), Global.YES) && param.getDefaultFee() == null) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "开关打开后,默认费用不能为空");
+        if (Objects.equals(param.getStatus(), Global.YES)  && param.getDefaultFee() == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_NOT_FOUND, "开关打开后,默认费用不能为空");
         }
-        KwtParkingStrategySwitch kwtParkingStrategySwitch = new KwtParkingStrategySwitch();
-        kwtParkingStrategySwitch.setId(strategySwitch.getId());
-        kwtParkingStrategySwitch.setStatus(param.getStatus());
-        kwtParkingStrategySwitch.setDefaultFee(param.getDefaultFee());
-        parkingStrategySwitchRepository.updateById(kwtParkingStrategySwitch);
-        log.info("收费策略开关修改完成,id:{}, status:{}, defaultFee:{}",
-                kwtParkingStrategySwitch.getId(), kwtParkingStrategySwitch.getStatus(), kwtParkingStrategySwitch.getDefaultFee());
+        strategySwitch.setStatus(param.getStatus());
+        strategySwitch.setDefaultFee(param.getDefaultFee());
+        parkingStrategySwitchRepository.updateById(strategySwitch);
     }
 
     /**

+ 10 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/ParkingWalletFeeService.java

@@ -317,7 +317,16 @@ public class ParkingWalletFeeService {
                     resp.setTradeType(feeBalance.getTradeType());
                     resp.setTradeTypeDesc(WalletTypEnum.getDescByCode(feeBalance.getTradeType()));
                     resp.setPaymentType(feeBalance.getPaymentType());
-                    resp.setTradeAmount(Objects.equals(feeBalance.getPaymentType(), 1) ? feeBalance.getTradeAmount() : feeBalance.getTradeAmount().negate());
+                    // 人人工录入
+                    if (Objects.equals(feeBalance.getTradeType(), WalletTypEnum.MANUAL_ENTRY.getCode())) {
+                        resp.setTradeAmount(Objects.equals(feeBalance.getPaymentType(), 1) ? feeBalance.getTradeAmount() : feeBalance.getTradeAmount().negate());
+                    } else if (Objects.equals(feeBalance.getTradeType(), WalletTypEnum.FREEZE.getCode()) ||
+                            Objects.equals(feeBalance.getTradeType(), WalletTypEnum.CONSUME.getCode())){
+                        resp.setTradeAmount(feeBalance.getTradeAmount().negate());
+                    } else {
+                        resp.setTradeAmount(feeBalance.getTradeAmount());
+                    }
+
                     resp.setServiceFeeBalance(feeBalance.getServiceFeeBalance());
                     resp.setTradingAmount(feeBalance.getTradingAmount());
                     resp.setVoucherUrl(feeBalance.getVoucherUrl());