简德馨 2 лет назад
Родитель
Сommit
d9adc7cedc

+ 119 - 0
src/main/java/org/springblade/common/utils/CapitalMathUtil.java

@@ -0,0 +1,119 @@
+package org.springblade.common.utils;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * @author jdx
+ * 时间:2017-1-6b
+ */
+@Slf4j
+public class CapitalMathUtil {
+
+    /**
+     * 订单货款垫资费用计算
+     *
+     * @param num1    记息金额
+     * @param num2    利率
+     * @param dateNum 天数
+     * @return 返回map值(实际日利率:dateRate,计息天数利息:interest)
+     * @throws IllegalAccessException
+     */
+    public static Map<String, Double> math1(double num1, double num2, int dateNum) throws IllegalAccessException {
+        Map<String, Double> map = new HashMap<>();
+        //计算实际日利息
+        double dayInterest = div(num2, 36000, 10);
+        //实际日利率
+        map.put("dayRate", dayInterest);
+        //计息天数利息
+        map.put("interest", mul(mul(num1, dayInterest), dateNum));
+        return map;
+    }
+
+
+    /**
+     * 获取当月天数
+     *
+     * @param date 指定时间
+     * @return
+     */
+    public static int getDaysOfMonth(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+    }
+
+
+    /**
+     * 加法计算
+     *
+     * @param value1 加数
+     * @param value2 加数
+     * @return
+     */
+    public static double add(double value1, double value2) {
+        BigDecimal val1 = new BigDecimal(Double.valueOf(value1));
+        BigDecimal val2 = new BigDecimal(Double.valueOf(value2));
+        return val1.add(val2).doubleValue();
+    }
+
+    /**
+     * 减法计算
+     *
+     * @param value1 减数
+     * @param value2 被减数
+     * @return
+     */
+    public static double sub(double value1, double value2) {
+        BigDecimal val1 = new BigDecimal(Double.valueOf(value1));
+        BigDecimal val2 = new BigDecimal(Double.valueOf(value2));
+        return val1.subtract(val2).doubleValue();
+    }
+
+    /**
+     * 乘法计算
+     *
+     * @param value1 乘数
+     * @param value2 乘数
+     * @return
+     */
+    public static double mul(double value1, double value2) {
+        BigDecimal val1 = new BigDecimal(Double.valueOf(value1));
+        BigDecimal val2 = new BigDecimal(Double.valueOf(value2));
+        return val1.multiply(val2).doubleValue();
+    }
+
+    /**
+     * 除法计算
+     *
+     * @param value1 被除数
+     * @param value2 除数
+     * @param scale  精度
+     * @return
+     * @throws IllegalAccessException
+     */
+    public static double div(double value1, double value2, int scale) throws IllegalAccessException {
+        //如果精确范围小于0,抛出异常信息
+        if (scale < 0) {
+            throw new IllegalAccessException("精确度不能小于0");
+        }
+        BigDecimal val1 = new BigDecimal(Double.valueOf(value1));
+        BigDecimal val2 = new BigDecimal(Double.valueOf(value2));
+        return val1.divide(val2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
+    /**
+     * 处理double精度问,四舍五入保留2位小数
+     * @param d
+     * @return
+     */
+    public static double doubleFormat(double d){
+        return new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+}

+ 125 - 13
src/main/java/org/springblade/modules/api/controller/AliPay01Controller.java

@@ -1,6 +1,7 @@
 package org.springblade.modules.api.controller;
 
 import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alipay.api.*;
 import com.alipay.api.domain.AlipayFundTransUniTransferModel;
@@ -9,6 +10,7 @@ import com.alipay.api.domain.Participant;
 import com.alipay.api.internal.util.AlipaySignature;
 import com.alipay.api.request.*;
 import com.alipay.api.response.*;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.ijpay.core.kit.PayKit;
@@ -30,6 +32,8 @@ import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.modules.finance.entity.Order;
 import org.springblade.modules.finance.entity.OrderConsign;
 import org.springblade.modules.finance.entity.OrderGrant;
+import org.springblade.modules.finance.entity.PlatformAuthorization;
+import org.springblade.modules.finance.mapper.PlatformAuthorizationMapper;
 import org.springblade.modules.finance.pay.entity.AlipayProperties;
 import org.springblade.modules.finance.service.IOrderConsignService;
 import org.springblade.modules.finance.service.IOrderGrantService;
@@ -44,13 +48,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
 import java.net.URLEncoder;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 @RestController
 @AllArgsConstructor
@@ -66,6 +69,9 @@ public class AliPay01Controller {
 	//预授权
 	private static final String NOTIFY_URL = "/api/v1/aliPay/sdk/auth_notify_url";
 
+	//平台付款预授权
+	private static final String PLATFORM_URL = "/api/v1/aliPay/sdk/platform_authorization_notify_url";
+
 	//抢购
 	private static final String TRADE_URL = "/api/v1/aliPay/sdk/trade_notify_url";
 
@@ -84,6 +90,9 @@ public class AliPay01Controller {
 	private final IOrderConsignService orderConsignService;
 	private final IConsignService consignService;
 
+	@Resource
+	private PlatformAuthorizationMapper paMapper;
+
 	@Autowired
 	private BladeLogger logger;
 
@@ -123,9 +132,9 @@ public class AliPay01Controller {
 			request.setBizModel(model);
 			request.setNotifyUrl(properties.getDomain() + ORDER_URL);
 			try  {
-				//这里和普通的接口调用不同,使用的是sdkExecute
-				//普通模式 使用 execute
-				//证书使用 使用 sdkExecute
+//				这里和普通的接口调用不同,使用的是sdkExecute
+//				普通模式 使用 execute
+//				证书使用 使用 sdkExecute
 				AlipayTradeAppPayResponse response = client.sdkExecute(request);
 				return R.data(response.getBody());
 			}  catch (AlipayApiException e ) {
@@ -136,6 +145,7 @@ public class AliPay01Controller {
 		return R.fail("该支付方式暂不支持!");
 	}
 
+
 	@ApiLog("绑定订单-预授权")
 	@PostMapping("/pay_002")
 	@ApiOperation(value = "统一收单交易支付接口", notes = "预授权")
@@ -229,7 +239,7 @@ public class AliPay01Controller {
 							@ApiParam(value = "数量", required = true) @RequestParam Integer num) throws AlipayApiException {
 		UserApp userApp = new UserApp();
 		UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId,userId));
-		if (Objects.isNull(query)){
+		if (ObjectUtil.isNull(query)){
 			return R.fail("该用户不存在!");
 		}
 		if (query.getEnableAuth() != 2){
@@ -247,7 +257,7 @@ public class AliPay01Controller {
 			return R.fail("该账号已冻结!");
 		}
 		Consign consign = consignService.queryConsign(batNo, userId);
-		if (Objects.isNull(consign)){
+		if (ObjectUtil.isNull(consign)){
 			return R.fail("亲,好物已抢完欢迎再来!");
 		}
 		//判断用户是否在该场次下有预授权
@@ -256,9 +266,12 @@ public class AliPay01Controller {
 			.eq(OrderGrant::getUserId, userId)
 			.eq(OrderGrant::getStatus,1)
 		);
-		if (!Objects.isNull(orderGrant)){
+		if(ObjectUtil.isNotNull(orderGrant)){
 			return R.fail("您已发起预授权,无需再次发起!");
 		}
+//		if (!ObjectUtil.isNull(orderGrant)){
+//			return R.fail("您已发起预授权,无需再次发起!");
+//		}
 		JSONObject data = new JSONObject();
 		String orderNo = CommonUtil.genTimeID();
 		data.put("out_order_no", orderNo);
@@ -449,6 +462,105 @@ public class AliPay01Controller {
 		return R.status(param.updateById());
 	}
 
+	@ApiLog("平台付款预授权回调")
+	@RequestMapping(value = "/platform_authorization_notify_url", method = {RequestMethod.GET, RequestMethod.POST})
+	@ApiOperation(value = "异步通知相应-预授回调", notes = "异步通知相应")
+	public void platformAuthorizationNotify(HttpServletRequest request){
+		String errMsg = "预授回调";
+		logger.info(errMsg, request.getParameterMap().toString());
+		if (!NotifyUtils.rsaCheck(properties, request.getParameterMap())) {
+			//这里处理验签失败
+			log.info(errMsg + "-处理验签失败");
+		}
+		String status = request.getParameter("status");
+		String auth_no = request.getParameter("auth_no");
+		if (!"SUCCESS".equals(status)){
+			log.info(errMsg + "-预授权失败");
+		}
+		String out_request_no = request.getParameter("out_request_no");
+		LambdaQueryWrapper<PlatformAuthorization> query = Wrappers.lambdaQuery(PlatformAuthorization.class);
+		query.eq(PlatformAuthorization::getOrderNo, out_request_no);
+		PlatformAuthorization platformAuthorization = paMapper.selectOne(query);
+		if(ObjectUtil.isNotNull(platformAuthorization)){
+			platformAuthorization.setAuthNo(auth_no);
+			platformAuthorization.setState(1);
+			paMapper.updateById(platformAuthorization);
+		}
+
+	}
+
+	/**
+	 * 发起支付宝预授权
+	 *
+	 * 1、判断用户是否能抢购
+	 * 2、查询是否有寄售/进货单
+	 * 3、发起支付宝预支付
+	 * 4、请求成功 创建预支付订单 默认为未授权
+	 * @param userId 用户id
+	 * @param batNo 批次ID
+	 * @param price 金额
+	 * @param num 预授数量
+	 * @return R
+	 * @throws AlipayApiException
+	 */
+	@ApiLog("发起支付宝预授权")
+	@PostMapping("/platfromAuth")
+	@ApiOperation(value = "线上资金授权冻结接口-调用支付宝预授权", notes = "支付请求")
+	@ApiOperationSupport(order = 3)
+	public R<String> platfromAuth(@ApiParam(value = "用户号", required = true) @RequestParam Long userId,
+								  @ApiParam(value = "批次ID", required = true) @RequestParam Long batNo,
+								  @ApiParam(value = "金额", required = true) @RequestParam BigDecimal price,
+								  @ApiParam(value = "数量", required = true) @RequestParam Integer num) throws AlipayApiException {
+		UserApp userApp = new UserApp();
+		UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId,userId));
+		if (ObjectUtil.isNull(query)){
+			return R.fail("该用户不存在!");
+		}
+		if (query.getEnableAuth() != 2){
+			double k = (double)query.getCreditScore() / 100;
+			int scoreCount = NumberUtil.roundDown(k, 2).intValue();
+			int consignCount = Integer.parseInt(ParamCache.getValue(CommonConstant.DEFAULT_CONDIGN_COUNT));
+			if (scoreCount > consignCount){
+				scoreCount = consignCount;
+			}
+			if (scoreCount < num){
+				return R.fail("预授数量不能大于单场可抢次数!");
+			}
+		}
+		if(query.getState() != 1 ){
+			return R.fail("该账号已冻结!");
+		}
+
+		JSONObject data = new JSONObject();
+		String orderNo = CommonUtil.genTimeID();
+		data.put("out_order_no", orderNo);
+		data.put("out_request_no", orderNo);
+		data.put("order_title","预授权冻结");
+		data.put("amount", price.multiply(new BigDecimal(num)));
+		data.put("product_code","PRE_AUTH_ONLINE"); //销售产品码。支付宝预授权产品固定为 PRE_AUTH_ONLINE
+		data.put("payee_user_id", properties.getPayeeUserId());
+		data.put("timeout_express","30m");
+		//APP支付
+		AlipayFundAuthOrderAppFreezeRequest request = new AlipayFundAuthOrderAppFreezeRequest();
+		request.setNotifyUrl(properties.getDomain() + PLATFORM_URL); //异步通知地址
+		request.setBizContent(data.toJSONString()); //业务参数
+		//APP支付
+		//必须使用 sdkExecute
+		AlipayFundAuthOrderAppFreezeResponse response = client.sdkExecute(request);
+		if(response.isSuccess()){
+			PlatformAuthorization platformAuthorization = new PlatformAuthorization();
+			platformAuthorization.setConsignConfigId(batNo);//场次id
+			platformAuthorization.setTotalNum(num);//授权数量
+			platformAuthorization.setState(0);//未授权
+			platformAuthorization.setOrderNo(orderNo);//订单编号
+			platformAuthorization.setAuthPrice(price.multiply(new BigDecimal(num)).setScale(2, BigDecimal.ROUND_DOWN));//订单金额
+			platformAuthorization.setCreateTime(new Date());
+			paMapper.insert(platformAuthorization);
+			return R.data(response.getBody());
+		}
+		return R.fail("授权失败!");
+	}
+
 	@ApiLog("预授回调")
 	@RequestMapping(value = "/auth_notify_url", method = {RequestMethod.GET, RequestMethod.POST})
 	@ApiOperation(value = "异步通知相应-预授回调", notes = "异步通知相应")
@@ -544,7 +656,7 @@ public class AliPay01Controller {
 		String out_trade_no = request.getParameter("out_trade_no");//获取请求参数中的商户订单号
 		log.info(errMsg, "out_trade_no == " + out_trade_no);
 		Order order = orderService.getOne(Wrappers.<Order>lambdaQuery().eq(Order::getOutTradeNo, out_trade_no));
-		if (Objects.isNull(order)){
+		if (ObjectUtil.isNull(order)){
 			log.info(errMsg + "-订单无数据");
 			return "error";
 		}
@@ -552,7 +664,7 @@ public class AliPay01Controller {
 			log.info(errMsg, "寄售订单 == " + order.getOrderType());
 			//查询寄售订单信息
 			OrderConsign orderConsign  = orderConsignService.getOne(Wrappers.<OrderConsign>lambdaQuery().eq(OrderConsign::getOutTradeNo, out_trade_no));
-			if (Objects.isNull(orderConsign)){
+			if (ObjectUtil.isNull(orderConsign)){
 				log.info(errMsg + "-寄售订单无数据");
 				return "error";
 			}
@@ -560,7 +672,7 @@ public class AliPay01Controller {
 			Double price = orderConsign.getConsignPrice();
 			//查询寄售订单中的寄售人
 			Consign consign  = consignService.getOne(Wrappers.<Consign>lambdaQuery().eq(Consign::getId, orderConsign.getConsignId()));
-			if (Objects.isNull(consign)){
+			if (ObjectUtil.isNull(consign)){
 				log.info(errMsg + "-寄售无数据");
 				return "error";
 			}

+ 2 - 1
src/main/java/org/springblade/modules/api/controller/Api03Controller.java

@@ -17,6 +17,7 @@
 package org.springblade.modules.api.controller;
 
 import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -126,7 +127,7 @@ public class Api03Controller extends BladeController {
 	public R<ConsignVO> detail(@ApiParam(value = "抢购主键", required = true) @RequestParam String consignId,
 							   @ApiParam(value = "用户ID", required = true) @RequestParam Long userId) {
 		Consign detail = consignService.getById(consignId);
-		if (Objects.isNull(detail)){
+		if (ObjectUtil.isNull(detail)){
 			return R.fail("无商品数据!");
 		}
 		ConsignVO consignVO = ConsignWrapper.build().entityVO(detail);

+ 1 - 1
src/main/java/org/springblade/modules/api/controller/Api04Controller.java

@@ -212,7 +212,7 @@ public class Api04Controller extends BladeController {
 		if(StringUtil.isNotBlank(request.getPhone()) && !PhoneUtil.isMobile(request.getPhone())){
 			return R.fail("请输入正确的手机号");
 		}
-		if(Objects.isNull(request.getUserId())){
+		if(StringUtil.isEmpty(request.getUserId())){
 			return R.fail("请求参数错误!");
 		}
 		UserAddress userAddress = Objects.requireNonNull(BeanUtil.copy(request, UserAddress.class));

+ 41 - 7
src/main/java/org/springblade/modules/api/controller/Api05Controller.java

@@ -22,6 +22,7 @@ import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
 import com.alipay.api.request.AlipayTradePayRequest;
 import com.alipay.api.response.AlipayTradePayResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -54,6 +55,7 @@ import org.springblade.modules.finance.vo.OrderVO;
 import org.springblade.modules.finance.wrapper.OrderWrapper;
 import org.springblade.modules.shopping.entity.Consign;
 import org.springblade.modules.shopping.service.IConsignService;
+import org.springblade.modules.shopping.vo.ConsignListVO;
 import org.springblade.modules.shopping.vo.ConsignVO;
 import org.springblade.modules.shopping.wrapper.ConsignWrapper;
 import org.springblade.modules.system.entity.UserApp;
@@ -62,7 +64,11 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 控制器
@@ -138,20 +144,23 @@ public class Api05Controller extends BladeController {
 			//已授权则生成订单
 			String outTradeNo = orderService.consignOrderInsert(request, query, tenantId);
 			if (!StringUtil.isEmpty(outTradeNo)){
+				//通过订单号获取授权信息
 				OrderGrant orderGrant = orderGrantService.getOne(Wrappers.<OrderGrant>lambdaQuery().eq(OrderGrant::getOrderNo, request.getOrderNo()));
-				boolean flg = orderGrantService.thaw(orderGrant);
-				if (!flg){
-					log.info("授权授权信息修改失败");
-					throw new ServiceException("亲!请重新抢单");
-				}
 				//重新查询返回是否授权
 				response = orderService.consignGrant(query, request.getConsignConfigId(), request.getOrderNo());
 				//返回订单号
 				response.setOutTradeNo(outTradeNo);
-				flg = orderConsign(outTradeNo, request.getOrderNo());
+				boolean flg = orderConsign(outTradeNo, request.getOrderNo());
 				if (flg){//是否发起统一收单
+					//修改授权状态
+					flg = orderGrantService.thaw(orderGrant);//flg = true
+					if (!flg){
+						log.info("授权授权信息修改失败");
+						throw new ServiceException("亲!请重新抢单");
+					}
 					return R.data(response);
 				}
+
 				throw new ServiceException("亲!请重新抢单");
 			}
 		}
@@ -159,6 +168,31 @@ public class Api05Controller extends BladeController {
 		return R.data(response);
 	}
 
+	/**
+	 *
+	 * @return
+	 */
+	@PostMapping("getConsignList")
+	@ApiOperation(value = "查询付款授权场次")
+	public R<List<ConsignListVO>> getConsignList(){
+		LambdaQueryWrapper<Consign> consignLambdaQueryWrapper = Wrappers.lambdaQuery(Consign.class);
+		consignLambdaQueryWrapper.eq(Consign::getNowStock, 0).eq(Consign::getConsignState, 2);
+		List<Consign> list = consignService.list(consignLambdaQueryWrapper);
+		ConsignListVO consignListVO = null;
+		List<ConsignListVO> consignListVOS = new ArrayList<>();;
+		Map<Long, List<Consign>> collect1 = list.stream().collect(Collectors.groupingBy(Consign::getConsignConfigId));
+		for (Map.Entry<Long, List<Consign>> entry : collect1.entrySet()) {
+			if(entry.getValue().size() > 0){
+				consignListVO = new ConsignListVO();
+				consignListVO.setConsignConfigId(entry.getKey());
+				consignListVO.setOrderNum(entry.getValue().size());
+				consignListVO.setOrderPrice(new BigDecimal(entry.getValue().get(0).getConsignPrice()).setScale(2, BigDecimal.ROUND_HALF_DOWN));
+				consignListVOS.add(consignListVO);
+			}
+		}
+		return R.data(consignListVOS);
+	}
+
 	@GetMapping("/finance/order-page")
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "我的订单", notes = "传入用户ID,支付状态 0:全部,1待付款,2:待发货,3待收货,4已完成,5已取消")
@@ -194,7 +228,7 @@ public class Api05Controller extends BladeController {
 			consign.setConsignState(3); //已收款
 		}//查询全部
 		IPage<Consign> pages = consignService.page(Condition.getPage(query),
-			Condition.getQueryWrapper(consign).orderByAsc("create_time"));
+			Condition.getQueryWrapper(consign).orderByDesc("create_time"));
 		return R.data(ConsignWrapper.build().listVO(pages.getRecords()));
 	}
 

+ 2 - 1
src/main/java/org/springblade/modules/api/controller/Api08Controller.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.modules.api.controller;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -85,7 +86,7 @@ public class Api08Controller extends BladeController {
 	@ApiOperation(value = "查询轮播数据", notes = "传入类型和条数,类型为字典项ads_type,1应用首页,2商城首页,3推荐品牌,4抢购专区,5新品推荐,6人气推荐")
 	public R<List<Ads>> adsList(@ApiParam(value = "类型", required = true)  @RequestParam Integer type,
 								@ApiParam(value = "条数,默认条数由系统配置", required = false)  @RequestParam(required = false) Integer limit) {
-		if(Objects.isNull(limit)){
+		if(ObjectUtil.isNull(limit)){
 			limit = Integer.valueOf(ParamCache.getValue(CommonConstant.DEFAULT_ADS_LIMIT));
 		}
 		return R.data(adsService.selectAdsList(type, limit));

+ 102 - 0
src/main/java/org/springblade/modules/finance/entity/PlatformAuthorization.java

@@ -0,0 +1,102 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.finance.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 商品寄售表实体类
+ *
+ * @author BladeX
+ * @since 2022年4月9日15:03:14
+ */
+@Data
+@TableName("t_platform_authorization")
+@ApiModel(value = "PlatformAuthorization", description = "场次授权付款表")
+public class PlatformAuthorization implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键ID
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	@ApiModelProperty(value = "主键ID")
+	private Long id;
+
+	/**
+	 * 订单ID
+	 */
+	@ApiModelProperty(value = "订单ID")
+	private String orderNo;
+
+	/**
+	 * 批次ID
+	 */
+	@ApiModelProperty(value = "批次ID")
+	private Long consignConfigId;
+
+	/**
+	 * 授权数量
+	 */
+	@ApiModelProperty(value = "授权数量")
+	private Integer totalNum;
+
+	/**
+	 * 授权号
+	 */
+	@ApiModelProperty(value = "授权号")
+	private String authNo;
+
+	/**
+	 * 授权金额
+	 */
+	@ApiModelProperty(value = "授权金额")
+	private BigDecimal authPrice;
+
+	/**
+	 * 授权状态
+	 */
+	@ApiModelProperty(value = "授权状态:0、未授权,1、已授权,2已解冻")
+	private Integer state;
+
+	/**
+	 * 结束时间
+	 */
+	@ApiModelProperty(value = "结束时间")
+	private Date endTime;
+
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+}

+ 30 - 0
src/main/java/org/springblade/modules/finance/mapper/PlatformAuthorizationMapper.java

@@ -0,0 +1,30 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.finance.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.modules.finance.entity.PlatformAuthorization;
+
+/**
+ * 订单预授权表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-03-27
+ */
+public interface PlatformAuthorizationMapper extends BaseMapper<PlatformAuthorization> {
+
+}

+ 1 - 0
src/main/java/org/springblade/modules/finance/service/impl/OrderGrantServiceImpl.java

@@ -64,6 +64,7 @@ public class OrderGrantServiceImpl extends ServiceImpl<OrderGrantMapper, OrderGr
 	public boolean thaw(OrderGrant entity) {
 		OrderGrant grantUpdate = new OrderGrant();
 		grantUpdate.setId(entity.getId());
+		//剩余数量为1时,把授权状态变为已解冻
 		if (entity.getNowNum() == 1){
 			grantUpdate.setStatus(2);//解冻
 			grantUpdate.setNowNum(0);

+ 3 - 3
src/main/java/org/springblade/modules/finance/service/impl/OrderServiceImpl.java

@@ -262,7 +262,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		if(ObjectUtil.isNull(consign)){//当没有获取到用户寄售单时进入品台单获取流程
 			consign = consignMapper.platformConsign(request.getConsignConfigId(), request.getConsignId());
 			//数据量判断
-			if (Objects.isNull(consign)){
+			if (ObjectUtil.isNull(consign)){
 				throw new ServiceException("亲,好物已抢完欢迎再来!");
 			}
 		}
@@ -281,7 +281,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		}
 		//查询商品信息
 		Goods goods = goodsMapper.selectById(consign.getGoodsId());
-		if (Objects.isNull(goods)){
+		if (ObjectUtil.isNull(goods)){
 			throw new ServiceException("商品不存在!");
 		}
 		User user = userMapper.selectById(request.getUserId());
@@ -564,7 +564,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 			}
 			//查询所抢的寄售订单
 			Consign queryConsign = consignMapper.selectById(query.getConsignId());
-			if(Objects.isNull(queryConsign)){ //后台的数据为0或者寄售的
+			if(ObjectUtil.isNull(queryConsign)){ //后台的数据为0或者寄售的
 				logger.error("订单异常", "寄售无数据!订单号:" + outTradeNo);
 				return false;
 			}

+ 2 - 1
src/main/java/org/springblade/modules/finance/wrapper/OrderGrantWrapper.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.modules.finance.wrapper;
 
+import cn.hutool.core.util.ObjectUtil;
 import org.springblade.common.cache.DictBizCache;
 import org.springblade.common.enums.DictBizEnum;
 import org.springblade.core.mp.support.BaseEntityWrapper;
@@ -54,7 +55,7 @@ public class OrderGrantWrapper extends BaseEntityWrapper<OrderGrant, OrderGrantV
 	public OrderGrantVO entityVO(OrderGrant entity) {
 		OrderGrantVO vo = Objects.requireNonNull(BeanUtil.copy(entity, OrderGrantVO.class));
 		User user = userService.getById(vo.getUserId());
-		if (!Objects.isNull(user)){
+		if (ObjectUtil.isNotNull(user)){
 			vo.setAccount(user.getAccount());
 			vo.setRealName(user.getRealName());
 		}

+ 2 - 1
src/main/java/org/springblade/modules/platform/wrapper/UserTicketWrapper.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.modules.platform.wrapper;
 
+import cn.hutool.core.util.ObjectUtil;
 import org.springblade.common.cache.DictBizCache;
 import org.springblade.common.enums.DictBizEnum;
 import org.springblade.core.mp.support.BaseEntityWrapper;
@@ -52,7 +53,7 @@ public class UserTicketWrapper extends BaseEntityWrapper<UserTicket, UserTicketV
 		vo.setDataSrcDisplayName(DictBizCache.getValue(DictBizEnum.DATA_SRC,vo.getDataSrc()));
 		if (3 == entity.getDataSrc()){
 			User user = userService.getById(entity.getDataId());
-			if (!Objects.isNull(user)){
+			if (ObjectUtil.isNotNull(user)){
 				vo.setAccount(user.getAccount());
 			}
 		}

+ 8 - 0
src/main/java/org/springblade/modules/shopping/controller/ConsignController.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.modules.shopping.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -33,8 +34,10 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.modules.shopping.entity.ConsignConfig;
 import org.springblade.modules.shopping.entity.Goods;
+import org.springblade.modules.shopping.mapper.ConsignMapper;
 import org.springblade.modules.shopping.service.IConsignConfigService;
 import org.springblade.modules.shopping.service.IGoodsService;
+import org.springblade.modules.shopping.vo.ConsignListVO;
 import org.springblade.modules.shopping.wrapper.ConsignWrapper;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -43,7 +46,12 @@ import org.springblade.modules.shopping.vo.ConsignVO;
 import org.springblade.modules.shopping.service.IConsignService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 商品寄售表 控制器

+ 23 - 0
src/main/java/org/springblade/modules/shopping/vo/ConsignListVO.java

@@ -0,0 +1,23 @@
+package org.springblade.modules.shopping.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "ConsignDistVO对象", description = "配货表")
+public class ConsignListVO {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "批次ID")
+	private Long consignConfigId;
+
+	@ApiModelProperty(value = "授权订单数")
+	private Integer orderNum;
+
+	@ApiModelProperty(value = "订单单价")
+	private BigDecimal orderPrice;
+}

+ 4 - 4
src/main/resources/application-dev.yml

@@ -13,7 +13,7 @@ spring:
     #  commandTimeout: 5000
   datasource:
     # MySql 39.108.56.127:3306/t-test
-    url: jdbc:mysql://127.0.0.1:3306/t-dev?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
+    url: jdbc:mysql://39.108.56.127:3306/t-test?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
     username: root
     password: 123456
     # PostgreSQL
@@ -96,7 +96,7 @@ alipay:
     payee-user-id: 2088341967443472
     # 回调域名
     domain: https://wine.gzzzyd.com
-    app-cert-path: D:\Blade2.9.0\bladex-boot\src\main\resources\alipay\appCertPublicKey_2021003125657245.crt
-    ali-pay-cert-path: D:\Blade2.9.0\bladex-boot\src\main\resources\alipay\alipayCertPublicKey_RSA2.crt
-    ali-pay-root-cert-path: D:\Blade2.9.0\bladex-boot\src\main\resources\alipay\alipayRootCert.crt
+    app-cert-path: D:\IdeaProjects\bladex-boot\src\main\resources\alipay\appCertPublicKey_2021003125657245.crt
+    ali-pay-cert-path: D:\IdeaProjects\bladex-boot\src\main\resources\alipay\alipayCertPublicKey_RSA2.crt
+    ali-pay-root-cert-path: D:\IdeaProjects\bladex-boot\src\main\resources\alipay\alipayRootCert.crt