订单业务功能开发v11 订单结算功能 & Bug问题修复

wxpay
LI-CCONG\李聪聪 7 months ago
parent b1100a2e3b
commit 79124e6afd

@ -110,4 +110,8 @@ public class Client {
@TableField("f_creator_time") @TableField("f_creator_time")
private LocalDateTime creatorTime; private LocalDateTime creatorTime;
@ApiModelProperty("修改时间")
@TableField("f_last_modify_time")
private LocalDateTime updateTime;
} }

@ -57,7 +57,7 @@ public class RecycleOrderProduct {
@ApiModelProperty("实际回收单价") @ApiModelProperty("实际回收单价")
@TableField("actual_recoveryl_price") @TableField("actual_recoveryl_price")
private BigDecimal ActualRecoveryPrice; private BigDecimal actualRecoveryPrice;
@ApiModelProperty("创建时间") @ApiModelProperty("创建时间")
@TableField("f_creator_time") @TableField("f_creator_time")

@ -71,12 +71,13 @@ public interface IClientService extends IService<Client> {
/** /**
* openId * id|openId
* @param id
* @param openId * @param openId
* @param amount * @param amount
* @param changeTypeEnum * @param changeTypeEnum
*/ */
void changeBalanceByOpenId(String openId, BigDecimal amount, BalanceChangeTypeEnum changeTypeEnum); void changeBalanceById(String id, String openId, BigDecimal amount, BalanceChangeTypeEnum changeTypeEnum);
/** /**

@ -48,6 +48,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.time.LocalDateTime;
import java.util.Collections; import java.util.Collections;
/** /**
@ -124,21 +125,38 @@ public class ClientServiceImpl extends ServiceImpl<ClientMapper, Client> impleme
} }
@Override // 金额交易! @Override // 金额交易!
public void changeBalanceByOpenId(String openId, BigDecimal amount, BalanceChangeTypeEnum changeTypeEnum) { public void changeBalanceById(String id, String openId, BigDecimal amount, BalanceChangeTypeEnum changeTypeEnum) {
LambdaQueryWrapper<Client> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Client> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Client::getWxOpenid, openId); wrapper.eq(Client::getId, id).or().eq(Client::getWxOpenid, openId);
wrapper.last("for update"); wrapper.last("for update");
Client client = this.getOne(wrapper); Client client = this.getOne(wrapper);
BigDecimal balance = client.getBanlance(); BigDecimal balance = client.getBanlance();
String remark;
LocalDateTime now = LocalDateTime.now();
if (changeTypeEnum.equals(BalanceChangeTypeEnum.INCOME)) { // 收入 if (changeTypeEnum.equals(BalanceChangeTypeEnum.INCOME)) { // 收入
client.setBanlance(balance.add(amount)); balance = balance.add(amount);
remark = "废品回收结算,收入" + amount + "元";
} else { // 支出/提现 } else { // 支出/提现
if (balance.compareTo(amount) < 0) { if (balance.compareTo(amount) < 0) {
throw new BizIllegalException("余额不足"); throw new BizIllegalException("余额不足");
} }
client.setBanlance(balance.subtract(amount)); balance = balance.subtract(amount);
remark = "微信提现" + amount + "元";
} }
// 更新余额
client.setBanlance(balance);
client.setUpdateTime(now);
this.updateById(client); this.updateById(client);
// 添加流水记录
ClientAccountDetail accountDetail = new ClientAccountDetail();
accountDetail.setClientId(client.getId());
accountDetail.setAmount(amount);
accountDetail.setChangeType(changeTypeEnum);
accountDetail.setBanlance(balance);
accountDetail.setRemark(remark);
accountDetail.setCreatorTime(now);
accountDetailMapper.insert(accountDetail);
} }
@ -153,48 +171,49 @@ public class ClientServiceImpl extends ServiceImpl<ClientMapper, Client> impleme
return accountDetailMapper.selectPage(pageDO, wrapperX); return accountDetailMapper.selectPage(pageDO, wrapperX);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void cashBalance(String openId, Integer amount) throws Exception { public void cashBalance(String openId, Integer amount) throws Exception {
// BatchTransferModel batchTransferModel = new BatchTransferModel() // 模拟提现成功
// .setAppid(wxPayV3Properties.getAppId()) this.changeBalanceById(null, openId, new BigDecimal(amount), BalanceChangeTypeEnum.CASH_OUT);
// .setOut_batch_no(PayKit.generateStr()) /* BatchTransferModel batchTransferModel = new BatchTransferModel()
// .setBatch_name("测试商户转账到零钱") .setAppid(wxPayV3Properties.getAppId())
// .setBatch_remark("测试商户转账到零钱") .setOut_batch_no(PayKit.generateStr())
// .setTotal_amount(amount) .setBatch_name("测试商户转账到零钱")
// .setTotal_num(1) .setBatch_remark("测试商户转账到零钱")
// .setTransfer_detail_list(Collections.singletonList( .setTotal_amount(amount)
// new TransferDetailInput() .setTotal_num(1)
// .setOut_detail_no(PayKit.generateStr()) .setTransfer_detail_list(Collections.singletonList(
// .setTransfer_amount(1) new TransferDetailInput()
// .setTransfer_remark("测试商户转账到零钱") .setOut_detail_no(PayKit.generateStr())
// .setOpenid(openId))); .setTransfer_amount(1)
// .setTransfer_remark("测试商户转账到零钱")
// log.info("发起商家转账请求参数 {}", JSONUtil.toJsonStr(batchTransferModel)); .setOpenid(openId)));
// // 删除
// IJPayHttpResponse response = WxPayApi.v3( log.info("发起商家转账请求参数 {}", JSONUtil.toJsonStr(batchTransferModel));
// RequestMethodEnum.POST, // 删除
// WxDomainEnum.CHINA.toString(), IJPayHttpResponse response = WxPayApi.v3(
// TransferApiEnum.TRANSFER_BATCHES.toString(), RequestMethodEnum.POST,
// wxPayV3Properties.getMchId(), WxDomainEnum.CHINA.toString(),
// getSerialNumber(), TransferApiEnum.TRANSFER_BATCHES.toString(),
// null, wxPayV3Properties.getMchId(),
// wxPayV3Properties.getKeyPath(), getSerialNumber(),
// JSONUtil.toJsonStr(batchTransferModel) null,
// ); wxPayV3Properties.getKeyPath(),
// log.info("发起商家转账响应 {}", response); JSONUtil.toJsonStr(batchTransferModel)
// 根据证书序列号查询对应的证书来验证签名结果 );
// boolean verifySignature = WxPayKit.verifySignature(response, wxPayV3Properties.getPlatformCertPath()); log.info("发起商家转账响应 {}", response);
// 根据证书序列号查询对应的证书来验证签名结果
boolean verifySignature = WxPayKit.verifySignature(response, wxPayV3Properties.getPlatformCertPath());
// log.info("verifySignature: {}", verifySignature); // log.info("verifySignature: {}", verifySignature);
// if (response.getStatus() == OK && verifySignature) { // if (response.getStatus() == OK && verifySignature) {
// return response.getBody(); // return response.getBody();
// } // }
// if (response.getStatus() != OK) { if (response.getStatus() != OK) {
// throw new BizIllegalException("提现失败"); throw new BizIllegalException("提现失败");
// } }
// 模拟提现成功 // return response.getBody(); */
this.changeBalanceByOpenId(openId, new BigDecimal(amount), BalanceChangeTypeEnum.CASH_OUT);
// return response.getBody();
} }

@ -13,10 +13,7 @@ import cc.yunxi.domain.query.RecycleOrderQuery;
import cc.yunxi.domain.vo.recycleorder.*; import cc.yunxi.domain.vo.recycleorder.*;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailCreateVO; import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailCreateVO;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailUpdateVO; import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailUpdateVO;
import cc.yunxi.enums.BusinessCodeEnum; import cc.yunxi.enums.*;
import cc.yunxi.enums.OrderStatusEnum;
import cc.yunxi.enums.OrderTypeEnum;
import cc.yunxi.enums.UserTypeEnum;
import cc.yunxi.mapper.RecycleOrderMapper; import cc.yunxi.mapper.RecycleOrderMapper;
import cc.yunxi.service.IClientService; import cc.yunxi.service.IClientService;
import cc.yunxi.service.IRecycleOrderProductService; import cc.yunxi.service.IRecycleOrderProductService;
@ -209,6 +206,7 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
if (!recycleOrder.getStaffsId().equals(orderFinishVO.getStaffsId())) { if (!recycleOrder.getStaffsId().equals(orderFinishVO.getStaffsId())) {
throw new BizIllegalException("非法操作!"); throw new BizIllegalException("非法操作!");
} }
String clientId = recycleOrder.getClientId();
recycleOrder = BeanUtils.copyBean(orderFinishVO, RecycleOrder.class);; recycleOrder = BeanUtils.copyBean(orderFinishVO, RecycleOrder.class);;
recycleOrder.setOrderStatus(OrderStatusEnum.FINISHED); recycleOrder.setOrderStatus(OrderStatusEnum.FINISHED);
recycleOrder.setCompleteTime(LocalDateTime.now()); recycleOrder.setCompleteTime(LocalDateTime.now());
@ -227,7 +225,15 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
List<RecycleOrderProduct> recycleOrderProducts = BeanUtils.copyList(recycleOrderProductVOList, RecycleOrderProduct.class); List<RecycleOrderProduct> recycleOrderProducts = BeanUtils.copyList(recycleOrderProductVOList, RecycleOrderProduct.class);
this.recycleOrderProductService.updateOrderProducts(recycleOrderProducts); this.recycleOrderProductService.updateOrderProducts(recycleOrderProducts);
// 给散户加余额 异步? todo // 订单结算 异步? todo
BigDecimal totalAmount = new BigDecimal("0.00");
for (RecycleOrderProduct recycleOrderProduct : recycleOrderProducts) {
BigDecimal weight = BigDecimal.valueOf(recycleOrderProduct.getProductActualWeight());
BigDecimal price = recycleOrderProduct.getActualRecoveryPrice();
totalAmount = totalAmount.add(weight.multiply(price));
}
// 增加收入余额
clientService.changeBalanceById(clientId, null, totalAmount, BalanceChangeTypeEnum.INCOME);
} }

@ -14,7 +14,8 @@
WHERE WHERE
a.`code` = #{productCode} a.`code` = #{productCode}
ORDER BY ORDER BY
c.f_creator_time ASC; c.f_creator_time DESC
LIMIT 1;
</select> </select>
</mapper> </mapper>

@ -2,8 +2,8 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.yunxi.mapper.RecycleOrderProductMapper"> <mapper namespace="cc.yunxi.mapper.RecycleOrderProductMapper">
<!-- 根据类目code,查询最新一条的有效的价目 --> <!-- 根据类目Id,查询最新一条的有效的价目 -->
<select id="getLatestPriceProductByProductId" resultType="String"> <select id="getLatestPriceProductByProductId" resultType="PriceProduct">
SELECT SELECT
b.id, b.id,
b.price_id, b.price_id,
@ -12,14 +12,14 @@
b.reward_points, b.reward_points,
b.f_creator_time b.f_creator_time
FROM FROM
nx_recycle_order_product a nx_price_product b
INNER JOIN nx_price_product b ON a.product_id = b.product_id
INNER JOIN nx_price c ON b.price_id = c.id INNER JOIN nx_price c ON b.price_id = c.id
AND c.`status` = 1 AND c.`status` = 1
WHERE WHERE
a.`product_id` = #{productId} b.`product_id` = #{productId}
ORDER BY ORDER BY
c.f_creator_time ASC; c.f_creator_time DESC
LIMIT 1;
</select> </select>
</mapper> </mapper>

@ -14,6 +14,7 @@
and ${ew.sqlSegment} and ${ew.sqlSegment}
ORDER BY ORDER BY
a.f_creator_time DESC a.f_creator_time DESC
LIMIT 1;
</select> </select>
</mapper> </mapper>

Loading…
Cancel
Save