Browse Source

95:红德堂APP调试 购物车

Long 2 days ago
parent
commit
9c497571a1

+ 47 - 0
fs-service/src/main/java/com/fs/his/domain/FsIntegralCart.java

@@ -0,0 +1,47 @@
+package com.fs.his.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@TableName("fs_integral_cart")
+@Data
+public class FsIntegralCart {
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    /**
+     * 用户ID
+     */
+    private Long userId;
+    /**
+     * 积分商品ID
+     */
+    private Long goodsId;
+    /**
+     * 所需积分-单价
+     */
+    private Long integral;
+    /**
+     * 所需金额-单价
+     */
+    private BigDecimal cash;
+    /**
+     * 数量
+     */
+    private Integer cartNum;
+    /**
+     * 添加时间
+     */
+    private LocalDateTime createTime;
+    /**
+     * 修改时间
+     */
+    private LocalDateTime updateTime;
+}

+ 5 - 0
fs-service/src/main/java/com/fs/his/domain/FsIntegralGoods.java

@@ -65,4 +65,9 @@ public class FsIntegralGoods extends BaseEntity
 
     @Excel(name = "产品编码")
     private String barCode;
+
+    /**
+     * 非数据库字段 仅用于订单信息存储购买数量
+     */
+    private Integer num;
 }

+ 31 - 0
fs-service/src/main/java/com/fs/his/mapper/FsIntegralCartMapper.java

@@ -0,0 +1,31 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsIntegralCart;
+import com.fs.his.vo.FsIntegralCartVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface FsIntegralCartMapper extends BaseMapper<FsIntegralCart> {
+
+    /**
+     * 新增或修改购物车
+     */
+    void insertOrUpdate(FsIntegralCart cart);
+
+    /**
+     * 获取购物车商品数量
+     * @param params    参数
+     * @return num      数量
+     */
+    Integer getCartCountByMap(@Param("params") Map<String, Object> params);
+
+    /**
+     * 获取购物车列表
+     * @param userId    用户ID
+     * @return  list
+     */
+    List<FsIntegralCartVO> getCartsByUserId(@Param("userId") Long userId);
+}

+ 20 - 0
fs-service/src/main/java/com/fs/his/param/FsIntegralCartOrderCreateParam.java

@@ -0,0 +1,20 @@
+package com.fs.his.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+
+@Data
+public class FsIntegralCartOrderCreateParam {
+
+
+    /** 用户id */
+    private Long userId;
+
+    private Long addressId;
+
+    private List<Long> ids;
+
+
+}

+ 22 - 0
fs-service/src/main/java/com/fs/his/param/FsIntegralCartParam.java

@@ -0,0 +1,22 @@
+package com.fs.his.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class FsIntegralCartParam {
+
+    @NotNull(message = "商品ID不能为空")
+    @ApiModelProperty("积分商品ID")
+    private Long goodsId;
+
+    @NotNull(message = "添加数量不能为空")
+    @Min(value = 1, message = "数量不再合法范围内")
+    @Max(value = 999, message = "数量不再合法范围内")
+    @ApiModelProperty("数量")
+    private Integer cartNum;
+}

+ 0 - 3
fs-service/src/main/java/com/fs/his/param/FsIntegralOrderCreateParam.java

@@ -1,10 +1,7 @@
 package com.fs.his.param;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fs.common.annotation.Excel;
 import lombok.Data;
 
-import java.util.Date;
 
 @Data
 public class FsIntegralOrderCreateParam {

+ 43 - 0
fs-service/src/main/java/com/fs/his/service/IFsIntegralCartService.java

@@ -0,0 +1,43 @@
+package com.fs.his.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsIntegralCart;
+import com.fs.his.vo.FsIntegralCartVO;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+import java.util.Map;
+
+public interface IFsIntegralCartService extends IService<FsIntegralCart> {
+
+    /**
+     * 添加或修改购物车
+     * @param userId    用户ID
+     * @param goodsId   积分商品ID
+     * @param cartNum   数量
+     */
+    void addOrUpdateCart(Long userId, Long goodsId, Integer cartNum);
+
+    /**
+     * 移除购物车
+     * @param userId    用户ID
+     * @param ids       购物车ID集合
+     */
+    void delCartByIds(Long userId, List<Long> ids);
+
+    /**
+     * 获取购物车商品数量
+     * @param params    参数
+     * @return num      数量
+     */
+    Integer getCartCountByMap(Map<String, Object> params);
+
+    /**
+     * 获取购物车列表
+     * @param userId    用户ID
+     * @return  list
+     */
+    List<FsIntegralCartVO> getCartsByUserId(Long userId);
+}

+ 8 - 4
fs-service/src/main/java/com/fs/his/service/IFsIntegralOrderService.java

@@ -3,10 +3,7 @@ package com.fs.his.service;
 import com.fs.common.core.domain.R;
 import com.fs.his.domain.FsIntegralOrder;
 import com.fs.his.enums.PaymentMethodEnum;
-import com.fs.his.param.FsIntegralOrderCreateParam;
-import com.fs.his.param.FsIntegralOrderDoPayParam;
-import com.fs.his.param.FsIntegralOrderListUParam;
-import com.fs.his.param.FsIntegralOrderParam;
+import com.fs.his.param.*;
 import com.fs.his.vo.FsIntegralOrderListUVO;
 import com.fs.his.vo.FsIntegralOrderListVO;
 import com.fs.his.vo.FsIntegralOrderPVO;
@@ -78,6 +75,13 @@ public interface IFsIntegralOrderService
 
     R createOrder(FsIntegralOrderCreateParam param);
 
+    /**
+     * 创建购物车订单
+     * @param param 参数
+     * @return  R
+     */
+    R createCartOrder(FsIntegralCartOrderCreateParam param);
+
     String importProductDeliver(List<FsStoreProductDeliverExcelVO> list);
 
     FsIntegralOrderPVO selectFsIntegralOrderPVO(Long orderId);

+ 107 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsIntegralCartServiceImpl.java

@@ -0,0 +1,107 @@
+package com.fs.his.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.exception.CustomException;
+import com.fs.his.domain.FsIntegralCart;
+import com.fs.his.domain.FsIntegralGoods;
+import com.fs.his.domain.FsUser;
+import com.fs.his.mapper.FsIntegralCartMapper;
+import com.fs.his.mapper.FsIntegralGoodsMapper;
+import com.fs.his.mapper.FsUserMapper;
+import com.fs.his.service.IFsIntegralCartService;
+import com.fs.his.vo.FsIntegralCartVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@Slf4j
+@Service
+public class FsIntegralCartServiceImpl extends ServiceImpl<FsIntegralCartMapper, FsIntegralCart> implements IFsIntegralCartService {
+
+    @Resource
+    private FsIntegralGoodsMapper goodsMapper;
+    @Resource
+    private FsUserMapper userMapper;
+
+    /**
+     * 添加或修改购物车
+     * @param userId    用户ID
+     * @param goodsId   积分商品ID
+     * @param cartNum   数量
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void addOrUpdateCart(Long userId, Long goodsId, Integer cartNum) {
+        log.debug("addOrUpdateCart userId: {}, goodsId: {}, cartNum: {}", userId, goodsId, cartNum);
+        FsUser fsUser = userMapper.selectFsUserByUserId(userId);
+        if (Objects.isNull(fsUser)) {
+            log.warn("addOrUpdateCart user not find userId: {}", userId);
+            throw new CustomException("用户不存在");
+        }
+
+        FsIntegralGoods fsIntegralGoods = goodsMapper.selectFsIntegralGoodsByGoodsId(goodsId);
+        if (Objects.isNull(fsIntegralGoods)) {
+            log.warn("addOrUpdateCart goods not find goodsId: {}", goodsId);
+            throw new CustomException("商品不存在");
+        }
+
+        if (fsIntegralGoods.getStock() < cartNum) {
+            log.warn("addOrUpdateCart goods not enough cartNum: {}", goodsId);
+            throw new CustomException("库存不足");
+        }
+
+        FsIntegralCart cart = new FsIntegralCart();
+        cart.setUserId(userId);
+        cart.setGoodsId(goodsId);
+        cart.setCartNum(cartNum);
+        cart.setIntegral(fsIntegralGoods.getIntegral());
+        cart.setCash(fsIntegralGoods.getCash());
+        cart.setCreateTime(LocalDateTime.now());
+        cart.setUpdateTime(LocalDateTime.now());
+        baseMapper.insertOrUpdate(cart);
+    }
+
+    /**
+     * 移除购物车
+     * @param userId    用户ID
+     * @param ids       购物车ID集合
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delCartByIds(Long userId, List<Long> ids) {
+        Wrapper<FsIntegralCart> wrapper = Wrappers.<FsIntegralCart>lambdaQuery()
+                .eq(FsIntegralCart::getUserId, userId)
+                .in(FsIntegralCart::getId, ids);
+        baseMapper.delete(wrapper);
+    }
+
+    /**
+     * 获取购物车商品数量
+     * @param params    参数
+     * @return num      数量
+     */
+    @Override
+    public Integer getCartCountByMap(Map<String, Object> params) {
+        return baseMapper.getCartCountByMap(params);
+    }
+
+    /**
+     * 获取购物车列表
+     * @param userId    用户ID
+     * @return  list
+     */
+    @Override
+    public List<FsIntegralCartVO> getCartsByUserId(Long userId) {
+        return baseMapper.getCartsByUserId(userId);
+    }
+}

+ 107 - 23
fs-service/src/main/java/com/fs/his/service/impl/FsIntegralOrderServiceImpl.java

@@ -1,10 +1,13 @@
 package com.fs.his.service.impl;
 
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.lang.TypeReference;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.constant.FsConstants;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
@@ -23,6 +26,7 @@ import com.fs.his.enums.FsUserIntegralLogTypeEnum;
 import com.fs.his.enums.PaymentMethodEnum;
 import com.fs.his.mapper.*;
 import com.fs.his.param.*;
+import com.fs.his.service.IFsIntegralCartService;
 import com.fs.his.service.IFsIntegralOrderService;
 import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.service.IFsUserIntegralLogsService;
@@ -101,6 +105,8 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
     private IPayService ybPayService;
     @Autowired
     private IFsStorePaymentService storePaymentService;
+    @Autowired
+    private IFsIntegralCartService cartService;
 
     /**
      * 查询积分商品订单
@@ -215,25 +221,51 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
         FsUser user=fsUserMapper.selectFsUserByUserId(param.getUserId());
         FsUserAddress address=fsUserAddressMapper.selectFsUserAddressByAddressId(param.getAddressId());
         FsIntegralGoods integralGoods=fsIntegralGoodsMapper.selectFsIntegralGoodsByGoodsId(param.getGoodsId());
-        if(integralGoods.getStock()<=0l){
+        if (Objects.isNull(user)) {
+            return R.error("用户不存在");
+        }
+        if (Objects.isNull(address)) {
+            return R.error("地址不存在");
+        }
+        if (Objects.isNull(integralGoods)) {
+            return R.error("商品不存在");
+        }
+        if(integralGoods.getStock()<=0L){
             return R.error("库存不足");
         }
         if(user.getIntegral()<integralGoods.getIntegral()){
             return R.error("积分不足");
         }
-        FsIntegralOrder order=new FsIntegralOrder();
-        String orderSn =  OrderCodeUtils.getOrderSn();
+
+        // 减库存
+        if (fsIntegralGoodsMapper.subStock(integralGoods.getGoodsId(), 1) <= 0) {
+            throw new CustomException("库存不足");
+        }
+
+        List<FsIntegralGoods> goodsItem = new ArrayList<>();
+        goodsItem.add(integralGoods);
+
+        // 创建订单
+        return createOrder(user, address, integralGoods.getIntegral(),integralGoods.getCash(), goodsItem);
+    }
+
+    /**
+     * 创建订单
+     */
+    private R createOrder(FsUser user, FsUserAddress address, Long totalIntegral, BigDecimal totalCash, List<FsIntegralGoods> goodsItem) {
+        FsIntegralOrder order = new FsIntegralOrder();
+        String orderSn = OrderCodeUtils.getOrderSn();
         if(StringUtils.isEmpty(orderSn)){
-            return R.error("订单生成失败,请重试");
+            throw new CustomException("订单生成失败,请重试");
         }
 
         // 现金
-        if (integralGoods.getCash().compareTo(BigDecimal.ZERO) > 0) {
+        if (totalCash.compareTo(BigDecimal.ZERO) > 0) {
             // 现金+积分
-            order.setPayType(integralGoods.getIntegral() > 0 ? 3 : 2);
+            order.setPayType(totalIntegral > 0 ? 3 : 2);
             order.setStatus(4);
             order.setIsPay(0);
-            order.setPayMoney(integralGoods.getCash());
+            order.setPayMoney(totalCash);
         }
         // 积分
         else {
@@ -245,9 +277,9 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
 
         order.setOrderCode(orderSn);
         order.setUserId(user.getUserId());
-        order.setBarCode(integralGoods.getBarCode());
-        order.setIntegral(integralGoods.getIntegral().toString());
-        order.setItemJson(JSONUtil.toJsonStr(integralGoods));
+        order.setBarCode(goodsItem.get(0).getBarCode());
+        order.setIntegral(totalIntegral.toString());
+        order.setItemJson(JSONUtil.toJsonStr(goodsItem));
         order.setUserName(address.getRealName());
         order.setUserAddress(address.getProvince()+address.getCity()+address.getDistrict()+address.getDetail());
         order.setUserPhone(address.getPhone());
@@ -270,23 +302,18 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
                 //写入日志
                 FsUser userMap=new FsUser();
                 userMap.setUserId(user.getUserId());
-                userMap.setIntegral(user.getIntegral()-integralGoods.getIntegral());
+                userMap.setIntegral(user.getIntegral()-totalIntegral);
                 fsUserMapper.updateFsUser(userMap);
                 FsUserIntegralLogs logs = new FsUserIntegralLogs();
-                logs.setIntegral(-integralGoods.getIntegral());
+                logs.setIntegral(-totalIntegral);
                 logs.setUserId(order.getUserId());
-                logs.setBalance(userMap.getIntegral().longValue());
+                logs.setBalance(userMap.getIntegral());
                 logs.setLogType(5);
                 logs.setBusinessId(order.getOrderId().toString());
                 logs.setCreateTime(new Date());
                 fsUserIntegralLogsMapper.insertFsUserIntegralLogs(logs);
             }
 
-            // 减库存
-            if (fsIntegralGoodsMapper.subStock(integralGoods.getGoodsId(), 1) <= 0) {
-                throw new CustomException("库存不足");
-            }
-
             // 积分支付
             if (order.getPayType() == 1) {
                 // 首次完成积分商城下单
@@ -306,9 +333,61 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
             }
         }
         else{
+            throw new CustomException("订单创建失败");
+        }
+    }
 
-            return R.error("订单创建失败");
+    /**
+     * 创建购物车订单
+     * @param param 参数
+     * @return  R
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public R createCartOrder(FsIntegralCartOrderCreateParam param) {
+        FsUser user=fsUserMapper.selectFsUserByUserId(param.getUserId());
+        FsUserAddress address=fsUserAddressMapper.selectFsUserAddressByAddressId(param.getAddressId());
+
+        if (Objects.isNull(user)) {
+            throw new CustomException("用户不存在");
+        }
+        if (Objects.isNull(address)) {
+            throw new CustomException("地址不存在");
+        }
+
+        Wrapper<FsIntegralCart> wrapper = Wrappers.<FsIntegralCart>lambdaQuery()
+                .eq(FsIntegralCart::getUserId, user.getUserId())
+                .in(FsIntegralCart::getId, param.getIds());
+        List<FsIntegralCart> carts = cartService.list(wrapper);
+        if (carts.isEmpty()) {
+            throw new CustomException("请选择商品");
+        }
+
+        long totalIntegral = 0L;
+        BigDecimal totalCash = BigDecimal.ZERO;
+        List<FsIntegralGoods> goodsItem = new ArrayList<>();
+        for (FsIntegralCart cart : carts) {
+            FsIntegralGoods integralGoods = fsIntegralGoodsMapper.selectFsIntegralGoodsByGoodsId(cart.getGoodsId());
+            if (Objects.isNull(integralGoods)) {
+                throw new CustomException("商品不存在");
+            }
+            if(integralGoods.getStock() < cart.getCartNum()){
+                throw new CustomException("库存不足");
+            }
+
+            // 减库存
+            if (fsIntegralGoodsMapper.subStock(integralGoods.getGoodsId(), cart.getCartNum()) <= 0) {
+                throw new CustomException("库存不足");
+            }
+
+            totalIntegral += integralGoods.getIntegral() * cart.getCartNum();
+            totalCash = totalCash.add(integralGoods.getCash().multiply(BigDecimal.valueOf(cart.getCartNum())));
+
+            integralGoods.setNum(cart.getCartNum());
+            goodsItem.add(integralGoods);
         }
+
+        return createOrder(user, address, totalIntegral, totalCash, goodsItem);
     }
 
     @Override
@@ -400,19 +479,24 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
         fsIntegralOrderMapper.updateFsIntegralOrder(order);
 
         // 还原库存
-        FsIntegralGoods integralGoods = JSONUtil.toBean(order.getItemJson(), FsIntegralGoods.class);
-        fsIntegralGoodsMapper.addStock(integralGoods.getGoodsId(), 1);
+        if (order.getItemJson().startsWith("[") && order.getItemJson().endsWith("]")){
+            List<FsIntegralGoods> goodsItem = JSONUtil.toBean(order.getItemJson(), new TypeReference<List<FsIntegralGoods>>(){}, true);
+            goodsItem.forEach(goods -> fsIntegralGoodsMapper.addStock(goods.getGoodsId(), goods.getNum()));
+        } else {
+            FsIntegralGoods integralGoods = JSONUtil.toBean(order.getItemJson(), FsIntegralGoods.class);
+            fsIntegralGoodsMapper.addStock(integralGoods.getGoodsId(), 1);
+        }
 
         // 还原积分
         FsUser user=fsUserMapper.selectFsUserByUserId(order.getUserId());
         FsUser userMap=new FsUser();
         userMap.setUserId(user.getUserId());
-        userMap.setIntegral(user.getIntegral()+integralGoods.getIntegral());
+        userMap.setIntegral(user.getIntegral() + Long.parseLong(order.getIntegral()));
         fsUserMapper.updateFsUser(userMap);
         FsUserIntegralLogs logs = new FsUserIntegralLogs();
         logs.setIntegral(Long.parseLong(order.getIntegral()));
         logs.setUserId(order.getUserId());
-        logs.setBalance(userMap.getIntegral().longValue());
+        logs.setBalance(userMap.getIntegral());
         logs.setLogType(5);
         logs.setBusinessId(order.getOrderId().toString());
         logs.setCreateTime(new Date());

+ 44 - 0
fs-service/src/main/java/com/fs/his/vo/FsIntegralCartVO.java

@@ -0,0 +1,44 @@
+package com.fs.his.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class FsIntegralCartVO {
+
+    @ApiModelProperty("主键ID")
+    private Long id;
+
+    @ApiModelProperty("积分商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("积分商品名称")
+    private String goodsName;
+
+    @ApiModelProperty("添加购物车时所需积分")
+    private Long integral;
+
+    @ApiModelProperty("添加购物车所需金额")
+    private BigDecimal cash;
+
+    @ApiModelProperty("最新所需积分")
+    private Long newIntegral;
+
+    @ApiModelProperty("最新所需金额")
+    private BigDecimal newCash;
+
+    @ApiModelProperty("数量")
+    private Integer cartNum;
+
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("修改时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+}

+ 16 - 1
fs-service/src/main/resources/db/20250721-积分加现金.sql

@@ -5,4 +5,19 @@ alter table fs_integral_order
     add column pay_money decimal(11,2) DEFAULT NULL COMMENT '支付金额' after `integral`,
     add column is_pay tinyint(1) DEFAULT NULL COMMENT '是否支付 0未支付 1已支付' after `pay_money`,
     add column `pay_time` datetime DEFAULT NULL COMMENT '支付时间' after `is_pay`,
-    add column `pay_type` int DEFAULT NULL COMMENT '支付类型 1积分 2现金 3积分+现金' after `pay_time`;
+    add column `pay_type` int DEFAULT NULL COMMENT '支付类型 1积分 2现金 3积分+现金' after `pay_time`;
+
+drop table if exists `fs_integral_cart`;
+create table `fs_integral_cart` (
+    `id`            bigint not null auto_increment       comment '主键ID',
+    `user_id`       bigint not null                      comment '用户ID',
+    `goods_id`      bigint not null                      comment '积分商品ID',
+    `integral`      int    default 0                     comment '所需积分-单价',
+    `cash`          decimal(10,2) default 0              comment '所需金额-单价',
+    `cart_num`      int    not null                      comment '数量',
+    `create_time`   datetime                             comment '添加时间',
+    `update_time`   datetime                             comment '修改时间',
+    primary key (`id`) using btree,
+    unique key uk_user_goods(`user_id`, `goods_id`),
+    key idx_goods(`goods_id`)
+) engine = Innodb comment '积分商品购物车';

+ 62 - 0
fs-service/src/main/resources/mapper/his/FsIntegralCartMapper.xml

@@ -0,0 +1,62 @@
+<?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="com.fs.his.mapper.FsIntegralCartMapper">
+
+    <insert id="insertOrUpdate">
+        insert into fs_integral_cart (
+            user_id,
+            goods_id,
+            integral,
+            cash,
+            cart_num,
+            create_time,
+            update_time
+        ) values (
+            #{userId},
+            #{goodsId},
+            #{integral},
+            #{cash},
+            #{cartnum},
+            #{createTime},
+            #{updateTime}
+        )
+        on duplicate key update
+            integral = values(integral),
+            cash = values(cash),
+            cart_num = values(cart_num),
+            update_time = values(update_time)
+    </insert>
+
+    <select id="getCartCountByMap" resultType="java.lang.Integer">
+        select
+            ifnull(sum(ic.cart_num), 0)
+        from fs_integral_cart ic
+        <where>
+            <if test="params.userId != null">
+                ic.user_id = #{params.userId}
+            </if>
+            <if test="params.goodsId != null">
+                ic.goods_id = #{params.goodsId}
+            </if>
+        </where>
+    </select>
+
+    <select id="getCartsByUserId" resultType="com.fs.his.vo.FsIntegralCartVO">
+        select
+            ic.id,
+            ic.goods_id,
+            ig.goods_name,
+            ic.integral,
+            ic.cash,
+            ig.integral newIntegral,
+            ig.cash newCash,
+            ic.cart_num,
+            ic.create_time,
+            ic.update_time
+        from fs_integral_cart ic
+        inner join fs_integral_goods ig on ig.goods_id = ic.goods_id
+        where ic.user_id = #{userId}
+    </select>
+</mapper>

+ 55 - 1
fs-user-app/src/main/java/com/fs/app/controller/IntegralController.java

@@ -1,6 +1,7 @@
 package com.fs.app.controller;
 
 
+import com.alibaba.fastjson.JSON;
 import com.fs.app.annotation.Login;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
@@ -15,15 +16,20 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 
+@Slf4j
 @Api("积分接口")
 @RestController
 @RequestMapping(value="/app/integral")
@@ -39,7 +45,8 @@ public class IntegralController extends  AppBaseController {
     private IFsUserService userService;
     @Autowired
     private IFsUserSignService userSignService;
-
+    @Autowired
+    private IFsIntegralCartService cartService;
     @Autowired
     private ISysConfigService configService;
     @ApiOperation("获取积分商品列表")
@@ -191,5 +198,52 @@ public class IntegralController extends  AppBaseController {
         return userIntegralLogsService.addIntegralTemplate(fsUserAddIntegralTemplateParam);
     }
 
+    @Login
+    @ApiOperation("添加或修改购物车")
+    @PostMapping("/addOrUpdateCart")
+    public R addOrUpdateCart(@Validated @RequestBody FsIntegralCartParam param) {
+        log.debug("addOrUpdateCart param: {}", JSON.toJSONString(param));
+        cartService.addOrUpdateCart(Long.parseLong(getUserId()), param.getGoodsId(), param.getCartNum());
+        return R.ok();
+    }
+
+    @Login
+    @ApiOperation("删除购物车")
+    @PostMapping("/delCart")
+    public R delCart(@RequestBody List<Long> ids) {
+        log.debug("delCartByIds ids: {}", ids);
+        if (Objects.isNull(ids) || ids.isEmpty()) {
+            return R.error("ID不能为空");
+        }
+        cartService.delCartByIds(Long.parseLong(getUserId()), ids);
+        return R.ok();
+    }
+
+    @Login
+    @ApiOperation("获取购物车商品数量")
+    @GetMapping("/getCartCount")
+    public R getCartCount(@RequestParam(required = false) Long goodsId) {
+        log.debug("getCartCount goodsId: {}", goodsId);
+        Map<String,Object> params = new HashMap<>();
+        params.put("userId", Long.parseLong(getUserId()));
+        params.put("goodsId",goodsId);
+        return R.ok().put("data", cartService.getCartCountByMap(params));
+    }
+
+    @Login
+    @ApiOperation("获取购物车列表")
+    @GetMapping("/getCarts")
+    public R getCarts() {
+        return R.ok().put("carts", cartService.getCartsByUserId(Long.parseLong(getUserId())));
+    }
+
+    @Login
+    @ApiOperation("创建购物车订单")
+    @PostMapping("/createCartOrder")
+    @RepeatSubmit
+    public R createCartOrder(@Validated @RequestBody FsIntegralCartOrderCreateParam param){
+        param.setUserId(Long.parseLong(getUserId()));
+        return integralOrderService.createCartOrder(param);
+    }
 
 }