分账信息生成

This commit is contained in:
andy 2025-04-23 11:07:18 +08:00
parent 93e47c4233
commit a3f357ba55
27 changed files with 876 additions and 84 deletions

View File

@ -15,7 +15,7 @@ import com.evotech.hd.authorization.service.ResourceService;
import com.evotech.hd.authorization.utils.LoginRequesHeadertUtil;
import com.evotech.hd.authorization.utils.Oauth2AccessTokenUtil;
import com.evotech.hd.authorization.utils.TokenUtil;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.Dto.ResponseUtil;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.entity.LoginCacheInfo;
import com.evotech.hd.common.core.entity.Result;
@ -178,59 +178,47 @@ public class LoginServiceImpl implements LoginService {
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_AUTH_USER_UID+":"+user.getPkId(), user.getUid());
//如果是运营方的类型账号
String pkIds = "-1", codes="-1";
if(Integer.valueOf(2).equals(user.getType())){
if(rcodeList.contains(HDConstant.OPERATOR_ROLE_CODE)){
BaseResponse<List<BatteryStation>> result = cloudService.loadBatteryStation(user.getBusinessCode());
if(CodeMsg.SUCCESS.getCode().equals(result.getCode())){
List<BatteryStation> list = result.getData();
if(CollectionUtils.isNotEmpty(list)){
pkIds = list.stream().map(BatteryStation::getPkId).map(String::valueOf).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
codes = list.stream().map(BatteryStation::getCode).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
}
if(Integer.valueOf(2).equals(user.getType())) {
if (rcodeList.contains(HDConstant.OPERATOR_ROLE_CODE)) {
List<BatteryStation> list = ResponseUtil.getValue(cloudService.loadBatteryStation(user.getBusinessCode()));
if (CollectionUtils.isNotEmpty(list)) {
pkIds = list.stream().map(BatteryStation::getPkId).map(String::valueOf).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
codes = list.stream().map(BatteryStation::getCode).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
}
}else{
} else {
//不是运营商管理角色
// 检查当前角色的站点信息
BaseResponse<List<AuthUserStation>> result = resourceService.loadBatteryStation(user.getUid());
if(CodeMsg.SUCCESS.getCode().equals(result.getCode())){
List<AuthUserStation> list = result.getData();
if(CollectionUtils.isNotEmpty(list)){
pkIds = list.stream().map(AuthUserStation::getStationId).map(String::valueOf).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
codes = list.stream().map(AuthUserStation::getStationCode).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
}
List<AuthUserStation> list = ResponseUtil.getValue(resourceService.loadBatteryStation(user.getUid()));
if (CollectionUtils.isNotEmpty(list)) {
pkIds = list.stream().map(AuthUserStation::getStationId).map(String::valueOf).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
codes = list.stream().map(AuthUserStation::getStationCode).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
}
}
}
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_PROXY_CODE+":"+user.getPkId(), user.getBusinessCode());
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_STATION_ID+":"+user.getPkId(), pkIds);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_STATION_CODE+":"+user.getPkId(), codes);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_PROXY_CODE + ":" + user.getPkId(), user.getBusinessCode());
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_STATION_ID + ":" + user.getPkId(), pkIds);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_STATION_CODE + ":" + user.getPkId(), codes);
//客户角色
String companyId="-1", companyCode="-1", carIds="-1", carPlateNums="-1";
if(Integer.valueOf(3).equals(user.getType())){
BaseResponse<Company> companyResult = cloudService.loadCompany(user.getBusinessCode());
if(rcodeList.contains(HDConstant.COMPANY_ROLE_CODE)){
if(CodeMsg.SUCCESS.getCode().equals(companyResult.getCode())){
Company company = companyResult.getData();
if(!ObjectUtils.isEmpty(company)){
companyId = String.valueOf(company.getPkId());
companyCode = company.getCcode();
BaseResponse<List<VehicleInfo>> vehicleInfoResult = cloudService.loadVehicleInfo(company.getCcode());
if(CodeMsg.SUCCESS.getCode().equals(vehicleInfoResult.getCode())){
List<VehicleInfo> list = vehicleInfoResult.getData();
if(CollectionUtils.isNotEmpty(list)){
carIds = list.stream().map(VehicleInfo::getPkId).map(String::valueOf).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
carPlateNums = list.stream().map(VehicleInfo::getPlateNum).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
}
}
String companyId = "-1", companyCode = "-1", carIds = "-1", carPlateNums = "-1";
if (Integer.valueOf(3).equals(user.getType())) {
if (rcodeList.contains(HDConstant.COMPANY_ROLE_CODE)) {
Company company = ResponseUtil.getValue(cloudService.loadCompany(user.getBusinessCode()));
if (!ObjectUtils.isEmpty(company)) {
companyId = String.valueOf(company.getPkId());
companyCode = company.getCcode();
List<VehicleInfo> list = ResponseUtil.getValue(cloudService.loadVehicleInfo(company.getCcode()));
if (CollectionUtils.isNotEmpty(list)) {
carIds = list.stream().map(VehicleInfo::getPkId).map(String::valueOf).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
carPlateNums = list.stream().map(VehicleInfo::getPlateNum).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
}
}
}
}
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_COMPANY_ID+":"+user.getPkId(), companyId);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_COMPANY_CODE+":"+user.getPkId(), companyCode);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_CAR_ID+":"+user.getPkId(), carIds);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_CAR_CODE+":"+user.getPkId(), carPlateNums);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_COMPANY_ID + ":" + user.getPkId(), companyId);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_COMPANY_CODE + ":" + user.getPkId(), companyCode);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_CAR_ID + ":" + user.getPkId(), carIds);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_CAR_CODE + ":" + user.getPkId(), carPlateNums);
return uv;

View File

@ -0,0 +1,26 @@
package com.evotech.hd.common.core.Dto;
import com.evotech.hd.common.core.enums.CodeMsg;
import lombok.extern.slf4j.Slf4j;
/**
*
*
* @ClassName:ResponseUtil
* @date: 2025年04月22日 16:38
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Slf4j
public class ResponseUtil {
public static <T> T getValue(BaseResponse<T> result){
if(CodeMsg.SUCCESS.getCode().equals(result.getCode())){
return result.getData();
}
log.error("当前请求出现异常{}", result.getMsg());
return null;
}
}

View File

@ -0,0 +1,97 @@
package com.evotech.hd.common.core.entity.cloud;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 分账表
* @ClassName:IndependentAccount
* @date: 2025年04月22日 11:46
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
@TableName(value = "yt_t_independent_account", schema = "hd_cloud_manage")
public class IndependentAccount {
@TableId(value = "pk_id", type = IdType.AUTO)
@Hidden
private Integer pkId;
/***
* 运营商id
*/
private Integer porxyId;
/***
* 运营商Code
*/
private String porxyCode;
/***
* 运营商名称
*/
private String porxyName;
/***
* 订单数量
*/
private Integer orderCount;
/***
* 分账总金额
*/
private Double accountTotalAmount;
/***
* 应分金额
*/
private Double orderTotalAmount;
/***
* 税点金额()
*/
private Double taxPointTotalAmount;
/***
* 手续费
* 当前商户承担的手续费
* 应分金额/提现总额*总手续费=当前商户承担手续费
*/
private Double handlingFee;
/***
* 手续费
* 当前操作产生的所有手续费
*/
private Double totalHandlingFee;
/***
* 实分金额
*/
private Double totalAmount;
/***
* 分账开始时间
*/
private Date independentAccountBegin;
/***
* 分账结束时间
*/
private Date independentAccountEnd;
/***
* 分账状态 0待分账. 1已分账
*/
private Integer status;
/***
* 分账人uid
*/
private String creater;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private Date ctime;
}

View File

@ -0,0 +1,58 @@
package com.evotech.hd.common.core.entity.cloud;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 分账详情表
* @ClassName:IndependentAccountDetail
* @date: 2025年04月22日 11:58
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
@TableName(value = "yt_t_independent_account_detail", schema = "hd_cloud_manage")
public class IndependentAccountDetail {
@TableId(value = "pk_id", type = IdType.AUTO)
@Hidden
private Integer pkId;
/***
* 分账表id
*/
private Integer independentAccountId;
/***
* 订单Id
*/
private Integer orderId;
/***
* 订单号
*/
private String orderNo;
/***
* 订单金额
*/
private Double orderAmount;
/***
* 税点Id
*/
private Integer taxPointId;
/***
* 税点金额
*/
private Double taxPointAmount;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private Date ctime;
}

View File

@ -0,0 +1,52 @@
package com.evotech.hd.common.core.entity.cloud;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 税点表
* @ClassName:TaxPoint
* @date: 2025年04月22日 11:28
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
@TableName(value = "yt_t_tax_point", schema = "hd_cloud_manage")
public class TaxPoint {
@TableId(value = "pk_id", type = IdType.AUTO)
@Hidden
private Integer pkId;
/***
* 税点金额
*/
private Double taxPoint;
/***
* 税点金额, 具体参考 数据字典TAX_POINT
*/
private String taxPointRatio;
/***
* 订单id
*/
private Integer orderId;
/***
* 订单号
*/
private String orderNo;
/***
* 订单金额
*/
private Double orderAmount;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private Date ctime;
}

View File

@ -0,0 +1,43 @@
package com.evotech.hd.cloud.controller;
import com.evotech.hd.cloud.entity.request.IndependentAccountRequest;
import com.evotech.hd.cloud.service.IndependentAccountService;
import com.evotech.hd.common.core.entity.Result;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
*
*
* @ClassName:IndependentAccountController
* @date: 2025年04月23日 8:43
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Tag(name = "分账管理")
@ApiSupport(order = 60)
@RestController
@RequestMapping("/independent/account")
public class IndependentAccountController {
@Resource
IndependentAccountService independentAccountService;
@Operation(summary = "查询")
@GetMapping("/list")
@ApiOperationSupport(order = 4)
public Result<Map<String, Object>> list(@ParameterObject IndependentAccountRequest params) {
return independentAccountService.pageList(params);
}
}

View File

@ -0,0 +1,27 @@
package com.evotech.hd.cloud.controller.adapter;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @desc: 第三方推送请求
* @ClassName:DHNoticeController
* @date: 2025年04月19日 11:10
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@RestController
@RequestMapping("/notice")
public class NoticeController {
@PostMapping("/dh")
public void dh(@RequestParam String info) {
System.out.println(info);
}
}

View File

@ -0,0 +1,24 @@
package com.evotech.hd.cloud.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.entity.request.IndependentAccountRequest;
import com.evotech.hd.common.core.entity.cloud.IndependentAccount;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 分账DAO接口
* @ClassName:IndependentAccountDao
* @date: 2025年04月22日 16:16
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface IndependentAccountDao extends BaseMapper<IndependentAccount> {
List<IndependentAccount> pageList(Page<IndependentAccount> page, @Param("params") IndependentAccountRequest params);
IndependentAccount countAmount(@Param("params") IndependentAccountRequest params);
}

View File

@ -0,0 +1,16 @@
package com.evotech.hd.cloud.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.evotech.hd.common.core.entity.cloud.IndependentAccountDetail;
/**
* 接口
*
* @ClassName:IndependentAccountDetailDao
* @date: 2025年04月22日 17:19
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface IndependentAccountDetailDao extends BaseMapper<IndependentAccountDetail> {
}

View File

@ -0,0 +1,15 @@
package com.evotech.hd.cloud.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.evotech.hd.common.core.entity.cloud.TaxPoint;
/**
* 接口
* @ClassName:TaxPoint
* @date: 2025年04月22日 13:42
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface TaxPointDao extends BaseMapper<TaxPoint> {
}

View File

@ -0,0 +1,27 @@
package com.evotech.hd.cloud.entity.request;
import com.evotech.hd.common.core.entity.BasePageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 分账管理请求参数类
*
* @ClassName:IndependentAccountRequest
* @date: 2025年04月23日 10:02
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
@Schema(name = "分账管理请求参数", hidden = true)
@EqualsAndHashCode(callSuper=false)
public class IndependentAccountRequest extends BasePageRequest {
@Schema(description = "分账状态")
private Integer status;
@Schema(description = "运营商ID")
private Integer porxyId;
}

View File

@ -12,14 +12,13 @@ import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
@Component
//@Component
@Order(value = 20)
@Slf4j
public class MqttConnectInit implements ApplicationRunner {

View File

@ -0,0 +1,17 @@
package com.evotech.hd.cloud.service;
import com.evotech.hd.common.core.entity.cloud.TaxPoint;
/**
* 分账详情接口
*
* @ClassName:IndependentAccountDetailService
* @date: 2025年04月22日 17:17
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface IndependentAccountDetailService {
void addIndependentAccountDetail(TaxPoint taxPoint, Integer independentAccountId);
}

View File

@ -0,0 +1,23 @@
package com.evotech.hd.cloud.service;
import com.evotech.hd.cloud.entity.request.IndependentAccountRequest;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.TaxPoint;
import java.util.Map;
/**
* 分账接口
* @ClassName:IndependentAccountService
* @date: 2025年04月22日 16:13
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface IndependentAccountService {
void addIndependentAccount(TaxPoint taxPoint, String stationCode);
public Result<Map<String, Object>> pageList(IndependentAccountRequest params);
}

View File

@ -0,0 +1,24 @@
package com.evotech.hd.cloud.service;
/**
* 接口
*
* @ClassName:TaxPointService
* @date: 2025年04月22日 13:29
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface TaxPointService {
/***
* 新增税点信息,
* @param orderId 订单Id
* @param orderNo 订单编号
* @param totalAmount 订单金额
* @param stationCode 换电站编码
*/
void addTaxPoint(Integer orderId, String orderNo, Double totalAmount, String stationCode);
}

View File

@ -6,12 +6,11 @@ import com.evotech.hd.cloud.device.dh.DHRequestUtil;
import com.evotech.hd.cloud.service.BatteryStationService;
import com.evotech.hd.cloud.service.DHDeviceService;
import com.evotech.hd.cloud.service.rpc.ResourceService;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.Dto.DeviceDto;
import com.evotech.hd.common.core.Dto.ResponseUtil;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.resource.ProxyOperater;
import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.utils.Collections;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@ -44,9 +43,9 @@ public class DHDeviceServiceImpl implements DHDeviceService {
@Override
public Result<List<DeviceDto>> findList() {
List<DeviceDto> result = new ArrayList<>();
BaseResponse<List<ProxyOperater>> proxyResult = resourceService.deviceList();
if(CodeMsg.SUCCESS.getCode().equals(proxyResult.getCode())){
proxyResult.getData().forEach(proxy ->{
List<ProxyOperater> proxyResult = ResponseUtil.getValue(resourceService.deviceList());
if(Collections.isNotEmpty(proxyResult)){
proxyResult.forEach(proxy ->{
result.add(new DeviceDto(proxy.getPocode(),"0", proxy.getPoname(),"","", buildStation(proxy.getPocode())));
});
}

View File

@ -0,0 +1,45 @@
package com.evotech.hd.cloud.service.impl;
import com.alibaba.fastjson.JSON;
import com.evotech.hd.cloud.dao.IndependentAccountDetailDao;
import com.evotech.hd.cloud.service.IndependentAccountDetailService;
import com.evotech.hd.common.core.entity.cloud.IndependentAccountDetail;
import com.evotech.hd.common.core.entity.cloud.TaxPoint;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 分账详情接口实现类
*
* @ClassName:IndependentAccountDetailServiceImpl
* @date: 2025年04月22日 17:18
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
@Slf4j
public class IndependentAccountDetailServiceImpl implements IndependentAccountDetailService {
@Resource
IndependentAccountDetailDao independentAccountDetailDao;
@Override
public void addIndependentAccountDetail(TaxPoint taxPoint, Integer independentAccountId) {
try {
IndependentAccountDetail detail = new IndependentAccountDetail();
detail.setOrderId(taxPoint.getOrderId());
detail.setOrderNo(taxPoint.getOrderNo());
detail.setOrderAmount(taxPoint.getOrderAmount());
detail.setTaxPointId(taxPoint.getPkId());
detail.setTaxPointAmount(taxPoint.getTaxPoint());
detail.setIndependentAccountId(independentAccountId);
independentAccountDetailDao.insert(detail);
} catch (Exception e) {
log.error("生成分账详情表出现错误, 税点信息为:{}; 分账ID为:{}, 错误信息为:{}", JSON.toJSONString(taxPoint), independentAccountId, e.getMessage());
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,125 @@
package com.evotech.hd.cloud.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.dao.BatteryStationDao;
import com.evotech.hd.cloud.dao.IndependentAccountDao;
import com.evotech.hd.cloud.entity.request.IndependentAccountRequest;
import com.evotech.hd.cloud.service.IndependentAccountDetailService;
import com.evotech.hd.cloud.service.IndependentAccountService;
import com.evotech.hd.cloud.service.rpc.ResourceService;
import com.evotech.hd.common.core.Dto.ResponseUtil;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.entity.cloud.IndependentAccount;
import com.evotech.hd.common.core.entity.cloud.TaxPoint;
import com.evotech.hd.common.core.entity.resource.ProxyOperater;
import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.utils.Collections;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 分账接口实现类
*
* @ClassName:IndependentAccountServiceImpl
* @date: 2025年04月22日 16:15
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
@Slf4j
public class IndependentAccountServiceImpl implements IndependentAccountService {
@Resource
IndependentAccountDao independentAccountDao;
@Resource
private BatteryStationDao batteryStationDao;
@Resource
private ResourceService resourceService;
@Resource
IndependentAccountDetailService independentAccountDetailService;
@Override
public void addIndependentAccount(TaxPoint taxPoint, String stationCode) {
try {
//获取没有删除的站点信息
BatteryStation batteryStation = batteryStationDao.selectOne(new LambdaQueryWrapper<BatteryStation>().eq(BatteryStation::getCode, stationCode).eq(BatteryStation::getDelFlag, 0).select(BatteryStation::getProxyId), false);
if(ObjectUtils.isEmpty(batteryStation)){
log.error("未找到对应的站点信息. 站点code{}", stationCode);
return;
}
ProxyOperater proxyOperater = ResponseUtil.getValue(resourceService.basicInfo(batteryStation.getProxyId()));
if(ObjectUtils.isEmpty(proxyOperater)){
log.error("未找到对应的运营商信息. 站点code{}", stationCode);
return;
}
IndependentAccount independentAccount = independentAccountDao.selectOne(new LambdaQueryWrapper<IndependentAccount>().eq(IndependentAccount::getPorxyId, proxyOperater.getPkId()).eq(IndependentAccount::getStatus, 0), false);
if(ObjectUtils.isEmpty(proxyOperater)){
independentAccount = new IndependentAccount();
independentAccount.setIndependentAccountBegin(new Date());
independentAccount.setStatus(0);
}
//更新信息
independentAccount.setPorxyId(proxyOperater.getPkId());
independentAccount.setPorxyCode(proxyOperater.getPocode());
independentAccount.setPorxyName(proxyOperater.getPoname());
independentAccount.setOrderCount(calculate(independentAccount.getOrderCount(), 1));
independentAccount.setOrderTotalAmount(calculate(independentAccount.getOrderTotalAmount(), taxPoint.getOrderAmount()));
independentAccount.setTaxPointTotalAmount(calculate(independentAccount.getTaxPointTotalAmount(), taxPoint.getTaxPoint()));
independentAccount.setTotalAmount(calculate(independentAccount.getTotalAmount(), new BigDecimal(taxPoint.getOrderAmount()).subtract(new BigDecimal(taxPoint.getTaxPoint())).doubleValue()));
int up = 0;
//如果为空, 则新增
if(independentAccount.getPkId() == null){
up = independentAccountDao.insert(independentAccount);
}else{
//不为空, 修改
up = independentAccountDao.updateById(independentAccount);
}
//修改或者新增成功, 处理详情信息
if(up > 0){
independentAccountDetailService.addIndependentAccountDetail(taxPoint, independentAccount.getPkId());
}
} catch (Exception e) {
log.error("生成分账表出现错误, 税点信息为:{}; 站点CODE为:{}, 错误信息为:{}", JSON.toJSONString(taxPoint), stationCode, e.getMessage());
e.printStackTrace();
}
}
@Override
public Result<Map<String, Object>> pageList(IndependentAccountRequest params) {
Page<IndependentAccount> page = new Page<IndependentAccount>(params.getPageNo(), params.getPageSize());
List<IndependentAccount> list = independentAccountDao.pageList(page, params);
if (list.isEmpty()) {
return new Result<Map<String, Object>>().error(CodeMsg.DATABASE_RESULT_NULL);
}
IndependentAccount totalAmount = independentAccountDao.countAmount(params);
return new Result<Map<String, Object>>().success(Collections.asMap("pageList", page.setRecords(list), "totalAmount", totalAmount));
}
private static <T> T calculate(T baseNum, T addNum){
BigDecimal va = new BigDecimal(String.valueOf((ObjectUtils.isEmpty(baseNum) ? 0 : baseNum))).add(new BigDecimal(String.valueOf(addNum)));
if(baseNum instanceof Integer){
return (T)Integer.valueOf(va.intValue());
}
if(baseNum instanceof Double){
return (T)Double.valueOf(va.doubleValue());
}
return baseNum;
}
}

View File

@ -0,0 +1,80 @@
package com.evotech.hd.cloud.service.impl;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evotech.hd.cloud.dao.TaxPointDao;
import com.evotech.hd.cloud.service.IndependentAccountService;
import com.evotech.hd.cloud.service.TaxPointService;
import com.evotech.hd.cloud.service.rpc.ResourceService;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.TaxPoint;
import com.evotech.hd.common.core.entity.resource.dict.Dict;
import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.utils.Collections;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
/**
* 税点表serviceImpl
* @ClassName:TaxPointServiceImpl
* @date: 2025年04月22日 13:41
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Slf4j
@Service
public class TaxPointServiceImpl implements TaxPointService {
@Resource
TaxPointDao taxPointDao;
@Resource
private ResourceService resourceService;
@Resource
IndependentAccountService independentAccountService;
@Override
public void addTaxPoint(Integer orderId, String orderNo, Double totalAmount, String stationCode) {
try {
//检查当前订单是否生成过税点信息
if(taxPointDao.exists(new LambdaQueryWrapper<TaxPoint>().eq(TaxPoint::getOrderId, orderId).eq(TaxPoint::getOrderNo, orderNo).select(TaxPoint::getPkId))){
log.error("当前订单信息的税点信息已经存在; 订单ID{}, 订单编号{}, 订单金额{}, 站点CODE:{};", orderId, orderNo, totalAmount, stationCode);
return;
}
//设置默认税点比例为3%
String taxPointRatio = "3";
//获取税点比例信息
Result<List<Dict>> res = resourceService.listDict("TAX_POINT");
if (CodeMsg.SUCCESS.getCode().equals(res.getCode())) {
List<Dict> list = JSONUtil.toList(JSONUtil.parseArray(res.getData()), Dict.class);
if(Collections.isNotEmpty(list)){
taxPointRatio = list.get(0).getDictValue();
}
}
//计算税点金额
Double taxPointAmount = new BigDecimal(taxPointRatio).divide(new BigDecimal(100)).multiply(new BigDecimal(totalAmount)).doubleValue();
TaxPoint taxPoint = new TaxPoint();
taxPoint.setTaxPoint(taxPointAmount);
taxPoint.setTaxPointRatio(taxPointRatio);
taxPoint.setOrderId(orderId);
taxPoint.setOrderNo(orderNo);
taxPoint.setOrderAmount(totalAmount);
log.info("记录订单的税点信息:{}", JSON.toJSONString(taxPoint));
if(taxPointDao.insert(taxPoint) > 0){
//生成待分账信息
independentAccountService.addIndependentAccount(taxPoint, stationCode);
}
} catch (Exception e) {
log.error("生成税点信息出现错误, 订单ID{}, 订单编号{}, 订单金额{}, 站点CODE:{}, 错误信息:{};", orderId, orderNo, totalAmount, stationCode, e.getMessage());
e.printStackTrace();
}
}
}

View File

@ -1,27 +1,23 @@
package com.evotech.hd.cloud.service.newthread;
import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.evotech.hd.cloud.dao.WalletAccountDao;
import com.evotech.hd.cloud.dao.WalletAccountDetailDao;
import com.evotech.hd.cloud.service.TaxPointService;
import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao;
import com.evotech.hd.common.core.dao.cloud.PreOrderRelationSwapOrderDao;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery;
import com.evotech.hd.common.core.entity.cloud.PreOrderRelationSwapOrder;
import com.evotech.hd.common.core.entity.cloud.TradeDetail;
import com.evotech.hd.common.core.entity.cloud.WalletAccount;
import com.evotech.hd.common.core.entity.cloud.WalletAccountDetail;
import com.evotech.hd.common.core.entity.cloud.*;
import com.evotech.hd.common.core.enums.OrderStatusEnums;
import com.evotech.hd.common.core.enums.TradeResultEnums;
import com.evotech.hd.common.core.enums.WechatPayApiTypeEnums;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Service
@Slf4j
@ -37,9 +33,11 @@ public class WechatPayNotifyHandleService {
private OrderSwapBatteryDao orderSwapBatteryDao;
@Resource
private PreOrderRelationSwapOrderDao preOrderRelationSwapOrderDao;
// @Async("taskExecutor")
@Resource
TaxPointService taxPointService;
// @Async("taskExecutor")
public void payNotifyBussinessHandle(TradeDetail tradeDetail) {
if (tradeDetail.getTradeType() == 1) {
// 充值
@ -107,7 +105,13 @@ public class WechatPayNotifyHandleService {
if (TradeResultEnums.SUCCESS.getName().equals(tradeDetail.getPayResult())) {
// 支付成功修改订单
afterPayAlterOrder(tradeDetail, one);
// 发送公众号消息
//税点信息记录
try {
taxPointService.addTaxPoint(one.getPkId(), one.getOrderNo(), Double.valueOf(one.getAmount()), one.getStationCode());
} catch (Exception e) {
log.error("jsapiPay=====生成税点信息异常,订单信息{}; 异常信息{}", JSON.toJSONString(one), e.getMessage());
}
// 发送公众号消息
templateMessageService.orderMessageSend(one, 3);
}
} else {
@ -133,7 +137,20 @@ public class WechatPayNotifyHandleService {
orderSwapBatteryDao.update(new UpdateWrapper<OrderSwapBattery>().in("pk_id", idList)
.set("status", OrderStatusEnums.FINISH.getCode())
.set("trade_no", tradeDetail.getOutTradeNo()));
// 发送公众号消息发给企业绑定的微信号
try {
orderList.stream().forEach(order->{
//税点信息记录
try {
taxPointService.addTaxPoint(order.getPkId(), order.getOrderNo(), Double.valueOf(order.getAmount()), order.getStationCode());
} catch (Exception e) {
log.error("生成税点信息异常,订单信息{}; 异常信息{}", JSON.toJSONString(order), e.getMessage());
}
});
} catch (Exception e) {
log.error("nativePay 生成税点信息异常,异常信息{}", e.getMessage());
}
// 发送公众号消息发给企业绑定的微信号
// templateMessageService.orderMessageSend(one, 3);
}

View File

@ -13,8 +13,8 @@ import java.util.List;
@FeignClient(name = "${RESOURCE-SERVER-API-NAME}", path = "${RESOURCE-SERVER-API-PATH}")
public interface ResourceService {
@GetMapping(value = "/dict/listdict",
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public Result<List<Dict>> listDict(@RequestParam String typeCode);
@ -22,5 +22,8 @@ public interface ResourceService {
@GetMapping(value = "/proxyoperater/device/list",
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public BaseResponse<List<ProxyOperater>> deviceList();
@GetMapping(value = "/proxyoperater/basic/info",
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public BaseResponse<ProxyOperater> basicInfo(@RequestParam String proxyCode);
}

View File

@ -0,0 +1,76 @@
<?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.evotech.hd.cloud.dao.IndependentAccountDao">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.evotech.hd.common.core.entity.cloud.IndependentAccount">
<id column="pk_id" property="pkId" />
<result column="proxy_id" property="proxyId" />
<result column="porxy_code" property="porxyCode" />
<result column="porxy_name" property="porxyName" />
<result column="order_count" property="orderCount" />
<result column="account_total_amount" property="accountTotalAmount" />
<result column="order_total_amount" property="orderTotalAmount" />
<result column="tax_point_total_amount" property="taxPointTotalAmount" />
<result column="total_amount" property="totalAmount" />
<result column="handling_fee" property="handlingFee" />
<result column="total_handling_fee" property="totalHandlingFee" />
<result column="independent_account_begin" property="independentAccountBegin" />
<result column="independent_account_end" property="independentAccountEnd" />
<result column="status" property="status" />
<result column="ctime" property="ctime" />
<result column="creater" property="creater" />
</resultMap>
<select id="pageList" resultMap="BaseResultMap">
select
account.pk_id,
account.proxy_id,
account.porxy_name,
ifnull(account.order_count, 0) as order_count,
ifnull(account.account_total_amount, 0) as account_total_amount,
ifnull(account.order_total_amount, 0) as order_total_amount,
ifnull(account.tax_point_total_amount, 0) as tax_point_total_amount,
ifnull(account.total_amount, 0) as total_amount,
ifnull(account.handling_fee, 0) as handling_fee,
ifnull(account.total_handling_fee, 0) as total_handling_fee,
account.independent_account_begin,
account.independent_account_end,
account.status
from hd_resource.yt_t_proxy_operater proxy
left join yt_t_independent_account account on account.porxy_id = proxy.pk_id
where
account.status = #{params.status}
<if test="params.proxyId != null ">
and account.proxy_id = #{params.proxyId}
</if>
order by account.pk_id desc
</select>
<select id="countAmount" resultMap="BaseResultMap">
select
account.pk_id,
account.proxy_id,
account.porxy_name,
sum(ifnull(account.order_count, 0)) as order_count,
sum(ifnull(account.account_total_amount, 0)) as account_total_amount,
sum(ifnull(account.order_total_amount, 0)) as order_total_amount,
sum(ifnull(account.tax_point_total_amount, 0)) as tax_point_total_amount,
sum(ifnull(account.total_amount, 0)) as total_amount,
sum(ifnull(account.handling_fee, 0)) as handling_fee,
sum(ifnull(account.total_handling_fee, 0)) as total_handling_fee,
account.independent_account_begin,
account.independent_account_end,
account.status
from hd_resource.yt_t_proxy_operater proxy
left join yt_t_independent_account account on account.porxy_id = proxy.pk_id
where
account.status = #{params.status}
<if test="params.proxyId != null ">
and account.proxy_id = #{params.proxyId}
</if>
order by account.pk_id desc
</select>
</mapper>

View File

@ -12,10 +12,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -57,11 +54,17 @@ public class ProxyOperaterController {
return proxyOperaterService.list(plpor);
}
@Operation(summary = "查询")
@GetMapping("/device/list")
@ApiOperationSupport(order = 4)
public BaseResponse<List<ProxyOperater>> deviceList() {
return proxyOperaterService.deviceList();
}
@GetMapping("/basic/info")
public BaseResponse<ProxyOperater> basicInfo(@RequestParam String proxyCode) {
return proxyOperaterService.basicInfo(proxyCode);
}
}

View File

@ -18,4 +18,6 @@ public interface ProxyOperaterService {
public Result<List<ProxyOperater>> list(PageListProxyOperaterRequest plpor);
public BaseResponse<List<ProxyOperater>> deviceList();
BaseResponse<ProxyOperater> basicInfo(String proxyCode);
}

View File

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.Dto.ResponseUtil;
import com.evotech.hd.common.core.dao.resource.ProxyOperaterDao;
import com.evotech.hd.common.core.dao.resource.auth.AuthUserDao;
import com.evotech.hd.common.core.dao.resource.auth.AuthUserRoleDao;
@ -18,6 +19,7 @@ import com.evotech.hd.common.core.entity.resource.auth.AuthUser;
import com.evotech.hd.common.core.entity.resource.auth.AuthUserRole;
import com.evotech.hd.common.core.entity.resource.auth.AuthUserStation;
import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.utils.Collections;
import com.evotech.hd.common.core.utils.SnowflakeUtil;
import com.evotech.hd.common.permission.util.RedisPermissionUtils;
import com.evotech.hd.resource.entity.request.ListUserRequest;
@ -131,9 +133,9 @@ public class AuthUserServiceImpl implements AuthUserService {
}
Map<String, String> businessNames = proxyOperaterDao.selectList(new LambdaQueryWrapper<ProxyOperater>().select(ProxyOperater::getPocode, ProxyOperater::getPoname)).stream().collect(Collectors.toMap(ProxyOperater::getPocode, ProxyOperater::getPoname, (k1, k2)->k1));
BaseResponse<List<Company>> companyResult = cloudService.resourceCompanyList();
if(CodeMsg.SUCCESS.getCode().equals(companyResult.getCode())){
businessNames.putAll(companyResult.getData().stream().collect(Collectors.toMap(Company::getCcode, Company::getCname, (k1,k2)->k1)));
List<Company> companyList = ResponseUtil.getValue(cloudService.resourceCompanyList());
if(Collections.isNotEmpty(companyList)){
businessNames.putAll(companyList.stream().collect(Collectors.toMap(Company::getCcode, Company::getCname, (k1,k2)->k1)));
}
page.getRecords().stream().forEach(user ->{
if(StringUtils.hasText(user.getBusinessCode())){
@ -176,9 +178,8 @@ public class AuthUserServiceImpl implements AuthUserService {
@Override
public Result<Integer> addUserStation(String stationIds, String uid) {
BaseResponse<List<BatteryStation>> result = cloudService.resourceList(stationIds);
if(CodeMsg.SUCCESS.getCode().equals(result.getCode())){
List<BatteryStation> stationlist = result.getData();
List<BatteryStation> stationlist = ResponseUtil.getValue(cloudService.resourceList(stationIds));
if(Collections.isNotEmpty(stationlist)){
if(!CollectionUtils.isEmpty(stationlist)){
List<AuthUserStation> list = new ArrayList<AuthUserStation>();
for (BatteryStation station : stationlist) {

View File

@ -76,4 +76,9 @@ public class ProxyOperaterServiceImpl implements ProxyOperaterService {
return new BaseResponse<List<ProxyOperater>>().success(proxyOperaterDao.selectList(new LambdaQueryWrapper<ProxyOperater>().eq(ProxyOperater::getStatus, 1).eq(ProxyOperater::getDelFlag, 0).select(ProxyOperater::getPkId, ProxyOperater::getPoname,ProxyOperater::getPocode)));
}
@Override
public BaseResponse<ProxyOperater> basicInfo(String proxyCode) {
return new BaseResponse<ProxyOperater>().success(proxyOperaterDao.selectOne(new LambdaQueryWrapper<ProxyOperater>().eq(ProxyOperater::getPocode, proxyCode).select(ProxyOperater::getPkId, ProxyOperater::getPoname,ProxyOperater::getPocode), false));
}
}

View File

@ -5,7 +5,7 @@ import cn.hutool.core.util.StrUtil;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.Dto.ResponseUtil;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.dao.resource.ProxyOperaterDao;
import com.evotech.hd.common.core.dao.resource.auth.AuthRoleDao;
@ -138,9 +138,9 @@ public class RoleServiceImpl implements RoleService {
return new Result<List<AuthRole>>().error(CodeMsg.DATABASE_RESULT_NULL);
}
Map<String, String> businessNames = proxyOperaterDao.selectList(new LambdaQueryWrapper<ProxyOperater>().select(ProxyOperater::getPocode, ProxyOperater::getPoname)).stream().collect(Collectors.toMap(ProxyOperater::getPocode, ProxyOperater::getPoname, (k1,k2)->k1));
BaseResponse<List<Company>> companyResult = cloudService.resourceCompanyList();
if(CodeMsg.SUCCESS.getCode().equals(companyResult.getCode())){
businessNames.putAll(companyResult.getData().stream().collect(Collectors.toMap(Company::getCcode, Company::getCname, (k1,k2)->k1)));
List<Company> companyList = ResponseUtil.getValue(cloudService.resourceCompanyList());
if(CollectionUtils.isNotEmpty(companyList)){
businessNames.putAll(companyList.stream().collect(Collectors.toMap(Company::getCcode, Company::getCname, (k1,k2)->k1)));
}
roleList.stream().forEach(role ->{
if(StringUtils.hasText(role.getBusinessCode())){