From c8a21748f87bc0a23744d9fee5dec3eaaa403fdc Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期二, 11 六月 2024 18:59:51 +0800 Subject: [PATCH] 1.提交【管理后台】-资讯管理相关接口 --- ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java | 495 ++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 381 insertions(+), 114 deletions(-) diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java index bfb52e2..1021e7c 100644 --- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java +++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java @@ -1,35 +1,34 @@ package com.ruoyi.auction.service.impl; import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.alibaba.fastjson.parser.Feature; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; -import com.alipay.api.DefaultAlipayClient; -import com.alipay.api.request.AlipaySystemOauthTokenRequest; -import com.alipay.api.request.AlipayUserInfoShareRequest; -import com.alipay.api.response.AlipaySystemOauthTokenResponse; -import com.alipay.api.response.AlipayUserInfoShareResponse; +import com.alipay.api.internal.util.AlipayEncrypt; +import com.alipay.api.internal.util.AlipaySignature; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.ruoyi.auction.controller.forepart.dto.AuctionSalesroomGoodsDTO; -import com.ruoyi.auction.controller.forepart.dto.ForepartAuctionBidRecordDTO; -import com.ruoyi.auction.controller.forepart.vo.ForepartAuctionSalesroomGoodsVO; -import com.ruoyi.auction.controller.forepart.vo.ForepartAuctionSalesroomVO; -import com.ruoyi.auction.controller.forepart.vo.MemberAuctionSalesroomInfoVO; -import com.ruoyi.auction.controller.forepart.vo.MemberAuctionSalesroomVO; +import com.google.common.collect.Lists; +import com.google.zxing.WriterException; import com.ruoyi.auction.controller.management.dto.MgtAuctionSaleroomBidRecordQuery; import com.ruoyi.auction.controller.management.dto.MgtAuctionSalesroomDTO; import com.ruoyi.auction.controller.management.dto.MgtAuctionSalesroomGoodsDTO; +import com.ruoyi.auction.controller.management.dto.MgtAuctionSalesroomGoodsQuery; import com.ruoyi.auction.controller.management.dto.MgtAuctionSalesroomQuery; import com.ruoyi.auction.controller.management.dto.MgtScreenBidPage; +import com.ruoyi.auction.controller.management.dto.MgtScreenSalesroomGoodsDTO; +import com.ruoyi.auction.controller.management.dto.MgtScreenVideoDTO; import com.ruoyi.auction.controller.management.vo.MgtAuctionBidRecordVO; import com.ruoyi.auction.controller.management.vo.MgtAuctionSalesroomGoodsVO; import com.ruoyi.auction.controller.management.vo.MgtAuctionSalesroomScreenVO; import com.ruoyi.auction.controller.management.vo.MgtAuctionSalesroomVO; import com.ruoyi.auction.domain.AuctionBidRecord; +import com.ruoyi.auction.domain.AuctionBrowseRecord; import com.ruoyi.auction.domain.AuctionSalesroomGoods; import com.ruoyi.auction.domain.AuctionVideo; import com.ruoyi.auction.mapper.AuctionBidRecordMapper; @@ -42,6 +41,7 @@ import com.ruoyi.auction.service.IAuctionVideoService; import com.ruoyi.auction.util.CreateQrCode; import com.ruoyi.auction.util.HttpUtils; +import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.enums.AuctionGoodsStatusEnum; @@ -56,27 +56,38 @@ import com.ruoyi.common.core.utils.page.Checker; import com.ruoyi.common.core.utils.page.CollUtils; import com.ruoyi.common.core.utils.page.PageDTO; +import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.domain.AppMiniLoginVO; import com.ruoyi.system.api.domain.AuctionGoods; import com.ruoyi.system.api.domain.AuctionSalesroom; import com.ruoyi.system.api.domain.GoodsSku; import com.ruoyi.system.api.domain.Member; import com.ruoyi.system.api.domain.OrderAuctionBond; +import com.ruoyi.system.api.domain.PromotionVideo; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.domain.dto.AppMiniLoginDTO; +import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO; import com.ruoyi.system.api.domain.dto.BidDTO; +import com.ruoyi.system.api.domain.dto.ForepartAuctionBidRecordDTO; import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomWdDTO; +import com.ruoyi.system.api.domain.dto.OrderAuctionBondDTO; import com.ruoyi.system.api.domain.dto.RefundDTO; +import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomGoodsVO; +import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomVO; +import com.ruoyi.system.api.domain.vo.MemberAuctionSalesroomInfoVO; +import com.ruoyi.system.api.domain.vo.MemberAuctionSalesroomVO; import com.ruoyi.system.api.domain.vo.PayInfoVO; import com.ruoyi.system.api.domain.vo.WdMemberAuctionSalesroomVO; import com.ruoyi.system.api.feignClient.GoodsSkuClient; import com.ruoyi.system.api.feignClient.MemberClient; import com.ruoyi.system.api.feignClient.OrderClient; +import com.ruoyi.system.api.feignClient.PromotionClient; import com.ruoyi.system.api.feignClient.SysUserClient; import io.seata.spring.annotation.GlobalTransactional; +import java.io.IOException; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.ArrayList; @@ -89,6 +100,7 @@ import java.util.stream.Collectors; import javax.annotation.Resource; import org.apache.http.HttpResponse; +import org.apache.http.client.config.RequestConfig; import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -137,17 +149,26 @@ @Resource private IAuctionBrowseRecordService iAuctionBrowseRecordService; + @Resource + private PromotionClient promotionClient; - //微信 - private static final String ACCESS_TOKEN_HOST = "https://api.weixin.qq.com/cgi-bin/token"; - - private static final String WX_APPID = "wxb7f0ea286fc4e535"; - - private static final String WX_SECRET = "852a2512a6ab559cafc68bae5d4160ac"; @Resource private AuctionBidRecordMapper auctionBidRecordMapper; + public static RequestConfig config = RequestConfig.custom().setConnectTimeout(5000).setSocketTimeout(5000).build(); + // 配置您申请的KEY,在个人中心->我的数据,接口名称上方查看 + public static final String APPKEY = ""; + //明文查询地址 + public static String query_url = "http://op.juhe.cn/idcard/query?key=" + APPKEY; + + + //微信 + private static final String ACCESS_TOKEN_HOST = "https://api.weixin.qq.com/cgi-bin/token"; + + private static final String WX_APPID = "wxe91f1af7638aa5dd"; + + private static final String WX_SECRET = "a787e1a462715604e0c9528b6d8960d1"; //支付寶 /** @@ -167,28 +188,29 @@ /** * appID **/ - private static final String APP_ID_PROD = "2021003196653501"; + private static final String APP_ID_PROD = "2021004147684313"; /** * 私钥 */ - private static final String APP_PRIVATE_KEY = ""; + private static final String APP_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCg31tKXap7oTKKKDtfXc/hQjriSJkKopfRkh9j1UA/BpY+6GLkbJhg8kw9CRCILjfi5M0F3FCu+j1ogeDE1ivRGJlX1l/TGj+HuM1g8qLx/tD5D+9nJq5UHfaoKxXPko8H3AWcN1n/MAq3kRwUJRkeYJyYrZ7Sd6RU2taVLktWu92lqoUahjFkQSkdJoKi77v5i1T56PLRFfClt72tnvgol4OXBfFEjpGVrnuYoiHCgLV9eN5Qmvdas/04TtU396p+atYycU2P/dU9fdc8NFFFJo+eYH7astJXIQsowpLtTS7lavQuzCcLvC20pRBPhql5+5X96DVdnOLMbdUKwLQ9AgMBAAECggEAZLuXgVhnYSSN7f7FNrEaczWyg3DsC8HGCN9TsoKcyRpJyDhhfCEXxVTTMkDTzkIKkpOsYagUCYz+GMuCwB5Pr42Ur3C37gr4jvbD+5nTOG7T0bENumx5Kojco27fKGvgDg7SoH/0ZZtiipFdoKueL+xVAjFtSuLJzqx9Q0qKuFLJH0lrQfHYyGcq9ZzrPKLrMZb3Ve3upmpaLjIddZmqnzK7g5lx/OLHEujXIR9u0VWzzxqeaFkgCAMuyzkNYwlpqtiTJsEggbnG9YsLf0n156F0dXo2i44fUav+bKU2ksv7YmENx3R9gPDuPAKH+MwQlwVIc6tR8jKoz0cUbmaujQKBgQDhvaQd4jg9zszdVw1enPWKWViu4rsEFirIz3CUBRB3g2mkZ+tXpQQps7bL7KLBFfXmVYiVMu4EoOfZlkAjJPbFMj9aSPZ3pbx0VnHG8+3T9T2eJdzZp/CehG3MyycNHxAbbl2B04Chiiyf67R0b4ZLMHoElQgJP9jF1q3Xiloi0wKBgQC2b73S4LZWlWkyIsmHYHmXyWta64W2whlL4Nsy97tl4kZNfLCG7mgG5FhHhi16lT7J6Sw1D2FgFov2B1r9+yGBRxckGzWoY5m6FtBE/l+42+gxsB41+kEgirVjlEaX7YBXmnux2LntPVlJOG6HTizjcUnTesGIRvwbmbR2tuXCrwKBgQCMJwKq7xW+AhQdY/vP/yFPaRNvWSOFcQHVNT2PGOnVWciQI1jxTGmePo7CY0PVH35RKE+pWjp+syvfYrKlX0C6w+yjcGNde4/apwTy4eWJ0FwWQSmyFNuGf2/wUz0Gn3+PmGEDxr25DaGRFHUwSUGWkx1elOytWW+LvTKnfKVjswKBgGuh50MnskvI4IRkw7Mr9vDXM5AzjfLx9syuf4RFZflJEyMaImeo9hTC2VZxUhmVPbMP7zXqug9fnflsA4H+jJjh4UQ7DWAoSwTf+sYJsV211/qgpmJAH/Zb/4Idc7yksWh9yuZ1L9RIsomhUoxfUdpp9x1euhl1j72U5ER5yXofAoGAZNrIYFWk4S8mqFY8/h0YVGxT7Hj0ppLsq20N4OzglScoEEG+aYmWDOQU9kWcxsD44bMdzk2k0DyOhHbp8Tjd1hp0UFb03s8HgERcFHMZMzQ5oqtWQEoYiyQZxReXZZvWUbV+dg1HXXG8I26XAKb3OWFUIBBfKa2/Ig9ensY9m+M="; /** * 支付宝公钥 */ - private static final String ALIPAY_PUBLIC_KEY = ""; + private static final String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAh+tCVKqUmlHDL8Ki1TUJtzE5IKV1irJuoHWZTvndJCKJJ8bdWxL9mu5xsy8KkfrnS6wJIKBMLTxMoYQHG7l2Gt07YyUCYHS5+yvbHtTkyFFy2KRPeUEWXz1Tm4juvInDvvr+n7v9ETepToGhC+UDlQcBvuSppw8N+463E+1GRrC4APwXYGLzaIvYvDHcQAULkWhXsjzxJSmeSi12kqWKlgnVJC1y0FT8xQtvhwShfaIqKwzErn9S2z7JjdXboJMUYQHoqF1A4SmWY8c0qawqvx2hGP36W3RDQ4cczzFwUHS1Cylhsbgh1COc4OdANCX4Np2NUzaRDCNzN0WVFKtK+QIDAQAB"; + + @Override - public PageDTO<AuctionSalesroom> getAuctionBidRecordList(AuctionSalesroomGoodsDTO ationSalesroomGoodsDTO) { - Page<AuctionSalesroom> page = new Page<>(ationSalesroomGoodsDTO.getPageCurr(), ationSalesroomGoodsDTO.getPageSize()); + public List<AuctionSalesroom> getAuctionBidRecordList(AuctionSalesroomDTO ationSalesroomGoodsDTO) { LambdaQueryWrapper<AuctionSalesroom> wrapper=Wrappers.lambdaQuery(); wrapper.eq(AuctionSalesroom::getSalesroomName,ationSalesroomGoodsDTO.getSalesroomName()); wrapper.eq(AuctionSalesroom::getDelFlag,0); - Page<AuctionSalesroom> page1 = this.page(page, wrapper); - return PageDTO.of(page1); + List<AuctionSalesroom> page1 = this.list(wrapper); + return page1; } @Override - public ForepartAuctionSalesroomVO getBaaner(AuctionSalesroomGoodsDTO ationSalesroomGoodsDTO) { + public ForepartAuctionSalesroomVO getBaaner(AuctionSalesroomDTO ationSalesroomGoodsDTO) { LambdaQueryWrapper<AuctionVideo> wrapper=Wrappers.lambdaQuery(); wrapper.eq(AuctionVideo::getAuctionSalesroomId,ationSalesroomGoodsDTO.getAuctionSalesroomId()); wrapper.eq(AuctionVideo::getDelFlag,0); @@ -209,17 +231,11 @@ public AuctionSalesroom getAuctionBidRecordOne(ForepartAuctionBidRecordDTO arepartAuctionBidRecordDTO) { R<SysUser> r=sysUserClient.queryUserByPhone(arepartAuctionBidRecordDTO.getPhone()); SysUser sysUser=r.getData(); - - if (sysUser!=null){ + if (sysUser==null){ throw new ServiceException("手机号未注册"); } - - if (!sysUser.getPassword().equals(arepartAuctionBidRecordDTO.getPassword())){ + if (!SecurityUtils.matchesPassword(arepartAuctionBidRecordDTO.getPassword(), sysUser.getPassword())){ throw new ServiceException("密码输入错误"); - } - - if (!sysUser.getUserType().equals("2")){ - throw new ServiceException("该人员不是拍卖师"); } LambdaQueryWrapper<AuctionSalesroom> wrapper=Wrappers.lambdaQuery(); @@ -231,67 +247,86 @@ @Override public AppMiniLoginVO actionMiniLogin(AppMiniLoginDTO appMiniLoginDto) { - try { AppMiniLoginVO appMiniLoginVo = new AppMiniLoginVO(); - if (appMiniLoginDto.getType()==1){ - if (appMiniLoginDto.getAuth_code()== null || appMiniLoginDto.getAuth_code().length() == 0) { + if (appMiniLoginDto.getType()==1) { + if (appMiniLoginDto.getAuth_code() == null || appMiniLoginDto.getAuth_code().length() == 0) { } else { - AppMiniLoginVO user=new AppMiniLoginVO(); - //String serverUrl, String appId, String privateKey, String format,String charset, String alipayPublicKey, String signType - //实例化客户端 参数:正式环境URL,Appid,商户私钥 PKCS8格式,字符编码格式,字符格式,支付宝公钥,签名方式 - AlipayClient alipayClient = new DefaultAlipayClient(ALIPAY_BORDER_PROD,APP_ID_PROD, APP_PRIVATE_KEY, "json", "GBK", ALIPAY_PUBLIC_KEY, "RSA2"); - AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); - // 值为authorization_code时,代表用code换取 - request.setGrantType("authorization_code"); - //授权码,用户对应用授权后得到的 - request.setCode(appMiniLoginDto.getAuth_code()); - //这里使用execute方法 - AlipaySystemOauthTokenResponse response = null; - try { - response = alipayClient.execute(request); - } catch (AlipayApiException e) { - throw new RuntimeException(e); - } - //刷新令牌,上次换取访问令牌时得到。见出参的refresh_token字段 - request.setRefreshToken(response.getAccessToken()); + //1. 获取验签和解密所需要的参数 + Map<String, String> openapiResult = JSON.parseObject(appMiniLoginDto.getAuth_code(), + new TypeReference<Map<String, String>>() { + }, Feature.OrderedField); + String signType = "RSA2"; + String charset = "UTF-8"; + String encryptType = "AES"; + String sign = openapiResult.get("sign"); + String content = openapiResult.get("response"); - //返回成功时 就将唯一标识返回 - if (response.isSuccess()) { - System.out.println("调用成功"); - //我这里只返回了一个字段给前端用 - String user1= response.getUserId(); - appMiniLoginVo.setZfbuserid(response.getUserId()); - AlipayUserInfoShareResponse alipayUserInfoShareResponse=getAliUserInfo(response.getAccessToken()); - appMiniLoginVo.setPhone(alipayUserInfoShareResponse.getPhone()); - R<SysUser> sysUserR = sysUserClient.queryUserByPhone(alipayUserInfoShareResponse.getPhone()); - SysUser data = sysUserR.getData(); - appMiniLoginVo.setSysUser(data); + //如果密文的 + boolean isDataEncrypted = !content.startsWith("{"); + boolean signCheckPass = false; + + //2. 验签 + String signContent = content; + + //如果是加密的报文则需要在密文的前后添加双引号 + if (isDataEncrypted) { + signContent = "\"" + signContent + "\""; } + try { + signCheckPass = AlipaySignature.rsaCheck(signContent, sign, ALIPAY_PUBLIC_KEY, charset, signType); + } catch (AlipayApiException e) { + //验签异常, 日志 + } + if (!signCheckPass) { + //验签不通过(异常或者报文被篡改),终止流程(不需要做解密) + } + + //3. 解密 + String plainData = null; + if (isDataEncrypted) { + try { + plainData = AlipayEncrypt.decryptContent(content, encryptType, "VSpPcLQjLSoTz6Yd7KNoyQ==", charset); + } catch (AlipayApiException e) { + //解密异常, 记录日志 + e.getMessage(); + } + } else { + plainData = content; + } + + Map<String, String> openapiResult1 = JSON.parseObject(plainData, + new TypeReference<Map<String, String>>() { + }, Feature.OrderedField); + + R<SysUser> sysUserR = sysUserClient.queryUserByPhone(openapiResult1.get("mobile")); + SysUser data = sysUserR.getData(); + appMiniLoginVo.setSysUser(data); + appMiniLoginVo.setPhone(openapiResult1.get("mobile")); } }else{ - WxMaJscode2SessionResult session = null; - String unionid; - String openid; - String sessionKey = null; - //获取session - session = wxMaService.getUserService().getSessionInfo(appMiniLoginDto.getCode()); - if (session != null && StringUtils.isNotBlank(session.getOpenid())) { - unionid = session.getUnionid(); - openid = session.getOpenid(); - sessionKey = session.getSessionKey(); - String responseAccessToken = getAccessTokenByWX(); + String responseAccessToken = null; + try { + responseAccessToken = getAccessTokenByWX(); + } catch (Exception e) { + throw new RuntimeException(e); + } - JSONObject jsonAccessToken = JSONObject.parseObject(responseAccessToken); + JSONObject jsonAccessToken = JSONObject.parseObject(responseAccessToken); String accessToken = jsonAccessToken.getString("access_token"); String errmsg = jsonAccessToken.getString("errmsg"); Long expiresIn = jsonAccessToken.getLong("expires_in"); if (StringUtils.isBlank(accessToken)) { throw new ServiceException(errmsg); } - String responseUserPhoneNumber = getMobileByWX(accessToken, appMiniLoginDto.getCode()); - JSONObject jsonUserPhoneNumber = JSONObject.parseObject(responseUserPhoneNumber); + String responseUserPhoneNumber = null; + try { + responseUserPhoneNumber = getMobileByWX(accessToken, appMiniLoginDto.getCode()); + } catch (Exception e) { + throw new RuntimeException(e); + } + JSONObject jsonUserPhoneNumber = JSONObject.parseObject(responseUserPhoneNumber); String phoneInfo = jsonUserPhoneNumber.getString("phone_info"); @@ -301,33 +336,15 @@ R<SysUser> sysUserR = sysUserClient.queryUserByPhone(mobile); SysUser data = sysUserR.getData(); appMiniLoginVo.setSysUser(data); - - appMiniLoginVo.setMiniOpenid(openid); - appMiniLoginVo.setWxUnionid(unionid); appMiniLoginVo.setPhone(mobile); - appMiniLoginVo.setSessionKey(sessionKey); - } } return appMiniLoginVo; - } catch (Exception e) { - e.printStackTrace(); - return null; - } + } - private AlipayUserInfoShareResponse getAliUserInfo (String accessToken) throws Exception { - AlipayClient alipayClient = new DefaultAlipayClient(ALIPAY_BORDER_PROD,APP_ID_PROD, APP_PRIVATE_KEY, "json", "GBK", ALIPAY_PUBLIC_KEY, "RSA2"); - AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest(); - AlipayUserInfoShareResponse response = alipayClient.execute(request, accessToken); - if(response.isSuccess()){ - System.out.println("获取会员信息 - 调用成功"); - return response; - } - return null; - } @Override public PageDTO<MemberAuctionSalesroomVO> getMemberAuctionSalesroomList(MemberAuctionSalesroomDTO memberAuctionSalesroomDTO) { @@ -394,7 +411,7 @@ forepartAuctionSalesroomGoodsVO.setCoverPic(goodsSku.getCoverPic()); forepartAuctionSalesroomGoodsVO.setStartingPrice(salesroomGoods.getStartingPrice()); forepartAuctionSalesroomGoodsVO.setSalesroomStock(salesroomGoods.getSalesroomStock()); - forepartAuctionSalesroomGoodsVO.setGoodsSkustatus(salesroomGoods.getStatus().getCode()); + forepartAuctionSalesroomGoodsVO.setGoodsSkustatus(salesroomGoods.getStatus()); forepartAuctionSalesroomGoodsVO.setYears(String.valueOf(goodsSku.getYears())); LambdaQueryWrapper<AuctionBidRecord> wrapper1=Wrappers.lambdaQuery(); wrapper1.eq(AuctionBidRecord::getMemberId,memberAuctionSalesroomDTO.getMemberId()); @@ -416,6 +433,27 @@ forepartAuctionSalesroomGoodsVOS.add(forepartAuctionSalesroomGoodsVO); } memberAuctionSalesroomInfoVO.setForepartAuctionSalesroomGoodsVO(forepartAuctionSalesroomGoodsVOS); + + + LocalDateTime now = LocalDateTime.now(); + LocalDateTime newTime7 = now.minusDays(7); + + LambdaQueryWrapper<AuctionBrowseRecord> wrapper3=Wrappers.lambdaQuery(); + wrapper3.eq(AuctionBrowseRecord::getDelFlag,0); + wrapper3.eq(AuctionBrowseRecord::getTargetId,memberAuctionSalesroomDTO.getAuctionSalesroomId()); + wrapper3.eq(AuctionBrowseRecord::getMemberId,memberAuctionSalesroomDTO.getMemberId()); + wrapper3.ge(AuctionBrowseRecord::getCreateTime, now) + .le(AuctionBrowseRecord::getCreateTime, newTime7); + List<AuctionBrowseRecord> list = iAuctionBrowseRecordService.list(wrapper3); + if (list.size()==0){ + AuctionBrowseRecord auctionBrowseRecord=new AuctionBrowseRecord(); + auctionBrowseRecord.setBrowseType(AuctionOrderTypeEnum.AUCTION_ITEMS); + auctionBrowseRecord.setMemberId(memberAuctionSalesroomDTO.getMemberId()); + auctionBrowseRecord.setTargetId(memberAuctionSalesroomDTO.getAuctionSalesroomId()); + iAuctionBrowseRecordService.save(auctionBrowseRecord); + } + + return memberAuctionSalesroomInfoVO; } @@ -689,7 +727,8 @@ @Override @Transactional @GlobalTransactional(rollbackFor = Exception.class) - public void saveAuctionSalesroom(MgtAuctionSalesroomDTO dto) { + public void saveAuctionSalesroom(MgtAuctionSalesroomDTO dto) + throws IOException, WriterException { Long id = dto.getId(); AuctionSalesroom auctionSalesroom = BeanUtils.copyBean(dto, AuctionSalesroom.class); List<MgtAuctionSalesroomGoodsDTO> auctionSalesroomGoodsDTOS = dto.getAuctionSalesroomGoodsDTOS(); @@ -717,6 +756,8 @@ // 生成唯一编号 Long nextId = IDhelper.getNextId(); auctionSalesroom.setAuctionSalesroomNo(nextId.toString()); + String qrCodeToObs = CreateQrCode.createQRCodeToObs(nextId.toString()); + auctionSalesroom.setQrCode(qrCodeToObs); // 添加 this.save(auctionSalesroom); List<GoodsStockUpdDTO> goodsStockUpdDTOS = auctionSalesroomGoods.stream().map(item -> { @@ -762,7 +803,7 @@ .eq(AuctionSalesroomGoods::getAuctionSalesroomId, id)); } for (AuctionSalesroomGoods auctionSalesroomGood : auctionSalesroomGoods) { - auctionSalesroomGood.setAuctionSalesroomId(id); + auctionSalesroomGood.setAuctionSalesroomId(auctionSalesroom.getId()); } // 添加拍卖商品 for (AuctionSalesroomGoods auctionSalesroomGoodss:auctionSalesroomGoods){ @@ -810,21 +851,22 @@ /** * 查看详情 - * * @param id 拍卖会id - * @return 拍卖场视图对象 + * @param isScreen 是否为大屏控制台 + * @return MgtAuctionSalesroomVO */ @Override - public MgtAuctionSalesroomVO getAuctionSalesroom(Long id) { + public MgtAuctionSalesroomVO getAuctionSalesroom(Long id, Boolean isScreen) { // 获取拍卖场 AuctionSalesroom auctionSalesroom = this.getById(id); MgtAuctionSalesroomVO mgtAuctionSalesroomVO = BeanUtils.copyBean(auctionSalesroom, MgtAuctionSalesroomVO.class); - // 获取拍卖场商品 - LambdaQueryWrapper<AuctionSalesroomGoods> wrappers=new LambdaQueryWrapper<AuctionSalesroomGoods>(); - wrappers.eq(AuctionSalesroomGoods::getAuctionSalesroomId, id); - wrappers.orderByDesc(AuctionSalesroomGoods::getSortNum); - List<AuctionSalesroomGoods> list = auctionSalesroomGoodsMapper.selectList(wrappers); + List<AuctionSalesroomGoods> list; + if (isScreen) { + list = getAuctionSalesroomGoods(id, Boolean.FALSE); + } else { + list = getAuctionSalesroomGoods(id, null); + } if (StringUtils.isNotEmpty(list)) { List<MgtAuctionSalesroomGoodsVO> mgtAuctionSalesroomGoodsVOS = BeanUtils.copyList(list, MgtAuctionSalesroomGoodsVO.class); @@ -848,6 +890,16 @@ mgtAuctionSalesroomVO.setAuctionSalesroomGoodsVOS(mgtAuctionSalesroomGoodsVOS); } return mgtAuctionSalesroomVO; + } + + private List<AuctionSalesroomGoods> getAuctionSalesroomGoods(Long id, Boolean isBackup) { + // 获取拍卖场商品 + LambdaQueryWrapper<AuctionSalesroomGoods> wrappers = new LambdaQueryWrapper<AuctionSalesroomGoods>(); + wrappers.eq(AuctionSalesroomGoods::getAuctionSalesroomId, id); + wrappers.eq(StringUtils.isNotNull(isBackup), AuctionSalesroomGoods::getBackupStatus, + isBackup); + wrappers.orderByDesc(AuctionSalesroomGoods::getSortNum); + return auctionSalesroomGoodsMapper.selectList(wrappers); } /** @@ -936,7 +988,7 @@ */ @Override public MgtAuctionSalesroomScreenVO getAuctionSalesroomDetail(Long id) { - MgtAuctionSalesroomVO mgtAuctionSalesroomVO = this.getAuctionSalesroom(id); + MgtAuctionSalesroomVO mgtAuctionSalesroomVO = this.getAuctionSalesroom(id, Boolean.TRUE); MgtAuctionSalesroomScreenVO vo = BeanUtils.copyBean( mgtAuctionSalesroomVO, MgtAuctionSalesroomScreenVO.class); if (vo.getStatus().equals(AuctionStartStatusEnum.IN_AUCTION)) { @@ -987,17 +1039,17 @@ /** * 进入详情-出价会员列表 * - * @param mgtScreenBidPage + * @param mgtScreenBidPage 分页参数对象 * @return PageDTO<MgtAuctionBidRecordVO> */ @Override public PageDTO<MgtAuctionBidRecordVO> getScreenBidRecordList( MgtScreenBidPage mgtScreenBidPage) { MgtAuctionSalesroomVO mgtAuctionSalesroomVO = this.getAuctionSalesroom( - mgtScreenBidPage.getId()); + mgtScreenBidPage.getId(), Boolean.TRUE); List<MgtAuctionSalesroomGoodsVO> auctionSalesroomGoodsVOS = mgtAuctionSalesroomVO.getAuctionSalesroomGoodsVOS(); if (StringUtils.isEmpty(auctionSalesroomGoodsVOS)) { - throw new ServiceException("该拍卖会暂无拍卖商品"); + return PageDTO.empty(0L, 0L); } AtomicReference<Long> currentAuctionGoodsId = new AtomicReference<>(); auctionSalesroomGoodsVOS.stream() @@ -1017,4 +1069,219 @@ } return PageDTO.of(page, MgtAuctionBidRecordVO.class); } + + /** + * 添加商品 + * + * @param dto 大屏操作台添加商品数据传输对象 + */ + @Override + @Transactional + @GlobalTransactional(rollbackFor = Exception.class) + public void addGoods(MgtScreenSalesroomGoodsDTO dto) { + GoodsSku data = goodsSkuClient.getGoodsSkuOne(dto.getGoodsSkuId(), SecurityConstants.INNER) + .getData(); + if (StringUtils.isNull(data)) { + throw new ServiceException("商品不存在"); + } + // 扣减库存 + GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); + goodsStockUpdDTO.setGoodsSkuId(data.getId()); + goodsStockUpdDTO.setAuctionStock(dto.getSalesroomStock() * -1); + R<?> result = goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO), + SecurityConstants.INNER); + if (result.getCode() != Constants.SUCCESS) { + throw new ServiceException("添加商品失败"); + } + AuctionSalesroomGoods auctionSalesroomGoods = BeanUtils.copyBean(dto, + AuctionSalesroomGoods.class); + auctionSalesroomGoods.setBackupStatus(false); + auctionSalesroomGoodsMapper.insert(auctionSalesroomGoods); + } + + /** + * 获取备选拍品列表的分页数据 + * + * @param query 拍卖场商品关系查询对象 + * @return PageDTO<MgtAuctionSalesroomGoodsVO> + */ + @Override + public PageDTO<MgtAuctionSalesroomGoodsVO> backupGoods(MgtAuctionSalesroomGoodsQuery query) { + Set<Long> goodsSkuIdSet = null; + if (StringUtils.isNotBlank(query.getGoodsName())) { + List<GoodsSku> data = goodsSkuClient.getGoodsByName(query.getGoodsName(), + SecurityConstants.INNER).getData(); + if (StringUtils.isNotEmpty(data)) { + goodsSkuIdSet = data.stream().map(GoodsSku::getId) + .collect(Collectors.toSet()); + } + } + Page<AuctionSalesroomGoods> page = auctionSalesroomGoodsMapper.selectPage( + new Page<>(query.getPageCurr(), query.getPageSize()), + Wrappers.<AuctionSalesroomGoods>lambdaQuery() + .in(StringUtils.isNotEmpty(goodsSkuIdSet), + AuctionSalesroomGoods::getGoodsSkuId, goodsSkuIdSet)); + if (StringUtils.isNotEmpty(page.getRecords())) { + return PageDTO.empty(page); + } + Set<Long> skuIdList = page.getRecords().stream().map(AuctionSalesroomGoods::getGoodsSkuId) + .collect(Collectors.toSet()); + List<GoodsSku> goodsSkuList = goodsSkuClient.getGoodsListByIds(skuIdList, + SecurityConstants.INNER).getData(); + Map<Long, GoodsSku> goodsSkuMap = goodsSkuList.stream() + .collect(Collectors.toMap(GoodsSku::getId, e -> e)); + PageDTO<MgtAuctionSalesroomGoodsVO> mgtAuctionSalesroomGoodsVOPageDTO = PageDTO.of(page, + MgtAuctionSalesroomGoodsVO.class); + mgtAuctionSalesroomGoodsVOPageDTO.getList().forEach(item -> { + item.setGoodsSkuName(goodsSkuMap.get(item.getGoodsSkuId()).getSkuName()); + }); + return mgtAuctionSalesroomGoodsVOPageDTO; + } + + /** + * 选择备选商品 + * + * @param idList 备选商品id集合 + */ + @Override + public void addBackupGoods(List<Long> idList) { + List<AuctionSalesroomGoods> auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectList( + Wrappers.<AuctionSalesroomGoods>lambdaQuery() + .in(AuctionSalesroomGoods::getId, idList) + .eq(AuctionSalesroomGoods::getBackupStatus, Boolean.TRUE)); + if (StringUtils.isNotEmpty(auctionSalesroomGoods)) { + auctionSalesroomGoods.forEach(item -> { + item.setStatus(AuctionGoodsStatusEnum.WAITING); + }); + auctionSalesroomGoodsMapper.updateBatchById(auctionSalesroomGoods); + } + } + + /** + * 结束当前拍卖商品 + * + * @param id 拍卖场商品id + */ + @Override + public void stopCurrentGoods(Long id) { + AuctionSalesroomGoods auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectById(id); + if (StringUtils.isNull(auctionSalesroomGoods)) { + throw new ServiceException("拍卖商品不存在"); + } + auctionSalesroomGoods.setStatus(AuctionGoodsStatusEnum.ENDED); + auctionSalesroomGoodsMapper.updateById(auctionSalesroomGoods); + } + + /** + * 开始下一拍卖商品 + * + * @param id 拍卖场商品id + */ + @Override + public void startNextGoods(Long id) { + AuctionSalesroomGoods auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectById(id); + if (StringUtils.isNull(auctionSalesroomGoods)) { + throw new ServiceException("拍卖商品不存在"); + } + auctionSalesroomGoods.setStatus(AuctionGoodsStatusEnum.IN_PROGRESS); + auctionSalesroomGoodsMapper.updateById(auctionSalesroomGoods); + } + + /** + * 播放视频 + * + * @param dto 大屏播放视频对象 + */ + @Override + public void play(MgtScreenVideoDTO dto) { + PromotionVideo data = promotionClient.getPromotionVideoOne(dto.getVideoId(), + SecurityConstants.INNER).getData(); + if (StringUtils.isNull(data)) { + throw new ServiceException("视频不存在"); + } + AuctionVideo auctionVideo = new AuctionVideo(); + auctionVideo.setAuctionSalesroomId(dto.getAuctionSalesroomId()); + auctionVideo.setPromotionVideoId(dto.getVideoId()); + auctionVideo.setPromotionVideoUrl(data.getVideoUrl()); + iAuctionVideoService.save(auctionVideo); + } + + /** + * 结束播放 + * + * @param auctionSalesroomId 拍卖场id + */ + @Override + public void stopPlay(Long auctionSalesroomId) { + iAuctionVideoService.remove(Wrappers.<AuctionVideo>lambdaQuery().eq + (AuctionVideo::getAuctionSalesroomId, 1L)); + } + + /** + * 开始当前拍卖场 + * + * @param auctionSalesroomId 拍卖场id + */ + @Override + public void startCurrentAuctionSalesroom(Long auctionSalesroomId) { + // 修改拍卖场开始状态 + AuctionSalesroom auctionSalesroom = this.getById(auctionSalesroomId); + auctionSalesroom.setStatus(AuctionStartStatusEnum.IN_AUCTION); + auctionSalesroom.setStartTime(LocalDateTime.now()); + auctionSalesroomMapper.updateById(auctionSalesroom); + // 修改拍卖商品开始状态 + LambdaQueryWrapper<AuctionSalesroomGoods> wrapper = Wrappers.lambdaQuery(); + wrapper.eq(AuctionSalesroomGoods::getStatus, AuctionGoodsStatusEnum.WAITING); + wrapper.eq(AuctionSalesroomGoods::getAuctionSalesroomId, auctionSalesroomId); + wrapper.orderByDesc(AuctionSalesroomGoods::getSortNum); + wrapper.last("limit 1"); + AuctionSalesroomGoods auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectOne( + wrapper); + auctionSalesroomGoods.setStatus(AuctionGoodsStatusEnum.IN_PROGRESS); + auctionSalesroomGoods.setStartTime(LocalDateTime.now()); + auctionSalesroomGoodsMapper.updateById(auctionSalesroomGoods); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional + public void stopCurrentAuctionSalesroom(Long auctionSalesroomId) { + // 修改拍卖场开始状态 + AuctionSalesroom auctionSalesroom = this.getById(auctionSalesroomId); + auctionSalesroom.setStatus(AuctionStartStatusEnum.ENDED); + auctionSalesroom.setEndTime(LocalDateTime.now()); + auctionSalesroomMapper.updateById(auctionSalesroom); + LambdaQueryWrapper<AuctionSalesroomGoods> wrapper = Wrappers.lambdaQuery(); + wrapper.eq(AuctionSalesroomGoods::getStatus, AuctionGoodsStatusEnum.WAITING); + wrapper.eq(AuctionSalesroomGoods::getAuctionSalesroomId, auctionSalesroomId); + wrapper.orderByDesc(AuctionSalesroomGoods::getSortNum); + List<AuctionSalesroomGoods> auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectList( + wrapper); + if (StringUtils.isNotEmpty(auctionSalesroomGoods)) { + List<GoodsStockUpdDTO> dtoList = new ArrayList<>(); + for (AuctionSalesroomGoods salesroomGoods : auctionSalesroomGoods) { + salesroomGoods.setStatus(AuctionGoodsStatusEnum.ENDED); + GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); + goodsStockUpdDTO.setGoodsSkuId(salesroomGoods.getGoodsSkuId()); + goodsStockUpdDTO.setAuctionStock(salesroomGoods.getSalesroomStock()); + dtoList.add(goodsStockUpdDTO); + } + // 批量更新商品库存 + auctionSalesroomGoodsMapper.updateBatchById(auctionSalesroomGoods); + goodsSkuClient.updGoodsStock(dtoList, SecurityConstants.INNER); + } + // 退保证金 + List<AuctionBidRecord> auctionBidRecordList = auctionBidRecordMapper.selectList( + Wrappers.<AuctionBidRecord>lambdaQuery() + .eq(AuctionBidRecord::getAuctionSalesroomId, auctionSalesroomId) + .eq(AuctionBidRecord::getStatus, BidStatusEnum.ELIMINATE)); + List<Long> memberIdlist = auctionBidRecordList.stream().map(AuctionBidRecord::getMemberId) + .collect(Collectors.toList()); + if (StringUtils.isNotEmpty(memberIdlist)) { + OrderAuctionBondDTO orderAuctionBondDTO = new OrderAuctionBondDTO(); + orderAuctionBondDTO.setAuctionSalesroomId(auctionSalesroom.getId()); + orderAuctionBondDTO.setUserList(memberIdlist); + orderClient.getOrderAuctionBond(orderAuctionBondDTO, SecurityConstants.INNER); + } + } } -- Gitblit v1.7.1