diff --git a/src/main/java/com/gxwebsoft/shop/controller/CartController.java b/src/main/java/com/gxwebsoft/shop/controller/CartController.java index e2f4be3..2757a5d 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/CartController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/CartController.java @@ -7,6 +7,7 @@ import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.common.core.web.BatchParam; import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.system.entity.Role; import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.shop.entity.Cart; import com.gxwebsoft.shop.entity.Merchant; @@ -23,10 +24,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -76,7 +74,6 @@ public class CartController extends BaseController { if (ObjectUtil.isEmpty(getLoginUser())) { return success("请先登录",null); } - // 修正用户ID cart.setUserId(getLoginUserId()); // 修正购买数量 @@ -87,7 +84,17 @@ public class CartController extends BaseController { if (cartService.count(new LambdaUpdateWrapper().eq(Cart::getUserId,getLoginUserId())) > 50) { return fail("购物车宝贝数量已满,建议您先去结算或清理~"); } - + // 重复商品叠加数量 + final Cart one = cartService.getOne(new LambdaQueryWrapper() + .eq(Cart::getUserId, getLoginUserId()) + .eq(Cart::getGoodsId,cart.getGoodsId()) + .eq(Cart::getSpec,cart.getSpec()) + .last("limit 1")); + if(ObjectUtil.isNotEmpty(one)){ + one.setCartNum(cart.getCartNum()+1); + cartService.updateById(one); + return success("更新成功",one.getId()); + } if (cartService.save(cart)) { return success("添加成功",cart.getId()); } @@ -161,111 +168,26 @@ public class CartController extends BaseController { return success("修改成功", cartService.updateBatchById(carts)); } + @ApiOperation("增加数量") + @PutMapping("/addCartNum") + public ApiResult addCartNum(@RequestBody Cart cart) { + if (ObjectUtil.isEmpty(getLoginUser())) { + return success("请先登录",null); + } + cart.setCartNum(cart.getCartNum()+1); + cartService.updateById(cart); + return success("操作成功"); + } -// @ApiOperation("我的购物车") -// @GetMapping("/myCart") -// public ApiResult myCart(CartParam param) { -// // 记录当前登录用户id -// User loginUser = getLoginUser(); -// if (loginUser == null) { -// return success("请先登录", null); -// } -// -//// if (param.getIsNew() == null) { -//// param.setIsNew(false); -//// } -// -// HashMap map = computeCart(param); -// System.out.println("map = " + map); -// -// // 查询购物车 -// param.setUserId(loginUser.getUserId()); -// final List carts = cartService.listRelMpj(param); -// System.out.println("carts3 = " + carts); -// -// // 收集店铺ID -// final Set merchantIds = carts.stream().map(Cart::getMerchantId).collect(Collectors.toSet()); -// if (CollectionUtils.isEmpty(merchantIds)) { -// map.put("selectAll", false); -// return success(map); -// } -// -// // 查询店铺列 -// final List merchants = merchantService.list(new LambdaQueryWrapper() -// .select(Merchant::getMerchantId, Merchant::getMerchantName, Merchant::getImage, Merchant::getShopType, Merchant::getAddress) -// .in(Merchant::getMerchantId, merchantIds)); -// -// // 返回空列表 -// if (CollectionUtils.isEmpty(merchants)) { -// map.put("merchants", merchants); -// return success(map); -// } -// -// final Map> collect = carts.stream().collect(Collectors.groupingBy(Cart::getMerchantId)); -// -// // 封装数据 -// merchants.forEach(d -> { -// d.setCarts(collect.get(d.getMerchantId())); -// }); -// -// // 计算购物车金额 -// map.put("merchants", merchants); -// -// return success(map); -// } - - -// @ApiOperation("计算购物车金额") -// @GetMapping("/count") -// public HashMap computeCart(CartParam param) { -// final LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); -// -// queryWrapper.select(Cart::getId, Cart::getPrice, Cart::getCartNum) -// .eq(Cart::getUserId, getLoginUserId()) -// .eq(Cart::getType, param.getType()) -// .eq(Cart::getSelected, param.getSelected()) -// .eq(Cart::getIsPay, param.getIsPay()) -// .eq(Cart::getIsNew,param.getIsNew()) -// .eq(Cart::getId,param.getId()); -// -//// if (param.getId() != null) { -//// queryWrapper.eq(Cart::getId,param.getId()); -//// } -//// if(param.getIsNew() != null){ -//// queryWrapper.eq(Cart::getIsNew,param.getIsNew()); -//// } -// -// // 查询购物车数据 -// final List carts = cartService.list(queryWrapper); -// System.out.println("carts2 = " + carts); -// -// // 计算单品合计价格 -// carts.forEach(d -> { -// d.setTotalPrice(d.getPrice().multiply(BigDecimal.valueOf(d.getCartNum()))); -// }); -// -// // 保存到数据库 -// cartService.updateBatchById(carts); -// -// // 计算购物车金额 -// final Integer reduce = carts.stream().map(Cart::getCartNum).reduce(Integer::sum).orElse(0); -// final BigDecimal reduced = carts.stream().map(Cart::getTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add); -// -// // 是否全选 -// Boolean selectAll = cartService.count(new LambdaQueryWrapper() -// .eq(Cart::getUserId, getLoginUserId()) -// .eq(Cart::getSelected, 0) -// .eq(Cart::getIsPay, 0) -// ) == 0; -// -// -// // 返回给前端 -// final HashMap map = new HashMap<>(); -// map.put("totalCartNum", reduce); -// map.put("totalPrice", reduced); -// map.put("selectAll", selectAll); -// -// return map; -// } + @ApiOperation("减少数量") + @PutMapping("/subCartNum") + public ApiResult subCartNum(@RequestBody Cart cart) { + if (ObjectUtil.isEmpty(getLoginUser())) { + return success("请先登录",null); + } + cart.setCartNum(cart.getCartNum()-1); + cartService.updateById(cart); + return success("操作成功"); + } } diff --git a/src/main/java/com/gxwebsoft/shop/controller/CashierController.java b/src/main/java/com/gxwebsoft/shop/controller/CashierController.java new file mode 100644 index 0000000..47e4c06 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/controller/CashierController.java @@ -0,0 +1,227 @@ +package com.gxwebsoft.shop.controller; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.gxwebsoft.common.core.utils.CommonUtil; +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.common.system.entity.Role; +import com.gxwebsoft.shop.entity.Cart; +import com.gxwebsoft.shop.service.CashierService; +import com.gxwebsoft.shop.entity.Cashier; +import com.gxwebsoft.shop.param.CashierParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.system.entity.User; +import com.gxwebsoft.shop.vo.CashierVo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * 收银控制器 + * + * @author 科技小王子 + * @since 2024-08-04 11:51:43 + */ +@Api(tags = "收银管理") +@RestController +@RequestMapping("/api/shop/cashier") +public class CashierController extends BaseController { + @Resource + private CashierService cashierService; + + @ApiOperation("分页查询收银") + @GetMapping("/page") + public ApiResult> page(CashierParam param) { + // 使用关联查询 + return success(cashierService.pageRel(param)); + } + + @ApiOperation("查询全部收银") + @GetMapping() + public ApiResult list(CashierParam param) { + if (ObjectUtil.isEmpty(getLoginUser())) { + return success("请先登录",null); + } + // 附加收银员ID + param.setCashierId(getLoginUserId()); + // 收银员ID +// final Set collect = getLoginUser().getRoles().stream().map(Role::getRoleCode).collect(Collectors.toSet()); +// if (!collect.contains("merchantClerk")) { +// return fail("这个账户没有收银权限",null); +// } + return success(cashierService.listRel(param)); + } + + @ApiOperation("按groupId分组查询全部收银") + @GetMapping("/listByGroupId") + public ApiResult> listByGroupId(CashierParam param) { + if (ObjectUtil.isEmpty(getLoginUser())) { + return success("请先登录",null); + } + // 附加收银员ID + param.setCashierId(getLoginUserId()); + // 收银员ID + return success(cashierService.listRelByGroupId(param)); + } + + @PreAuthorize("hasAuthority('shop:cashier:list')") + @ApiOperation("根据id查询收银") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(cashierService.getByIdRel(id)); + } + + @ApiOperation("添加收银") + @PostMapping() + public ApiResult save(@RequestBody Cashier cashier) { + if (ObjectUtil.isEmpty(getLoginUser())) { + return success("请先登录",null); + } + cashier.setCashierId(getLoginUserId()); + // 修正购买数量 + if (ObjectUtil.isEmpty(cashier.getCartNum())) { + cashier.setCartNum(1); + } + // 超出最大限制 + if (cashierService.count(new LambdaUpdateWrapper().eq(Cashier::getCashierId,getLoginUserId())) > 50) { + return fail("购物车宝贝数量已满,建议您先去结算或清理~"); + } + // 重复商品叠加数量 + final Cashier one = cashierService.getOne(new LambdaQueryWrapper() + .eq(Cashier::getCashierId,getLoginUserId()) + .eq(Cashier::getGoodsId,cashier.getGoodsId()) + .eq(Cashier::getSpec,cashier.getSpec()) + .eq(Cashier::getGroupId,0) + .last("limit 1")); + + if(ObjectUtil.isNotEmpty(one)){ + return fail("请勿重复添加"); + } + if (cashierService.save(cashier)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("修改收银") + @PutMapping() + public ApiResult update(@RequestBody Cashier cashier) { + if (cashierService.updateById(cashier)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除收银") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (cashierService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加收银") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (cashierService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改收银") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(cashierService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除收银") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (cashierService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("增加数量") + @PutMapping("/addCartNum") + public ApiResult addCartNum(@RequestBody Cashier cashier) { + if (ObjectUtil.isEmpty(getLoginUser())) { + return success("请先登录",null); + } + cashier.setCartNum(cashier.getCartNum()+1); + cashierService.updateById(cashier); + return success("操作成功"); + } + + @ApiOperation("减少数量") + @PutMapping("/subCartNum") + public ApiResult subCartNum(@RequestBody Cashier cashier) { + if (ObjectUtil.isEmpty(getLoginUser())) { + return success("请先登录",null); + } + cashier.setCartNum(cashier.getCartNum()-1); + cashierService.updateById(cashier); + return success("操作成功"); + } + + @ApiOperation("清空") + @PutMapping("/cearCartNum") + public ApiResult removeCartNum(@RequestBody Cashier cashier) { + if (ObjectUtil.isEmpty(getLoginUser())) { + return success("请先登录",null); + } + cashier.setCartNum(cashier.getCartNum()-1); + cashierService.updateById(cashier); + return success("操作成功"); + } + + @ApiOperation("挂单") + @PutMapping("/packCashier") + public ApiResult packCashier() { + if (ObjectUtil.isEmpty(getLoginUser())) { + return success("请先登录",null); + } + final int groupId = Integer.parseInt(getLoginUserId().toString() + RandomUtil.randomInt(1, 100)); + final boolean update = cashierService.update(new LambdaUpdateWrapper().eq(Cashier::getGroupId, 0).eq(Cashier::getCashierId, getLoginUserId()).set(Cashier::getGroupId, groupId)); + + return success("操作成功",update); + } + + @ApiOperation("取单") + @PutMapping("/getByGroup/{id}") + public ApiResult getByGroup(@PathVariable("id") Integer id) { + if (cashierService.update(new LambdaUpdateWrapper().eq(Cashier::getGroupId,id).set(Cashier::getGroupId,0))) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("删除整单") + @DeleteMapping("/removeByGroup/{id}") + public ApiResult removeByGroup(@PathVariable("id") Integer id) { + if (cashierService.remove(new LambdaQueryWrapper().eq(Cashier::getGroupId,id))) { + return success("删除成功"); + } + return fail("删除失败"); + } +} diff --git a/src/main/java/com/gxwebsoft/shop/controller/GoodsCategoryController.java b/src/main/java/com/gxwebsoft/shop/controller/GoodsCategoryController.java index ef22b44..daf8d90 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/GoodsCategoryController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/GoodsCategoryController.java @@ -1,23 +1,21 @@ package com.gxwebsoft.shop.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import com.gxwebsoft.cms.entity.Navigation; import com.gxwebsoft.common.core.utils.JSONUtil; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.common.core.web.BatchParam; import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.system.entity.User; -import com.gxwebsoft.shop.entity.*; +import com.gxwebsoft.shop.entity.Goods; +import com.gxwebsoft.shop.entity.GoodsCategory; +import com.gxwebsoft.shop.entity.GoodsSpec; import com.gxwebsoft.shop.param.GoodsCategoryParam; -import com.gxwebsoft.shop.param.GoodsSpecParam; import com.gxwebsoft.shop.service.GoodsCategoryService; import com.gxwebsoft.shop.service.GoodsService; import com.gxwebsoft.shop.service.GoodsSpecService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.apache.poi.ss.formula.functions.T; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/gxwebsoft/shop/controller/GoodsController.java b/src/main/java/com/gxwebsoft/shop/controller/GoodsController.java index 137ddb2..dca535e 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/GoodsController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/GoodsController.java @@ -3,19 +3,16 @@ package com.gxwebsoft.shop.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.gxwebsoft.common.core.utils.JSONUtil; -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.shop.entity.GoodsSku; -import com.gxwebsoft.shop.entity.GoodsSkuVO; -import com.gxwebsoft.shop.entity.GoodsSpec; -import com.gxwebsoft.shop.service.GoodsService; -import com.gxwebsoft.shop.entity.Goods; -import com.gxwebsoft.shop.param.GoodsParam; import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.system.entity.User; +import com.gxwebsoft.shop.entity.Goods; +import com.gxwebsoft.shop.entity.GoodsSku; +import com.gxwebsoft.shop.entity.GoodsSpec; +import com.gxwebsoft.shop.param.GoodsParam; +import com.gxwebsoft.shop.service.GoodsService; import com.gxwebsoft.shop.service.GoodsSkuService; import com.gxwebsoft.shop.service.GoodsSpecService; import io.swagger.annotations.Api; @@ -80,6 +77,7 @@ public class GoodsController extends BaseController { @GetMapping("/page") public ApiResult> page(GoodsParam param) { // 使用关联查询 + System.out.println("param = " + param); return success(goodsService.pageRel(param)); } diff --git a/src/main/java/com/gxwebsoft/shop/controller/OrderController.java b/src/main/java/com/gxwebsoft/shop/controller/OrderController.java index ce8640c..fb8dbac 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/OrderController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/OrderController.java @@ -4,6 +4,7 @@ import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; @@ -154,19 +155,22 @@ public class OrderController extends BaseController { @PostMapping() public ApiResult save(@RequestBody Order order, HttpServletRequest request) { String access_token = JwtUtil.getAccessToken(request); - // 记录当前登录用户id User loginUser = getLoginUser(); - if (loginUser == null) { + + if (ObjectUtil.isEmpty(loginUser)) { return fail("请先登录"); } + // 微信openid(必填) - if (StrUtil.isBlank(loginUser.getOpenid())) { + if (order.getType().equals(1) && StrUtil.isBlank(loginUser.getOpenid())) { return fail("微信openid(必填)"); } + // 商品描述(必填) if (StrUtil.isBlank(order.getComments())) { return fail("商品描述(必填)"); } + // 判断场地是否被抢占 if (order.getType().equals(1)) { order.getOrderInfo().forEach(d -> { @@ -181,11 +185,11 @@ public class OrderController extends BaseController { } } // 微信支付(商品金额不能为0) -// if (order.getPayType().equals(1)) { -// if (order.getTotalPrice().compareTo(BigDecimal.ZERO) == 0) { -// return fail("商品金额不能为0"); -// } -// } + if (order.getPayType().equals(1)) { + if (order.getTotalPrice().compareTo(BigDecimal.ZERO) == 0) { + return fail("商品金额不能为0"); + } + } // 已下过订单 if(order.getOrderId() != null){ diff --git a/src/main/java/com/gxwebsoft/shop/entity/Cashier.java b/src/main/java/com/gxwebsoft/shop/entity/Cashier.java new file mode 100644 index 0000000..bd09b65 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/entity/Cashier.java @@ -0,0 +1,97 @@ +package com.gxwebsoft.shop.entity; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.TableField; +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 java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 收银 + * + * @author 科技小王子 + * @since 2024-08-04 11:51:43 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "Cashier对象", description = "收银") +@TableName("shop_cashier") +public class Cashier implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "收银单ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "类型 0商城 1外卖") + private Integer type; + + @ApiModelProperty(value = "唯一标识") + private String code; + + @ApiModelProperty(value = "商品ID") + private Integer goodsId; + + @ApiModelProperty(value = "商品规格") + private String spec; + + @ApiModelProperty(value = "商品价格") + private BigDecimal price; + + @ApiModelProperty(value = "商品数量") + private Integer cartNum; + + @ApiModelProperty(value = "单商品合计") + private BigDecimal totalPrice; + + @ApiModelProperty(value = "0 = 未购买 1 = 已购买") + private Boolean isPay; + + @ApiModelProperty(value = "是否为立即购买") + private Boolean isNew; + + @ApiModelProperty(value = "是否选中") + private Boolean selected; + + @ApiModelProperty(value = "商户ID") + private Integer merchantId; + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "收银员ID") + private Integer cashierId; + + @ApiModelProperty(value = "收银单分组ID") + private Integer groupId; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "租户id") + private Integer tenantId; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "商品名称") + @TableField(exist = false) + private String goodsName; + + @ApiModelProperty(value = "商品图片") + @TableField(exist = false) + private String image; + +} diff --git a/src/main/java/com/gxwebsoft/shop/mapper/CashierMapper.java b/src/main/java/com/gxwebsoft/shop/mapper/CashierMapper.java new file mode 100644 index 0000000..fb0e6e4 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/CashierMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.shop.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.shop.entity.Cashier; +import com.gxwebsoft.shop.param.CashierParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 收银Mapper + * + * @author 科技小王子 + * @since 2024-08-04 11:51:43 + */ +public interface CashierMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") CashierParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") CashierParam param); + +} diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/CartMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/CartMapper.xml index 011ac18..4feae08 100644 --- a/src/main/java/com/gxwebsoft/shop/mapper/xml/CartMapper.xml +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/CartMapper.xml @@ -42,6 +42,9 @@ AND a.user_id LIKE CONCAT('%', #{param.userId}, '%') + + AND a.admin_id LIKE CONCAT('%', #{param.adminId}, '%') + AND a.selected = #{param.selected} diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/CashierMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/CashierMapper.xml new file mode 100644 index 0000000..e68d541 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/CashierMapper.xml @@ -0,0 +1,81 @@ + + + + + + + SELECT a.*,b.goods_name,b.image,c.merchant_name,c.address + FROM shop_cashier a + LEFT JOIN shop_goods b ON a.goods_id = b.goods_id + LEFT JOIN shop_merchant c ON a.merchant_id = c.merchant_id + + + AND a.id = #{param.id} + + + AND a.type = #{param.type} + + + AND a.code LIKE CONCAT('%', #{param.code}, '%') + + + AND a.goods_id LIKE CONCAT('%', #{param.goodsId}, '%') + + + AND a.spec LIKE CONCAT('%', #{param.spec}, '%') + + + AND a.price = #{param.price} + + + AND a.cart_num = #{param.cartNum} + + + AND a.total_price = #{param.totalPrice} + + + AND a.is_pay = #{param.isPay} + + + AND a.is_new = #{param.isNew} + + + AND a.selected = #{param.selected} + + + AND a.merchant_id LIKE CONCAT('%', #{param.merchantId}, '%') + + + AND a.user_id LIKE CONCAT('%', #{param.userId}, '%') + + + AND a.cashier_id LIKE CONCAT('%', #{param.cashierId}, '%') + + + AND a.group_id LIKE CONCAT('%', #{param.groupId}, '%') + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND (c.merchant_name LIKE CONCAT('%', #{param.keywords}, '%') + OR b.goods_name LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsMapper.xml index 32873fe..1f77d76 100644 --- a/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsMapper.xml +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsMapper.xml @@ -100,12 +100,12 @@ AND a.create_time <= #{param.createTimeEnd} - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - OR a.goods_name = #{param.keywords} - OR a.code = #{param.keywords} - ) - + + + + + + diff --git a/src/main/java/com/gxwebsoft/shop/param/CashierParam.java b/src/main/java/com/gxwebsoft/shop/param/CashierParam.java new file mode 100644 index 0000000..0d5fc3c --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/param/CashierParam.java @@ -0,0 +1,85 @@ +package com.gxwebsoft.shop.param; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 收银查询参数 + * + * @author 科技小王子 + * @since 2024-08-04 11:51:43 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(value = "CashierParam对象", description = "收银查询参数") +public class CashierParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "收银单ID") + @QueryField(type = QueryType.EQ) + private Integer id; + + @ApiModelProperty(value = "类型 0商城 1外卖") + @QueryField(type = QueryType.EQ) + private Integer type; + + @ApiModelProperty(value = "唯一标识") + private String code; + + @ApiModelProperty(value = "商品ID") + private Integer goodsId; + + @ApiModelProperty(value = "商品规格") + private String spec; + + @ApiModelProperty(value = "商品价格") + @QueryField(type = QueryType.EQ) + private BigDecimal price; + + @ApiModelProperty(value = "商品数量") + @QueryField(type = QueryType.EQ) + private Integer cartNum; + + @ApiModelProperty(value = "单商品合计") + @QueryField(type = QueryType.EQ) + private BigDecimal totalPrice; + + @ApiModelProperty(value = "0 = 未购买 1 = 已购买") + @QueryField(type = QueryType.EQ) + private Boolean isPay; + + @ApiModelProperty(value = "是否为立即购买") + @QueryField(type = QueryType.EQ) + private Boolean isNew; + + @ApiModelProperty(value = "是否选中") + @QueryField(type = QueryType.EQ) + private Boolean selected; + + @ApiModelProperty(value = "商户ID") + private Integer merchantId; + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "收银员ID") + private Integer cashierId; + + @ApiModelProperty(value = "收银单分组ID") + private Integer groupId; + + @ApiModelProperty(value = "按groupId分组") + @TableField(exist = false) + private Boolean showByGroup; + +} diff --git a/src/main/java/com/gxwebsoft/shop/param/GoodsParam.java b/src/main/java/com/gxwebsoft/shop/param/GoodsParam.java index 81c44d6..e2c47c8 100644 --- a/src/main/java/com/gxwebsoft/shop/param/GoodsParam.java +++ b/src/main/java/com/gxwebsoft/shop/param/GoodsParam.java @@ -123,7 +123,6 @@ public class GoodsParam extends BaseParam { @QueryField(type = QueryType.EQ) private Integer deleted; - @ApiModelProperty(value = "父级分类ID") @TableField(exist = false) private Integer parentId; diff --git a/src/main/java/com/gxwebsoft/shop/service/CashierService.java b/src/main/java/com/gxwebsoft/shop/service/CashierService.java new file mode 100644 index 0000000..cf8bba3 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/CashierService.java @@ -0,0 +1,44 @@ +package com.gxwebsoft.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.entity.Cashier; +import com.gxwebsoft.shop.param.CashierParam; +import com.gxwebsoft.shop.vo.CashierVo; + +import java.util.List; + +/** + * 收银Service + * + * @author 科技小王子 + * @since 2024-08-04 11:51:43 + */ +public interface CashierService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(CashierParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + CashierVo listRel(CashierParam param); + + /** + * 根据id查询 + * + * @param id 收银单ID + * @return Cashier + */ + Cashier getByIdRel(Integer id); + + List listRelByGroupId(CashierParam param); +} diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/CartServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/CartServiceImpl.java index 798c35f..de885cf 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/CartServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/CartServiceImpl.java @@ -73,6 +73,7 @@ public class CartServiceImpl extends ServiceImpl implements Ca final Cart cart = collectCart.get(shopId).get(0); shopVo.setShopName(cart.getMerchantName()); shopVo.setShopLogo(cart.getImage()); + shopVo.setAddress(cart.getAddress()); } shops.add(shopVo); } diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/CashierServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/CashierServiceImpl.java new file mode 100644 index 0000000..ad52bcb --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/impl/CashierServiceImpl.java @@ -0,0 +1,119 @@ +package com.gxwebsoft.shop.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.shop.entity.Cart; +import com.gxwebsoft.shop.mapper.CashierMapper; +import com.gxwebsoft.shop.service.CashierService; +import com.gxwebsoft.shop.entity.Cashier; +import com.gxwebsoft.shop.param.CashierParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.vo.CartVo; +import com.gxwebsoft.shop.vo.CashierVo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 收银Service实现 + * + * @author 科技小王子 + * @since 2024-08-04 11:51:43 + */ +@Service +public class CashierServiceImpl extends ServiceImpl implements CashierService { + + @Override + public PageResult pageRel(CashierParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("create_time desc"); + List list = baseMapper.selectPageRel(page, param); + return new PageResult<>(list, page.getTotal()); + } + + @Override + @Transactional(rollbackFor = {Exception.class}) + public CashierVo listRel(CashierParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("create_time desc"); + + final List cashiers = page.sortRecords(list); + + // 整理数据 + final CashierVo vo = new CashierVo(); + // 计算单品总价 + for (Cashier cashier : cashiers) { + cashier.setTotalPrice(cashier.getPrice().multiply(BigDecimal.valueOf(cashier.getCartNum()))); + } + // 计算购物车金额 + final Integer cartNum = cashiers.stream().map(Cashier::getCartNum).reduce(Integer::sum).orElse(0); + final Integer selectNums = cashiers.stream().filter(d -> d.getSelected().equals(true)).map(Cashier::getCartNum).reduce(Integer::sum).orElse(0); + final BigDecimal totalPrice = cashiers.stream().filter(d -> d.getSelected().equals(true)).map(Cashier::getTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + + // 封装数据 + vo.setCashiers(cashiers); + vo.setTotalPrice(totalPrice); + vo.setTotalNums(Long.valueOf(cartNum)); + vo.setSelectNums(Long.valueOf(selectNums)); + + return vo; + } + + + @Override + @Transactional(rollbackFor = {Exception.class}) + public List listRelByGroupId(CashierParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("create_time desc"); + final List cashiers = page.sortRecords(list); + + // 计算单品总价 + cashiers.forEach(d->{ + d.setTotalPrice(d.getPrice().multiply(BigDecimal.valueOf(d.getCartNum()))); + }); + + final Map> collectByGroupId = cashiers.stream().collect(Collectors.groupingBy(Cashier::getGroupId)); + + // 整理数据 + final ArrayList cashierVos = new ArrayList<>(); + for (Integer groupId : collectByGroupId.keySet()) { + final CashierVo vo = new CashierVo(); + final List cashierList = collectByGroupId.get(groupId); + for (Cashier cashier : cashierList) { + if (cashier.getGroupId().equals(groupId)) { + // 计算购物车金额 + final Integer cartNum = cashierList.stream().map(Cashier::getCartNum).reduce(Integer::sum).orElse(0); + final Integer selectNums = cashierList.stream().filter(d -> d.getSelected().equals(true)).map(Cashier::getCartNum).reduce(Integer::sum).orElse(0); + final BigDecimal totalPrice = cashierList.stream().filter(d -> d.getSelected().equals(true)).map(Cashier::getTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + vo.setGroupId(Long.valueOf(groupId)); + vo.setCashiers(cashierList); + vo.setTotalPrice(totalPrice); + vo.setTotalNums(Long.valueOf(cartNum)); + vo.setSelectNums(Long.valueOf(selectNums)); + vo.setComments("订单备注:"); + } + } + cashierVos.add(vo); + } + return cashierVos; + } + + @Override + public Cashier getByIdRel(Integer id) { + CashierParam param = new CashierParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + +} diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/GoodsServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/GoodsServiceImpl.java index 4a465c3..1565406 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/GoodsServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/GoodsServiceImpl.java @@ -43,6 +43,7 @@ public class GoodsServiceImpl extends ServiceImpl implements PageParam page = new PageParam<>(param); page.setDefaultOrder("sort_number asc, create_time desc"); List list = baseMapper.selectPageRel(page, param); + System.out.println("list = " + list); final Set goodsIds = list.stream().map(Goods::getGoodsId).collect(Collectors.toSet()); if (!CollectionUtils.isEmpty(goodsIds)) { final List specs = goodsSpecService.list(new LambdaQueryWrapper().in(GoodsSpec::getGoodsId, goodsIds)); diff --git a/src/main/java/com/gxwebsoft/shop/vo/CartShopVo.java b/src/main/java/com/gxwebsoft/shop/vo/CartShopVo.java index 70f969b..305131f 100644 --- a/src/main/java/com/gxwebsoft/shop/vo/CartShopVo.java +++ b/src/main/java/com/gxwebsoft/shop/vo/CartShopVo.java @@ -27,12 +27,17 @@ public class CartShopVo implements Serializable { @ApiModelProperty(value = "店铺图标") private String shopLogo; + @ApiModelProperty(value = "门店地址") + private String address; + @ApiModelProperty(value = "商品列表") private List carts; @Data public static class Payload { private Integer shopId; - private Integer shopName; + private String shopName; + private String shopLogo; + private String address; private List carts; } } diff --git a/src/main/java/com/gxwebsoft/shop/vo/CashierVo.java b/src/main/java/com/gxwebsoft/shop/vo/CashierVo.java new file mode 100644 index 0000000..43d939a --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/vo/CashierVo.java @@ -0,0 +1,49 @@ +package com.gxwebsoft.shop.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.gxwebsoft.shop.entity.Cashier; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.models.auth.In; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "Cart对象", description = "购物车") +@TableName("shop_cart") +public class CashierVo implements Serializable { + + @ApiModelProperty(value = "购物车总金额") + private BigDecimal totalPrice; + + @ApiModelProperty(value = "宝贝数量") + private Long totalNums; + + @ApiModelProperty(value = "已选中宝贝") + private Long selectNums; + + @ApiModelProperty(value = "收银商品列表") + private List cashiers; + + @ApiModelProperty(value = "分组ID") + private Long groupId; + + @ApiModelProperty(value = "订单备注") + private String comments; + + @Data + public static class Payload { + private BigDecimal totalPrice; + private Long totalNums; + private Long selectNums; + private List cashiers; + private Long groupId; + } +} diff --git a/src/test/java/com/gxwebsoft/generator/ShopGenerator.java b/src/test/java/com/gxwebsoft/generator/ShopGenerator.java index 3ae38de..765419d 100644 --- a/src/test/java/com/gxwebsoft/generator/ShopGenerator.java +++ b/src/test/java/com/gxwebsoft/generator/ShopGenerator.java @@ -87,7 +87,8 @@ public class ShopGenerator { // "shop_dealer_user", // "shop_dealer_withdraw" // "shop_cart" - "shop_count" +// "shop_count" + "shop_cashier" }; // 需要去除的表前缀 private static final String[] TABLE_PREFIX = new String[]{