zoujiajian преди 1 година
родител
ревизия
39c0cc5645

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsWholesaleOrderDon.java

@@ -48,6 +48,8 @@ public class GoodsWholesaleOrderDon extends BaseEntity{
 
 	private String shopId;
 
+	private String outRefundNo;
+
 	/**
 	 * 是否网页支付
 	 */
@@ -64,6 +66,8 @@ public class GoodsWholesaleOrderDon extends BaseEntity{
 	@TableField(exist = false)
 	private Boolean isDeposit;
 
+	private BigDecimal refundMoney;
+
 	public enum Status {
 		/**
 		 * 订单状态

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/request/OrderRefundReq.java

@@ -53,4 +53,6 @@ public class OrderRefundReq {
 	 * 扣除的余额
 	 */
 	private BigDecimal deductBalance;
+
+	private Long adminId;
 }

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/goods/GoodsWholesaleService.java

@@ -3,6 +3,7 @@ package com.cyksj.service.goods;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.cyksj.model.entity.GoodsWholesale;
 import com.cyksj.model.entity.GoodsWholesaleUserAccount;
+import com.cyksj.model.request.OrderRefundReq;
 
 import java.util.List;
 import java.util.Map;
@@ -25,4 +26,6 @@ public interface GoodsWholesaleService extends IService<GoodsWholesale> {
 	void updateOrderAccount(List<GoodsWholesaleUserAccount> goodsWholesaleUserAccounts);
 
 	void insertOrderAccount(List<GoodsWholesaleUserAccount> goodsWholesaleUserAccounts);
+
+	void wholesaleOrderRefund(OrderRefundReq refundReq) throws Exception;
 }

+ 25 - 11
netflix-service/src/main/java/com/cyksj/service/goods/impl/GoodsWholesaleServiceImpl.java

@@ -8,7 +8,6 @@ import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Codec;
 import com.cyksj.common.util.Jsons;
-import com.cyksj.common.util.StringUtil;
 import com.cyksj.common.util.Xmls;
 import com.cyksj.mapper.GoodsWholesaleMapper;
 import com.cyksj.mapper.GoodsWholesaleOrderDonMapper;
@@ -19,6 +18,7 @@ import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.model.dto.GoodsWholesaleUserDepositDto;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.request.OrderRefundReq;
 import com.cyksj.service.goods.GoodsWholesaleService;
 import com.cyksj.service.order.OrderRefundService;
 import com.cyksj.service.user.UserBindRelationService;
@@ -27,6 +27,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -186,6 +187,27 @@ public class GoodsWholesaleServiceImpl extends ServiceImpl<GoodsWholesaleMapper,
 		}
 	}
 
+	@Override
+	public void wholesaleOrderRefund(OrderRefundReq refundReq) throws Exception {
+		Long orderId = refundReq.getOrderId();
+		GoodsWholesaleOrderDon orderDon = wholesaleOrderDonMapper.selectById(orderId);
+		if (orderDon == null) {
+			return;
+		}
+		//余额
+		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0) {
+			return;
+		}
+		if (orderDon.getStatus() == GoodsWholesaleOrderDon.Status.refund) {
+			return;
+		}
+		orderDon.setRefundMoney(refundReq.getRefundMoney());
+		String outRefundNo = orderRefundService.refundWholesaleOrder(orderDon);
+		orderDon.setOutRefundNo(outRefundNo);
+		orderDon.setStatus(GoodsWholesaleOrderDon.Status.refund);
+		wholesaleOrderDonMapper.updateById(orderDon);
+	}
+
 	private void setStatusIfGoal(GoodsWholesaleUserDeposit goodsWholesaleUserDeposit) throws Exception {
 		//是否已满足 批发足够账号
 		SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class)
@@ -200,16 +222,8 @@ public class GoodsWholesaleServiceImpl extends ServiceImpl<GoodsWholesaleMapper,
 		List<Long> userIdList = userBindRelationService.getRelationUserIdList(goodsWholesaleUserDeposit.getUserId(), null);
 		Integer payNum = wholesaleOrderDonMapper.getUserWholesaleNumByUserIds(userIdList, null);
 		if (payNum >= num) {
-			//腿还押金
-			try {
-				String outNo = orderRefundService.refundWholesaleUserDeposit(goodsWholesaleUserDeposit);
-				goodsWholesaleUserDeposit.setRefundOutNo(outNo);
-				goodsWholesaleUserDeposit.setStatus(GoodsWholesaleUserDeposit.Status.refund);
-				//批发数量已达
-				goodsWholesaleUserDeposit.setIsGoal(true);
-			} catch (Exception e) {
-				log.info("押金退款错误:{}", StringUtil.getErrorText(e));
-			}
+			//批发数量已达
+			goodsWholesaleUserDeposit.setIsGoal(true);
 		}
 	}
 }

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/order/OrderRefundService.java

@@ -26,4 +26,6 @@ public interface OrderRefundService {
 	void refundUpgradeRecord(UpgradeOrderDon orderDon, BigDecimal refundMoney, UpgradePackage upgradePackage, String operator, String outRefundNo, String refundType, String chatImg);
 
 	String refundWholesaleUserDeposit(GoodsWholesaleUserDeposit goodsWholesaleUserDeposit) throws Exception;
+
+	String refundWholesaleOrder(GoodsWholesaleOrderDon orderDon) throws Exception;
 }

+ 69 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderRefundServiceImpl.java

@@ -157,6 +157,29 @@ public class OrderRefundServiceImpl implements OrderRefundService {
 		return StrUtil.EMPTY;
 	}
 
+	private String wxRefundWholesaleOrder(GoodsWholesaleOrderDon orderDon) throws Exception {
+		BigDecimal money = orderDon.getRefundMoney();
+		if (money.compareTo(BigDecimal.ZERO) <=0){
+			return StrUtil.EMPTY;
+		}
+		long time = System.currentTimeMillis();
+		//退款订单号
+		String outRefundNo = Codec.DoDigest.custom()
+				.setAlgorithm(Codec.DoDigest.Algorithm.MD5)
+				.setStringData(time + String.valueOf(orderDon.getId()))
+				.toHexString();
+		log.info("退押金退款订单号:{}", outRefundNo);
+		weChatService.refundWxOrder(weChatConfig.getAppid(),
+				Optional.ofNullable(orderDon.getShopId()).orElse(ShopConfig.WX_DEFAULT_APP_ID),
+				orderDon.getTransactionId(),
+				outRefundNo,
+				money,
+				money,
+				weChatConfig.getDomain() + "manage/goods/whole/sale/deposit/refund/notify");
+		//记录退款信息
+		return outRefundNo;
+	}
+
 	private String zfbRefundWholesaleUserDeposit(GoodsWholesaleUserDeposit goodsWholesaleUserDeposit) throws Exception {
 		BigDecimal money = goodsWholesaleUserDeposit.getMoney();
 		if (money.compareTo(BigDecimal.ZERO) <=0){
@@ -355,4 +378,50 @@ public class OrderRefundServiceImpl implements OrderRefundService {
 		apiContext.setConfigurationMap(sdkConfig);
 		return apiContext;
 	}
+
+	@Override
+	public String refundWholesaleOrder(GoodsWholesaleOrderDon orderDon) throws Exception {
+		GoodsWholesaleOrderDon.Type type = orderDon.getType();
+		if (type == GoodsWholesaleOrderDon.Type.WeChat) {
+			return wxRefundWholesaleOrder(orderDon);
+		}
+		if (type == GoodsWholesaleOrderDon.Type.ALI_PAY) {
+			return zfbRefundWholesaleOrder(orderDon);
+		}
+		return StrUtil.EMPTY;
+	}
+
+	private String zfbRefundWholesaleOrder(GoodsWholesaleOrderDon orderDon) throws Exception {
+		BigDecimal money = orderDon.getRefundMoney();
+		if (money.compareTo(BigDecimal.ZERO) <=0){
+			return StrUtil.EMPTY;
+		}
+		AlipayTradeRefundResponse response;
+		//支付宝退款
+		AlipayClient alipayClient = AliPayClientFactory.getAlipayClient(Optional.ofNullable(orderDon.getShopId()).orElse(ShopConfig.ZFB_DEFAULT_APP_ID));
+		AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
+		AlipayTradeRefundModel model = new AlipayTradeRefundModel();
+		//支付宝交易号
+		model.setTradeNo(orderDon.getTransactionId());
+		model.setRefundAmount(money.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_EVEN).toString());
+		model.setQueryOptions(List.of("gmt_refund_pay"));
+		long time = System.currentTimeMillis();
+		//退款订单号
+		String outRefundNo = Codec.DoDigest.custom()
+				.setAlgorithm(Codec.DoDigest.Algorithm.MD5)
+				.setStringData(time + String.valueOf(orderDon.getId()))
+				.toHexString();
+		//退款请求号
+		model.setOutRequestNo(outRefundNo);
+		request.setBizModel(model);
+		String shopId = orderDon.getShopId();
+		ShopConfig shopConfig = shopConfigMapper.selectOne(Wrappers.lambdaQuery(ShopConfig.class).eq(ShopConfig::getAppId, orderDon.getShopId()));
+		if (shopId != null && shopConfig != null && shopConfig.getIsCert()) {
+			response = alipayClient.certificateExecute(request);
+		} else {
+			response = alipayClient.execute(request);
+		}
+		if (!response.isSuccess()) throw BusinessRuntimeException.getInstance("退款失败,e:{0}", response.getSubMsg());
+		return outRefundNo;
+	}
 }

+ 17 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonWholeSaleController.java

@@ -3,17 +3,20 @@ package com.cyksj.web.controller.manage.goods;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.EasyExcel;
+import com.cyksj.common.annotation.Log;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.IoKit;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.Xmls;
 import com.cyksj.dto.Result;
+import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsWholesaleOrderDonMapper;
 import com.cyksj.mapper.GoodsWholesaleUserAccountMapper;
 import com.cyksj.model.entity.GoodsWholesale;
 import com.cyksj.model.entity.GoodsWholesaleUserAccount;
 import com.cyksj.model.entity.GoodsWholesaleUserDeposit;
+import com.cyksj.model.request.OrderRefundReq;
 import com.cyksj.model.views.GoodsWholesaleOrderView;
 import com.cyksj.model.views.GoodsWholesaleView;
 import com.cyksj.model.views.WholesaleUserRequirementView;
@@ -26,6 +29,7 @@ import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -185,6 +189,7 @@ public class CmsGoodsDonWholeSaleController {
 	 * 押金退款
 	 */
 	@PostMapping("/deposit/refund/{id}")
+	@Log(module = "批发押金退款", businessType = BusinessType.POST, isSaveRequestData = true)
 	public Result<String> depositRefund(@PathVariable Long id) throws Exception {
 		long adminId = StpUtil.getLoginIdAsLong();
 		goodsWholesaleService.depositRefund(id, adminId);
@@ -232,6 +237,18 @@ public class CmsGoodsDonWholeSaleController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 
+	/**
+	 * 批发订单退款
+	 */
+	@PostMapping("/refund/order")
+	@Log(module = "批发订单退款", businessType = BusinessType.POST, isSaveRequestData = true)
+	public Result<String> wholesaleOrderRefund(@RequestBody @Validated OrderRefundReq refundReq) throws Exception {
+		long adminId = StpUtil.getLoginIdAsLong();
+		refundReq.setAdminId(adminId);
+		goodsWholesaleService.wholesaleOrderRefund(refundReq);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
 	/**
 	 * 上传账号
 	 */