package com.ruoyi.other.controller; import java.math.BigDecimal; import java.time.LocalDateTime; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.account.api.dto.GrantCouponDto; import com.ruoyi.account.api.feignClient.AppCouponClient; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.dto.AppGoodQuery; import com.ruoyi.common.core.dto.ExchangeBackDto; import com.ruoyi.common.core.dto.PointChangeDto; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.BasePage; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.log.enums.OperatorType; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.annotation.Logical; import com.ruoyi.common.security.annotation.RequiresPermissions; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.api.feignClient.OrderClient; import com.ruoyi.order.api.model.TShoppingOrder; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TGoods; import com.ruoyi.common.core.dto.ExchangeDto; import com.ruoyi.other.api.dto.AdvertisingDTO; import com.ruoyi.other.api.dto.GoodsDTO; import com.ruoyi.other.service.TActivityService; import com.ruoyi.other.service.TCouponService; import com.ruoyi.other.service.TGoodsService; import com.ruoyi.other.util.RedisLock; import com.ruoyi.payment.api.feignClient.AliPaymentClient; import com.ruoyi.payment.api.feignClient.IcbcPaymentClient; import com.ruoyi.payment.api.vo.AliPaymentReq; import com.ruoyi.payment.api.vo.AliPaymentResp; import com.ruoyi.payment.api.vo.IcbcPaymentReq; import com.ruoyi.payment.api.vo.IcbcPaymentResp; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.swing.*; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** *

* 前端控制器 *

* * @author 无关风月 * @since 2024-08-06 */ @RestController @RequestMapping("/t-goods") public class TGoodsController { @Autowired private TGoodsService goodsService; @Autowired private TActivityService activityService; @Resource private TokenService tokenService; @Resource private AppUserClient appUserClient; @Resource private OrderClient orderClient; @Resource private AppCouponClient appCouponClient; @Resource private TCouponService couponService; @Resource private IcbcPaymentClient icbcPaymentClient; @Resource private RedisService redisService; @Autowired public RedisTemplate redisTemplate; /** * 远程调用 根据商品名称查询商品ids * @param name * @return */ @PostMapping("/getGoodsIdsByName/{name}") public R> getGoodsIdsByName(@PathVariable("name")String name) { List collect = goodsService.list(new QueryWrapper() .like("name", name)).stream().map(TGoods::getId).collect(Collectors.toList()); return R.ok(collect); } @RequiresPermissions(value = {"/goods/add"}, logical = Logical.OR) @PostMapping("/saveGoods") @ApiOperation(tags = {"管理后台-商品管理"},value = "商品添加") @Log(title = "【商品管理】添加商品", businessType = BusinessType.INSERT) public AjaxResult saveActivity(@RequestBody TGoods dto) { goodsService.save(dto); return AjaxResult.success(); } @RequiresPermissions(value = {"/goods/del"}, logical = Logical.OR) @GetMapping("/delete") @ApiOperation(tags = {"管理后台-商品管理"},value = "商品删除") @Log(title = "【商品管理】删除商品", businessType = BusinessType.DELETE) public AjaxResult delete(String ids) { goodsService.removeBatchByIds(Arrays.asList(ids.split(","))); return AjaxResult.success(); } @RequiresPermissions(value = {"/goods/update"}, logical = Logical.OR) @PostMapping("/updateVip") @ApiOperation(tags = {"管理后台-商品管理"},value = "商品修改") @Log(title = "【商品管理】修改商品", businessType = BusinessType.UPDATE) public AjaxResult updateActivity(@RequestBody TGoods dto) { goodsService.updateById(dto); return AjaxResult.success(); } @RequiresPermissions(value = {"/goods/select"}, logical = Logical.OR) @GetMapping("/getInfo") @ApiOperation(tags = {"管理后台-商品管理"},value = "商品查看详情") public AjaxResult getInfo(Integer id) { TGoods byId = goodsService.getById(id); return AjaxResult.ok(byId); } @GetMapping("/getInfoByType") @ApiOperation(tags = {"小程序-兑换商城"},value = "商品查看详情") public R getInfoByType(Integer goodType,Integer id,Integer type) { if (goodType==1){ TGoods byId = goodsService.getById(id); if (byId==null||byId.getStatus()==2){ return R.fail(2,"该商品已不存在"); } // List data = orderClient.getSalesCountByGoodsId(String.valueOf(id)).getData(); // for (int i = 0; i < list.size(); i++) { // list.get(i).setSalesCount(data.get(i)); // } Integer data = orderClient.getSalesCountByGoodsIdgetCount(byId.getId(), 1, type).getData(); byId.setSalesCount(data); return R.ok(byId); } else { TCoupon byId = couponService.getById(id); if (byId==null||byId.getStatus()==2){ return R.fail(2,"该商品已不存在"); } Integer data = orderClient.getSalesCountByGoodsIdgetCount(byId.getId(),2, type).getData(); byId.setSalesCount(data); return R.ok(byId); } } @RequiresPermissions(value = {"/goods"}, logical = Logical.OR) @ApiOperation(tags = {"管理后台-商品管理"},value = "商品列表分页查询") @PostMapping(value = "/pageList") public AjaxResult> pageList(@RequestBody GoodsDTO dto) { return AjaxResult.ok(goodsService.pageList(dto)); } @ApiOperation(tags = {"小程序-兑换商城"},value = "商品列表分页查询") @PostMapping(value = "/app/pageList") public AjaxResult> apppageList(@RequestBody AppGoodQuery appGoodQuery) { return AjaxResult.ok(goodsService.pageList1(appGoodQuery)); } @ApiOperation(tags = {"小程序-兑换商城"},value = "积分兑换商品检查数量") @PostMapping(value = "/app/shop/check") public R check(@RequestBody ExchangeDto exchangeDto) { //检查当前用户积分是否够 Long userId = tokenService.getLoginUserApplet().getUserId(); Integer point = 0; if (exchangeDto.getGoodType()==1) { //查询当前商品信息 TGoods good = goodsService.getById(exchangeDto.getGoodId()); point = good.getRedeemPoints(); //检查当前用户是否到达兑换上限 Long count = orderClient.getExchangeById(exchangeDto.getGoodId(), userId,exchangeDto.getGoodType()).getData(); if (good.getLimitExchangeTimes() != -1 && count >= good.getLimitExchangeTimes()) { return R.fail("当前用户已兑换"+count+"张"); } TAppUser user = appUserClient.getUserById(userId).getData(); if (user.getPoints()= coupon.getInventoryQuantity()) { return R.fail("当前用户已到达兑换"+coupon+"次"); } } return R.ok(); } @Log(title = "【我的】积分兑换商品", businessType = BusinessType.INSERT,operatorType = OperatorType.MOBILE) @ApiOperation(tags = {"小程序-兑换商城"},value = "积分兑换商品") @PostMapping(value = "/app/shop") public AjaxResult> shop(@RequestBody ExchangeDto exchangeDto) { //redis锁 和支付使用同一个锁 RedisLock redisLock = new RedisLock(redisTemplate, "POINT_EXCHANGE_LOCK", 5, 30000); try { redisLock.lock(); Long userId = tokenService.getLoginUserApplet().getUserId(); Integer point = 0; TAppUser user = appUserClient.getUserById(userId).getData(); if (exchangeDto.getGoodType()==1) { //查询当前商品信息 TGoods good = goodsService.getById(exchangeDto.getGoodId()); point = good.getRedeemPoints(); if (user.getPoints().compareTo(good.getRedeemPoints()) < 0){ return AjaxResult.error("当前用户积分不足"); } //检查当前用户是否到达兑换上限 Long count = orderClient.getExchangeById(exchangeDto.getGoodId(), userId,exchangeDto.getGoodType()).getData(); if (good.getLimitExchangeTimes() != -1 && count >= good.getLimitExchangeTimes()) { return AjaxResult.error("当前用户已兑换"+count+"张"); }else { //减少库存 if (good.getInventory()!=-1) { good.setInventory(good.getInventory() - exchangeDto.getNum()); goodsService.updateById(good); } } }else { TCoupon coupon = couponService.getById(exchangeDto.getGoodId()); point = coupon.getRedeemPoints(); if (user.getPoints().compareTo(coupon.getRedeemPoints()) < 0){ return AjaxResult.error("当前用户积分不足"); } Long count = orderClient.getExchangeById(exchangeDto.getGoodId(), userId,exchangeDto.getGoodType()).getData(); if (coupon.getInventoryQuantity() != -1 && count >= coupon.getInventoryQuantity()) { return AjaxResult.error("当前用户已到达兑换"+coupon+"次"); }else { if (coupon.getInventoryQuantity()!=-1) { coupon.setInventoryQuantity(coupon.getInventoryQuantity() - 1); couponService.updateById(coupon); } } } exchangeDto.setPoint(point); exchangeDto.setUserId(userId); //生成积分兑换成功的订单 R longR = orderClient.exchangeCreate(exchangeDto); if (exchangeDto.getGoodType()==2) { TCoupon coupon = couponService.getById(exchangeDto.getGoodId()); //如果是优惠卷,赠送优惠卷给用户 GrantCouponDto grantCouponDto = new GrantCouponDto(); grantCouponDto.setUserIds(userId.toString()); grantCouponDto.setCouponId(exchangeDto.getGoodId()); grantCouponDto.setWaysToObtain(1); grantCouponDto.setEndTime(LocalDateTime.now()); grantCouponDto.setType(3); switch (coupon.getValidityPeriodMode()){ case 1: grantCouponDto.setEndTime(coupon.getEndTime()); break; case 2: grantCouponDto.setEndTime(LocalDateTime.now().plusDays(coupon.getDays())); break; } appCouponClient.grantCoupon(grantCouponDto); } //生成消耗积分的记录 PointChangeDto pointChangeDto = new PointChangeDto(); pointChangeDto.setUserId(userId); pointChangeDto.setPoints(point); pointChangeDto.setRemark(String.valueOf(longR.getData().getId())); pointChangeDto.setType(6); pointChangeDto.setCode(longR.getData().getCode()); appUserClient.changeDown(pointChangeDto); return AjaxResult.success(longR.getData().getId()); }catch (Exception e){ e.printStackTrace(); }finally { //解锁 redisLock.unlock(); } return AjaxResult.success(); } @Resource private AliPaymentClient aliPaymentClient; @Log(title = "【我的】支付商品", businessType = BusinessType.UPDATE,operatorType = OperatorType.MOBILE) @ApiOperation(tags = {"小程序-现金商城"},value = "支付商品") @PostMapping(value = "/app/pay") public Object pay(@RequestBody ExchangeDto exchangeDto) { Long userId = tokenService.getLoginUserApplet().getUserId(); TAppUser user = appUserClient.getUserById(userId).getData(); boolean isVip = false; if (user.getVipEndTime()!=null&&user.getVipEndTime().isAfter(LocalDateTime.now())){ isVip = true; } //计算价格 BigDecimal orderPrice = new BigDecimal(0); BigDecimal payPrice = new BigDecimal(0); BigDecimal discountPrice = new BigDecimal(0); BigDecimal vipDiscount = new BigDecimal(0); if (exchangeDto.getGoodType()==1){ TGoods good = goodsService.getById(exchangeDto.getGoodId()); if (good.getStatus()==2){ return R.fail("当前商品已下架"); } BigDecimal originalPrice = good.getPreferentialPrice(); exchangeDto.setTitle("【商品购买】"+good.getName()); if (isVip){ if (good.getVipPrice()!=null){ vipDiscount = originalPrice.subtract(good.getVipPrice()).multiply(BigDecimal.valueOf(exchangeDto.getNum())); originalPrice = good.getVipPrice(); } } orderPrice = orderPrice.add(originalPrice.multiply(BigDecimal.valueOf(exchangeDto.getNum()))); }else { TCoupon coupon = couponService.getById(exchangeDto.getGoodId()); if (coupon.getStatus()==2){ return R.fail("当前商品已下架"); } exchangeDto.setTitle("【优惠卷购买】"+coupon.getName()); BigDecimal originalPrice = coupon.getPaymentAmount(); if (isVip){ if (coupon.getVipPaymentAmount()!=null) { vipDiscount = originalPrice.subtract(coupon.getVipPaymentAmount()).multiply(BigDecimal.valueOf(exchangeDto.getNum())); originalPrice = coupon.getVipPaymentAmount(); } } orderPrice = orderPrice.add(originalPrice); } exchangeDto.setOrderPrice(orderPrice); //查看是否使用优惠券 if(exchangeDto.getCouponId()!=null) { TAppCoupon appCoupon = appUserClient.couponGetById(exchangeDto.getCouponId()).getData(); TCoupon coupon = JSON.toJavaObject(JSON.parseObject(appCoupon.getCouponJson()), TCoupon.class); if (coupon.getValidityPeriodMode()==1){ if (orderPrice.compareTo(coupon.getMeetTheConditions())<0){ return R.fail("不满足使用优惠券条件"); } } payPrice = orderPrice.subtract(coupon.getDiscountAmount()); discountPrice = coupon.getDiscountAmount(); }else { payPrice = orderPrice; } exchangeDto.setPayPrice(payPrice); exchangeDto.setDiscountPrice(discountPrice); exchangeDto.setVipDiscount(vipDiscount); exchangeDto.setUserId(userId); exchangeDto.setPhone(user.getPhone()); boolean wechatMiniProgramPay = exchangeDto.getPayMethod() == 1; if (wechatMiniProgramPay) { exchangeDto.setPayMethod(3); } //创建订单 TShoppingOrder shopOrder = orderClient.shopCreate(exchangeDto).getData(); if (wechatMiniProgramPay) { IcbcPaymentReq paymentReq = new IcbcPaymentReq(); paymentReq.setOutTradeNo(shopOrder.getCode()); paymentReq.setAmount(exchangeDto.getPayPrice()); paymentReq.setOpenId(user.getWxOpenid()); paymentReq.setPaymentType(1); paymentReq.setSubject("购买商品"); paymentReq.setBody(exchangeDto.getTitle()); R paymentResult = icbcPaymentClient.payment(paymentReq); if (paymentResult == null || paymentResult.getCode() != 200 || paymentResult.getData() == null) { return R.fail(paymentResult == null ? "工行支付无响应" : paymentResult.getMsg()); } IcbcPaymentResp paymentResp = paymentResult.getData(); if (!"SUCCESS".equals(paymentResp.getStatus())) { return R.fail(paymentResp.getRawResponse()); } Map data = JSON.parseObject(JSON.toJSONString(paymentResp), Map.class); data.put("orderId", shopOrder.getId().toString()); return R.ok(data); }else { AliPaymentReq req = new AliPaymentReq(); req.setOutTradeNo(shopOrder.getCode()); req.setTotalAmount(shopOrder.getPaymentAmount().toString()); req.setSubject("购买商品"); req.setBuyerOpenId(user.getAliOpenid()); req.setBody("购买商品"); req.setNotifyUrl("/payment/ali/callBack"); AliPaymentResp data = aliPaymentClient.payment(req).getData(); if(null != data){ data.setOrderId(shopOrder.getId().toString()); return AjaxResult.success(data); } } return AjaxResult.success(); } /** * 根据id获取商品信息 * @param id * @return */ @PostMapping("/getGoodsById/{id}") public R getGoodsById(@PathVariable Integer id){ TGoods goods = goodsService.getById(id); return R.ok(goods); } /** * 修改商品 * @param goods * @return */ @PostMapping("/updateGoods") public R updateGoods(@RequestBody TGoods goods){ goodsService.updateById(goods); return R.ok(); } }