提交 b984f66e authored 作者: huyufan's avatar huyufan

网络货运钱包相关

上级 41c8989f
package com.clx.performance.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Optional;
@Getter
@AllArgsConstructor
@SuppressWarnings("all")
public enum NetworkDriverAccountEnum {
;
@Getter
@AllArgsConstructor
public enum RunningWaterStatus {
SETTLEMENT(10, "运单结算"),
CASE_OUT_FROZEN(20, "提现冻结"),
CASE_OUT_SUCCESS(30, "提现成功"),
;
private final Integer code;
private final String msg;
public static Optional<NetworkDriverAccountEnum.RunningWaterStatus> getByCode(int code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public Integer getCode() {
return this.code;
}
public String getMsg() {
return this.msg;
}
}
@Getter
@AllArgsConstructor
public enum FundType {
INCOME(10, "收入"),
FROZEN(20, "冻结"),
EXPENDITURE(30, "支出"),
;
private final Integer code;
private final String msg;
public static Optional<NetworkDriverAccountEnum.FundType> getByCode(int code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public Integer getCode() {
return this.code;
}
public String getMsg() {
return this.msg;
}
}
}
...@@ -9,8 +9,11 @@ import com.clx.performance.model.settle.NetworkDriverAccount; ...@@ -9,8 +9,11 @@ import com.clx.performance.model.settle.NetworkDriverAccount;
import com.clx.performance.param.pc.PageNetworkAccountListParam; import com.clx.performance.param.pc.PageNetworkAccountListParam;
import com.clx.performance.vo.pc.NetworkDriverAccountVO; import com.clx.performance.vo.pc.NetworkDriverAccountVO;
import com.msl.common.dao.impl.BaseDaoImpl; import com.msl.common.dao.impl.BaseDaoImpl;
import com.msl.common.utils.DateUtils;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
/** /**
* @author kavin * @author kavin
* Date 2023-12-19 * Date 2023-12-19
...@@ -24,4 +27,13 @@ public class NetworkDriverAccountDaoImpl extends BaseDaoImpl<NetworkDriverAccoun ...@@ -24,4 +27,13 @@ public class NetworkDriverAccountDaoImpl extends BaseDaoImpl<NetworkDriverAccoun
Page<NetworkDriverAccountVO> page = Page.of(param.getPage(), param.getPageSize()); Page<NetworkDriverAccountVO> page = Page.of(param.getPage(), param.getPageSize());
return baseMapper.networkAccountList(page, param); return baseMapper.networkAccountList(page, param);
} }
public Integer updateAccountCAS(NetworkDriverAccount account, LocalDateTime now, boolean flag) {
String nowStr = DateUtils.formatDateTime(now).get();
if (flag) {
return baseMapper.addAccount(account, nowStr);
} else {
return baseMapper.subAccount(account, nowStr);
}
}
} }
...@@ -8,6 +8,8 @@ import com.clx.performance.param.pc.PageNetworkAccountListParam; ...@@ -8,6 +8,8 @@ import com.clx.performance.param.pc.PageNetworkAccountListParam;
import com.clx.performance.vo.pc.NetworkDriverAccountVO; import com.clx.performance.vo.pc.NetworkDriverAccountVO;
import com.msl.common.dao.BaseDao; import com.msl.common.dao.BaseDao;
import java.time.LocalDateTime;
/** /**
* @author kavin * @author kavin
* Date 2023-12-19 * Date 2023-12-19
...@@ -17,4 +19,6 @@ public interface NetworkDriverAccountDao extends BaseDao<NetworkDriverAccountMap ...@@ -17,4 +19,6 @@ public interface NetworkDriverAccountDao extends BaseDao<NetworkDriverAccountMap
IPage<NetworkDriverAccountVO> networkAccountList(PageNetworkAccountListParam param); IPage<NetworkDriverAccountVO> networkAccountList(PageNetworkAccountListParam param);
Integer updateAccountCAS(NetworkDriverAccount account, LocalDateTime now, boolean flag);
} }
...@@ -7,7 +7,9 @@ import com.clx.performance.model.settle.NetworkDriverAccount; ...@@ -7,7 +7,9 @@ import com.clx.performance.model.settle.NetworkDriverAccount;
import com.clx.performance.param.pc.PageNetworkAccountListParam; import com.clx.performance.param.pc.PageNetworkAccountListParam;
import com.clx.performance.sqlProvider.settle.NetworkDriverAccountProvider; import com.clx.performance.sqlProvider.settle.NetworkDriverAccountProvider;
import com.clx.performance.vo.pc.NetworkDriverAccountVO; import com.clx.performance.vo.pc.NetworkDriverAccountVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider; import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.Update;
/** /**
* @author kavin * @author kavin
...@@ -18,4 +20,19 @@ public interface NetworkDriverAccountMapper extends BaseMapper<NetworkDriverAcco ...@@ -18,4 +20,19 @@ public interface NetworkDriverAccountMapper extends BaseMapper<NetworkDriverAcco
@SelectProvider(type = NetworkDriverAccountProvider.class, method = "networkAccountList") @SelectProvider(type = NetworkDriverAccountProvider.class, method = "networkAccountList")
IPage<NetworkDriverAccountVO> networkAccountList(Page<NetworkDriverAccountVO> page, PageNetworkAccountListParam param); IPage<NetworkDriverAccountVO> networkAccountList(Page<NetworkDriverAccountVO> page, PageNetworkAccountListParam param);
@Update("update network_driver_account set usable_balance = usable_balance + #{account.usableBalance}"
+ ",account_balance = account_balance + #{account.accountBalance}"
+ ",modified_time= #{now}"
+ "where id = #{account.id} and modified_time = #{account.modifiedTime}"
)
Integer addAccount(@Param("account") NetworkDriverAccount account, @Param("now") String now);
@Update("update network_driver_account set usable_balance = usable_balance - #{account.usableBalance}," +
"frozen_balance = frozen_balance + #{account.frozenBalance},account_balance = account_balance - #{account.accountBalance}," +
"modified_time=#{now}"
+ "where id = #{account.id} and modified_time = #{account.modifiedTime}"
)
Integer subAccount(@Param("account") NetworkDriverAccount account, @Param("now") String now);
} }
...@@ -8,6 +8,7 @@ import com.msl.common.config.KeyColumn; ...@@ -8,6 +8,7 @@ import com.msl.common.config.KeyColumn;
import com.msl.common.model.HasKey; import com.msl.common.model.HasKey;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Builder; import lombok.Builder;
import lombok.Data;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
...@@ -20,8 +21,7 @@ import java.time.LocalDateTime; ...@@ -20,8 +21,7 @@ import java.time.LocalDateTime;
* Date 2023-12-19 * Date 2023-12-19
* Time 11:34 * Time 11:34
*/ */
@Getter @Data
@Setter
@Accessors(chain = true) @Accessors(chain = true)
@TableName("network_driver_account") @TableName("network_driver_account")
@Builder @Builder
......
...@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName; ...@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import com.msl.common.config.KeyColumn; import com.msl.common.config.KeyColumn;
import com.msl.common.model.HasKey; import com.msl.common.model.HasKey;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
...@@ -23,6 +24,7 @@ import java.time.LocalDateTime; ...@@ -23,6 +24,7 @@ import java.time.LocalDateTime;
@Setter @Setter
@Accessors(chain = true) @Accessors(chain = true)
@TableName("network_driver_running_water_record") @TableName("network_driver_running_water_record")
@Builder
public class NetworkDriverRunningWaterRecord implements HasKey<Integer> { public class NetworkDriverRunningWaterRecord implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.AUTO)
......
package com.clx.performance.service.impl.settle; package com.clx.performance.service.impl.settle;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.component.IdGenerateSnowFlake;
import com.clx.performance.dao.settle.NetworkDriverAccountDao;
import com.clx.performance.dao.settle.NetworkDriverRunningWaterRecordDao; import com.clx.performance.dao.settle.NetworkDriverRunningWaterRecordDao;
import com.clx.performance.enums.NetworkDriverAccountEnum;
import com.clx.performance.model.settle.NetworkDriverAccount;
import com.clx.performance.model.settle.NetworkDriverRunningWaterRecord;
import com.clx.performance.param.pc.PageNetworkAccountInfoListParam; import com.clx.performance.param.pc.PageNetworkAccountInfoListParam;
import com.clx.performance.service.settle.NetworkDriverRunningWaterRecordService; import com.clx.performance.service.settle.NetworkDriverRunningWaterRecordService;
import com.clx.performance.vo.pc.NetworkDriverRunningWaterRecordVO; import com.clx.performance.vo.pc.NetworkDriverRunningWaterRecordVO;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
/** /**
* @author kavin * @author kavin
...@@ -17,12 +30,116 @@ import org.springframework.stereotype.Service; ...@@ -17,12 +30,116 @@ import org.springframework.stereotype.Service;
@Service @Service
@AllArgsConstructor @AllArgsConstructor
@Slf4j @Slf4j
public class NetworkDriverRunningWaterRecordServiceImpl implements NetworkDriverRunningWaterRecordService { public class NetworkDriverRunningWaterRecordServiceImpl implements NetworkDriverRunningWaterRecordService, InitializingBean {
private final static Map<Integer, BiConsumer<NetworkDriverAccount, BigDecimal>> strategyMap = new HashMap<>();
private final NetworkDriverRunningWaterRecordDao networkDriverRunningWaterRecordDao; private final NetworkDriverRunningWaterRecordDao networkDriverRunningWaterRecordDao;
private final NetworkDriverAccountDao networkDriverAccountDao;
private final IdGenerateSnowFlake idGenerateSnowFlake;
@Override @Override
public IPage<NetworkDriverRunningWaterRecordVO> networkDriverRunningWaterRecordList(PageNetworkAccountInfoListParam param) { public IPage<NetworkDriverRunningWaterRecordVO> networkDriverRunningWaterRecordList(PageNetworkAccountInfoListParam param) {
return networkDriverRunningWaterRecordDao.networkDriverRunningWaterRecordDao(param); return networkDriverRunningWaterRecordDao.networkDriverRunningWaterRecordDao(param);
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void generateSettlementRunningWaterRecord(NetworkDriverAccount networkDriverAccount, BigDecimal money) {
NetworkDriverAccount build = NetworkDriverAccount.builder().id(networkDriverAccount.getId())
.usableBalance(money)
.frozenBalance(BigDecimal.ZERO)
.accountBalance(money).build();
while (true) {
NetworkDriverAccount account = networkDriverAccountDao.getEntityByKey(build.getId()).get();
build.setModifiedTime(account.getModifiedTime());
Integer i = networkDriverAccountDao.updateAccountCAS(build, LocalDateTime.now(), true);
if (i == 1) {
account = networkDriverAccountDao.getEntityByKey(build.getId()).get();
NetworkDriverRunningWaterRecord entity = NetworkDriverRunningWaterRecord.builder()
.usableBalance(account.getUsableBalance())
.alterationBalance(money).accountBalance(account.getAccountBalance())
.frozenBalance(account.getFrozenBalance()).createBy("系统")
.fundType(NetworkDriverAccountEnum.FundType.INCOME.getCode())
.driverUserName(account.getDriverUserName())
.driverUserNo(account.getDriverUserNo())
.runningWaterNo(idGenerateSnowFlake.nextId(2L))
.build();
networkDriverRunningWaterRecordDao.saveEntity(entity);
break;
}
}
}
@Override
public void generateCaseOutFrozenRunningWaterRecord(NetworkDriverAccount networkDriverAccount, BigDecimal money) {
NetworkDriverAccount build = NetworkDriverAccount.builder().id(networkDriverAccount.getId())
.frozenBalance(money)
.accountBalance(BigDecimal.ZERO)
.usableBalance(money).build();
while (true) {
NetworkDriverAccount account = networkDriverAccountDao.getEntityByKey(build.getId()).get();
build.setModifiedTime(account.getModifiedTime());
Integer i = networkDriverAccountDao.updateAccountCAS(build, LocalDateTime.now(), false);
if (i == 1) {
account = networkDriverAccountDao.getEntityByKey(build.getId()).get();
NetworkDriverRunningWaterRecord entity = NetworkDriverRunningWaterRecord.builder()
.usableBalance(account.getUsableBalance())
.alterationBalance(money).accountBalance(account.getAccountBalance())
.frozenBalance(account.getFrozenBalance()).createBy("系统")
.fundType(NetworkDriverAccountEnum.FundType.FROZEN.getCode())
.driverUserName(account.getDriverUserName())
.driverUserNo(account.getDriverUserNo())
.runningWaterNo(idGenerateSnowFlake.nextId(3L))
.build();
networkDriverRunningWaterRecordDao.saveEntity(entity);
break;
}
}
}
@Override
public void generateCaseOutSuccessRunningWaterRecord(NetworkDriverAccount networkDriverAccount, BigDecimal money) {
NetworkDriverAccount build = NetworkDriverAccount.builder().id(networkDriverAccount.getId())
.frozenBalance(money.negate())
.usableBalance(BigDecimal.ZERO)
.accountBalance(money).build();
while (true) {
NetworkDriverAccount account = networkDriverAccountDao.getEntityByKey(build.getId()).get();
build.setModifiedTime(account.getModifiedTime());
Integer i = networkDriverAccountDao.updateAccountCAS(build, LocalDateTime.now(), false);
if (i == 1) {
account = networkDriverAccountDao.getEntityByKey(build.getId()).get();
NetworkDriverRunningWaterRecord entity = NetworkDriverRunningWaterRecord.builder()
.usableBalance(account.getUsableBalance())
.alterationBalance(money).accountBalance(account.getAccountBalance())
.frozenBalance(account.getFrozenBalance()).createBy("系统")
.fundType(NetworkDriverAccountEnum.FundType.EXPENDITURE.getCode())
.driverUserName(account.getDriverUserName())
.driverUserNo(account.getDriverUserNo())
.runningWaterNo(idGenerateSnowFlake.nextId(3L))
.build();
networkDriverRunningWaterRecordDao.saveEntity(entity);
break;
}
}
}
@Override
public void generateNetworkDriverRunningWaterRecord(NetworkDriverAccount networkDriverAccount, BigDecimal money, Integer runningWaterType) {
strategyMap.get(runningWaterType).accept(networkDriverAccount, money);
}
@Override
public void afterPropertiesSet() throws Exception {
strategyMap.put(NetworkDriverAccountEnum.RunningWaterStatus.SETTLEMENT.getCode(), this::generateSettlementRunningWaterRecord);
strategyMap.put(NetworkDriverAccountEnum.RunningWaterStatus.CASE_OUT_FROZEN.getCode(), this::generateCaseOutFrozenRunningWaterRecord);
strategyMap.put(NetworkDriverAccountEnum.RunningWaterStatus.CASE_OUT_SUCCESS.getCode(), this::generateCaseOutSuccessRunningWaterRecord);
}
} }
...@@ -25,6 +25,7 @@ import com.clx.performance.model.settle.SettlementDriverDetail; ...@@ -25,6 +25,7 @@ import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail; import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.param.feign.transport.ThirdOrderChildBrokerParam; import com.clx.performance.param.feign.transport.ThirdOrderChildBrokerParam;
import com.clx.performance.service.TransportSyncService; import com.clx.performance.service.TransportSyncService;
import com.clx.performance.service.settle.NetworkDriverRunningWaterRecordService;
import com.clx.performance.service.settle.SettlementMqService; import com.clx.performance.service.settle.SettlementMqService;
import com.clx.performance.service.settle.SettlementService; import com.clx.performance.service.settle.SettlementService;
import com.clx.performance.vo.feign.transport.ThirdOrderChildBrokerResultVO; import com.clx.performance.vo.feign.transport.ThirdOrderChildBrokerResultVO;
...@@ -69,6 +70,9 @@ public class SettlementServiceImpl implements SettlementService { ...@@ -69,6 +70,9 @@ public class SettlementServiceImpl implements SettlementService {
@Autowired @Autowired
private OwnerAccountDao ownerAccountDao; private OwnerAccountDao ownerAccountDao;
@Autowired
private NetworkDriverRunningWaterRecordService networkDriverRunningWaterRecordService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
...@@ -165,7 +169,7 @@ public class SettlementServiceImpl implements SettlementService { ...@@ -165,7 +169,7 @@ public class SettlementServiceImpl implements SettlementService {
runningWaterRecord.setRunningWaterType(OwnerAccountEnum.RunningWaterStatus.TAKE_OUT.getCode()); runningWaterRecord.setRunningWaterType(OwnerAccountEnum.RunningWaterStatus.TAKE_OUT.getCode());
runningWaterRecord.setRunningWaterNo(idGenerateSnowFlake.nextId(IdTypeEnum.Type.TAKE_OUT.getCode())); runningWaterRecord.setRunningWaterNo(idGenerateSnowFlake.nextId(IdTypeEnum.Type.TAKE_OUT.getCode()));
ownerRunningWaterRecordDao.saveEntity(runningWaterRecord); ownerRunningWaterRecordDao.saveEntity(runningWaterRecord);
//TODO networkDriverRunningWaterRecordService
} else { } else {
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO); settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
settlementDriverDetail.setPrepayFreightFlag(0); settlementDriverDetail.setPrepayFreightFlag(0);
......
package com.clx.performance.service.settle; package com.clx.performance.service.settle;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.model.settle.NetworkDriverAccount;
import com.clx.performance.param.pc.PageNetworkAccountInfoListParam; import com.clx.performance.param.pc.PageNetworkAccountInfoListParam;
import com.clx.performance.vo.pc.NetworkDriverRunningWaterRecordVO; import com.clx.performance.vo.pc.NetworkDriverRunningWaterRecordVO;
import java.math.BigDecimal;
/** /**
* @author kavin * @author kavin
* Date 2023-12-19 * Date 2023-12-19
...@@ -12,4 +15,13 @@ import com.clx.performance.vo.pc.NetworkDriverRunningWaterRecordVO; ...@@ -12,4 +15,13 @@ import com.clx.performance.vo.pc.NetworkDriverRunningWaterRecordVO;
public interface NetworkDriverRunningWaterRecordService { public interface NetworkDriverRunningWaterRecordService {
IPage<NetworkDriverRunningWaterRecordVO> networkDriverRunningWaterRecordList(PageNetworkAccountInfoListParam param); IPage<NetworkDriverRunningWaterRecordVO> networkDriverRunningWaterRecordList(PageNetworkAccountInfoListParam param);
void generateSettlementRunningWaterRecord(NetworkDriverAccount networkDriverAccount, BigDecimal money);
void generateCaseOutFrozenRunningWaterRecord(NetworkDriverAccount networkDriverAccount, BigDecimal money);
void generateCaseOutSuccessRunningWaterRecord(NetworkDriverAccount networkDriverAccount, BigDecimal money);
void generateNetworkDriverRunningWaterRecord(NetworkDriverAccount networkDriverAccount, BigDecimal money, Integer runningWaterType);
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论