Просмотр исходного кода

修改支付和抢购功能等

VEAR 2 лет назад
Родитель
Сommit
6165895e0b
27 измененных файлов с 819 добавлено и 181 удалено
  1. 3 3
      src/main/java/org/springblade/common/config/ApilayAutoConfiguration.java
  2. 105 41
      src/main/java/org/springblade/modules/api/controller/AliPay01Controller.java
  3. 54 21
      src/main/java/org/springblade/modules/api/controller/AliPay02Controller.java
  4. 74 30
      src/main/java/org/springblade/modules/api/controller/Api03Controller.java
  5. 20 4
      src/main/java/org/springblade/modules/api/controller/Api05Controller.java
  6. 15 0
      src/main/java/org/springblade/modules/api/controller/TestController.java
  7. 126 0
      src/main/java/org/springblade/modules/finance/controller/UserTradeController.java
  8. 34 0
      src/main/java/org/springblade/modules/finance/dto/UserTradeDTO.java
  9. 1 1
      src/main/java/org/springblade/modules/finance/entity/Order.java
  10. 2 2
      src/main/java/org/springblade/modules/finance/entity/OrderGrant.java
  11. 107 0
      src/main/java/org/springblade/modules/finance/entity/UserTrade.java
  12. 42 0
      src/main/java/org/springblade/modules/finance/mapper/UserTradeMapper.java
  13. 27 0
      src/main/java/org/springblade/modules/finance/mapper/UserTradeMapper.xml
  14. 3 1
      src/main/java/org/springblade/modules/finance/service/IOrderGrantService.java
  15. 13 1
      src/main/java/org/springblade/modules/finance/service/IOrderService.java
  16. 41 0
      src/main/java/org/springblade/modules/finance/service/IUserTradeService.java
  17. 4 6
      src/main/java/org/springblade/modules/finance/service/impl/OrderGrantServiceImpl.java
  18. 51 63
      src/main/java/org/springblade/modules/finance/service/impl/OrderServiceImpl.java
  19. 41 0
      src/main/java/org/springblade/modules/finance/service/impl/UserTradeServiceImpl.java
  20. 36 0
      src/main/java/org/springblade/modules/finance/vo/UserTradeVO.java
  21. 0 1
      src/main/java/org/springblade/modules/shopping/controller/ConsignConfigController.java
  22. 6 4
      src/main/java/org/springblade/modules/shopping/controller/ConsignController.java
  23. 1 1
      src/main/java/org/springblade/modules/shopping/mapper/ConsignConfigMapper.xml
  24. 10 0
      src/main/java/sql/usertrade.menu.mysql
  25. 1 1
      src/main/resources/application-dev.yml
  26. 1 1
      src/main/resources/application-prod.yml
  27. 1 0
      src/main/resources/application.yml

+ 3 - 3
src/main/java/org/springblade/common/config/ApilayAutoConfiguration.java

@@ -52,11 +52,11 @@ public class ApilayAutoConfiguration {
 		alipayConfig.setCharset(charset);
 		alipayConfig.setSignType(signType);
 		//设置应用公钥证书路径//appCertPublicKey_2021003125657245
-		//alipayConfig.setAppCertPath(properties.getAppCertPath());
+		alipayConfig.setAppCertPath(properties.getAppCertPath());
 		//设置支付宝公钥证书路径//alipayCertPublicKey_RSA2
-		//alipayConfig.setAlipayPublicCertPath(properties.getAliPayRootCertPath());
+		alipayConfig.setAlipayPublicCertPath(properties.getAliPayRootCertPath());
 		//设置支付宝根证书路径
-		//alipayConfig.setRootCertPath(properties.getAliPayRootCertPath());
+		alipayConfig.setRootCertPath(properties.getAliPayRootCertPath());
 		//return new DefaultAlipayClient(gatewayUrl, appId, privateKey, format, charset, alipayPublicKey, signType);
 		return new DefaultAlipayClient(alipayConfig);
     }

+ 105 - 41
src/main/java/org/springblade/modules/api/controller/AliPay01Controller.java

@@ -2,11 +2,9 @@ package org.springblade.modules.api.controller;
 
 import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSONObject;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.AlipayClient;
-import com.alipay.api.AlipayConfig;
-import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.*;
 import com.alipay.api.domain.AlipayFundTransUniTransferModel;
+import com.alipay.api.domain.AlipayTradeAppPayModel;
 import com.alipay.api.domain.Participant;
 import com.alipay.api.internal.util.AlipaySignature;
 import com.alipay.api.request.*;
@@ -24,7 +22,6 @@ import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.NotifyUtils;
 import org.springblade.core.log.annotation.ApiLog;
-import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.log.logger.BladeLogger;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.DateUtil;
@@ -48,6 +45,9 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
 
 @RestController
 @AllArgsConstructor
@@ -64,7 +64,7 @@ public class AliPay01Controller {
 	private static final String TRADE_URL = "/api/v1/aliPay/sdk/trade_notify_url";
 
 	//购买
-	//private static final String TRADE_URL = "/api/v1/aliPay/sdk/order_notify_url";
+	private static final String ORDER_URL = "/api/v1/aliPay/sdk/order_notify_url";
 
 	@Autowired
 	private AlipayClient client;//支付宝请求sdk客户端
@@ -73,9 +73,7 @@ public class AliPay01Controller {
 	private AlipayProperties properties;//支付宝sdk配置
 
 	private final IOrderService orderService;
-
 	private final IOrderGrantService orderGrantService;
-
 	private final IUserService userService;
 	private final IOrderConsignService orderConsignService;
 	private final IConsignService consignService;
@@ -83,7 +81,7 @@ public class AliPay01Controller {
 	@Autowired
 	private BladeLogger logger;
 
-	@ApiLog("发起支付-直接交易")
+	@ApiLog("发起交易-证书")
 	@PostMapping("/pay_001")
 	@ApiOperation(value = "统一收单线下交易查询", notes = "当面付")
 	@ApiOperationSupport(order = 1)
@@ -98,33 +96,36 @@ public class AliPay01Controller {
 		}
 		if(order.getOrderType() == 3){
 			//寄售订单而且寄售方式为寄售
-			Consign consign = consignService.getOne(Wrappers.<Consign>lambdaQuery().eq(Consign::getConsignType,order.getOutTradeNo()));
-			if (consign != null && consign.getConsignFor() == 2){
-				return R.fail("该订单为寄售单,不能发起交易!");
+			OrderConsign orderConsign = orderConsignService.getOne(Wrappers.<OrderConsign>lambdaQuery()
+				.eq(OrderConsign::getOutTradeNo, outTradeNo));
+			if (orderConsign != null){
+				Consign consign = consignService.getById(orderConsign.getConsignId());
+				if (consign != null && consign.getConsignType() == 2){
+					return R.fail("该订单为抢购单,不能发起交易!");
+				}
 			}
 		}
 		if("aliPay".equals(payFor)){
-			try {
-				JSONObject data = new JSONObject();
-				data.put("out_trade_no", outTradeNo); //商户订单号
-				//产品码, APP支付 QUICK_MSECURITY_PAY, PC支付 FAST_INSTANT_TRADE_PAY, 移动H5支付 QUICK_WAP_PAY
-				data.put("product_code", "QUICK_MSECURITY_PAY");
-				data.put("total_amount", "0.1"); //订单金额
-				data.put("subject", "中宏酒业"); //订单标题
-				//APP支付
-				AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
-				request.setNotifyUrl(properties.getDomain() + TRADE_URL); //异步通知地址
-				request.setBizContent(data.toJSONString()); //业务参数
-				//APP支付
+			AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest ();
+			AlipayTradeAppPayModel model = new AlipayTradeAppPayModel ();
+			model.setBody("中宏商城" );
+			model.setSubject("中宏商城");
+			model.setOutTradeNo(outTradeNo);
+			model.setTimeoutExpress("30m");
+			model.setTotalAmount(order.getPayFee().toString());
+			model.setProductCode("QUICK_MSECURITY_PAY");
+			request.setBizModel(model);
+			request.setNotifyUrl(properties.getDomain() + ORDER_URL);
+			try  {
+				//这里和普通的接口调用不同,使用的是sdkExecute
+				//普通模式 使用 execute
+				//证书使用 使用 sdkExecute
 				AlipayTradeAppPayResponse response = client.sdkExecute(request);
-				if (response.isSuccess()){
-					return R.data(response.getBody());
-				}
-			} catch (AlipayApiException e) {
+				return R.data(response.getBody());
+			}  catch (AlipayApiException e ) {
 				e.printStackTrace();
-				log.info("这里报错了.....");
+				return R.fail("发起支付失败!");
 			}
-			return R.fail("发起支付失败!");
 		}
 		return R.fail("该支付方式暂不支持!");
 	}
@@ -181,7 +182,9 @@ public class AliPay01Controller {
 			if (!flg){
 				logger.info("订单绑定失败",update.toString());
 			}
-			AlipayTradePayResponse response = client.execute(request);
+			//普通模式 使用 execute
+			//证书使用 使用 certificateExecute
+			AlipayTradePayResponse response = client.certificateExecute(request);
 			if (response.isSuccess()){
 				return R.data(response.getBody());
 			}else{
@@ -204,7 +207,8 @@ public class AliPay01Controller {
 							@ApiParam(value = "批次ID", required = true) @RequestParam Long batNo,
 							@ApiParam(value = "金额", required = true) @RequestParam Double price,
 							@ApiParam(value = "数量", required = true) @RequestParam Integer num) throws AlipayApiException {
-		//1.通过批次号查询金额
+
+		//1.通过批次号和用户id查询是有在预授权的数据
 		JSONObject data = new JSONObject();
 		String orderNo = CommonUtil.genTimeID();
 		data.put("out_order_no", orderNo);
@@ -219,6 +223,7 @@ public class AliPay01Controller {
 		request.setNotifyUrl(properties.getDomain() + NOTIFY_URL); //异步通知地址
 		request.setBizContent(data.toJSONString()); //业务参数
 		//APP支付
+		//必须使用 sdkExecute
 		AlipayFundAuthOrderAppFreezeResponse response = client.sdkExecute(request);
 		if(response.isSuccess()){
 			//查询数据如果已经预授权的
@@ -232,6 +237,7 @@ public class AliPay01Controller {
 			grant.setNowNum(num);
 			grant.setPrice(price);
 			grant.setDataDate(dataDate);
+			grant.setCreateTime(DateUtil.now());//创建时间
 			orderGrantService.save(grant);
 			return R.data(response.getBody());
 		}
@@ -292,14 +298,14 @@ public class AliPay01Controller {
 		alipayConfig.setRootCertPath("D:\\Blade2.9.0\\bladex-boot\\src\\main\\resources\\alipay\\alipayRootCert.crt");
 		AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
 		AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
-		model.setOutBizNo("9c721d8d8a6948b8b5c9c2084b264acd");
+		model.setOutBizNo("9c721d8d8a648b8b5c9c2084b264acd");
 		model.setRemark("201905代发");
 		model.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");
 		model.setBizScene("DIRECT_TRANSFER");
 		Participant payeeInfo = new Participant();
-		payeeInfo.setIdentity("2088012801069195");
+		payeeInfo.setIdentity("2088022745054432");
 		payeeInfo.setIdentityType("ALIPAY_USER_ID");
-		payeeInfo.setName("丰元权");
+		payeeInfo.setName("徐维");
 		model.setPayeeInfo(payeeInfo);
 		model.setTransAmount("0.1");
 		model.setProductCode("TRANS_ACCOUNT_NO_PWD");
@@ -315,6 +321,17 @@ public class AliPay01Controller {
 		return R.fail("打款失败!");
 	}
 
+	@ApiLog("抢购打款-测试")
+	@PostMapping("/pay_006")
+	@ApiOperation(value = "单笔转账到支付宝账户", notes = "单笔转账到支付宝账户")
+	@ApiOperationSupport(order = 5)
+	public R pay006(@ApiParam(value = "支付宝", required = true) @RequestParam String aliPayId,
+					@ApiParam(value = "真实姓名", required = true) @RequestParam String name,
+					@ApiParam(value = "金额", required = true) @RequestParam String amount) {
+		transfer(aliPayId, name, amount);
+		return R.fail("正在打款...");
+	}
+
 	@ApiLog("资金解冻")
 	@GetMapping("/pay_unfreeze")
 	@ApiOperation(value = "资金授权解冻", notes = "支付请求")
@@ -325,7 +342,7 @@ public class AliPay01Controller {
 		JSONObject bizContent = new JSONObject();
 		bizContent.put("auth_no",authNo);
 		bizContent.put("out_request_no","outRequestNo123");
-		bizContent.put("amount",amount);
+		bizContent.put("amount", amount);
 		bizContent.put("remark","解冻资金");
 		JSONObject extraParam = new JSONObject();
 		JSONObject unfreezeBizInfo = new JSONObject();
@@ -337,10 +354,10 @@ public class AliPay01Controller {
 		// 使用execute方法发起请求
 		AlipayFundAuthOrderUnfreezeResponse response = client.execute(request);
 		if(response.isSuccess()){
-			logger.info("解冻资金成功",response.getBody());
+			logger.info("解冻资金成功", response.getBody());
 			return R.fail("解冻资金成功!");
 		}
-		logger.info("解冻资金失败",response.getBody());
+		logger.info("解冻资金失败", response.getBody());
 		return R.fail("解冻资金失败!");
 	}
 
@@ -414,6 +431,7 @@ public class AliPay01Controller {
 		grantUpdate.setId(query.getId());
 		grantUpdate.setStatus(1);//已授权
 		grantUpdate.setAuthNo(auth_no);
+		grantUpdate.setFreezeTime(DateUtil.now());
 		boolean flg =  orderGrantService.updateById(grantUpdate);
 		if (!flg){
 			log.info(errMsg + "-更新数据失败");
@@ -422,25 +440,63 @@ public class AliPay01Controller {
 		return "success";
 	}
 
+	@ApiLog("购买回调")
+	@RequestMapping(value = "/order_notify_url", method = {RequestMethod.GET, RequestMethod.POST})
+	@ApiOperation(value = "异步通知相应-购买回调", notes = "异步通知相应")
+	@ApiOperationSupport(order = 100)
+	public String orderNotify(HttpServletRequest request) throws AlipayApiException {
+		String errMsg = "购买回调";
+		//获取支付宝POST过来反馈信息
+		Map<String,String> params = new HashMap<>();
+		Map requestParams = request.getParameterMap();
+		for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext ();) {
+			String name =  ( String )iter.next();
+			String[] values = (String[])requestParams.get(name);
+			String valueStr="";
+			for(int i = 0;i < values.length; i++){
+				valueStr = (i== values.length-1)?valueStr+values[i]:valueStr+values[i] + ",";
+			}
+			//乱码解决,这段代码在出现乱码时使用。
+			//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
+			params.put(name,valueStr);
+		}
+		log.info("params === " + params.toString());
+		//切记alipayPublicCertPath是支付宝公钥证书路径,请去open.alipay.com对应应用下载。
+		//boolean AlipaySignature.rsaCertCheckV1(Map<String, String> params, String publicKeyCertPath, String charset,String signType)
+		boolean flag = AlipaySignature.rsaCertCheckV1(params,properties.getAliPayCertPath(), AlipayConstants.CHARSET_UTF8,"RSA2");
+		log.info("flag === " + flag);
+		String out_trade_no = request.getParameter("out_trade_no");//获取请求参数中的商户订单号
+		Order order = orderService.getOne(Wrappers.<Order>lambdaQuery().eq(Order::getOutTradeNo, out_trade_no));
+		if (order == null){
+			log.info(errMsg + "-订单无数据");
+			return "error";
+		}
+		//寄售和购买
+		orderService.payCommonSuccess(out_trade_no,"aliPay");
+		return "success";
+	}
+
 	@ApiLog("购买进货回调")
 	@RequestMapping(value = "/trade_notify_url", method = {RequestMethod.GET, RequestMethod.POST})
 	@ApiOperation(value = "异步通知相应-购买进货回调", notes = "异步通知相应")
 	@ApiOperationSupport(order = 100)
 	public String tradeNotify(HttpServletRequest request) {
 		String errMsg = "购买进货回调";//抢购改为进货
-		logger.info(errMsg, request.getParameterMap().toString());
+		log.info(errMsg, request.getParameterMap().toString());
 		if (!NotifyUtils.rsaCheck(properties, request.getParameterMap())) {
 			//这里处理验签失败
 			log.info(errMsg + "-处理验签失败" + request.getParameterMap());
 			return "error";
 		}
 		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 (order == null){
 			log.info(errMsg + "-订单无数据");
 			return "error";
 		}
 		if(order.getOrderType() == 3){
+			log.info(errMsg, "寄售订单 == " + order.getOrderType());
 			//通过订单号获取寄售人信息
 			OrderConsign orderConsign  = orderConsignService.getOne(Wrappers.<OrderConsign>lambdaQuery().eq(OrderConsign::getOutTradeNo, out_trade_no));
 			if (orderConsign == null){
@@ -459,11 +515,13 @@ public class AliPay01Controller {
 				log.info(errMsg + "-预授权无数据");
 				return "error";
 			}
+			log.info(errMsg, "修改授权信息 == " + query);
 			OrderGrant grantUpdate = new OrderGrant();
 			grantUpdate.setId(query.getId());
 			if (query.getNowNum() == 1){
 				grantUpdate.setStatus(2);//解冻
 				grantUpdate.setNowNum(0);
+				grantUpdate.setUnfreezeTime(DateUtil.now());//解冻时间
 			}else{
 				//状态不变
 				grantUpdate.setNowNum(query.getNowNum() - 1);//减少数量
@@ -478,18 +536,21 @@ public class AliPay01Controller {
 				//获取寄售人信息
 				UserApp userApp = new UserApp();
 				UserApp user = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId,consign.getConsignUserId()));
+				log.info(errMsg, "-获取寄售人信息进行打款,用户信息:" +  user);
 				if (user != null && user.getUserId() != null){
 					User u = userService.getById(user.getUserId());
 					if (u != null && u.getRealName() != null){
 						//向寄售人打款
-						log.info(errMsg + "-向寄售人打款");
+						log.info(errMsg + "- 向寄售人打款: 寄售人信息支付宝账号:" + user.getAlipayUserId() + "姓名:" + u.getRealName());
 						transfer(user.getAlipayUserId(),u.getRealName(), Double.toString(query.getPrice()));
 					}else{
-						log.info(errMsg + "-修改失败");
+						log.info(errMsg + "- 修改失败");
 					}
 				}else{
 					log.info(errMsg + "-修改失败");
 				}
+			}else{
+				log.info(errMsg, "寄售来源为后台  == 无需打款" );
 			}
 		}else{
 			log.info(errMsg + "-购买订单回调");
@@ -501,6 +562,7 @@ public class AliPay01Controller {
 
 	private void transfer(String identity, String name, String transAmount){
 		try {
+			log.info("向用户【" + name +" 】打款开始,打款账号:"  + identity);
 			String privateKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCU4XTbNjnNOmuEnwBEgUBOVLK5CaUiUFKEkVW1/2sTlijARZzLtzwXfbkvzHEhCSu+E+OA1Futbh5HwNAC06bvqYDS+TXrFuZ0LcDaU92lk5Hp/ed8NhRXtm0gss1TS0vebOq+3kejErIvVCg9kNMrYMrmdf8G0+zKlCp3vrfdM37IeLXp3GoOckNzHh/LT7rLd7/9QcdSCPixPSwusrfCusw3H093cuWkV9WX4Go/zHTL9rAEwJPOn36OhyVc1oG113ZJiVg7KgsZGOCJJyh9BvlKq2vuKxnylQwq9Kh5e+BfP2FSWs7a1XMj/79JsZTxztJ9tFqcSXQh99vq1nd1AgMBAAECggEAVglIT5oxoxEcq0J7lBshf2Lg+Z/CR2clmKioYImfZm1DVYGlD/DvECA+kYnS4qV7GthBg+S0qi/V3d9mFgwcD6nj4YfVCets+Dyskz8d+p6iFxf820IhVWL+A4Rwta7wxDQrIGwx9+JJCKLYsmNsNUg1WSNdYqO71oHzXMnhVTmYJ6sKOrrBucyI4Ydu9UbfN+DRRGD9seL+Nxh1V2PPXs4ftk2kRlG18LaTPgFba1g8QBIpGDR9gFqM+DvBHUxAWsPRnL1+q0c6o5Ndk7W5f7Ob1zxF/lgqHudiG38jItkwc7MLMOYjbV5wiJPZc93nsHS1CKPSEX9/snNLnx2LQQKBgQDMyLBVVasfTMQpMjyi+Jof9JLHPiRP3dEHwZECUgfdWhPoidLjK9y1wszmCLrcg01842WufrpbJ1QXs+g8x6+DhLHvcKum1znsvQKWdy/2V6a2eahNHsYi1Qus+N0dFgotfZwfElfkIU/jAwh6OnYPCXQCVmdvoxzmdk81L04d5QKBgQC6HY6EZ8o4mo4CzDss2qxT2oKuiI0clnbDPC9LJzkRBVbHosx6AO+C3RyfREZxMzNhYW3XnozifDyRw6rlvI6toE3l9ku71dJS1aKZwbH/h0rdHXXqDHARYc9rdwCzOM2t2Kve/PgXxCDQdwY/m0deXM22oKdOlb7miz2YTGLaUQKBgEg8qucPNzPtUmztybH7W/LVxUj/RLPfnTLNNyfIY/nTIp6ur3NvL4X2V2z1u2S59IWPeXjaP0aUUvehgNSf4+vSzSmXZxWNamN2MQl+ta6CMM7Bj3rU1jPHTz0O9ICkG6b8Xiwfvl082v9LPJxRLwAS55dDf21D7pflN/+c1kN5AoGARaRHrt3TeojCuONJBUiyERKDseFgxCC9QeLkY3/Cx86yoTMWxlRRSyuHyUTYAwXApSC65GLsntcUJwsLiLmcvfVtEK6vuhKRh/Nuy5ACFfa/Gawrci/DQ43Q+opmFaoctH+OGHuaLfJywO64xNZKx1F8nGjTEgHQlB3oJ3P1zXECgYBW/GRUU+SevGeLjZTZ9WqG+ztseItnmEwmar9tGhR9TNv3vDiL5/fsAfI8ApMiIzDe6+QfS5Lxx5rD6V4Et/zBpsf8JzqP2eDiTe9UiHxDr2v5NIxelf404VZcdRh83u84lCJTa/ZYanFu94UW6h70MHhDWtiWddtFR3EXt5hD9w==";
 			String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhIxPBQL0OKBc6fcU/9PdVTMA7L2s314oU2w1q06ywQSDdhF3RY1Bo0Eqh4Zg8QpPirFeyAc4rhFjyKZRlngQXrybcAhUfswD86QQGodObe3aA9bbWdXiTt10Q5CBk5GImadNiEW6Adh+0bY5ezf1RbxIjbGDfH6x5gatZnpjPswiHMQnskZtg9JSfE2u8WEKuSaH8yhnkllHpIHWnWvFvXwNVNycXdmDrEe7gIB1yCouNK6/DZ7IQH2AajSuvbxmCqO0MzywEfgvLqE0GFVsKKmXvgJebRAnW9RmGhmrxvEIceXCjR3tbxM9gX8lioDlqKnBootTgAbjIJ5VrPvKPwIDAQAB";
 			AlipayConfig alipayConfig = new AlipayConfig();
@@ -540,8 +602,10 @@ public class AliPay01Controller {
 			request.setBizModel(model);
 			AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
 			if (!response.isSuccess()){
+				log.info("向用户【" + name +" 】打款失败,打款账号:"  + identity);
 				logger.info("打款失败", ",打款人:" + name + "支付宝账号:" + identity);
 			}else{
+				log.info("向用户【" + name +" 】打款成功,打款账号:"  + identity);
 				logger.info("打款成功", ",打款人:" + name + "支付宝账号:" + identity);
 			}
 		} catch (AlipayApiException e) {

+ 54 - 21
src/main/java/org/springblade/modules/api/controller/AliPay02Controller.java

@@ -9,6 +9,7 @@ import com.alipay.api.internal.util.AlipaySignature;
 import com.alipay.api.response.AlipayFundAuthOrderFreezeResponse;
 import com.alipay.api.response.AlipayFundCouponOrderAgreementPayResponse;
 import com.alipay.api.response.AlipayTradeCreateResponse;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.ijpay.alipay.AliPayApi;
 import com.ijpay.alipay.AliPayApiConfig;
@@ -17,14 +18,21 @@ import com.ijpay.core.kit.PayKit;
 import com.ijpay.core.kit.RsaKit;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.StringUtils;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.modules.finance.controller.AbstractAliPayApiController;
+import org.springblade.modules.finance.entity.Order;
 import org.springblade.modules.finance.pay.entity.AjaxResult;
 import org.springblade.modules.finance.pay.entity.AliPayBean;
+import org.springblade.modules.finance.service.IOrderService;
+import org.springblade.modules.shopping.entity.Consign;
+import org.springblade.modules.shopping.service.IConsignService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -55,18 +63,21 @@ public class AliPay02Controller extends AbstractAliPayApiController {
 	private static final Logger log = LoggerFactory.getLogger(AliPay02Controller.class);
 
 	// 证书模式
-	// private final static String NOTIFY_URL = "/aliPay/cert_notify_url";
-	// private final static String RETURN_URL = "/aliPay/cert_return_url";
+	private final static String NOTIFY_URL = "/aliPay/cert_notify_url";
+	private final static String RETURN_URL = "/aliPay/cert_return_url";
 
 	// 普通公钥模式
-    private final static String NOTIFY_URL = "/api/v1/aliPay/notify_url";
-	private final static String RETURN_URL = "/api/v1/aliPay/return_url";
+    //private final static String NOTIFY_URL = "/api/v1/aliPay/notify_url";
+	//private final static String RETURN_URL = "/api/v1/aliPay/return_url";
 
 	private final AjaxResult result = new AjaxResult();
 
 	@Autowired
 	private AliPayBean aliPayBean;
 
+	private final IOrderService orderService;
+	private final IConsignService consignService;
+
 	@Override
 	public AliPayApiConfig getApiConfig() throws AlipayApiException {
 		AliPayApiConfig aliPayApiConfig;
@@ -129,28 +140,50 @@ public class AliPay02Controller extends AbstractAliPayApiController {
 
 	/**
 	 * 创建订单
-	 * {"alipay_trade_create_response":{"code":"10000","msg":"Success","out_trade_no":"081014283315033","trade_no":"2017081021001004200200274066"},"sign":"ZagfFZntf0loojZzdrBNnHhenhyRrsXwHLBNt1Z/dBbx7cF1o7SZQrzNjRHHmVypHKuCmYifikZIqbNNrFJauSuhT4MQkBJE+YGPDtHqDf4Ajdsv3JEyAM3TR/Xm5gUOpzCY7w+RZzkHevsTd4cjKeGM54GBh0hQH/gSyhs4pEN3lRWopqcKkrkOGZPcmunkbrUAF7+AhKGUpK+AqDw4xmKFuVChDKaRdnhM6/yVsezJFXzlQeVgFjbfiWqULxBXq1gqicntyUxvRygKA+5zDTqE5Jj3XRDjVFIDBeOBAnM+u03fUP489wV5V5apyI449RWeybLg08Wo+jUmeOuXOA=="}
+	 * {"alipay_trade_create_response":{"code":"10000",
+	 * "msg":"Success","out_trade_no":"081014283315033",
+	 * "trade_no":"2017081021001004200200274066"},
+	 * "sign":"ZagfFZntf0loojZzdrBNnHhenhyRrsXwHLBNt1Z/dBbx7cF1o7SZQrzNjRHHmVypHKuCmYifikZIqbNNrFJauSuhT4MQkBJE+YGPDtHqDf4Ajdsv3JEyAM3TR/Xm5gUOpzCY7w+RZzkHevsTd4cjKeGM54GBh0hQH/gSyhs4pEN3lRWopqcKkrkOGZPcmunkbrUAF7+AhKGUpK+AqDw4xmKFuVChDKaRdnhM6/yVsezJFXzlQeVgFjbfiWqULxBXq1gqicntyUxvRygKA+5zDTqE5Jj3XRDjVFIDBeOBAnM+u03fUP489wV5V5apyI449RWeybLg08Wo+jUmeOuXOA=="}
 	 */
-	@RequestMapping(value = "/tradeCreate" , method = {RequestMethod.GET, RequestMethod.POST})
+	@RequestMapping(value = "/trade" , method = {RequestMethod.GET, RequestMethod.POST})
 	@ResponseBody
 	@ApiOperation(value = "创建订单", notes = "创建订单")
 	@ApiOperationSupport(order = 4)
-	public String tradeCreate(@RequestParam("outTradeNo") String outTradeNo) {
-		String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL;
-		AlipayTradeCreateModel model = new AlipayTradeCreateModel();
-		model.setOutTradeNo(outTradeNo);
-		model.setTotalAmount("88.88");
-		model.setBody("Body");
-		model.setSubject("Javen 测试统一收单交易创建接口");
-		//买家支付宝账号,和buyer_id不能同时为空
-		model.setBuyerLogonId("skuaqo5756@sandbox.com");
-		try {
-			AlipayTradeCreateResponse response = AliPayApi.tradeCreateToResponse(model, notifyUrl);
-			return response.getBody();
-		} catch (AlipayApiException e) {
-			e.printStackTrace();
+	public R tradeCreate(@ApiParam(value = "订单号", required = true) @RequestParam String outTradeNo,
+						 @ApiParam(value = "支付渠道:aliPay支付宝,wechatPay微信支付,unionPay银联 ", required = true) @RequestParam String payFor) {
+
+		Order order = orderService.getOne(Wrappers.<Order>lambdaQuery().eq(Order::getOutTradeNo, outTradeNo));
+		if (order == null){
+			return R.fail("请求参数错误!");
 		}
-		return null;
+		if(StringUtil.isEmpty(payFor)){
+			return R.fail("请选择支付方式!");
+		}
+		if(order.getOrderType() == 3){
+			//寄售订单而且寄售方式为寄售
+			Consign consign = consignService.getOne(Wrappers.<Consign>lambdaQuery().eq(Consign::getConsignType,order.getOutTradeNo()));
+			if (consign != null && consign.getConsignFor() == 2){
+				return R.fail("该订单为寄售单,不能发起交易!");
+			}
+		}
+		if("aliPay".equals(payFor)){
+			String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL;
+			AlipayTradeCreateModel model = new AlipayTradeCreateModel();
+			model.setOutTradeNo(outTradeNo);
+			model.setTotalAmount(order.getPayFee().toString());
+			model.setBody("Body");
+			model.setSubject("中宏酒业");
+			//买家支付宝账号,和buyer_id不能同时为空
+			//model.setBuyerLogonId("skuaqo5756@sandbox.com");
+			try {
+				AlipayTradeCreateResponse response = AliPayApi.tradeCreateToResponse(model, notifyUrl);
+				return R.fail(response.getBody());
+			} catch (AlipayApiException e) {
+				e.printStackTrace();
+				return R.fail("创建订单失败");
+			}
+		}
+		return R.fail("创建订单失败");
 	}
 
 	@PostMapping(value = "/wapPayNoSdk")

+ 74 - 30
src/main/java/org/springblade/modules/api/controller/Api03Controller.java

@@ -25,31 +25,30 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springblade.common.cache.ParamCache;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
-import org.springblade.core.redis.cache.BladeRedis;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.modules.api.service.IApiService;
-import org.springblade.modules.desk.service.INoticeService;
 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.service.IOrderConsignService;
 import org.springblade.modules.finance.service.IOrderGrantService;
 import org.springblade.modules.finance.service.IOrderService;
-import org.springblade.modules.platform.service.IAdsService;
-import org.springblade.modules.platform.service.IFreightService;
-import org.springblade.modules.platform.service.IUserAddressService;
-import org.springblade.modules.platform.service.IUserBrowseService;
 import org.springblade.modules.shopping.entity.Consign;
 import org.springblade.modules.shopping.entity.ConsignConfig;
 import org.springblade.modules.shopping.entity.GoodsAttributes;
-import org.springblade.modules.shopping.service.*;
+import org.springblade.modules.shopping.service.IConsignConfigService;
+import org.springblade.modules.shopping.service.IConsignService;
+import org.springblade.modules.shopping.service.IGoodsAttributesService;
+import org.springblade.modules.shopping.service.IGoodsService;
 import org.springblade.modules.shopping.vo.ConsignVO;
 import org.springblade.modules.shopping.vo.GoodsVO;
 import org.springblade.modules.shopping.wrapper.ConsignWrapper;
@@ -77,6 +76,7 @@ import java.util.List;
 @RequestMapping(CommonConstant.API_URL)
 @Api(value = "抢购接口", tags = "03.抢购接口")
 public class Api03Controller extends BladeController {
+	private static final Logger log = LoggerFactory.getLogger(Api03Controller.class);
 
 	private final IGoodsService goodsService;
 	private final IGoodsAttributesService goodsAttributesService;
@@ -142,35 +142,79 @@ public class Api03Controller extends BladeController {
 			consignVO.setGoodsLabel(vo.getGoodsLabel());
 			consignVO.setTextImg(vo.getTextImg());
 		}
-		Integer count = orderConsignService.selectUserCount(userId, detail.getConsignConfigId());
+		Kv kv = consignGrant(userId, consignVO.getConsignConfigId());
+		Integer isGrant = kv.getInt("isGrant");
+		consignVO.setIsGrant(isGrant);
+		consignVO.setOrderNo(kv.getStr("orderNo"));
+		if ( 3 == isGrant){
+			return R.data(consignVO,"您本场抢购次数已用完!");
+		}
+		return R.data(consignVO);
+	}
+
+	/**
+	 * 查询用户预授权数据
+	 *
+	 * isGrant
+	 * 	为2 已授权 需要返回授权订单号
+	 *  为1 未授权 返回的为空
+	 *
+	 * @param userId 用户
+	 * @param consignConfigId 场次
+	 * @return Kv
+	 */
+	private Kv consignGrant(Long userId, Long consignConfigId){
+		Kv kv = Kv.create();
+		Integer count = orderConsignService.selectUserCount(userId, consignConfigId);
+		log.info("用户【" + userId + "】在场次【" + consignConfigId + "】已抢购次数为:" + count);
 		UserApp userApp = new UserApp();
 		UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId,userId));
+		log.info("用户【" + userId + "】基本数据:" + query.toString());
+		List<OrderGrant> selectGrantList = orderGrantService.selectGrant(consignConfigId, userId);
+		log.info("用户【" + userId + "】授权数据:" + selectGrantList);
+		log.info("用户【" + userId + "】userApp.getIsAuth() :" + userApp.getIsAuth());
+		log.info("用户【" + userId + "】为普通用户,判断信誉积分数据");
 		double k = (double)query.getCreditScore() / 100;
-		//可抢次数
-		int enableCount = NumberUtil.roundDown(k, 2).intValue() - count;
-		if(count < enableCount){
-			OrderGrant orderGrant = orderGrantService.isGrant(consignVO.getConsignConfigId(), userId);
-			int size= 0;
-			if(orderGrant!=null){
-				int status = orderGrant.getStatus();
-				List<Order> order = orderService.list(Wrappers.<Order>lambdaQuery().eq(Order::getGrantNo,orderGrant.getAuthNo()));
-				if(order!=null){
-					size = order.size();
-				}
-				if(1==status && size< orderGrant.getNum()){
-					consignVO.setIsGrant(2);
-					consignVO.setOrderNo(orderGrant.getOrderNo());
-					return R.data(consignVO);
-				}
+		Integer scoreCount = NumberUtil.roundDown(k, 2).intValue();
+		log.info("用户【" + userId + "】为信誉分可抢次数为:" + scoreCount);
+		int enableCount = scoreCount - count; //信誉分可抢次数 - 已抢次数 = 可抢次数
+		log.info("用户【" + userId + "】为实际可抢次数为:" + enableCount);
+		if (enableCount <= 0){
+			kv.put("isGrant", 3);
+			kv.put("orderNo", "");
+			return kv;
+		}
+
+		//授权订单总条数
+		int grantCount = 0;
+		List<String> authNos = new ArrayList<>();
+		//查已授权的数据
+		String orderNo = "";
+		for (OrderGrant orderGrant: selectGrantList) {
+			grantCount = grantCount + orderGrant.getNum();
+			authNos.add(orderGrant.getAuthNo());
+			if (orderGrant.getNowNum() > 0){
+				orderNo = orderGrant.getOrderNo();
 			}
-			consignVO.setIsGrant(1);
-			return R.data(consignVO);
-		}else{
-			consignVO.setIsGrant(3); //当日已抢完
 		}
-		return R.data(consignVO);
+		if (selectGrantList.size() > 0){
+			List<Order> list = orderService.list(Wrappers.<Order>lambdaQuery().in(Order::getGrantNo, authNos));
+			log.info("查询用户【" + userId + "】在场次【" + consignConfigId + "】是否有已授权成功的订单数据条数:" + list.size());
+			log.info("查询用户【" + userId + "】在场次【" + consignConfigId + "】是否有已授权成功的授权数量:" + grantCount);
+			//该授权号订单条数 小于 授权总数量 则为已授权
+			if (list.size() < grantCount){
+				kv.put("isGrant", 2);
+				kv.put("orderNo", orderNo);
+				return kv;
+			}
+		}
+		log.info("用户【" + userId + "】为未授权,请发起授权");
+		kv.put("isGrant", 1);
+		kv.put("orderNo", "");
+		return kv;
 	}
 
+
 	@GetMapping("/consign-turnout")
 	@ApiOperationSupport(order = 5)
 	@ApiOperation(value = "参与人数", notes = "虚拟数")

+ 20 - 4
src/main/java/org/springblade/modules/api/controller/Api05Controller.java

@@ -18,6 +18,7 @@ package org.springblade.modules.api.controller;
 
 import com.alipay.api.AlipayClient;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -25,6 +26,7 @@ import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
@@ -43,6 +45,7 @@ import org.springblade.modules.shopping.entity.Consign;
 import org.springblade.modules.shopping.service.IConsignService;
 import org.springblade.modules.shopping.vo.ConsignVO;
 import org.springblade.modules.shopping.wrapper.ConsignWrapper;
+import org.springblade.modules.system.entity.UserApp;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -88,10 +91,23 @@ public class Api05Controller extends BladeController {
 	@ApiOperation(value = "寄售抢购", notes = "抢购订单")
 	public R consignRandom(@RequestBody OrderConsignRandomRequest request) {
 		String tenantId = WebUtil.getRequest().getHeader(TokenUtil.TENANT_HEADER_KEY);
-		ConsignResponse response = orderService.consignOrderInsert(request, tenantId);
-		if (StringUtil.isEmpty(response.getOutTradeNo())){
-			if (response.getStatus() == 1){
-				return R.data(400,response,"");
+		UserApp userApp = new UserApp();
+		UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId,request.getUserId()));
+		if (query == null){
+			return R.fail("该用户不存在");
+		}
+		if (query.getState() != 1){
+			return R.fail("登录账号已冻结");
+		}
+		if (query.getCreditScore() < 100){
+			return R.fail("您的信誉分不够");
+		}
+		ConsignResponse response = orderService.consignGrant(query, request.getConsignConfigId(), request.getOrderNo());
+		if (response.getStatus() == 2){ //已授权则生成订单
+			String outTradeNo = orderService.consignOrderInsert(request, tenantId);
+			if (!StringUtil.isEmpty(outTradeNo)){
+				response.setOutTradeNo(outTradeNo);
+				return R.data(response);
 			}
 		}
 		return R.data(response);

+ 15 - 0
src/main/java/org/springblade/modules/api/controller/TestController.java

@@ -39,7 +39,9 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.modules.finance.service.IOrderService;
 import org.springblade.modules.resource.utils.SmsUtil;
+import org.springblade.modules.system.entity.User;
 import org.springblade.modules.system.entity.UserApp;
+import org.springblade.modules.system.service.IUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
@@ -63,6 +65,7 @@ public class TestController extends BladeController {
 	private static final Logger log = LoggerFactory.getLogger(TestController.class);
 
 	private final IOrderService orderService;
+	private final IUserService userService;
 	private final BladeRedis bladeRedis;
 	@Autowired
 	private BladeLogger logger;
@@ -177,6 +180,18 @@ public class TestController extends BladeController {
 		return R.data(jheSms(phone));
 	}
 
+
+	@PostMapping("/test012")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "测试012-获取用户信息", notes = "验证码发送")
+	public R<UserApp> test012(@ApiParam(value = "phone", required = true) @RequestParam(required = false) String phone) {
+		User user = userService.getOne(Wrappers.<User>lambdaQuery().eq(User::getPhone, phone));
+		UserApp userApp = new UserApp();
+		userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId, user.getId()));
+		log.info("userApp === " + userApp.getIsAuth());
+		return R.data(userApp);
+	}
+
 	private SmsCode jheSms(String phone){
 		SmsCode smsCode = new SmsCode();
 		Map<String, String> params = SmsUtil.getValidateParams();

+ 126 - 0
src/main/java/org/springblade/modules/finance/controller/UserTradeController.java

@@ -0,0 +1,126 @@
+/*
+ *      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.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.finance.entity.UserTrade;
+import org.springblade.modules.finance.vo.UserTradeVO;
+import org.springblade.modules.finance.service.IUserTradeService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 用户提现表 控制器
+ *
+ * @author BladeX
+ * @since 2022-04-02
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("finance/usertrade")
+@Api(value = "用户提现表", tags = "用户提现表接口")
+public class UserTradeController extends BladeController {
+
+	private final IUserTradeService userTradeService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入userTrade")
+	public R<UserTrade> detail(UserTrade userTrade) {
+		UserTrade detail = userTradeService.getOne(Condition.getQueryWrapper(userTrade));
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 用户提现表
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入userTrade")
+	public R<IPage<UserTrade>> list(UserTrade userTrade, Query query) {
+		IPage<UserTrade> pages = userTradeService.page(Condition.getPage(query), Condition.getQueryWrapper(userTrade));
+		return R.data(pages);
+	}
+
+	/**
+	 * 自定义分页 用户提现表
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入userTrade")
+	public R<IPage<UserTradeVO>> page(UserTradeVO userTrade, Query query) {
+		IPage<UserTradeVO> pages = userTradeService.selectUserTradePage(Condition.getPage(query), userTrade);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增 用户提现表
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入userTrade")
+	public R save(@Valid @RequestBody UserTrade userTrade) {
+		return R.status(userTradeService.save(userTrade));
+	}
+
+	/**
+	 * 修改 用户提现表
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入userTrade")
+	public R update(@Valid @RequestBody UserTrade userTrade) {
+		return R.status(userTradeService.updateById(userTrade));
+	}
+
+	/**
+	 * 新增或修改 用户提现表
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入userTrade")
+	public R submit(@Valid @RequestBody UserTrade userTrade) {
+		return R.status(userTradeService.saveOrUpdate(userTrade));
+	}
+
+	
+	/**
+	 * 删除 用户提现表
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(userTradeService.removeByIds(Func.toLongList(ids)));
+	}
+
+	
+}

+ 34 - 0
src/main/java/org/springblade/modules/finance/dto/UserTradeDTO.java

@@ -0,0 +1,34 @@
+/*
+ *      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.dto;
+
+import org.springblade.modules.finance.entity.UserTrade;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户提现表数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2022-04-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class UserTradeDTO extends UserTrade {
+	private static final long serialVersionUID = 1L;
+
+}

+ 1 - 1
src/main/java/org/springblade/modules/finance/entity/Order.java

@@ -78,7 +78,7 @@ public class Order implements Serializable {
 	/**
 	 * 预授权订单号
 	 */
-	@ApiModelProperty(value = "授权订单号")
+	@ApiModelProperty(value = "授权号")
 	private String grantNo;
 
 	/**

+ 2 - 2
src/main/java/org/springblade/modules/finance/entity/OrderGrant.java

@@ -57,9 +57,9 @@ public class OrderGrant implements Serializable {
 	private String orderNo;
 
 	/**
-	 * 业务NO
+	 * 授权号
 	 */
-	@ApiModelProperty(value = "业务类型")
+	@ApiModelProperty(value = "授权号")
 	private String authNo;
 
 	/**

+ 107 - 0
src/main/java/org/springblade/modules/finance/entity/UserTrade.java

@@ -0,0 +1,107 @@
+/*
+ *      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 java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 用户提现表实体类
+ *
+ * @author BladeX
+ * @since 2022-04-02
+ */
+@Data
+@TableName("t_user_trade")
+@ApiModel(value = "UserTrade对象", description = "用户提现表")
+public class UserTrade implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@TableId(value = "id", type = IdType.AUTO)
+	private Long id;
+	/**
+	* 用户ID
+	*/
+		@ApiModelProperty(value = "用户ID")
+		private Long userId;
+	/**
+	* 提现渠道,1,微信,2,支付(默认)
+	*/
+		@ApiModelProperty(value = "提现渠道,1,微信,2,支付(默认)")
+		private Integer type;
+	/**
+	* 提现账号,支付宝账户、微信账户
+	*/
+		@ApiModelProperty(value = "提现账号,支付宝账户、微信账户")
+		private String account;
+	/**
+	* 账户姓名
+	*/
+		@ApiModelProperty(value = "账户姓名")
+		private String accountName;
+	/**
+	* 可提现金额(打款金额)
+	*/
+		@ApiModelProperty(value = "可提现金额(打款金额)")
+		private BigDecimal money;
+	/**
+	* 提现来源,1,红包(默认),2:用户钱包,3:企业钱包,4,基金
+	*/
+		@ApiModelProperty(value = "提现来源,1,红包(默认),2:用户钱包,3:企业钱包,4,基金")
+		private Integer cashFrom;
+	/**
+	* 有效状态,0:提现中,1:已到账,2:支付失败
+	*/
+		@ApiModelProperty(value = "有效状态,0:提现中,1:已到账,2:支付失败")
+		private Integer status;
+	/**
+	* 创建时间
+	*/
+		@ApiModelProperty(value = "创建时间")
+		private LocalDateTime createTime;
+	/**
+	* 支付成功时间
+	*/
+		@ApiModelProperty(value = "支付成功时间")
+		private LocalDateTime updateTime;
+	/**
+	* 支付返回body
+	*/
+		@ApiModelProperty(value = "支付返回body")
+		private String body;
+	/**
+	* 支付宝/微信用户Id
+	*/
+		@ApiModelProperty(value = "支付宝/微信用户Id")
+		private String payId;
+	/**
+	* 支付宝/微信订单号
+	*/
+		@ApiModelProperty(value = "支付宝/微信订单号")
+		private String outTradeNo;
+
+
+}

+ 42 - 0
src/main/java/org/springblade/modules/finance/mapper/UserTradeMapper.java

@@ -0,0 +1,42 @@
+/*
+ *      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 org.springblade.modules.finance.entity.UserTrade;
+import org.springblade.modules.finance.vo.UserTradeVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 用户提现表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-04-02
+ */
+public interface UserTradeMapper extends BaseMapper<UserTrade> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param userTrade
+	 * @return
+	 */
+	List<UserTradeVO> selectUserTradePage(IPage page, UserTradeVO userTrade);
+
+}

+ 27 - 0
src/main/java/org/springblade/modules/finance/mapper/UserTradeMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.finance.mapper.UserTradeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="userTradeResultMap" type="org.springblade.modules.finance.entity.UserTrade">
+        <id column="id" property="id"/>
+        <result column="user_id" property="userId"/>
+        <result column="type" property="type"/>
+        <result column="account" property="account"/>
+        <result column="account_name" property="accountName"/>
+        <result column="money" property="money"/>
+        <result column="cash_from" property="cashFrom"/>
+        <result column="status" property="status"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="body" property="body"/>
+        <result column="pay_id" property="payId"/>
+        <result column="out_trade_no" property="outTradeNo"/>
+    </resultMap>
+
+
+    <select id="selectUserTradePage" resultMap="userTradeResultMap">
+        select * from t_user_trade where is_deleted = 0
+    </select>
+
+</mapper>

+ 3 - 1
src/main/java/org/springblade/modules/finance/service/IOrderGrantService.java

@@ -21,6 +21,8 @@ import org.springblade.modules.finance.vo.OrderGrantVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.util.List;
+
 /**
  * 订单预授权表 服务类
  *
@@ -45,6 +47,6 @@ public interface IOrderGrantService extends IService<OrderGrant> {
 	 * @param userId 用户
 	 * @return
 	 */
-	OrderGrant isGrant(Long batNo, Long userId);
+	List<OrderGrant> selectGrant(Long batNo, Long userId);
 
 }

+ 13 - 1
src/main/java/org/springblade/modules/finance/service/IOrderService.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.modules.finance.service;
 
+import org.springblade.core.tool.support.Kv;
 import org.springblade.modules.api.request.OrderCommonSaveRequest;
 import org.springblade.modules.api.request.OrderConsignRandomRequest;
 import org.springblade.modules.api.request.OrderConsignSaveRequest;
@@ -25,6 +26,7 @@ import org.springblade.modules.api.request.OrderTakeRequest;
 import org.springblade.modules.finance.vo.OrderVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.system.entity.UserApp;
 
 /**
  * 订单表 服务类
@@ -102,5 +104,15 @@ public interface IOrderService extends IService<Order> {
 	 * @param tenantId 租户号
 	 * @return Response
 	 */
-	ConsignResponse consignOrderInsert(OrderConsignRandomRequest request, String tenantId);
+	String consignOrderInsert(OrderConsignRandomRequest request, String tenantId);
+
+
+	/**
+	 * 是否可抢
+	 *
+	 * @param query 用户ID
+	 * @param consignConfigId 场次ID
+	 * @return Kv
+	 */
+	ConsignResponse consignGrant(UserApp query, Long consignConfigId, String orderNo);
 }

+ 41 - 0
src/main/java/org/springblade/modules/finance/service/IUserTradeService.java

@@ -0,0 +1,41 @@
+/*
+ *      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.service;
+
+import org.springblade.modules.finance.entity.UserTrade;
+import org.springblade.modules.finance.vo.UserTradeVO;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 用户提现表 服务类
+ *
+ * @author BladeX
+ * @since 2022-04-02
+ */
+public interface IUserTradeService extends IService<UserTrade> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param userTrade
+	 * @return
+	 */
+	IPage<UserTradeVO> selectUserTradePage(IPage<UserTradeVO> page, UserTradeVO userTrade);
+
+}

+ 4 - 6
src/main/java/org/springblade/modules/finance/service/impl/OrderGrantServiceImpl.java

@@ -42,16 +42,14 @@ public class OrderGrantServiceImpl extends ServiceImpl<OrderGrantMapper, OrderGr
 	}
 
 	@Override
-	public OrderGrant isGrant(Long batNo, Long userId) {
+	public List<OrderGrant> selectGrant(Long batNo, Long userId) {
 		List<OrderGrant> list = baseMapper.selectList(Wrappers.<OrderGrant>lambdaQuery()
 			.eq(OrderGrant::getBatNo,batNo)
 			.eq(OrderGrant::getUserId, userId)
 			.eq(OrderGrant::getStatus, 1) //查询已经做预授权的
-		); //查询正在做预授权的数据
-		if (list.size() > 0){
-			return list.get(0);
-		}
-		return null;
+		);
+		//查询正在做预授权的数据
+		return list;
 	}
 
 }

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

@@ -25,7 +25,9 @@ import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.log.logger.BladeLogger;
+import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.modules.api.controller.AliPay01Controller;
 import org.springblade.modules.api.request.*;
 import org.springblade.modules.api.response.ConsignResponse;
@@ -90,6 +92,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 	@Autowired
 	private OrderGrantMapper orderGrantMapper;
 
+	@Autowired
+	private IOrderService orderService;
+
 	private BladeLogger logger;
 
 	@Override
@@ -303,9 +308,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 			orderConsign.setGoodsName(goods.getGoodsName());
 			orderConsign.setConsignType(request.getConsignType());
 			orderConsign.setPayUserId(request.getUserId()); //支付人
-			if(request.getConsignType() == 1){
+			if(request.getConsignType() == 1){//提货
 				orderConsign.setConsignDays(0);
-			}else if(request.getConsignType() == 2){
+			}else if(request.getConsignType() == 2){ //寄售
 				orderConsign.setConsignDays(request.getConsignDays());
 			}else{
 				throw new ServiceException("请求参数错误!");
@@ -343,63 +348,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public ConsignResponse consignOrderInsert(OrderConsignRandomRequest request, String tenantId) {
-		ConsignResponse response = new ConsignResponse();
-		response.setStatus(1); //未授权
-		response.setNum(0); //未授权
-		UserApp userApp = new UserApp();
-		UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId,request.getUserId()));
-		if (query == null){
-			throw new ServiceException("请重新登录!");
-		}
-		if (query.getState() != 1){
-			throw new ServiceException("登录账号已冻结!");
-		}
-		if (query.getCreditScore() < 100){
-			throw new ServiceException("您的信誉分不够!");
-		}
-		//已抢次数 (可抢订单数/日)
-		Integer count = orderConsignMapper.selectUserCount(request.getUserId(), request.getConsignConfigId());
-		OrderGrant orderGrant = orderGrantMapper.selectOne(Wrappers.<OrderGrant>lambdaQuery().eq(OrderGrant::getOrderNo, request.getOrderNo()));
-		if (orderGrant != null){
-			if (orderGrant.getStatus() == 2){
-				response.setStatus(1);//未授权
-				return response;
-			}
-			//注释:如果第一次授权完成,再次授权抢回变成为授权
-			/*else {
-				//授权次数小于等已抢次数 则
-				if (orderGrant.getNum() <= count){
-					response.setStatus(1);//未授权
-					return response;
-				}
-			}*/
-			//如果剩余单数为大于1
-			if(orderGrant.getNowNum() > 1){
-				//查询当前用户已授权但是的数据
-				Integer num = 0; //授权次数
-				List<OrderGrant> list = orderGrantMapper.selectList(Wrappers.<OrderGrant>lambdaQuery()
-					.eq(OrderGrant::getDataDate, DateUtil.format(DateUtil.now(),DateUtil.PATTERN_DATE))
-					.eq(OrderGrant::getUserId, request.getUserId()));
-				for (OrderGrant grant: list){
-					num = grant.getNum() + num;
-				}
-				if (num >= count){
-					throw new ServiceException("您授权的次数已用完!");
-				}
-				response.setStatus(2);//已授权
-			}
-		}
-		//是特殊账号的不判断的抢购次数
-		if (query.getIsAuth() != 2){
-			//可抢次数
-			double k = (double)query.getCreditScore() / 100;
-			Integer num = NumberUtil.roundDown(k, 2).intValue() - (count + 1);
-			response.setNum(num);
-			if(count >= k){
-				throw new ServiceException("您抢购的次数已用完!");
-			}
-		}
+	public String consignOrderInsert(OrderConsignRandomRequest request, String tenantId) {
 		//获取寄售商品数据
 		Consign consign = consignMapper.randomConsign(request.getConsignConfigId());
 		if (consign == null){
@@ -410,7 +359,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		if (goods == null){
 			throw new ServiceException("商品不存在!");
 		}
-		User user = userMapper.selectById(query.getUserId());
+		User user = userMapper.selectById(request.getUserId());
 		//生成订单号
 		String outTradeNo = CommonUtil.genTimeID();
 		Order order = new Order();
@@ -419,7 +368,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 			order.setUserName(user.getName());
 		}
 		order.setOutTradeNo(outTradeNo);
-		order.setUserId(query.getUserId());
+		order.setUserId(request.getUserId());
 		order.setOrderType(3);//寄售订单
 		order.setPayFlag(1); //待付款
 		order.setPayFee(consign.getConsignPrice());
@@ -489,10 +438,49 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 			if(j != 1){
 				throw new ServiceException("购买失败!");
 			}
-			response.setOutTradeNo(outTradeNo);
+			return outTradeNo;
+		}
+		return "";
+	}
+
+	@Override
+	public ConsignResponse consignGrant(UserApp query, Long consignConfigId, String orderNo) {
+		ConsignResponse response = new ConsignResponse();
+		//已抢次数 (可抢订单数/日)
+		Integer count = orderConsignMapper.selectUserCount(query.getUserId(), consignConfigId);
+		log.info("用户【" + query.getUserId() + "】在场次【" + consignConfigId + "】已抢购次数为:" + count);
+		OrderGrant orderGrant = orderGrantMapper.selectOne(Wrappers.<OrderGrant>lambdaQuery().eq(OrderGrant::getOrderNo, orderNo));
+		log.info("用户【" + query.getUserId() + "】授权数据:" + orderGrant);
+		//是特殊账号的不判断的抢购次数
+		log.info("用户【" + query.getUserId() + "】为普通用户,判断信誉积分数据");
+		double k = (double)query.getCreditScore() / 100; //可抢次数
+		int scoreCount = NumberUtil.roundDown(k, 2).intValue();
+		log.info("用户【" + query.getUserId() + "】为信誉分可抢次数为:" + scoreCount);
+		int num = scoreCount - count;
+		if (num <= 0){
+			response.setStatus(3);//已抢购完成
+			response.setNum(0);
 			return response;
 		}
-		throw new ServiceException("购买失败!");
+		if (orderGrant != null){
+			//已解冻 则该账单已支付完成
+			if (orderGrant.getStatus() == 2){
+				response.setStatus(1);//未授权
+				response.setNum(0); //剩余已授权的次数
+				return response;
+			}
+			List<Order> list = orderService.list(Wrappers.<Order>lambdaQuery().in(Order::getGrantNo, orderNo));
+			//如果剩余次数为大于等于1
+			//  订单表  --     预授表 -- 5  --3   --2
+			if(list.size() < orderGrant.getNum() && orderGrant.getStatus() == 1){
+				response.setStatus(2);//已授权
+				response.setNum(orderGrant.getNum()); //剩余已授权的次数
+				return response;
+			}
+		}
+		response.setStatus(1);//未授权
+		response.setNum(0); //剩余已授权的次数
+		return response;
 	}
 
 	@Override

+ 41 - 0
src/main/java/org/springblade/modules/finance/service/impl/UserTradeServiceImpl.java

@@ -0,0 +1,41 @@
+/*
+ *      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.service.impl;
+
+import org.springblade.modules.finance.entity.UserTrade;
+import org.springblade.modules.finance.vo.UserTradeVO;
+import org.springblade.modules.finance.mapper.UserTradeMapper;
+import org.springblade.modules.finance.service.IUserTradeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 用户提现表 服务实现类
+ *
+ * @author BladeX
+ * @since 2022-04-02
+ */
+@Service
+public class UserTradeServiceImpl extends ServiceImpl<UserTradeMapper, UserTrade> implements IUserTradeService {
+
+	@Override
+	public IPage<UserTradeVO> selectUserTradePage(IPage<UserTradeVO> page, UserTradeVO userTrade) {
+		return page.setRecords(baseMapper.selectUserTradePage(page, userTrade));
+	}
+
+}

+ 36 - 0
src/main/java/org/springblade/modules/finance/vo/UserTradeVO.java

@@ -0,0 +1,36 @@
+/*
+ *      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.vo;
+
+import org.springblade.modules.finance.entity.UserTrade;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * 用户提现表视图实体类
+ *
+ * @author BladeX
+ * @since 2022-04-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "UserTradeVO对象", description = "用户提现表")
+public class UserTradeVO extends UserTrade {
+	private static final long serialVersionUID = 1L;
+
+}

+ 0 - 1
src/main/java/org/springblade/modules/shopping/controller/ConsignConfigController.java

@@ -55,7 +55,6 @@ import java.util.List;
 public class ConsignConfigController extends BladeController {
 
 	private final IConsignConfigService consignConfigService;
-	private final IConsignService consignService;
 	private final BladeRedis bladeRedis;
 
 	/**

+ 6 - 4
src/main/java/org/springblade/modules/shopping/controller/ConsignController.java

@@ -138,10 +138,12 @@ public class ConsignController extends BladeController {
 			ConsignConfig consignConfig = consignConfigService.getById(consign.getConsignConfigId());
 			if (consignConfig != null){
 				String ymd = DateUtil.format(DateUtil.now(), DateUtil.PATTERN_DATE);
-				String startTime = ymd + " " + consignConfig.getStartTime();
-				String endTime = ymd + " " + consignConfig.getEndTime();
-				Date startDate = DateUtil.parse(startTime, DateUtil.PATTERN_DATE);
-				Date endDate = DateUtil.parse(endTime, DateUtil.PATTERN_DATE);
+				String st = DateUtil.format(consignConfig.getStartTime(), DateUtil.PATTERN_TIME);
+				String et = DateUtil.format(consignConfig.getEndTime(), DateUtil.PATTERN_TIME);
+				String startTime = ymd + " " + st;
+				String endTime = ymd + " " + et;
+				Date startDate = DateUtil.parse(startTime, DateUtil.PATTERN_DATETIME);
+				Date endDate = DateUtil.parse(endTime, DateUtil.PATTERN_DATETIME);
 				consign.setStartTime(startDate);
 				consign.setEndTime(endDate);
 			}

+ 1 - 1
src/main/java/org/springblade/modules/shopping/mapper/ConsignConfigMapper.xml

@@ -19,7 +19,7 @@
     <update id="updateConsignTime" parameterType="org.springblade.modules.shopping.entity.ConsignConfig">
         UPDATE t_consign t
         SET t.start_time = concat(date_format(t.start_time, '%Y-%m-%d'),CONCAT(' ',date_format(#{consignConfig.startTime}, '%H:%i:%s'))),
-        t.end_time = concat(date_format(t.start_time, '%Y-%m-%d'),CONCAT(' ',date_format(#{consignConfig.endTime}, '%H:%i:%s')))
+        t.end_time = concat(date_format(t.end_time, '%Y-%m-%d'),CONCAT(' ',date_format(#{consignConfig.endTime}, '%H:%i:%s')))
         WHERE t.now_stock > 0 AND t.consign_config_id = #{consignConfig.id};
     </update>
 

+ 10 - 0
src/main/java/sql/usertrade.menu.mysql

@@ -0,0 +1,10 @@
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1510245018274422791', 1123598815738675201, 'usertrade', '用户交易记录表', 'menu', '/finance/usertrade', NULL, 1, 1, 0, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1510245018274422792', '1510245018274422791', 'usertrade_add', '新增', 'add', '/finance/usertrade/add', 'plus', 1, 2, 1, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1510245018274422793', '1510245018274422791', 'usertrade_edit', '修改', 'edit', '/finance/usertrade/edit', 'form', 2, 2, 2, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1510245018274422794', '1510245018274422791', 'usertrade_delete', '删除', 'delete', '/api/finance/usertrade/remove', 'delete', 3, 2, 3, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1510245018274422795', '1510245018274422791', 'usertrade_view', '查看', 'view', '/finance/usertrade/view', 'file-text', 4, 2, 2, 1, NULL, 0);

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

@@ -13,7 +13,7 @@ spring:
     #  commandTimeout: 5000
   datasource:
     # MySql
-    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

+ 1 - 1
src/main/resources/application-prod.yml

@@ -26,7 +26,7 @@ oss:
   enabled: true
   name: minio
   tenant-mode: true
-  endpoint:  http://47.109.28.56:9000
+  endpoint:  https://www.gzzhsckj.com
   access-key: admin
   secret-key: 12345678
   bucket-name: bladex

+ 1 - 0
src/main/resources/application.yml

@@ -191,6 +191,7 @@ blade:
       - /v1/common/send-validate
       - /v1/aliPay/sdk/auth_notify_url # 预授权拦截
       - /v1/aliPay/sdk/trade_notify_url # 支付回调
+      - /v1/aliPay/sdk/order_notify_url # 支付回调
       - /v1/versionUpgrade
     #授权认证配置
     auth: