Browse Source

对接拼团数据

master
wangfukang 4 weeks ago
parent
commit
d37e6a6f9b
  1. 5
      hiver-core/src/main/java/cc/hiver/core/entity/User.java
  2. 4
      hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/AuthController.java
  3. 2
      hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java
  4. 101
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java
  5. 14
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java
  6. 32
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductCategoryController.java
  7. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/ShopDao.java
  8. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java
  9. 5
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGroupMapper.java
  10. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallDeliveryOrder.java
  11. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java
  12. 8
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrderGroup.java
  13. 9
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/CreateOrderDTO.java
  14. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallDeliveryOrderPageQuery.java
  15. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductPageVO.java
  16. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/ShopService.java
  17. 7
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java
  18. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderGroupService.java
  19. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ShopServiceImpl.java
  20. 101
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java
  21. 21
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java
  22. 44
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
  23. 58
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/MerchantOrderSeqUtil.java
  24. 24
      hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml
  25. 24
      hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderGroupMapper.xml
  26. 6
      hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml

5
hiver-core/src/main/java/cc/hiver/core/entity/User.java

@ -126,11 +126,6 @@ public class User extends HiverBaseEntity {
@ApiModelProperty(value = "入库员标识:0:不是(数据库默认);1:是;")
private String warehouseKeeperFlag;
@Transient
@ApiModelProperty(value = "店铺id")
private String shopId;
@ApiModelProperty(value = "小程序id")
private String miniProgramOpenid;

4
hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/AuthController.java

@ -502,8 +502,8 @@ public class AuthController {
customer.setUserName("sanke");
customer.setShopId(shop.getId());
customerService.addCustomer(customer);*/
byMobileAndType.setShopId(shop.getId());
return ResultUtil.data(byMobileAndType);
List<Shop> shops = shopService.getShopByUserid(byMobileAndType.getId());
return ResultUtil.data(shops);
}
@RequestMapping(value = "/chooseShop", method = RequestMethod.POST)

2
hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java

@ -666,7 +666,7 @@ public class UserController {
// 返回当前登录人的信息
resultMap.put("user", wechatUser);
Shop shop = shopService.getShopByUserid(wechatUser.getId());
List<Shop> shop = shopService.getShopByUserid(wechatUser.getId());
if(shop != null){
resultMap.put("shop", shop);
}

101
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java

@ -1,10 +1,16 @@
package cc.hiver.mall.controller;
import cc.hiver.core.common.constant.CommonConstant;
import cc.hiver.core.common.utils.ResultUtil;
import cc.hiver.core.common.utils.SecurityUtil;
import cc.hiver.core.common.vo.Result;
import cc.hiver.core.entity.User;
import cc.hiver.core.entity.Worker;
import cc.hiver.core.service.WorkerService;
import cc.hiver.mall.entity.MallDeliveryOrder;
import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery;
import cc.hiver.mall.service.mybatis.MallDeliveryOrderService;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -12,6 +18,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
/**
* 配送订单接口
*/
@ -24,6 +32,11 @@ public class MallDeliveryOrderController {
@Autowired
private MallDeliveryOrderService mallDeliveryOrderService;
@Autowired
private SecurityUtil securityUtil;
@Autowired
private WorkerService workerService;
/**
* 分页查询配送单
* hallOnly=true 时查询抢单大厅未被接单的单
@ -31,7 +44,14 @@ public class MallDeliveryOrderController {
@PostMapping("/page")
@ApiOperation(value = "分页查询配送单", notes = "hallOnly=true 查询抢单大厅")
public Result<Object> page(@RequestBody MallDeliveryOrderPageQuery q) {
if (Boolean.TRUE.equals(q.getHallOnly())) {
if (q.getDeliveryType() == 4 && StrUtil.isNotBlank(q.getWorkerId())) {
//先查当前用户指派单未确认接单数量
q.setHallOnly(false);
q.setGetAreaId(null);
q.setPutAreaId(null);
q.setPageSize(100);
//随便给个值,指派单不区分类型
q.setDeliveryType(null);
IPage<MallDeliveryOrder> page = mallDeliveryOrderService.pageDelivery(q);
java.util.Map<String, Object> result = new java.util.HashMap<>();
result.put("records", page.getRecords());
@ -39,9 +59,44 @@ public class MallDeliveryOrderController {
result.put("size", page.getSize());
result.put("current", page.getCurrent());
result.put("pages", page.getPages());
result.put("waimaiCount", mallDeliveryOrderService.countWaitGrabOrders(1));
result.put("kuaidiCount", mallDeliveryOrderService.countWaitGrabOrders(2));
//外卖、快递、跑腿待接数
result.put("orderCount", mallDeliveryOrderService.countOrdersByType(q.getRegionId()));
return new ResultUtil<Object>().setData(result);
}else{
if (Boolean.TRUE.equals(q.getHallOnly())) {
java.util.Map<String, Object> result = new java.util.HashMap<>();
Integer deliveryType = q.getDeliveryType();
String getAreaId = q.getGetAreaId();
String putAreaId = q.getPutAreaId();
if(StrUtil.isNotBlank(q.getWorkerId())){
//先查当前用户指派单未确认接单数量
q.setHallOnly(false);
q.setGetAreaId(null);
q.setPutAreaId(null);
//随便给个值,指派单不区分类型
q.setDeliveryType(null);
//随便给个值,指派单不区分类型
q.setPageSize(100);
IPage<MallDeliveryOrder> page = mallDeliveryOrderService.pageDelivery(q);
result.put("zhipaiCount", page.getTotal());
}
//其他类型外卖、快递、跑腿待接数据
q.setHallOnly(true);
q.setGetAreaId(getAreaId);
q.setPutAreaId(putAreaId);
q.setDeliveryType(deliveryType);
q.setWorkerId(null);
IPage<MallDeliveryOrder> page1 = mallDeliveryOrderService.pageDelivery(q);
result.put("records", page1.getRecords());
result.put("total", page1.getTotal());
result.put("size", page1.getSize());
result.put("current", page1.getCurrent());
result.put("pages", page1.getPages());
//外卖、快递、跑腿待接数
result.put("orderCount", mallDeliveryOrderService.countOrdersByType(q.getRegionId()));
return new ResultUtil<Object>().setData(result);
}
}
return new ResultUtil<Object>().setData(mallDeliveryOrderService.pageDelivery(q));
}
@ -52,10 +107,44 @@ public class MallDeliveryOrderController {
@PostMapping("/accept")
@ApiOperation(value = "配送员接单", notes = "抢单大厅单或指派单均通过此接口接单")
public Result accept(@RequestParam String deliveryId,
@RequestParam String workerId) {
@RequestParam String workerId,@RequestParam String regionId,@RequestParam String groupId) {
try {
mallDeliveryOrderService.workerAccept(deliveryId, workerId);
return ResultUtil.success("接单成功");
if(StrUtil.isBlank(workerId)){
//当前人没有注册兼职,先赋予兼职身份
final User user = securityUtil.getCurrUser();
Worker worker = new Worker();
if(worker == null){
worker.setWorkerName(user.getNickname());
worker.setUserId(user.getId());
worker.setAvgTime(BigDecimal.valueOf(30));
worker.setMobile(user.getMobile());
worker.setRegion(regionId);
worker.setIsOnLine(CommonConstant.ON_LINE);
worker.setScore(BigDecimal.valueOf(5));
workerService.save(worker);
}
Integer result = mallDeliveryOrderService.workerAccept(deliveryId, workerId,groupId);
if(result == 0){
return ResultUtil.success("配送单不存在");
}else if (result == 1){
return ResultUtil.success("配送单已被接取或已取消");
}else if(result == 2){
return ResultUtil.success("该单已指定其他配送员,无法抢单");
}else{
return ResultUtil.success("接单成功");
}
}else{
Integer result = mallDeliveryOrderService.workerAccept(deliveryId, workerId,groupId);
if(result == 0){
return ResultUtil.success("配送单不存在");
}else if (result == 1){
return ResultUtil.success("配送单已被接取或已取消");
}else if(result == 2){
return ResultUtil.success("该单已指定其他配送员,无法抢单");
}else{
return ResultUtil.success("接单成功");
}
}
} catch (Exception e) {
log.error("配送员接单失败: {}", e.getMessage(), e);
return ResultUtil.error(e.getMessage());

14
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java

@ -3,9 +3,11 @@ package cc.hiver.mall.controller;
import cc.hiver.core.common.utils.ResultUtil;
import cc.hiver.core.common.vo.Result;
import cc.hiver.mall.entity.MallOrder;
import cc.hiver.mall.entity.MallOrderGroup;
import cc.hiver.mall.pojo.dto.CreateOrderDTO;
import cc.hiver.mall.pojo.query.MallOrderPageQuery;
import cc.hiver.mall.pojo.vo.MallOrderVO;
import cc.hiver.mall.service.mybatis.MallOrderGroupService;
import cc.hiver.mall.service.mybatis.MallOrderService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
@ -16,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
/**
* 订单接口
@ -29,6 +32,8 @@ public class MallOrderController {
@Autowired
private MallOrderService mallOrderService;
@Autowired
private MallOrderGroupService mallOrderGroupService;
/**
* 下单普通购买 / 发起拼团 / 参团
*/
@ -53,6 +58,15 @@ public class MallOrderController {
return new ResultUtil<IPage<MallOrderVO>>().setData(mallOrderService.pageOrder(q));
}
/**
* 根据店铺id查询待成团订单
*/
@PostMapping("/getMallOrderGroupByShopId")
@ApiOperation(value = "根据店铺id查询待成团订单")
public Result<List<MallOrderGroup>> getMallOrderGroupByShopId(@RequestBody MallOrderGroup group) {
return new ResultUtil<List<MallOrderGroup>>().setData(mallOrderGroupService.selectMallGroup(group));
}
/**
* 根据拼团id查询团长订单配送费信息

32
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductCategoryController.java

@ -47,15 +47,15 @@ public class ProductCategoryController {
@ApiOperation(value = "新增货品类别")
public Result save(ProductCategory productCategory) {
// shopId从缓存中设置
final String shopId = securityUtil.getShopId();
productCategory.setShopId(shopId);
boolean result = productCategoryService.save(productCategory);
if (result) {
productCategoryService.refreshProductCategoryCache(shopId, productCategory.getId());
return ResultUtil.success("添加成功");
if (StringUtils.isEmpty(productCategory.getShopId())) {
final String shopId = securityUtil.getShopId();
productCategory.setShopId(shopId);
} else {
return ResultUtil.error("添加失败");
productCategory.setShopId(productCategory.getShopId());
}
productCategoryService.save(productCategory);
productCategoryService.refreshProductCategoryCache(productCategory.getShopId(), productCategory.getId());
return ResultUtil.success("添加成功");
}
@RequestMapping(value = "/edit", method = RequestMethod.POST)
@ -68,13 +68,9 @@ public class ProductCategoryController {
} else {
productCategory.setShopId(productCategory.getShopId());
}
boolean result = productCategoryService.updateById(productCategory);
if (result) {
productCategoryService.refreshProductCategoryCache(productCategory.getShopId(), productCategory.getId());
return ResultUtil.success("修改成功");
} else {
return ResultUtil.error("修改失败");
}
productCategoryService.updateById(productCategory);
productCategoryService.refreshProductCategoryCache(productCategory.getShopId(), productCategory.getId());
return ResultUtil.success("修改成功");
}
@RequestMapping(value = "/delById", method = RequestMethod.POST)
@ -87,12 +83,8 @@ public class ProductCategoryController {
boolean result = productCategoryService.removeById(productCategory.getId());
// 将该分类下的商品id删除掉
productService.deleteProductByCategoryId(productCategory.getId());
if (result) {
productCategoryService.removeProductCategoryCache(old.getShopId(), old.getId());
return ResultUtil.success("删除成功");
} else {
return ResultUtil.error("删除失败");
}
productCategoryService.removeProductCategoryCache(old.getShopId(), old.getId());
return ResultUtil.success("删除成功");
}
@RequestMapping(value = "/list", method = RequestMethod.GET)

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/ShopDao.java

@ -58,7 +58,7 @@ public interface ShopDao extends HiverBaseDao<Shop, String> {
* @param userId
*/
@Query(value = "select * from t_shop where shop_owner_id = ?",nativeQuery = true)
Shop getShopByUserid(String userId);
List<Shop> getShopByUserid(String userId);
@Query(value = "select * from t_shop where id in (select shop_id from t_customer where user_id = ?)",nativeQuery = true)
List<Shop> getAllShopByCustomer(String userId);

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
@ -24,4 +25,6 @@ public interface MallDeliveryOrderMapper extends BaseMapper<MallDeliveryOrder> {
* 统计配送员当前活跃单量待取货+配送中
*/
Map<String, Integer> countActiveOrdersByWorker(@Param("workerId") String workerId);
List<Map<Integer, Integer>> countOrdersByType(@Param("regionId") String regionId);
}

5
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderGroupMapper.java

@ -2,11 +2,16 @@ package cc.hiver.mall.dao.mapper;
import cc.hiver.mall.entity.MallOrderGroup;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 拼团主表 Mapper 接口
*/
@Repository
public interface MallOrderGroupMapper extends BaseMapper<MallOrderGroup> {
List<MallOrderGroup> selectMallGroup(@Param("group") MallOrderGroup group);
}

6
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallDeliveryOrder.java

@ -54,6 +54,10 @@ public class MallDeliveryOrder implements Serializable {
private String shopPhone;
@ApiModelProperty(value = "商家地址(快照)")
private String shopAddress;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "学校id")
private String regionId;
@ApiModelProperty(value = "加入大厅或指派时间")
private Date createTime;
@ApiModelProperty(value = "接单时间")
@ -66,4 +70,6 @@ public class MallDeliveryOrder implements Serializable {
private Date finishTime;
@ApiModelProperty(value = "订单类型 1:外卖 2:快递 3 跑腿")
private Integer deliveryType;
@ApiModelProperty(value = "商家-订单序号")
private String numberCode;
}

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java

@ -35,6 +35,8 @@ public class MallOrder implements Serializable {
private Integer deliveryType;
@ApiModelProperty(value = "订单状态 0:待支付 1:待商家接单 01:待成团 2待配送员接单 3:待取货(配送)/待消费(自取) 4:配送中 5:已完成 6:已取消 7:待商家同意退款 8:已退款")
private Integer status;
@ApiModelProperty(value = "商家-订单序号")
private String numberCode;
@ApiModelProperty(value = "订单总金额(包含运费打包费等)")
private BigDecimal totalAmount;
@ApiModelProperty(value = "商品总金额")
@ -67,4 +69,6 @@ public class MallOrder implements Serializable {
private Date createTime;
@ApiModelProperty(value = "支付时间")
private Date payTime;
@ApiModelProperty(value = "学校id")
private String regionId;
}

8
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrderGroup.java

@ -35,6 +35,8 @@ public class MallOrderGroup implements Serializable {
private Integer targetMembers;
@ApiModelProperty(value = "当前参团人数")
private Integer currentMembers;
@ApiModelProperty(value = "0不是 1是面对面拼团")
private Integer isFace;
@ApiModelProperty(value = "拼团状态 0:拼团中 1:拼团成功 2:拼团失败 3:面对面团(不公开)")
private Integer status;
@ApiModelProperty(value = "拼团价格")
@ -49,4 +51,10 @@ public class MallOrderGroup implements Serializable {
private Date createTime;
@ApiModelProperty(value = "过期时间")
private Date expireTime;
@ApiModelProperty(value = "拼团商品名称")
private String productName;
@ApiModelProperty(value = "拼团商品图片")
private String productPicture;
@ApiModelProperty(value = "拼团商品id")
private String productId;
}

9
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/CreateOrderDTO.java

@ -21,6 +21,9 @@ public class CreateOrderDTO {
@ApiModelProperty(value = "店铺ID", required = true)
private String shopId;
@ApiModelProperty(value = "学校ID", required = true)
private String regionId;
@ApiModelProperty(value = "商品列表", required = true)
private List<OrderItemDTO> items;
@ -61,12 +64,18 @@ public class CreateOrderDTO {
public static class OrderItemDTO {
@ApiModelProperty(value = "商品ID", required = true)
private String productId;
@ApiModelProperty(value = "商品名称", required = false)
private String productName;
@ApiModelProperty(value = "商品图片", required = false)
private String productPicture;
@ApiModelProperty(value = "商品规格JSON,格式:{\"specPrice\":\"11\",\"specNum\":9999}", required = true)
private String specs;
@ApiModelProperty(value = "下单价格(以此为准,由前端传入规格对应价格)", required = true)
private BigDecimal price;
@ApiModelProperty(value = "购买数量", required = true)
private Integer quantity;
@ApiModelProperty(value = "是否是拼团商品", required = false)
private Integer isMain;
}
@Data

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallDeliveryOrderPageQuery.java

@ -36,6 +36,9 @@ public class MallDeliveryOrderPageQuery extends HiverBasePageQuery {
@ApiModelProperty("是否只查询抢单大厅(workerId为空的)")
private Boolean hallOnly;
@ApiModelProperty(value = "学校id")
private String regionId;
@ApiModelProperty("订单类型 1:外卖 2:快递")
private Integer deliveryType;

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductPageVO.java

@ -98,7 +98,7 @@ public class ProductPageVO {
private BigDecimal commission;
@ApiModelProperty(value = "创建人")
private BigDecimal createBy;
private String createBy;
@ApiModelProperty(value = "货品图片")
private String productPicture;

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/ShopService.java

@ -57,7 +57,7 @@ public interface ShopService extends HiverBaseService<Shop, String> {
*/
void updateShopAreaTitle(String shopArea, String shopAreaTitle);
Shop getShopByUserid(String userId);
List<Shop> getShopByUserid(String userId);
/**
* 根据用户id获取店铺信息

7
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java

@ -5,6 +5,9 @@ import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
* 配送订单 Service 接口
*/
@ -18,7 +21,7 @@ public interface MallDeliveryOrderService extends IService<MallDeliveryOrder> {
/**
* 配送员接单抢单大厅或指派单
*/
void workerAccept(String deliveryId, String workerId);
Integer workerAccept(String deliveryId, String workerId,String groupId);
/**
* 配送员取货
@ -40,4 +43,6 @@ public interface MallDeliveryOrderService extends IService<MallDeliveryOrder> {
* @param deliveryType 1:外卖 2:快递
*/
long countWaitGrabOrders(int deliveryType);
List<Map<Integer, Integer>> countOrdersByType(String regionId);
}

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderGroupService.java

@ -3,6 +3,8 @@ package cc.hiver.mall.service.mybatis;
import cc.hiver.mall.entity.MallOrderGroup;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 拼团主表 Service 接口
*/
@ -17,4 +19,6 @@ public interface MallOrderGroupService extends IService<MallOrderGroup> {
* 拼团过期处理发起退款所有子订单设为已取消
*/
void expireGroup(String groupId);
List<MallOrderGroup> selectMallGroup(MallOrderGroup group);
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ShopServiceImpl.java

@ -168,7 +168,7 @@ public class ShopServiceImpl implements ShopService {
}
@Override
public Shop getShopByUserid(String userId) {
public List<Shop> getShopByUserid(String userId) {
return shopDao.getShopByUserid(userId);
}

101
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java

@ -1,11 +1,15 @@
package cc.hiver.mall.serviceimpl.mybatis;
import cc.hiver.mall.dao.mapper.MallDeliveryOrderMapper;
import cc.hiver.mall.dao.mapper.MallOrderGroupMapper;
import cc.hiver.mall.entity.MallDeliveryOrder;
import cc.hiver.mall.entity.MallOrder;
import cc.hiver.mall.entity.MallOrderGroup;
import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery;
import cc.hiver.mall.service.mybatis.MallDeliveryOrderService;
import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.utils.MerchantOrderSeqUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -19,7 +23,10 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 配送订单 Service 实现
@ -45,13 +52,28 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
@Lazy
private MallOrderService mallOrderService;
@Autowired
private MallOrderGroupMapper mallOrderGroupMapper;
@Autowired
private MerchantOrderSeqUtil merchantOrderSeqUtil;
@Override
public IPage<MallDeliveryOrder> pageDelivery(MallDeliveryOrderPageQuery q) {
if (Boolean.TRUE.equals(q.getHallOnly())) {
q.setPageSize(20);
}
IPage<MallDeliveryOrder> page = new Page<>(q.getPageNum(), q.getPageSize());
return this.baseMapper.selectPageVO(page, q);
page = this.baseMapper.selectPageVO(page, q);
// 抢单大厅中,如果页码越界,使其循环回到前面的页
if (Boolean.TRUE.equals(q.getHallOnly()) && page.getPages() > 0 && q.getPageNum() > page.getPages()) {
long actualPage = ((q.getPageNum() - 1) % page.getPages()) + 1;
page.setCurrent(actualPage);
page = this.baseMapper.selectPageVO(page, q);
}
return page;
}
/**
@ -61,14 +83,14 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void workerAccept(String deliveryId, String workerId) {
public Integer workerAccept(String deliveryId, String workerId,String groupId) {
MallDeliveryOrder delivery = this.getById(deliveryId);
if (delivery == null) throw new RuntimeException("配送单不存在");
if (delivery.getStatus() != STATUS_WAIT_ACCEPT) throw new RuntimeException("配送单已被接取或已取消");
if (delivery == null) return 0;//throw new RuntimeException("配送单不存在");
if (delivery.getStatus() != STATUS_WAIT_ACCEPT) return 1;//throw new RuntimeException("配送单已被接取或已取消");
// 指派单校验
if (StringUtils.isNotBlank(delivery.getWorkerId()) && !delivery.getWorkerId().equals(workerId)) {
throw new RuntimeException("该单已指定其他配送员,无法抢单");
return 2;//throw new RuntimeException("该单已指定其他配送员,无法抢单");
}
// 更新配送单
@ -78,31 +100,67 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
.set(MallDeliveryOrder::getWorkerId, workerId)
.set(MallDeliveryOrder::getAcceptTime, new Date());
MallOrder order = mallOrderService.getById(delivery.getOrderId());
String numberCode = "";
//需要查询该group的所有关联订单,如果是面对面拼团需要更新订单序号
if(delivery.getGroupId() != null){
LambdaQueryWrapper<MallOrderGroup> gq = new LambdaQueryWrapper<>();
gq.eq(MallOrderGroup::getId, delivery.getGroupId());
MallOrderGroup group = mallOrderGroupMapper.selectOne(gq);
if(group.getIsFace() == 1){
List<String> orderIds = Arrays.asList(group.getGroupOrderIds().split(","));
for (String orderId : orderIds) {
MallOrder orderInner = mallOrderService.getById(orderId);
if (orderInner != null) {
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1);
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, orderId)
.set(MallOrder::getNumberCode, latestSeq).set(MallOrder::getStatus, 3);
mallOrderService.update(oUw);
numberCode+=latestSeq+"+";
}
}
}else{
// 同步更新关联订单状态:待配送员接单 -> 配送中(或待取货)
if (StringUtils.isNotBlank(delivery.getOrderId())) {
if (order != null && order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) {
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1);
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, delivery.getOrderId())
.set(MallOrder::getNumberCode, latestSeq).set(MallOrder::getStatus, 3); // 待取货
//缺少根据groupId更新面对面团所有订单状态
mallOrderService.update(oUw);
numberCode = latestSeq;
}
}
}
}else{
// 同步更新关联订单状态:待配送员接单 -> 配送中(或待取货)
if (StringUtils.isNotBlank(delivery.getOrderId())) {
if (order != null && order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) {
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1);
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, delivery.getOrderId())
.set(MallOrder::getNumberCode, latestSeq).set(MallOrder::getStatus, 3); // 待取货
//缺少根据groupId更新面对面团所有订单状态
mallOrderService.update(oUw);
numberCode = latestSeq;
}
}
}
// 若为指派单(直接购买),计算平台额外佣金 = 商品总价 * 2%
if (StringUtils.isNotBlank(delivery.getOrderId())) {
MallOrder order = mallOrderService.getById(delivery.getOrderId());
if (order != null && order.getOrderType() == 1) {
BigDecimal bonus = order.getGoodsAmount()
.multiply(new BigDecimal("0.02"))
.setScale(2, RoundingMode.HALF_UP);
uw.set(MallDeliveryOrder::getDeliveryFeeMarketplace, bonus);
uw.set(MallDeliveryOrder::getNumberCode, numberCode);
}
}
this.update(uw);
// 同步更新关联订单状态:待配送员接单 -> 配送中(或待取货)
if (StringUtils.isNotBlank(delivery.getOrderId())) {
MallOrder order = mallOrderService.getById(delivery.getOrderId());
if (order != null && order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) {
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, delivery.getOrderId())
.set(MallOrder::getStatus, 3); // 待取货
mallOrderService.update(oUw);
}
}
log.info("配送员 {} 接单成功,deliveryId={}", workerId, deliveryId);
return 3;
}
/**
@ -190,4 +248,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
.eq(MallDeliveryOrder::getDeliveryType, deliveryType);
return this.count(query);
}
@Override
public List<Map<Integer, Integer>> countOrdersByType(String regionId) {
return this.baseMapper.countOrdersByType(regionId);
}
}

21
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java

@ -9,6 +9,7 @@ import cc.hiver.mall.dao.mapper.WorkerRelaPriceMapper;
import cc.hiver.mall.entity.*;
import cc.hiver.mall.service.mybatis.MallOrderGroupService;
import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.utils.MerchantOrderSeqUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -46,6 +47,9 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
@Lazy
private MallOrderService mallOrderService;
@Autowired
private MerchantOrderSeqUtil merchantOrderSeqUtil;
@Autowired
private MallRefundRecordMapper mallRefundRecordMapper;
@ -97,8 +101,16 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
for (MallOrder order : waitingOrders) {
int targetStatus = (order.getDeliveryType() != null && order.getDeliveryType() == 1) ? 2 : 3;
LambdaUpdateWrapper<MallOrder> ouw = new LambdaUpdateWrapper<>();
ouw.eq(MallOrder::getId, order.getId())
.set(MallOrder::getStatus, targetStatus);
//代表该拼团子订单订单选择到店
if(targetStatus == 3){
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 2);
ouw.eq(MallOrder::getId, order.getId())
.set(MallOrder::getStatus, targetStatus)
.set(MallOrder::getNumberCode, latestSeq);
}else{
ouw.eq(MallOrder::getId, order.getId())
.set(MallOrder::getStatus, targetStatus);
}
mallOrderService.update(ouw);
if (order.getDeliveryType() != null && order.getDeliveryType() == 1) {
@ -201,4 +213,9 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
log.info("拼团 {} 已过期,取消 {} 条子订单并生成退款记录", groupId, waitingOrders.size());
}
@Override
public List<MallOrderGroup> selectMallGroup(MallOrderGroup group) {
return this.baseMapper.selectMallGroup(group);
}
}

44
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java

@ -9,6 +9,7 @@ import cc.hiver.mall.service.mybatis.MallDeliveryOrderService;
import cc.hiver.mall.service.mybatis.MallOrderGroupService;
import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.service.mybatis.MallRefundRecordService;
import cc.hiver.mall.utils.MerchantOrderSeqUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
@ -62,6 +63,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
private static final int GROUP_STATUS_SUCCESS = 1; // 拼团成功
private static final int GROUP_STATUS_FAIL = 2; // 拼团失败
private static final int GROUP_STATUS_FACE2FACE = 3; // 面对面团
private static final int GROUP_STATUS_WAITPAY = -1; // 拼团中
@Autowired
private MallOrderGoodsMapper mallOrderGoodsMapper;
@ -78,6 +80,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
@Autowired
private MallOrderGroupService mallOrderGroupService;
@Autowired
private MerchantOrderSeqUtil merchantOrderSeqUtil;
@Autowired
private MallDeliveryOrderService mallDeliveryOrderService;
@ -176,6 +181,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
MallOrder order = buildBaseOrder(dto, ORDER_TYPE_NORMAL, goodsAmount, deliveryFee, packageFee);
// 待支付
order.setStatus(STATUS_WAIT_PAY);
order.setRegionId(dto.getRegionId());
this.save(order);
// 保存商品快照
@ -231,18 +237,33 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
// 创建团长订单(初始状态:待支付)
MallOrder order = buildBaseOrder(dto, ORDER_TYPE_GROUP, goodsAmount, deliveryFee, packageFee);
order.setStatus(STATUS_WAIT_PAY);
order.setRegionId(dto.getRegionId());
this.save(order);
// 创建拼团主记录
MallOrderGroup group = new MallOrderGroup();
if(isFace2Face){
group.setIsFace(GROUP_STATUS_SUCCESS);
}else{
group.setIsFace(STATUS_WAIT_PAY);
}
group.setShopId(dto.getShopId());
group.setHeadUserId(dto.getUserId());
group.setTargetMembers(gp.getTargetMembers());
group.setCurrentMembers(1);
if(goodsSnapshots != null && !goodsSnapshots.isEmpty()){
group.setGroupPrice(goodsSnapshots.get(0).getPrice());
if(dto.getItems() != null && dto.getItems().size() > 0){
dto.getItems().forEach(item -> {
if(item.getIsMain() != null){
if(item.getIsMain() == 0){
group.setProductName(item.getProductName());
group.setProductPicture(item.getProductPicture());
group.setGroupPrice(item.getPrice());
group.setProductId(item.getProductId());
}
}
});
}
group.setHeadOrderId(order.getId());
group.setStatus(isFace2Face ? GROUP_STATUS_FACE2FACE : GROUP_STATUS_FORMING);
group.setStatus(isFace2Face ? GROUP_STATUS_FACE2FACE : GROUP_STATUS_WAITPAY);
group.setGroupOrderIds(order.getId());
group.setCreateTime(new Date());
@ -321,6 +342,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
// 创建参团人订单(初始状态:待支付)
MallOrder order = buildBaseOrder(dto, ORDER_TYPE_GROUP, goodsAmount, deliveryFee, packageFee);
order.setStatus(STATUS_WAIT_PAY);
order.setRegionId(dto.getRegionId());
this.save(order);
saveGoodsSnapshots(goodsSnapshots, order.getId());
@ -377,7 +399,10 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
.set(MallDeliveryOrder::getStatus, 0);
mallDeliveryOrderMapper.update(null, duw);
} else {
updateOrderStatus(orderId, STATUS_WAIT_PICKUP);
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 2);
LambdaUpdateWrapper<MallOrder> uw = new LambdaUpdateWrapper<>();
uw.eq(MallOrder::getId, orderId).set(MallOrder::getStatus, STATUS_WAIT_PICKUP).set(MallOrder::getNumberCode, latestSeq);
this.update(uw);
}
} else if (order.getOrderType() == ORDER_TYPE_GROUP) {
// 拼团订单支付成功 -> 改为待成团
@ -394,6 +419,14 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
.like(MallOrderGroup::getGroupOrderIds, order.getId())
.last("LIMIT 1");
group = mallOrderGroupMapper.selectOne(gq2);
}else{
// 团长支付 且不是面对面团 状态改为待成团
if(group.getIsFace() != 1){
LambdaUpdateWrapper<MallOrderGroup> guw = new LambdaUpdateWrapper<>();
guw.eq(MallOrderGroup::getId, group.getId())
.set(MallOrderGroup::getStatus, GROUP_STATUS_FORMING);
mallOrderGroupMapper.update(group,guw);
}
}
if (group != null) {
mallOrderGroupService.checkAndActivateGroup(group.getId());
@ -634,8 +667,11 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
MallDeliveryOrder delivery = new MallDeliveryOrder();
delivery.setOrderId(order.getId());
delivery.setGroupId(groupId);
//学校id
delivery.setRegionId(dto.getRegionId());
delivery.setShopId(dto.getShopId());
delivery.setStatus(initialStatus);
delivery.setRemark(dto.getRemark());
delivery.setDeliveryType(1); // 外卖单
// 总配送费放入 delivery

58
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/MerchantOrderSeqUtil.java

@ -0,0 +1,58 @@
package cc.hiver.mall.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
/**
* 商家订单序号生成工具区分外卖和到店
*/
@Component
public class MerchantOrderSeqUtil {
private static final String REDIS_SEQ_PREFIX = "mall:order:seq:";
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 生成并获取商家最新的订单序号 (外卖和到店分开计数)
* 每天 24:00 自动归零
*
* @param shopId 商家ID
* @param deliveryType 配送方式 (1: 外卖, 2: 到店自取/堂食)
* @return 订单序号例如W001, D001
*/
public String generateOrderSequence(String shopId, Integer deliveryType) {
// 1. 获取当前日期,用于按天创建 Redis Key 的一部分 (格式: yyyyMMdd)
String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
// 2. 根据配送类型区分前缀(1:外卖送餐 W, 其他/2:到店自取 D)
String typeFix = (deliveryType != null && deliveryType == 1) ? "W" : "D";
// 3. 构建 Redis Key: mall:order:seq:{shopId}:{dateStr}:{typeFix}
String redisKey = REDIS_SEQ_PREFIX + shopId + ":" + dateStr + ":" + typeFix;
// 4. Redis 自增(返回自增后的值),如果 key 不存在则自动创建并返回 1
Long seq = stringRedisTemplate.opsForValue().increment(redisKey);
// 5. 如果是当天的第一个序号,设置过期时间为今天的 24:00:00 (即 LocalTime.MAX)
if (seq != null && seq == 1L) {
LocalDateTime endOfDay = LocalDateTime.now().with(LocalTime.MAX);
Duration expireDuration = Duration.between(LocalDateTime.now(), endOfDay);
// 补偿以防止过期时间极其短(虽然 LocalTime.MAX 基本不会出现问题)
if (!expireDuration.isNegative()) {
stringRedisTemplate.expire(redisKey, expireDuration);
}
}
// 6. 格式化序号,比如 W001, D001(不足3位补0)
return typeFix + String.format("%03d", seq != null ? seq : 1L);
}
}

24
hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml

@ -26,6 +26,9 @@
<result column="must_finish_time" property="mustFinishTime"/>
<result column="finish_time" property="finishTime"/>
<result column="delivery_type" property="deliveryType"/>
<result column="number_code" property="numberCode"/>
<result column="region_id" property="regionId"/>
<result column="remark" property="remark"/>
</resultMap>
<!-- 分页查询配送单,支持多条件过滤(抢单大厅:hallOnly=true时只查workerId为空的) -->
@ -35,9 +38,13 @@
d.get_area_id, d.put_area_id, d.delivery_fee, d.delivery_fee_marketplace,
d.status, d.create_time, d.accept_time, d.get_time, d.must_finish_time, d.finish_time,
d.receiver_name, d.receiver_phone, d.receiver_address,
d.shop_name, d.shop_phone, d.shop_address, d.delivery_type
d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code,
d.region_id,d.remark
FROM mall_delivery_order d
<where>
<if test="q.regionId != null and q.regionId != ''">
AND d.region_id = #{q.regionId}
</if>
<if test="q.workerId != null and q.workerId != ''">
AND d.worker_id = #{q.workerId}
</if>
@ -68,6 +75,9 @@
</if>
</where>
ORDER BY
<if test="q.order != null and q.order == 'deliveryFee'">
d.delivery_fee DESC,
</if>
<if test="(q.waimaiData != null and q.waimaiData.size() > 0) or (q.kuaidiData != null and q.kuaidiData.size() > 0)">
(CASE
<if test="q.waimaiData != null and q.waimaiData.size() > 0">
@ -83,10 +93,8 @@
ELSE 0
END) DESC,
</if>
<if test="q.order != null and q.order == 'deliveryFee'">
d.delivery_fee DESC,
</if>
d.create_time DESC
(CASE WHEN d.must_finish_time IS NULL THEN 1 ELSE 0 END) ASC,
d.must_finish_time ASC,d.delivery_fee DESC
</select>
<!--
@ -102,4 +110,10 @@
AND status IN (1, 2)
</select>
<select id="countOrdersByType" resultType="map">
SELECT delivery_type as deliveryType,count(*) as orderCount
FROM mall_delivery_order
WHERE region_id = #{regionId} and worker_id is null and status = 0 group by delivery_type
</select>
</mapper>

24
hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderGroupMapper.xml

@ -18,6 +18,30 @@
<result column="total_delivery_fee" property="totalDeliveryFee"/>
<result column="create_time" property="createTime"/>
<result column="expire_time" property="expireTime"/>
<result column="is_face" property="isFace"/>
<result column="product_name" property="productName"/>
<result column="product_picture" property="productPicture"/>
<result column="product_id" property="productId"/>
</resultMap>
<select id="selectMallGroup" resultMap="groupMap">
SELECT id,shop_id,head_user_id,head_order_id,group_order_ids,target_members,
current_members,status,group_price,worker_id,worker_commission,total_delivery_fee,
create_time,expire_time,is_face,product_name,product_picture,product_id
FROM mall_order_group
<where>
<if test="group.shopId != null and group.shopId != ''">
AND shop_id = #{group.shopId}
</if>
<if test="group.isFace != null and group.isFace != ''">
AND is_face = #{group.isFace}
</if>
<if test="group.status != null">
AND status = #{group.status}
</if>
</where>
</select>
</mapper>

6
hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml

@ -25,6 +25,8 @@
<result column="shop_address" property="shopAddress"/>
<result column="create_time" property="createTime"/>
<result column="pay_time" property="payTime"/>
<result column="number_code" property="numberCode"/>
<result column="region_id" property="regionId"/>
</resultMap>
<!-- 分页查询订单(不挂载商品明细,由Service层补填) -->
@ -34,7 +36,7 @@
o.status, o.total_amount, o.goods_amount, o.delivery_fee,
o.package_fee, o.address_id, o.remark, o.create_time, o.pay_time,
o.receiver_name, o.receiver_phone, o.receiver_address,
o.shop_name, o.shop_phone, o.shop_address
o.shop_name, o.shop_phone, o.shop_address,o.number_code,region_id
FROM mall_order o
<where>
<if test="q.userId != null and q.userId != ''">
@ -68,7 +70,7 @@
o.status, o.total_amount, o.goods_amount, o.delivery_fee,
o.package_fee, o.address_id, o.remark, o.create_time, o.pay_time,
o.receiver_name, o.receiver_phone, o.receiver_address,
o.shop_name, o.shop_phone, o.shop_address
o.shop_name, o.shop_phone, o.shop_address,o.number_code,o.region_id
FROM mall_order o LEFT JOIN mall_order_group og ON o.id = og.head_order_id
<where>
<if test="groupId != null and groupId != ''">

Loading…
Cancel
Save