Merge #98 into master from cc_20260408_trans
feat:mock 处理
* cc_20260408_trans: (22 commits squashed)
- feat:分账
- feat:分账接口
- feat:分账单管理
- feat:分账管理
- feat:分账管理
- feat:userIdName
- feat:提现
- feat:调整
- feat:accountName
- feat:accountName
- feat:mock
- feat:关联门店
- feat:待充值待认款
- feat:待充值待认款
- feat:payer_account_no
- feat:payeeAccountName
- feat:payeeAccountNo
- feat:page
- feat:枚举
- feat:接口请求方式调整get->post
- feat:mock 处理
- Merge branch 'master' into cc_20260408_trans
# Conflicts:
#	coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java
#	coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java
Signed-off-by: 正新 <accounts_6964c7bcd2a2c377c5bbd01b@mail.teambition.com>
Merged-by: 正新 <accounts_6964c7bcd2a2c377c5bbd01b@mail.teambition.com>
CR-link: https://codeup.aliyun.com/692ea314dec569489f6f167c/hangzhou/java/custom_zxjp/change/98
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
package com.cool.store.service;
|
||||
|
||||
import com.cool.store.context.CurrentUserHolder;
|
||||
import com.cool.store.context.LoginUserInfo;
|
||||
import com.cool.store.request.*;
|
||||
import com.cool.store.request.wallet.ConfirmRechargeRequest;
|
||||
import com.cool.store.response.AdjustmentOrderResponse;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 费用调整单 Service
|
||||
*/
|
||||
public interface AdjustmentOrderService {
|
||||
|
||||
/**
|
||||
* 新增费用调整单
|
||||
* @param request 调整单请求
|
||||
* @return 是否成功
|
||||
*/
|
||||
Boolean add(AdjustmentOrderRequest request);
|
||||
|
||||
/**
|
||||
* 编辑费用调整单
|
||||
* @param request 调整单请求
|
||||
* @return 是否成功
|
||||
*/
|
||||
Boolean update(AdjustmentOrderRequest request);
|
||||
|
||||
/**
|
||||
* 删除费用调整单
|
||||
* @param id 调整单ID
|
||||
* @return 是否成功
|
||||
*/
|
||||
Boolean delete(Long id);
|
||||
|
||||
/**
|
||||
* 根据ID查询费用调整单详情
|
||||
* @param id 调整单ID
|
||||
* @return 调整单详情
|
||||
*/
|
||||
AdjustmentOrderResponse getById(Long id);
|
||||
|
||||
/**
|
||||
* 分页查询费用调整单
|
||||
* @param request 分页查询请求
|
||||
* @return 分页结果
|
||||
*/
|
||||
PageInfo<AdjustmentOrderResponse> page(AdjustmentOrderPageRequest request);
|
||||
|
||||
PageInfo<AdjustmentOrderResponse> getSpecialStatusData(AdjustmentSpecialPageRequest request);
|
||||
|
||||
|
||||
/**
|
||||
* 生成分账单
|
||||
* @param request 生成分账单请求
|
||||
* @return 分账单号
|
||||
*/
|
||||
String generateSplitOrder(GenerateSplitOrderRequest request);
|
||||
|
||||
/**
|
||||
* 认款
|
||||
* @param request 认款请求
|
||||
* @return 是否成功
|
||||
*/
|
||||
Boolean recognizePayment(RecognizePaymentRequest request, LoginUserInfo userInfo);
|
||||
|
||||
/**
|
||||
* 计算金额
|
||||
* @param id
|
||||
* @param transferAmount
|
||||
* @return
|
||||
*/
|
||||
Boolean calculateAmount(Long id ,String transferAmount);
|
||||
|
||||
/**
|
||||
* 确认充值
|
||||
* @return
|
||||
*/
|
||||
Boolean confirmRecharge(ConfirmRechargeRequest request);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
package com.cool.store.service;
|
||||
|
||||
import com.cool.store.context.LoginUserInfo;
|
||||
import com.cool.store.dto.wallet.TradeRecordDTO;
|
||||
import com.cool.store.entity.wallet.WalletTradeDO;
|
||||
import com.cool.store.request.SplitOrderPageRequest;
|
||||
import com.cool.store.request.SplitOrderRequest;
|
||||
import com.cool.store.request.wallet.BillDetailRequest;
|
||||
import com.cool.store.response.ResponseResult;
|
||||
import com.cool.store.response.SplitOrderResponse;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 分账主表 Service
|
||||
*/
|
||||
public interface SplitOrderService {
|
||||
|
||||
/**
|
||||
* 新增分账单
|
||||
* @param request 分账单请求
|
||||
* @return 是否成功
|
||||
*/
|
||||
Boolean add(SplitOrderRequest request);
|
||||
|
||||
/**
|
||||
* 编辑分账单
|
||||
* @param request 分账单请求
|
||||
* @return 是否成功
|
||||
*/
|
||||
Boolean update(SplitOrderRequest request);
|
||||
|
||||
/**
|
||||
* 删除分账单
|
||||
* @param id 分账单ID
|
||||
* @return 是否成功
|
||||
*/
|
||||
Boolean delete(Long id);
|
||||
|
||||
/**
|
||||
* 根据ID查询分账单详情
|
||||
* @param id 分账单ID
|
||||
* @return 分账单详情
|
||||
*/
|
||||
SplitOrderResponse getById(Long id);
|
||||
|
||||
/**
|
||||
* 分页查询分账单
|
||||
* @param request 分页查询请求
|
||||
* @return 分页结果
|
||||
*/
|
||||
PageInfo<SplitOrderResponse> page(SplitOrderPageRequest request);
|
||||
|
||||
/**
|
||||
* 批量更新状态
|
||||
* @param ids 分账单ID列表
|
||||
* @param status 目标状态
|
||||
* @return 是否成功
|
||||
*/
|
||||
Boolean batchUpdateStatus(List<Long> ids, String status);
|
||||
|
||||
/**
|
||||
* 确认分账
|
||||
* @param id 分账单ID
|
||||
* @return 是否成功
|
||||
*/
|
||||
Boolean confirmSplitOrder(Long id, LoginUserInfo userInfo);
|
||||
|
||||
TradeRecordDTO getBillDetail(Long id);
|
||||
|
||||
/**
|
||||
* 更新数据
|
||||
* @param walletTradeDO
|
||||
*/
|
||||
Boolean updateWalletTrade(WalletTradeDO walletTradeDO);
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.cool.store.service;
|
||||
|
||||
import com.cool.store.dao.wallet.WalletTradeDAO;
|
||||
import com.cool.store.dto.wallet.WithdrawApplicationDTO;
|
||||
import com.cool.store.entity.wallet.WalletTradeDO;
|
||||
import com.cool.store.request.WithdrawApplicationPageRequest;
|
||||
import com.cool.store.request.WithdrawApplicationRequest;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
|
||||
/**
|
||||
* 提现申请 Service
|
||||
*/
|
||||
public interface WithdrawApplicationService {
|
||||
|
||||
/**
|
||||
* 分页查询提现申请
|
||||
*/
|
||||
PageInfo<WithdrawApplicationDTO> page(WithdrawApplicationPageRequest request);
|
||||
|
||||
/**
|
||||
* 新增提现申请
|
||||
*/
|
||||
Boolean add(WithdrawApplicationRequest request);
|
||||
|
||||
Boolean confirmWithdraw(Long id);
|
||||
|
||||
Boolean updateTrade(WalletTradeDO walletTradeDO);
|
||||
|
||||
|
||||
}
|
||||
@@ -1,10 +1,12 @@
|
||||
package com.cool.store.service.fees;
|
||||
|
||||
import com.cool.store.dto.wallet.AccountTransferDTO;
|
||||
import com.cool.store.request.fees.WalletCancelPayRequest;
|
||||
import com.cool.store.request.fees.WalletPayRequest;
|
||||
import com.cool.store.request.fees.WalletRepayRequest;
|
||||
import com.cool.store.vo.fees.WalletPayInfoVO;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -57,4 +59,16 @@ public interface WalletPayInfoService {
|
||||
* @param walletPayInfoId 支付信息
|
||||
*/
|
||||
void rePushReceipt(Long walletPayInfoId);
|
||||
|
||||
/**
|
||||
* 账户间转账
|
||||
* @param expenseType
|
||||
* @param amount
|
||||
* @param inAccNo
|
||||
* @param outAccNo
|
||||
* @param payNo
|
||||
* @param remark
|
||||
* @return
|
||||
*/
|
||||
AccountTransferDTO accountPay(String expenseType, BigDecimal amount, String inAccNo, String outAccNo, String payNo, String remark);
|
||||
}
|
||||
|
||||
@@ -14,9 +14,10 @@ import com.cool.store.dao.fees.ShopAllocationInfoDAO;
|
||||
import com.cool.store.dao.fees.WalletPayInfoDAO;
|
||||
import com.cool.store.dao.wallet.WalletTradeDAO;
|
||||
import com.cool.store.dto.wallet.AccountInfoDTO;
|
||||
import com.cool.store.dto.wallet.AccountTransferDTO;
|
||||
import com.cool.store.dto.wallet.BatchTransferDTO;
|
||||
import com.cool.store.request.wallet.BatchTransferQueryRequest;
|
||||
import com.cool.store.request.wallet.BatchTransferRequest;
|
||||
import com.cool.store.enums.wechat.WalletTypeEnum;
|
||||
import com.cool.store.request.wallet.*;
|
||||
import com.cool.store.dto.wallet.TransferDTO;
|
||||
import com.cool.store.entity.FranchiseFeeDO;
|
||||
import com.cool.store.entity.ShopInfoDO;
|
||||
@@ -35,8 +36,6 @@ import com.cool.store.exception.ServiceException;
|
||||
import com.cool.store.request.fees.WalletCancelPayRequest;
|
||||
import com.cool.store.request.fees.WalletPayRequest;
|
||||
import com.cool.store.request.fees.WalletRepayRequest;
|
||||
import com.cool.store.request.wallet.OutStoreIdRequest;
|
||||
import com.cool.store.request.wallet.TransferRequest;
|
||||
import com.cool.store.request.xgj.ReceiptRequest;
|
||||
import com.cool.store.service.PushService;
|
||||
import com.cool.store.service.fees.WalletPayInfoService;
|
||||
@@ -374,4 +373,20 @@ public class WalletPayInfoServiceImpl implements WalletPayInfoService {
|
||||
request.setRemark(feeItem.getDesc());
|
||||
return walletApiService.transfer(request);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AccountTransferDTO accountPay(String expenseType, BigDecimal amount, String inAccNo, String outAccNo,String payNo, String remark) {
|
||||
WalletFeeItemEnum feeItem = WalletFeeItemEnum.getByExpenseType(expenseType);
|
||||
if (Objects.isNull(feeItem)) {
|
||||
throw new ServiceException(ErrorCodeEnum.NONSUPPORT_EXPENSE_TYPE);
|
||||
}
|
||||
AccountTransferRequest request = new AccountTransferRequest();
|
||||
request.setReqNo(payNo);
|
||||
request.setInAccNo(inAccNo);
|
||||
request.setOutAccNo(outAccNo);
|
||||
request.setRemark(remark);
|
||||
request.setAmount(amount.toPlainString());
|
||||
request.setWalletType(WalletTypeEnum.ONLINE_BANK.getType());
|
||||
return walletApiService.accountTransfer(request);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,440 @@
|
||||
package com.cool.store.service.impl;
|
||||
|
||||
import com.cool.store.context.CurrentUserHolder;
|
||||
import com.cool.store.context.LoginUserInfo;
|
||||
import com.cool.store.dao.*;
|
||||
import com.cool.store.dto.wallet.AccountInfoDTO;
|
||||
import com.cool.store.entity.AdjustmentOrderDO;
|
||||
import com.cool.store.entity.ExpenseMappingDO;
|
||||
import com.cool.store.entity.SplitOrderDO;
|
||||
import com.cool.store.entity.StoreDO;
|
||||
import com.cool.store.enums.ErrorCodeEnum;
|
||||
import com.cool.store.enums.ExpenseSheetTypeEnum;
|
||||
import com.cool.store.enums.wallet.DocStatusEnum;
|
||||
import com.cool.store.enums.wallet.SplitSourceEnum;
|
||||
import com.cool.store.enums.wallet.SplitTypeEnum;
|
||||
import com.cool.store.exception.ServiceException;
|
||||
import com.cool.store.request.*;
|
||||
import com.cool.store.request.wallet.ConfirmRechargeRequest;
|
||||
import com.cool.store.request.wallet.OutStoreIdRequest;
|
||||
import com.cool.store.response.AdjustmentOrderResponse;
|
||||
import com.cool.store.service.AdjustmentOrderService;
|
||||
import com.cool.store.service.dict.impl.DictService;
|
||||
import com.cool.store.service.wallet.WalletApiService;
|
||||
import com.cool.store.utils.GenerateNoUtil;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static com.cool.store.enums.fees.AllocationPayStatusEnum.*;
|
||||
import static com.cool.store.enums.wallet.DocStatusEnum.*;
|
||||
|
||||
/**
|
||||
* 费用调整单 Service 实现类
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class AdjustmentOrderServiceImpl implements AdjustmentOrderService {
|
||||
|
||||
@Resource
|
||||
private AdjustmentOrderDAO adjustmentOrderDAO;
|
||||
|
||||
@Resource
|
||||
private SplitOrderDAO splitOrderDAO;
|
||||
|
||||
@Resource
|
||||
private StoreDao storeDao;
|
||||
|
||||
@Resource
|
||||
private ExpenseMappingDAO expenseMappingDAO;
|
||||
|
||||
@Resource
|
||||
WalletApiService walletApiService;
|
||||
|
||||
@Resource
|
||||
EnterpriseUserDAO enterpriseUserDAO;
|
||||
|
||||
@Resource
|
||||
DictService dictService;
|
||||
|
||||
private static final String ADJUSTMENT_ORDER_PREFIX = "TZ";
|
||||
private static final String EXPENSE_SHEET_PREFIX = "FY";
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean add(AdjustmentOrderRequest request) {
|
||||
String userId = CurrentUserHolder.getUserId();
|
||||
|
||||
// 校验门店是否存在
|
||||
StoreDO store = storeDao.getByStoreId(request.getStoreId());
|
||||
if (store == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.STORE_IS_EXIST);
|
||||
}
|
||||
|
||||
AdjustmentOrderDO adjustmentOrder = AdjustmentOrderDO.builder()
|
||||
.adjustmentNo(GenerateNoUtil.generateAdjustmentNo(request.getExpenseSheetType()))
|
||||
.storeId(request.getStoreId())
|
||||
.businessTypeCode(request.getBusinessTypeCode())
|
||||
.expenseTypeCode(request.getExpenseTypeCode())
|
||||
.adjustType(request.getAdjustType())
|
||||
.adjustAmount(request.getAdjustAmount())
|
||||
.adjustReason(request.getAdjustReason())
|
||||
.remark(request.getRemark())
|
||||
.attachmentInfo(request.getAttachmentInfo())
|
||||
.contractAttachmentInfo(request.getContractAttachmentInfo())
|
||||
.expenseSheetType(request.getExpenseSheetType())
|
||||
.settledAmount(new BigDecimal("0"))
|
||||
.pendingSettlementAmount(request.getAdjustAmount())
|
||||
.status(DOC_STATUS_1.getStatus())
|
||||
.createUserId(userId)
|
||||
.createTime(new Date())
|
||||
.build();
|
||||
|
||||
int result = adjustmentOrderDAO.insert(adjustmentOrder);
|
||||
return result > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean update(AdjustmentOrderRequest request) {
|
||||
if (request.getId() == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.CHANGE_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
AdjustmentOrderDO existing = adjustmentOrderDAO.getById(request.getId());
|
||||
if (existing == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.CHANGE_NOT_NULL);
|
||||
}
|
||||
|
||||
// 只有待确认缴费状态才能编辑
|
||||
if (!DOC_STATUS_1.getStatus().equals(existing.getStatus())) {
|
||||
throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION);
|
||||
}
|
||||
|
||||
AdjustmentOrderDO update = AdjustmentOrderDO.builder()
|
||||
.id(request.getId())
|
||||
.storeId(request.getStoreId())
|
||||
.businessTypeCode(request.getBusinessTypeCode())
|
||||
.expenseTypeCode(request.getExpenseTypeCode())
|
||||
.adjustType(request.getAdjustType())
|
||||
.adjustAmount(request.getAdjustAmount())
|
||||
.adjustReason(request.getAdjustReason())
|
||||
.remark(request.getRemark())
|
||||
.expenseSheetType(request.getExpenseSheetType())
|
||||
.settledAmount(new BigDecimal("0"))
|
||||
.pendingSettlementAmount(request.getAdjustAmount())
|
||||
.contractAttachmentInfo(request.getContractAttachmentInfo())
|
||||
.attachmentInfo(request.getAttachmentInfo())
|
||||
.build();
|
||||
|
||||
int result = adjustmentOrderDAO.update(update);
|
||||
return result > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean delete(Long id) {
|
||||
if (id == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.CHANGE_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
AdjustmentOrderDO existing = adjustmentOrderDAO.getById(id);
|
||||
if (existing == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.CHANGE_NOT_NULL);
|
||||
}
|
||||
|
||||
// 只有待确认缴费状态才能删除
|
||||
if (!DOC_STATUS_1.getStatus().equals(existing.getStatus())) {
|
||||
throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION);
|
||||
}
|
||||
existing.setDeleted(1);
|
||||
adjustmentOrderDAO.update(existing);
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AdjustmentOrderResponse getById(Long id) {
|
||||
if (id == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
AdjustmentOrderDO adjustmentOrder = adjustmentOrderDAO.getById(id);
|
||||
if (adjustmentOrder == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return buildResponse(adjustmentOrder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageInfo<AdjustmentOrderResponse> page(AdjustmentOrderPageRequest request) {
|
||||
PageHelper.startPage(request.getPageNum(), request.getPageSize());
|
||||
List<AdjustmentOrderResponse> list = adjustmentOrderDAO.pageQuery(request);
|
||||
|
||||
dictService.fillDictField(list);
|
||||
// 批量查询交易流水号
|
||||
if (CollectionUtils.isNotEmpty(list)) {
|
||||
List<String> adjustmentNos = list.stream()
|
||||
.map(AdjustmentOrderResponse::getAdjustmentNo)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
List<ExpenseMappingDO> expenseMappings = expenseMappingDAO.listByRelatedAdjustmentNoList(adjustmentNos);
|
||||
|
||||
// 按调整单号分组
|
||||
Map<String, List<String>> tradeNoMap = expenseMappings.stream()
|
||||
.collect(Collectors.groupingBy(
|
||||
ExpenseMappingDO::getRelatedAdjustmentNo,
|
||||
Collectors.mapping(ExpenseMappingDO::getTradeNo, Collectors.toList())
|
||||
));
|
||||
|
||||
Set<String> userIdList = list.stream()
|
||||
.filter(x -> StringUtils.isNotBlank(x.getClaimUserId()) || StringUtils.isNotBlank(x.getCreateUserId()))
|
||||
.flatMap(x -> Stream.of(x.getClaimUserId(), x.getCreateUserId()))
|
||||
.filter(StringUtils::isNotBlank)
|
||||
.collect(Collectors.toSet());
|
||||
Map<String, String> userNameMap = enterpriseUserDAO.getUserNameMap(new ArrayList<>(userIdList));
|
||||
|
||||
// 填充交易流水号
|
||||
list.forEach(response -> {
|
||||
List<String> tradeNos = tradeNoMap.get(response.getAdjustmentNo());
|
||||
if (CollectionUtils.isNotEmpty(tradeNos)) {
|
||||
response.setTradeNoList(tradeNos);
|
||||
}
|
||||
if (StringUtils.isNotBlank(response.getClaimUserId())){
|
||||
response.setClaimUserName(userNameMap.get(response.getClaimUserId()));
|
||||
}
|
||||
if (StringUtils.isNotEmpty(response.getCreateUserId())){
|
||||
response.setCreateUserName(userNameMap.get(response.getCreateUserId()));
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
return new PageInfo<>(list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageInfo<AdjustmentOrderResponse> getSpecialStatusData(AdjustmentSpecialPageRequest request) {
|
||||
AdjustmentOrderPageRequest convert = AdjustmentSpecialPageRequest.convert(request);
|
||||
//只查询指定的状态
|
||||
List<Integer> statusList = convert.getStatusList();
|
||||
List<Integer> list = Arrays.asList(DOC_STATUS_4.getStatus(), DOC_STATUS_3.getStatus());
|
||||
if (CollectionUtils.isEmpty(statusList)){
|
||||
statusList = list;
|
||||
}else {
|
||||
statusList.addAll(list);
|
||||
}
|
||||
convert.setStatusList(statusList);
|
||||
return page(convert);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public String generateSplitOrder(GenerateSplitOrderRequest request) {
|
||||
if (request.getId() == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.CHANGE_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
AdjustmentOrderDO adjustmentOrder = adjustmentOrderDAO.getById(request.getId());
|
||||
if (adjustmentOrder == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.CHANGE_NOT_NULL);
|
||||
}
|
||||
|
||||
List<SplitOrderDO> splitOrderDOS = splitOrderDAO.listByRelatedDocNo(adjustmentOrder.getAdjustmentNo(), Arrays.asList(UNPAID.getStatus(), PAYING.getStatus()));
|
||||
if (CollectionUtils.isNotEmpty(splitOrderDOS)){
|
||||
throw new ServiceException(ErrorCodeEnum.NOT_COMPLETE_TRANS_SHEET);
|
||||
}
|
||||
|
||||
//分账金额不能大雨待分账金额
|
||||
if (adjustmentOrder.getPendingSettlementAmount().compareTo(request.getSplitAmount())<0){
|
||||
throw new ServiceException(ErrorCodeEnum.PENDING_TRANS_AMOUNT);
|
||||
}
|
||||
|
||||
// 只有认款完成状态才能生成分账单
|
||||
if (!DOC_STATUS_3.getStatus().equals(adjustmentOrder.getStatus())) {
|
||||
throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION);
|
||||
}
|
||||
|
||||
String userId = CurrentUserHolder.getUserId();
|
||||
String splitNo = GenerateNoUtil.generateSplitNo();
|
||||
|
||||
// 查询门店信息
|
||||
StoreDO store = storeDao.getByStoreId(adjustmentOrder.getStoreId());
|
||||
if (store == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.STORE_IS_EXIST);
|
||||
}
|
||||
SplitSourceEnum splitSourceEnum = SplitSourceEnum.getSplitSourceEnum(adjustmentOrder.getExpenseSheetType());
|
||||
Integer source = null;
|
||||
if (splitSourceEnum!=null){
|
||||
source = splitSourceEnum.getStatus();
|
||||
}
|
||||
OutStoreIdRequest outStoreIdRequest = new OutStoreIdRequest();
|
||||
outStoreIdRequest.setOutStoreId(adjustmentOrder.getStoreId());
|
||||
List<AccountInfoDTO> accountInfoList = walletApiService.getAccountInfo(outStoreIdRequest);
|
||||
|
||||
if (CollectionUtils.isEmpty(accountInfoList)){
|
||||
throw new ServiceException(ErrorCodeEnum.NOT_EXIST_WANG_SHANG_ACCOUNT);
|
||||
}
|
||||
|
||||
AccountInfoDTO accountInfoDTO = accountInfoList.get(0);
|
||||
|
||||
// 生成分账单
|
||||
SplitOrderDO splitOrder = SplitOrderDO.builder()
|
||||
.splitNo(splitNo)
|
||||
.splitType(SplitTypeEnum.ADD_BY_HAND.getStatus())
|
||||
.relatedStoreId(adjustmentOrder.getStoreId())
|
||||
.payerAccountName(accountInfoDTO.getAccountName())
|
||||
.payerAccountNo(accountInfoDTO.getAccountNo())
|
||||
.payeeAccountName(request.getPayeeAccountName())
|
||||
.payeeAccountNo(request.getPayeeAccountNo())
|
||||
.expenseTypeCode(adjustmentOrder.getExpenseTypeCode())
|
||||
.splitAmount(request.getSplitAmount())
|
||||
.relatedDocNo(adjustmentOrder.getAdjustmentNo())
|
||||
.attachmentInfo(request.getAttachmentInfo())
|
||||
.remark(request.getRemark())
|
||||
.status(UNPAID.getStatus())
|
||||
.createUserId(userId)
|
||||
.createTime(new Date())
|
||||
.source(source)
|
||||
.build();
|
||||
|
||||
splitOrderDAO.insert(splitOrder);
|
||||
return splitNo;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean recognizePayment(RecognizePaymentRequest request, LoginUserInfo userInfo) {
|
||||
if (request.getId() == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.CHANGE_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
if (CollectionUtils.isEmpty(request.getTradeNos())) {
|
||||
throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE, "交易流水号列表不能为空");
|
||||
}
|
||||
|
||||
// 查询费用调整单
|
||||
AdjustmentOrderDO adjustmentOrder = adjustmentOrderDAO.getById(request.getId());
|
||||
if (adjustmentOrder == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.CHANGE_NOT_NULL);
|
||||
}
|
||||
|
||||
// 只有待充值待认款状态才能进行认款操作
|
||||
if (!(DOC_STATUS_2.getStatus().equals(adjustmentOrder.getStatus())||DOC_STATUS_1.getStatus().equals(adjustmentOrder.getStatus()))) {
|
||||
throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION);
|
||||
}
|
||||
|
||||
// 查询交易流水号是否已被使用
|
||||
List<ExpenseMappingDO> existingMappings = expenseMappingDAO.listByTradeNos(request.getTradeNos());
|
||||
if (CollectionUtils.isNotEmpty(existingMappings)) {
|
||||
throw new ServiceException(ErrorCodeEnum.TRADE_EXIST);
|
||||
}
|
||||
|
||||
// 批量插入映射记录
|
||||
List<ExpenseMappingDO> mappingList = request.getTradeNos().stream()
|
||||
.map(tradeNo -> ExpenseMappingDO.builder()
|
||||
.relatedAdjustmentNo(adjustmentOrder.getAdjustmentNo())
|
||||
.tradeNo(tradeNo)
|
||||
.build())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
expenseMappingDAO.batchInsert(mappingList);
|
||||
|
||||
// 更新费用调整单状态为认款完成
|
||||
AdjustmentOrderDO update = AdjustmentOrderDO.builder()
|
||||
.id(request.getId())
|
||||
.status(DOC_STATUS_3.getStatus())
|
||||
.claimTime(new Date())
|
||||
.claimUserId(userInfo.getUserId())
|
||||
.build();
|
||||
|
||||
adjustmentOrderDAO.update(update);
|
||||
|
||||
log.info("费用调整单认款成功,单号:{},交易流水号:{}",
|
||||
adjustmentOrder.getAdjustmentNo(), request.getTradeNos());
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean calculateAmount(Long id, String transferAmount) {
|
||||
AdjustmentOrderDO adjustmentOrderDO = adjustmentOrderDAO.getById(id);
|
||||
if (adjustmentOrderDO==null){
|
||||
log.info("calculateAmount:费用单/费用调整单为空");
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
BigDecimal amount = new BigDecimal(transferAmount);
|
||||
adjustmentOrderDO.setSettledAmount(adjustmentOrderDO.getSettledAmount().add(amount));
|
||||
adjustmentOrderDO.setPendingSettlementAmount(adjustmentOrderDO.getPendingSettlementAmount().subtract(amount));
|
||||
if (adjustmentOrderDO.getPendingSettlementAmount().compareTo(new BigDecimal("0"))<=0){
|
||||
adjustmentOrderDO.setStatus(DOC_STATUS_5.getStatus());
|
||||
}
|
||||
if (adjustmentOrderDO.getPendingSettlementAmount().compareTo(new BigDecimal("0"))>0){
|
||||
adjustmentOrderDO.setStatus(DOC_STATUS_4.getStatus());
|
||||
}
|
||||
adjustmentOrderDAO.update(adjustmentOrderDO);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean confirmRecharge(ConfirmRechargeRequest request) {
|
||||
AdjustmentOrderDO adjustmentOrderDO = adjustmentOrderDAO.getById(request.getId());
|
||||
if (adjustmentOrderDO==null){
|
||||
throw new ServiceException(ErrorCodeEnum.CHANGE_NOT_NULL);
|
||||
}
|
||||
adjustmentOrderDO.setAttachmentInfo(request.getAttachmentInfo());
|
||||
adjustmentOrderDO.setRemark(request.getRemark());
|
||||
adjustmentOrderDO.setStatus(DOC_STATUS_2.getStatus());
|
||||
adjustmentOrderDO.setPayTime(new Date());
|
||||
adjustmentOrderDAO.update(adjustmentOrderDO);
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建响应对象
|
||||
*/
|
||||
private AdjustmentOrderResponse buildResponse(AdjustmentOrderDO adjustmentOrder) {
|
||||
AdjustmentOrderResponse response = new AdjustmentOrderResponse();
|
||||
response.setId(adjustmentOrder.getId());
|
||||
response.setAdjustmentNo(adjustmentOrder.getAdjustmentNo());
|
||||
response.setStoreId(adjustmentOrder.getStoreId());
|
||||
response.setBusinessTypeCode(adjustmentOrder.getBusinessTypeCode());
|
||||
response.setExpenseTypeCode(adjustmentOrder.getExpenseTypeCode());
|
||||
response.setAdjustType(adjustmentOrder.getAdjustType());
|
||||
response.setAdjustAmount(adjustmentOrder.getAdjustAmount());
|
||||
response.setAdjustReason(adjustmentOrder.getAdjustReason());
|
||||
response.setRemark(adjustmentOrder.getRemark());
|
||||
response.setAttachmentInfo(adjustmentOrder.getAttachmentInfo());
|
||||
response.setStatus(adjustmentOrder.getStatus());
|
||||
response.setCreateUserId(adjustmentOrder.getCreateUserId());
|
||||
response.setCreateTime(adjustmentOrder.getCreateTime());
|
||||
response.setSettledAmount(adjustmentOrder.getSettledAmount());
|
||||
response.setPendingSettlementAmount(adjustmentOrder.getPendingSettlementAmount());
|
||||
response.setClaimUserId(adjustmentOrder.getClaimUserId());
|
||||
response.setClaimTime(adjustmentOrder.getClaimTime());
|
||||
response.setContractAttachmentInfo(adjustmentOrder.getContractAttachmentInfo());
|
||||
response.setPayTime(adjustmentOrder.getPayTime());
|
||||
|
||||
// 设置门店信息
|
||||
if (StringUtils.isNotBlank(adjustmentOrder.getStoreId())) {
|
||||
StoreDO store = storeDao.getByStoreId(adjustmentOrder.getStoreId());
|
||||
if (store != null) {
|
||||
response.setStoreName(store.getStoreName());
|
||||
response.setStoreNum(store.getStoreNum());
|
||||
}
|
||||
}
|
||||
dictService.fillDictField(response);
|
||||
return response;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,335 @@
|
||||
package com.cool.store.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.cool.store.constants.CommonConstants;
|
||||
import com.cool.store.constants.RedisConstant;
|
||||
import com.cool.store.context.CurrentUserHolder;
|
||||
import com.cool.store.context.LoginUserInfo;
|
||||
import com.cool.store.dao.SplitOrderDAO;
|
||||
import com.cool.store.dao.StoreDao;
|
||||
import com.cool.store.dao.AdjustmentOrderDAO;
|
||||
import com.cool.store.dao.wallet.WalletTradeDAO;
|
||||
import com.cool.store.dto.wallet.AccountTransferDTO;
|
||||
import com.cool.store.dto.wallet.TradeRecordDTO;
|
||||
import com.cool.store.entity.SplitOrderDO;
|
||||
import com.cool.store.entity.StoreDO;
|
||||
import com.cool.store.entity.AdjustmentOrderDO;
|
||||
import com.cool.store.entity.wallet.WalletTradeDO;
|
||||
import com.cool.store.enums.ErrorCodeEnum;
|
||||
import com.cool.store.enums.fees.AllocationPayStatusEnum;
|
||||
import com.cool.store.enums.wallet.SplitSourceEnum;
|
||||
import com.cool.store.exception.ServiceException;
|
||||
import com.cool.store.request.SplitOrderPageRequest;
|
||||
import com.cool.store.request.SplitOrderRequest;
|
||||
import com.cool.store.request.wallet.BillDetailRequest;
|
||||
import com.cool.store.response.SplitOrderResponse;
|
||||
import com.cool.store.service.AdjustmentOrderService;
|
||||
import com.cool.store.service.SplitOrderService;
|
||||
import com.cool.store.service.fees.WalletPayInfoService;
|
||||
import com.cool.store.service.wallet.WalletApiService;
|
||||
import com.cool.store.service.wallet.WalletService;
|
||||
import com.cool.store.utils.GenerateNoUtil;
|
||||
import com.cool.store.utils.RedisUtil;
|
||||
import com.cool.store.utils.RedisUtilPool;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.poi.ss.formula.functions.T;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.cool.store.enums.wallet.WalletTradeModuleEnum.STANDARD_STORE;
|
||||
import static com.cool.store.enums.wallet.WalletTradeModuleEnum.TRANSFER;
|
||||
|
||||
/**
|
||||
* 分账主表 Service 实现类
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class SplitOrderServiceImpl implements SplitOrderService {
|
||||
|
||||
@Resource
|
||||
private SplitOrderDAO splitOrderDAO;
|
||||
|
||||
@Resource
|
||||
private StoreDao storeDao;
|
||||
|
||||
@Resource
|
||||
private AdjustmentOrderDAO adjustmentOrderDAO;
|
||||
|
||||
@Resource
|
||||
AdjustmentOrderService adjustmentOrderService;
|
||||
|
||||
@Resource
|
||||
WalletPayInfoService walletPayInfoService;
|
||||
|
||||
@Resource
|
||||
WalletTradeDAO walletTradeDAO;
|
||||
|
||||
@Resource
|
||||
RedisUtil redisUtil;
|
||||
|
||||
@Resource
|
||||
WalletApiService walletApiService;
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean add(SplitOrderRequest request) {
|
||||
String userId = CurrentUserHolder.getUserId();
|
||||
|
||||
SplitOrderDO splitOrder = SplitOrderDO.builder()
|
||||
.splitNo(GenerateNoUtil.generateSplitNo())
|
||||
.splitType(request.getSplitType())
|
||||
.relatedStoreId(request.getRelatedStoreId())
|
||||
.payerAccountName(request.getPayerAccountName())
|
||||
.payerAccountNo(request.getPayerAccountNo())
|
||||
.payeeAccountName(request.getPayeeAccountName())
|
||||
.payeeAccountNo(request.getPayeeAccountNo())
|
||||
.expenseTypeCode(request.getExpenseTypeCode())
|
||||
.splitAmount(request.getSplitAmount())
|
||||
.relatedDocNo(request.getRelatedDocNo())
|
||||
.remark(request.getRemark())
|
||||
.status(AllocationPayStatusEnum.UNPAID.getStatus())
|
||||
.createUserId(userId)
|
||||
.createTime(new Date())
|
||||
.attachmentInfo(request.getAttachmentInfo())
|
||||
.source(SplitSourceEnum.ADD_BY_HAND.getStatus())
|
||||
.build();
|
||||
|
||||
int result = splitOrderDAO.insert(splitOrder);
|
||||
return result > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean update(SplitOrderRequest request) {
|
||||
if (request.getId() == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.TRANS_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
SplitOrderDO existing = splitOrderDAO.getById(request.getId());
|
||||
if (existing == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.TRANS_NOT_NULL);
|
||||
}
|
||||
|
||||
// 只有待分账状态才能编辑
|
||||
if (!AllocationPayStatusEnum.UNPAID.getStatus().equals(existing.getStatus())) {
|
||||
throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION);
|
||||
}
|
||||
|
||||
SplitOrderDO update = SplitOrderDO.builder()
|
||||
.id(request.getId())
|
||||
.splitType(request.getSplitType())
|
||||
.relatedStoreId(request.getRelatedStoreId())
|
||||
.payerAccountName(request.getPayerAccountName())
|
||||
.payeeAccountNo(request.getPayerAccountNo())
|
||||
.payeeAccountName(request.getPayeeAccountName())
|
||||
.payeeAccountNo(request.getPayeeAccountNo())
|
||||
.expenseTypeCode(request.getExpenseTypeCode())
|
||||
.splitAmount(request.getSplitAmount())
|
||||
.relatedDocNo(request.getRelatedDocNo())
|
||||
.attachmentInfo(request.getAttachmentInfo())
|
||||
.remark(request.getRemark())
|
||||
.build();
|
||||
|
||||
int result = splitOrderDAO.update(update);
|
||||
return result > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean delete(Long id) {
|
||||
if (id == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.TRANS_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
SplitOrderDO existing = splitOrderDAO.getById(id);
|
||||
if (existing == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.TRANS_NOT_NULL);
|
||||
}
|
||||
|
||||
// 只有待分账状态才能删除
|
||||
if (!AllocationPayStatusEnum.UNPAID.getStatus().equals(existing.getStatus())) {
|
||||
throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION);
|
||||
}
|
||||
|
||||
int result = splitOrderDAO.delete(id);
|
||||
return result > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SplitOrderResponse getById(Long id) {
|
||||
if (id == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
SplitOrderDO splitOrder = splitOrderDAO.getById(id);
|
||||
if (splitOrder == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return buildResponse(splitOrder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageInfo<SplitOrderResponse> page(SplitOrderPageRequest request) {
|
||||
PageHelper.startPage(request.getPageNum(), request.getPageSize());
|
||||
List<SplitOrderResponse> responses = splitOrderDAO.pageQueryWithStore(request);
|
||||
return new PageInfo<>(responses);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean batchUpdateStatus(List<Long> ids, String status) {
|
||||
if (CollectionUtils.isEmpty(ids) || StringUtils.isBlank(status)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int result = splitOrderDAO.batchUpdateStatus(ids, status);
|
||||
return result > 0;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean confirmSplitOrder(Long id, LoginUserInfo userInfo) {
|
||||
if (id == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.TRANS_ID_NOT_NULL);
|
||||
}
|
||||
//分账单锁
|
||||
String lockKey = MessageFormat.format(RedisConstant.WALLET_TRANSFER_LOCK, id);
|
||||
boolean lock = redisUtil.tryLock(lockKey, id.toString(), 1,TimeUnit.SECONDS);
|
||||
if (!lock) {
|
||||
throw new ServiceException(ErrorCodeEnum.TRANSFER_ING);
|
||||
}
|
||||
SplitOrderDO existing = splitOrderDAO.getById(id);
|
||||
if (existing == null) {
|
||||
throw new ServiceException(ErrorCodeEnum.TRANS_NOT_NULL);
|
||||
}
|
||||
// 只有待分账状态才能确认
|
||||
if (!AllocationPayStatusEnum.UNPAID.getStatus().equals(existing.getStatus())) {
|
||||
throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION);
|
||||
}
|
||||
|
||||
//营帐通完成分账 String expenseType, BigDecimal amount, String inAccNo, String outAccNo, String payNo, String remark
|
||||
AccountTransferDTO accountTransferDTO ;
|
||||
try {
|
||||
accountTransferDTO = walletPayInfoService.accountPay(existing.getExpenseTypeCode(), existing.getSplitAmount(),
|
||||
existing.getPayeeAccountNo(), existing.getPayerAccountNo(), existing.getSplitNo(), existing.getRemark());
|
||||
|
||||
}catch (Exception e){
|
||||
//分账失败 释放锁
|
||||
redisUtil.unlock(lockKey);
|
||||
throw new ServiceException(ErrorCodeEnum.TRANSFER_ERROR);
|
||||
}
|
||||
existing.setConfirmer(userInfo.getUserId());
|
||||
existing.setStatus(accountTransferDTO.getTradeStatus());
|
||||
existing.setConfirmTime(new Date());
|
||||
int result = splitOrderDAO.update(existing);
|
||||
|
||||
WalletTradeDO walletTradeDO = new WalletTradeDO();
|
||||
walletTradeDO.setPayStatus(accountTransferDTO.getTradeStatus());
|
||||
walletTradeDO.setModule(TRANSFER.getModule());
|
||||
walletTradeDO.setRemark(existing.getRemark());
|
||||
walletTradeDO.setPayAmount(new BigDecimal(accountTransferDTO.getAmount()));
|
||||
walletTradeDO.setPayTime(new Date());
|
||||
walletTradeDO.setPayNo(existing.getSplitNo());
|
||||
walletTradeDO.setTradeId(String.valueOf(accountTransferDTO.getTradeId()));
|
||||
walletTradeDO.setType(1);
|
||||
walletTradeDAO.insertSelective(walletTradeDO);
|
||||
//如果是分账完成 需要变更单据已分账金额
|
||||
if (AllocationPayStatusEnum.PAID.getStatus().equals(accountTransferDTO.getTradeStatus())){
|
||||
log.info("confirmSplitOrder 分账完成分账单ID:{}",id);
|
||||
adjustmentOrderService.calculateAmount(id,accountTransferDTO.getAmount());
|
||||
}
|
||||
return result > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TradeRecordDTO getBillDetail(Long id) {
|
||||
SplitOrderDO splitOrder = splitOrderDAO.getById(id);
|
||||
if (splitOrder==null){
|
||||
throw new ServiceException(ErrorCodeEnum.TRANS_NOT_NULL);
|
||||
}
|
||||
String splitNo = splitOrder.getSplitNo();
|
||||
WalletTradeDO walletTrade = walletTradeDAO.getByPayNo(splitNo);
|
||||
if (walletTrade==null){
|
||||
return null;
|
||||
}
|
||||
BillDetailRequest request = new BillDetailRequest();
|
||||
request.setTradeId(Long.valueOf(walletTrade.getTradeId()));
|
||||
return walletApiService.getBillDetail(request);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public Boolean updateWalletTrade(WalletTradeDO walletTradeDO) {
|
||||
log.info("updateWalletTrade:{}", JSONObject.toJSONString(walletTradeDO));
|
||||
if (walletTradeDO==null||StringUtils.isEmpty(walletTradeDO.getTradeId())){
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
SplitOrderDO split = splitOrderDAO.getBySplitNo(walletTradeDO.getPayNo());
|
||||
//通过tradeId查询支付状态
|
||||
BillDetailRequest billDetailRequest = new BillDetailRequest();
|
||||
billDetailRequest.setTradeId(Long.valueOf(walletTradeDO.getTradeId()));
|
||||
TradeRecordDTO billDetail = walletApiService.getBillDetail(billDetailRequest);
|
||||
//修改状态
|
||||
walletTradeDO.setPayStatus(billDetail.getTradeStatus());
|
||||
walletTradeDAO.updateByPrimaryKeySelective(walletTradeDO);
|
||||
split.setStatus(billDetail.getTradeStatus());
|
||||
split.setFailReason(billDetail.getErrMsg());
|
||||
splitOrderDAO.update(split);
|
||||
if (AllocationPayStatusEnum.PAID.getStatus().equals(billDetail.getTradeStatus())){
|
||||
log.info("confirmSplitOrder 分账完成分账单ID:{}",split.getId());
|
||||
adjustmentOrderService.calculateAmount(split.getId(),billDetail.getAmount());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 构建响应对象
|
||||
*/
|
||||
private SplitOrderResponse buildResponse(SplitOrderDO splitOrder) {
|
||||
SplitOrderResponse response = new SplitOrderResponse();
|
||||
response.setId(splitOrder.getId());
|
||||
response.setSplitNo(splitOrder.getSplitNo());
|
||||
response.setSplitType(splitOrder.getSplitType());
|
||||
response.setRelatedStoreId(splitOrder.getRelatedStoreId());
|
||||
response.setPayerAccountName(splitOrder.getPayerAccountName());
|
||||
response.setPayeeAccountNo(splitOrder.getPayeeAccountNo());
|
||||
response.setPayerAccountNo(splitOrder.getPayerAccountNo());
|
||||
response.setPayeeAccountName(splitOrder.getPayeeAccountName());
|
||||
response.setExpenseTypeCode(splitOrder.getExpenseTypeCode());
|
||||
response.setSplitAmount(splitOrder.getSplitAmount());
|
||||
response.setRelatedDocNo(splitOrder.getRelatedDocNo());
|
||||
response.setRemark(splitOrder.getRemark());
|
||||
response.setStatus(splitOrder.getStatus());
|
||||
response.setConfirmer(splitOrder.getConfirmer());
|
||||
response.setConfirmTime(splitOrder.getConfirmTime());
|
||||
response.setCreateUserId(splitOrder.getCreateUserId());
|
||||
response.setCreateTime(splitOrder.getCreateTime());
|
||||
response.setSource(splitOrder.getSource());
|
||||
|
||||
// 设置门店信息
|
||||
if (StringUtils.isNotBlank(splitOrder.getRelatedStoreId())) {
|
||||
StoreDO store = storeDao.getByStoreId(splitOrder.getRelatedStoreId());
|
||||
if (store != null) {
|
||||
response.setStoreName(store.getStoreName());
|
||||
response.setStoreNum(store.getStoreNum());
|
||||
}
|
||||
}
|
||||
|
||||
return response;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,165 @@
|
||||
package com.cool.store.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.cool.store.constants.RedisConstant;
|
||||
import com.cool.store.context.CurrentUserHolder;
|
||||
import com.cool.store.context.LoginUserInfo;
|
||||
import com.cool.store.dao.WithdrawApplicationDAO;
|
||||
import com.cool.store.dao.wallet.WalletTradeDAO;
|
||||
import com.cool.store.dto.wallet.AccountWithdrawerDTO;
|
||||
import com.cool.store.dto.wallet.TradeRecordDTO;
|
||||
import com.cool.store.dto.wallet.WithdrawApplicationDTO;
|
||||
import com.cool.store.entity.WithdrawApplicationDO;
|
||||
import com.cool.store.entity.wallet.WalletTradeDO;
|
||||
import com.cool.store.enums.ErrorCodeEnum;
|
||||
import com.cool.store.enums.fees.AllocationPayStatusEnum;
|
||||
import com.cool.store.enums.wallet.TradeTypeEnum;
|
||||
import com.cool.store.enums.wechat.WalletTypeEnum;
|
||||
import com.cool.store.exception.ServiceException;
|
||||
import com.cool.store.request.WithdrawApplicationPageRequest;
|
||||
import com.cool.store.request.WithdrawApplicationRequest;
|
||||
import com.cool.store.request.wallet.AccountWithdrawerRequest;
|
||||
import com.cool.store.request.wallet.BillDetailRequest;
|
||||
import com.cool.store.service.WithdrawApplicationService;
|
||||
import com.cool.store.service.wallet.WalletApiService;
|
||||
import com.cool.store.utils.GenerateNoUtil;
|
||||
import com.cool.store.utils.RedisUtil;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static com.cool.store.enums.wallet.WalletTradeModuleEnum.STANDARD_STORE;
|
||||
import static com.cool.store.enums.wallet.WalletTradeModuleEnum.TRANSFER;
|
||||
|
||||
/**
|
||||
* 提现申请 Service 实现类
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class WithdrawApplicationServiceImpl implements WithdrawApplicationService {
|
||||
|
||||
@Resource
|
||||
private WithdrawApplicationDAO withdrawApplicationDAO;
|
||||
|
||||
@Resource
|
||||
RedisUtil redisUtil;
|
||||
|
||||
@Resource
|
||||
WalletApiService walletApiService;
|
||||
|
||||
@Resource
|
||||
WalletTradeDAO walletTradeDAO;
|
||||
|
||||
private static final String WITHDRAW_ORDER_PREFIX = "TX";
|
||||
|
||||
@Override
|
||||
public PageInfo<WithdrawApplicationDTO> page(WithdrawApplicationPageRequest request) {
|
||||
PageHelper.startPage(request.getPageNum(), request.getPageSize());
|
||||
List<WithdrawApplicationDTO> responses = withdrawApplicationDAO.pageQuery(request);
|
||||
return new PageInfo<>(responses);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean add(WithdrawApplicationRequest request) {
|
||||
String userId = CurrentUserHolder.getUserId();
|
||||
String withdrawNo = GenerateNoUtil.generateNo(WITHDRAW_ORDER_PREFIX);
|
||||
|
||||
WithdrawApplicationDO withdrawApplication = WithdrawApplicationDO.builder()
|
||||
.withdrawNo(withdrawNo)
|
||||
.accountName(request.getAccountName())
|
||||
.accountNo(request.getAccountNo())
|
||||
.amount(request.getAmount())
|
||||
.bankCardNo(request.getBankCardNo())
|
||||
.bankName(request.getBankName())
|
||||
.status(AllocationPayStatusEnum.UNPAID.getStatus())
|
||||
.createUserId(userId)
|
||||
.createTime(new Date())
|
||||
.updateTime(new Date())
|
||||
.build();
|
||||
|
||||
int result = withdrawApplicationDAO.insert(withdrawApplication);
|
||||
return result > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean confirmWithdraw(Long id) {
|
||||
LoginUserInfo user = CurrentUserHolder.getUser();
|
||||
String lockKey = MessageFormat.format(RedisConstant.WALLET_WITHDRAW_LOCK, id);
|
||||
boolean lock = redisUtil.tryLock(lockKey, id.toString(), 1, TimeUnit.SECONDS);
|
||||
if (!lock) {
|
||||
throw new ServiceException(ErrorCodeEnum.TRANSFER_ING);
|
||||
}
|
||||
WithdrawApplicationDO withdrawApplicationDO = withdrawApplicationDAO.getById(id);
|
||||
if (Objects.isNull(withdrawApplicationDO)){
|
||||
throw new ServiceException(ErrorCodeEnum.WITHDRAW_APPLY_NOT_EXIST);
|
||||
}
|
||||
if (!AllocationPayStatusEnum.UNPAID.getStatus().equals(withdrawApplicationDO.getStatus())){
|
||||
throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION);
|
||||
}
|
||||
//开始提现
|
||||
AccountWithdrawerRequest request = new AccountWithdrawerRequest();
|
||||
request.setAccNo(withdrawApplicationDO.getAccountNo());
|
||||
request.setAmount(withdrawApplicationDO.getAmount().toPlainString());
|
||||
request.setReqNo(withdrawApplicationDO.getWithdrawNo());
|
||||
request.setWalletType(WalletTypeEnum.ONLINE_BANK.getType());
|
||||
//AccountWithdrawerDTO accountWithdrawerDTO = walletApiService.accountWithdrawer(request);
|
||||
AccountWithdrawerDTO accountWithdrawerDTO = new AccountWithdrawerDTO();
|
||||
accountWithdrawerDTO.setTradeId(11222L);
|
||||
accountWithdrawerDTO.setAmount("100");
|
||||
accountWithdrawerDTO.setTradeStatus(1);
|
||||
|
||||
withdrawApplicationDO.setStatus(accountWithdrawerDTO.getTradeStatus());
|
||||
withdrawApplicationDAO.update(withdrawApplicationDO);
|
||||
//保存交易单
|
||||
WalletTradeDO walletTrade = new WalletTradeDO();
|
||||
//支付中 通过查询详情获取是否是否支付成功
|
||||
walletTrade.setPayStatus(AllocationPayStatusEnum.PAYING.getStatus());
|
||||
walletTrade.setModule(TRANSFER.getModule());
|
||||
walletTrade.setPayNo(withdrawApplicationDO.getWithdrawNo());
|
||||
walletTrade.setTradeId(String.valueOf(accountWithdrawerDTO.getTradeId()));
|
||||
walletTrade.setType(TradeTypeEnum.FEE_ADJUSTMENT_ORDER.getStatus());
|
||||
walletTrade.setPayUserName(user.getName());
|
||||
walletTrade.setPayAmount(new BigDecimal(accountWithdrawerDTO.getAmount()));
|
||||
walletTrade.setPayStatus(accountWithdrawerDTO.getTradeStatus());
|
||||
walletTrade.setPayTime(new Date());
|
||||
walletTrade.setCreateTime(new Date());
|
||||
walletTradeDAO.insertSelective(walletTrade);
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public Boolean updateTrade(WalletTradeDO walletTradeDO) {
|
||||
log.info("confirmWithdraw_updateTrade:{}", JSONObject.toJSONString(walletTradeDO));
|
||||
WithdrawApplicationDO withdraw = withdrawApplicationDAO.getByWithdrawNo(walletTradeDO.getPayNo());
|
||||
if (Objects.isNull(withdraw)){
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
try {
|
||||
//查询详情
|
||||
BillDetailRequest billDetailRequest = new BillDetailRequest();
|
||||
billDetailRequest.setTradeId(Long.valueOf(walletTradeDO.getTradeId()));
|
||||
TradeRecordDTO billDetail = walletApiService.getBillDetail(billDetailRequest);
|
||||
withdraw.setFailReason(billDetail.getErrMsg());
|
||||
withdraw.setStatus(billDetail.getTradeStatus());
|
||||
withdrawApplicationDAO.update(withdraw);
|
||||
walletTradeDO.setPayStatus(billDetail.getTradeStatus());
|
||||
walletTradeDAO.updateByPrimaryKeySelective(walletTradeDO);
|
||||
}catch (Exception e){
|
||||
log.info("confirmWithdraw_error:{}",e.getMessage());
|
||||
}
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -548,7 +548,7 @@ public class PreAllocationRecordServiceImpl implements PreAllocationRecordServic
|
||||
Map<String, WalletAllocationDTO> allocationConfigMap = walletAllocationConfigDAO
|
||||
.selectByExpenseTypeList(FranchiseBrandEnum.ZXJP.getCode(), null)
|
||||
.stream()
|
||||
.collect(Collectors.toMap(WalletAllocationDTO::getExpenseType, Function.identity()));
|
||||
.collect(Collectors.toMap(WalletAllocationDTO::getExpenseType, Function.identity(),(existing, replacement) -> existing));
|
||||
|
||||
// 获取订单实际费用明细
|
||||
List<ExpenseTypeAmountDTO> actualExpenseList = storeOrderOptionSnapshotDAO
|
||||
|
||||
@@ -282,4 +282,24 @@ public class WalletApiService {
|
||||
public BatchTransferDTO queryBatchTransfer(BatchTransferQueryRequest request) {
|
||||
return walletHttpClientRest.postWithSign(walletBaseUrl + "/open/crm/trans/v1/queryBatchTransfer", request, BatchTransferDTO.class);
|
||||
}
|
||||
|
||||
public AccountTransferDTO accountTransfer(AccountTransferRequest request){
|
||||
return walletHttpClientRest.postWithSign(walletBaseUrl + "/open/crm/trans/v1/accountTransfer", request, AccountTransferDTO.class);
|
||||
}
|
||||
|
||||
public OrgAccountDTO findOrgAccount(AccountPageRequest request){
|
||||
return walletHttpClientRest.postWithSign(walletBaseUrl + "/open/crm/base/v1/findOrgAccount", request, OrgAccountDTO.class);
|
||||
}
|
||||
|
||||
public AccountWithdrawerDTO accountWithdrawer(AccountWithdrawerRequest request){
|
||||
return walletHttpClientRest.postWithSign(walletBaseUrl + "/open/crm/trans/v1/accountWithdrawer", request, AccountWithdrawerDTO.class);
|
||||
}
|
||||
|
||||
public AccountInfoDTO getAccountByAccNo(AccountDetailRequest request){
|
||||
return walletHttpClientRest.postWithSign(walletBaseUrl + "/open/crm/trans/v1/getAccountByAccNo", request, AccountInfoDTO.class);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -163,9 +163,16 @@ public interface WalletService {
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
PageInfo<TradeRecordDTO> getTradeRecordList(CoolTradeRecodePageRequest request);
|
||||
PageInfo<TradeRecordDTO> getTradeRecordList(CoolTradeRecodePageRequest request,Boolean orgFlag);
|
||||
|
||||
|
||||
/**
|
||||
* 查询充值的数据
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
PageInfo<TradeRecordDTO> getRechargeTradeRecordList(CoolTradeRecodeRequest request);
|
||||
|
||||
/**
|
||||
* 通过门店Code 查询存量客户开通基本信息
|
||||
* @param storeCode
|
||||
@@ -202,4 +209,6 @@ public interface WalletService {
|
||||
* 网商充值账户查询
|
||||
*/
|
||||
WsPayAccountDTO wsPayAccountQuery(StoreShopRequest request);
|
||||
|
||||
PageInfo<AccountInfoDTO> getOrgAccountInfoList(CoolAccountPageRequest request);
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user