Browse Source

对接拼团数据

master
wangfukang 4 weeks ago
parent
commit
739d175d1b
  1. 113
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/OrderController.java
  2. 83
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java
  3. 34
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/WorkerRelaPriceMapper.java
  4. 36
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallDeliveryOrder.java
  5. 37
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java
  6. 30
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrderGoods.java
  7. 37
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrderGroup.java
  8. 31
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallRefundRecord.java
  9. 22
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/WorkerAreaOnlineCountVO.java
  10. 51
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/WorkerMatchVO.java
  11. 116
      hiver-modules/hiver-mall/src/main/resources/mapper/WorkerRelaPriceMapper.xml

113
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/OrderController.java

@ -11,9 +11,7 @@ import cc.hiver.core.service.WorkerService;
import cc.hiver.file.manage.FileManageFactory;
import cc.hiver.mall.common.constant.OrderConstant;
import cc.hiver.mall.deductlog.service.DeductLogService;
import cc.hiver.mall.entity.OrderXd;
import cc.hiver.mall.entity.ReturnSale;
import cc.hiver.mall.entity.Sale;
import cc.hiver.mall.entity.*;
import cc.hiver.mall.pojo.vo.OrderQueryVO;
import cc.hiver.mall.pojo.vo.OrderVO;
import cc.hiver.mall.service.OrderService;
@ -27,6 +25,7 @@ import com.google.gson.JsonParser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
@ -49,6 +48,8 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
@ -539,4 +540,110 @@ public class OrderController {
headers.setLocation(URI.create(url));
return new ResponseEntity<>(headers, HttpStatus.FOUND);
}
@Data
public static class OrderSubmitDTO {
private String userId;
private String shopId;
private Integer orderType; // 1: Direct 2: Group
private Integer deliveryType; // 1: Delivery 2: Pickup
private BigDecimal totalAmount;
private BigDecimal goodsAmount;
private BigDecimal packageFee;
private String addressId; // if delivery
private String getAreaId; // from shop
private String putAreaId; // from address
// Group fields
private Integer groupTargetMembers;
private BigDecimal groupPrice;
private String workerId;
private BigDecimal workerCommission;
// Items
private List<OrderItem> items;
}
@Data
public static class OrderItem {
private String productId;
private String productName;
private String productPicture;
private String specs;
private BigDecimal price;
private Integer quantity;
}
@PostMapping("/submitMallOrder")
@ApiOperation("提交商城订单(自研)")
public Result submitMallOrder(@RequestBody OrderSubmitDTO dto) {
// 1. Create Order
MallOrder order = new MallOrder();
order.setId("O" + SnowFlakeUtil.nextId().toString());
order.setUserId(dto.getUserId());
order.setShopId(dto.getShopId());
order.setOrderType(dto.getOrderType());
order.setDeliveryType(dto.getDeliveryType());
order.setStatus(0); // 待支付
order.setGoodsAmount(dto.getGoodsAmount());
order.setPackageFee(dto.getPackageFee());
if(dto.getPackageFee() == null) order.setPackageFee(BigDecimal.ZERO);
order.setAddressId(dto.getAddressId());
order.setCreateTime(new Date());
// 2. Delivery Fee calculation logic
BigDecimal deliveryFee = BigDecimal.ZERO;
if (dto.getDeliveryType() != null && dto.getDeliveryType() == 1) { // 跑腿配送
if (dto.getOrderType() == 1) { // Direct Buy
deliveryFee = dto.getWorkerCommission() != null ? dto.getWorkerCommission() : BigDecimal.ZERO;
} else if (dto.getOrderType() == 2) { // Group Buy
int members = dto.getGroupTargetMembers() != null ? dto.getGroupTargetMembers() : 1;
if (dto.getWorkerId() != null && !dto.getWorkerId().isEmpty() && dto.getWorkerCommission() != null) {
BigDecimal base = dto.getWorkerCommission();
BigDecimal extra = members > 2 ? new BigDecimal("0.5").multiply(new BigDecimal(members - 2)) : BigDecimal.ZERO;
deliveryFee = base.add(extra).divide(new BigDecimal(members), 1, RoundingMode.UP);
} else if (dto.getWorkerCommission() != null) {
deliveryFee = dto.getWorkerCommission().divide(new BigDecimal(members), 1, RoundingMode.UP);
}
}
}
order.setDeliveryFee(deliveryFee);
order.setTotalAmount(order.getGoodsAmount().add(order.getPackageFee()).add(deliveryFee));
// 3. Create Group Buy Entry if needed
String groupId = null;
if (dto.getOrderType() != null && dto.getOrderType() == 2) {
MallOrderGroup group = new MallOrderGroup();
group.setId("G" + SnowFlakeUtil.nextId().toString());
group.setShopId(dto.getShopId());
group.setHeadUserId(dto.getUserId());
group.setHeadOrderId(order.getId());
group.setTargetMembers(dto.getGroupTargetMembers());
group.setCurrentMembers(1);
group.setStatus(0); // 拼团中
group.setGroupPrice(dto.getGroupPrice());
group.setWorkerId(dto.getWorkerId());
group.setWorkerCommission(dto.getWorkerCommission());
group.setCreateTime(new Date());
groupId = group.getId();
}
// Return unified order data for payment
return ResultUtil.success("下单成功");
}
@PostMapping("/payMallOrderSuccess")
@ApiOperation("商城订单支付成功回调(自研)")
public Result payMallOrderSuccess(@RequestParam String orderId, @RequestParam(required = false) String workerId) {
// Here we would lookup the order, update status to 1
// If deliveryType == 1 && orderType == 1 (Direct), create DeliveryOrder
MallDeliveryOrder delivery = new MallDeliveryOrder();
delivery.setId("D" + SnowFlakeUtil.nextId().toString());
delivery.setOrderId(orderId);
delivery.setWorkerId(workerId); // From order DB
delivery.setStatus(0); // 待接单
delivery.setCreateTime(new Date());
return ResultUtil.success("支付成功处理完毕");
}
}

83
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java

@ -1,6 +1,5 @@
package cc.hiver.mall.controller;
import cc.hiver.core.common.constant.CommonConstant;
import cc.hiver.core.common.constant.WorkerConstant;
import cc.hiver.core.common.utils.BeanUtils;
@ -10,14 +9,18 @@ import cc.hiver.core.entity.Worker;
import cc.hiver.core.service.WorkerService;
import cc.hiver.core.vo.WorkerAppVO;
import cc.hiver.core.vo.WorkerQueryVO;
import cc.hiver.mall.dao.mapper.WorkerRelaPriceMapper;
import cc.hiver.mall.entity.Recharge;
import cc.hiver.mall.entity.ShopArea;
import cc.hiver.mall.pojo.vo.WorkerAreaOnlineCountVO;
import cc.hiver.mall.pojo.vo.WorkerMatchVO;
import cc.hiver.mall.service.RechargeService;
import cc.hiver.mall.service.ShopAreaService;
import cn.hutool.core.util.StrUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
@ -30,13 +33,13 @@ import java.math.BigDecimal;
import java.util.List;
/**
* 订单工管理接口
* 配送员管理接口
*
* @author houpn
*/
@Slf4j
@RestController
@Api(tags = "订单工接口")
@Api(tags = "配送员接口")
@RequestMapping("/hiver/worker")
@CacheConfig(cacheNames = "worker")
@Transactional
@ -51,6 +54,9 @@ public class WorkerController {
@Autowired
private ShopAreaService shopAreaService;
@Autowired
private WorkerRelaPriceMapper workerRelaPriceMapper;
@RequestMapping(value = "/getByCondition", method = RequestMethod.POST)
@ApiOperation(value = "多条件分页获取订单列表")
public Result<Page<Worker>> getByCondition(@RequestBody WorkerQueryVO worker) {
@ -85,7 +91,7 @@ public class WorkerController {
}
@RequestMapping(value = "/admin/add", method = RequestMethod.POST)
@ApiOperation(value = "创建抢单工")
@ApiOperation(value = "创建配送员")
public Result add(@Valid Worker u) {
// 添加商圈名称
@ -115,7 +121,7 @@ public class WorkerController {
}
@RequestMapping(value = "/admin/edit", method = RequestMethod.POST)
@ApiOperation(value = "修改抢单工信息", notes = "需要通过下单编号获取订单信息")
@ApiOperation(value = "修改配送员信息", notes = "需要通过下单编号获取订单信息")
public Result edit(Worker u) {
if (StrUtil.isNotBlank(u.getRegion())) {
@ -133,9 +139,9 @@ public class WorkerController {
}
@RequestMapping(value = "/admin/editApp", method = RequestMethod.POST)
@ApiOperation(value = "修改抢单工信息-APP", notes = "需要通过下单编号获取订单信息")
@ApiOperation(value = "修改配送员信息-APP", notes = "需要通过下单编号获取订单信息")
public Result editApp(WorkerAppVO u) {
//修改抢单工信息时如涉及到充值押金情况,需要更新余额且重置应缴
//修改配送员信息时如涉及到充值押金情况,需要更新余额且重置应缴
Worker worker = workerService.get(u.getWorkerId());
if (u.getDepoNum() != null && u.getDepoNum().compareTo(BigDecimal.ZERO) > 0) {
@ -160,7 +166,7 @@ public class WorkerController {
}
@RequestMapping(value = "/admin/disable/{workerId}", method = RequestMethod.POST)
@ApiOperation(value = "后台人工禁用抢单工")
@ApiOperation(value = "后台人工禁用配送员")
public Result disable(@ApiParam("用户唯一id标识") @PathVariable String workerId) {
Worker worker = workerService.get(workerId);
worker.setWorkerStatus(WorkerConstant.WORKER_STATUS_DISABLE);
@ -171,8 +177,8 @@ public class WorkerController {
}
@RequestMapping(value = "/admin/enable/{workerId}", method = RequestMethod.POST)
@ApiOperation(value = "后台人工启用抢单工")
public Result enable(@ApiParam("抢单工唯一id标识") @PathVariable String workerId) {
@ApiOperation(value = "后台人工启用配送员")
public Result enable(@ApiParam("配送员唯一id标识") @PathVariable String workerId) {
Worker worker = workerService.get(workerId);
//这儿暂时有bug,启用的时候其实需要判定原状态是启用还是不可接单状态,需要进行逻辑判断
worker.setWorkerStatus(WorkerConstant.WORKER_STATUS_NORMAL);
@ -183,7 +189,7 @@ public class WorkerController {
}
/**
* 拉包工上线
* 配送员上线
*
* @param id
* @return Result<Object>
@ -191,7 +197,7 @@ public class WorkerController {
* @date 2024/2/2
*/
@RequestMapping(value = "/onLine", method = RequestMethod.POST)
@ApiOperation(value = "拉包工上线")
@ApiOperation(value = "配送员上线")
public Result<Object> onLine(String id) {
try {
workerService.onLine(id);
@ -211,7 +217,7 @@ public class WorkerController {
* @date 2024/2/2
*/
@RequestMapping(value = "/offLine", method = RequestMethod.POST)
@ApiOperation(value = "拉包工下线")
@ApiOperation(value = "配送员下线")
public Result<Object> offLine(String id) {
try {
workerService.offLine(id);
@ -221,4 +227,55 @@ public class WorkerController {
return ResultUtil.error("下线失败");
}
}
/**
* 配送员匹配 DTO前台传入参数
*/
@Data
public static class WorkerMatchDTO {
/** 取货区域id(商家所在区域) */
private String shopAreaId;
/** 送货区域id(用户收货区域) */
private String putAreaId;
/** 交易保障:true 只查 rebate_amount > 0 的配送员 */
private Boolean baozhang;
/** 相同地址:true 只查手上有相同送货区域订单的配送员 */
private Boolean xiangtong;
/** 搜索关键词:模糊匹配配送员姓名或手机号 */
private String keyword;
/**
* 排序字段
* score -> 评分倒序默认
* avgTime -> 平均时长正序
* orderBkge -> 配送佣金正序
*/
private String sortField;
}
@RequestMapping(value = "/getMatchingWorkerList", method = RequestMethod.POST)
@ApiOperation(value = "匹配抢单配送员列表")
public Result<List<WorkerMatchVO>> getMatchingWorkerList(@RequestBody WorkerMatchDTO dto) {
// 计算排序方向:avgTime/orderBkge 默认 ASC,score 默认 DESC
String sortOrder = "DESC";
if ("avgTime".equals(dto.getSortField()) || "orderBkge".equals(dto.getSortField())) {
sortOrder = "ASC";
}
List<WorkerMatchVO> list = workerRelaPriceMapper.getMatchingWorkerList(
dto.getShopAreaId(),
dto.getPutAreaId(),
StrUtil.isBlank(dto.getKeyword()) ? null : dto.getKeyword().trim(),
dto.getBaozhang(),
dto.getXiangtong(),
dto.getSortField(),
sortOrder
);
return new ResultUtil<List<WorkerMatchVO>>().setData(list);
}
@RequestMapping(value = "/getOnlineWorkerByArea", method = RequestMethod.GET)
@ApiOperation(value = "查询各食堂区域在线配送员数量")
public Result<List<WorkerAreaOnlineCountVO>> getOnlineWorkerByArea(String parentId) {
List<WorkerAreaOnlineCountVO> list = workerRelaPriceMapper.getOnlineWorkerCountByCanteenArea(parentId);
return new ResultUtil<List<WorkerAreaOnlineCountVO>>().setData(list);
}
}

34
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/WorkerRelaPriceMapper.java

@ -1,7 +1,10 @@
package cc.hiver.mall.dao.mapper;
import cc.hiver.mall.entity.WorkerRelaPrice;
import cc.hiver.mall.pojo.vo.WorkerAreaOnlineCountVO;
import cc.hiver.mall.pojo.vo.WorkerMatchVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@ -15,4 +18,35 @@ public interface WorkerRelaPriceMapper extends BaseMapper<WorkerRelaPrice> {
void deleteByWorkerId(String workerId);
/**
* 查询匹配条件的配送员列表联查 t_worker_rela_pricet_workermall_delivery_order
*
* @param shopAreaId 取货区域id前台 shopAreaId
* @param putAreaId 送货区域id
* @param keyword 模糊搜索姓名或手机号 null 时不过滤
* @param baozhang 交易保障true 则只查 rebate_amount > 0 的配送员
* @param xiangtong 相同地址true 则只查手上有相同 putAreaId 订单的配送员
* @param sortField 排序字段score/avgTime/orderBkge默认 score
* @param sortOrder 排序方向DESC/ASC
* @return 配送员匹配 VO 列表
*/
List<WorkerMatchVO> getMatchingWorkerList(
@Param("shopAreaId") String shopAreaId,
@Param("putAreaId") String putAreaId,
@Param("keyword") String keyword,
@Param("baozhang") Boolean baozhang,
@Param("xiangtong") Boolean xiangtong,
@Param("sortField") String sortField,
@Param("sortOrder") String sortOrder
);
/**
* 查询各食堂区域在线配送员数量
* 条件worker_status=1is_on_line=1worker.get_push_order=1
* 且存在 worker_rela_price.get_push_order=1 get_area_id=shop_area.id 的配置
*
* @return 食堂区域在线配送员统计
*/
List<WorkerAreaOnlineCountVO> getOnlineWorkerCountByCanteenArea(@Param("parentId") String parentId);
}

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

@ -0,0 +1,36 @@
package cc.hiver.mall.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
@Entity
@Table(name = "mall_delivery_order")
@TableName("mall_delivery_order")
@ApiModel(value = "配送订单表")
public class MallDeliveryOrder implements Serializable {
@Id
@TableId
private String id;
private String orderId;
private String groupId;
private String workerId;
private String shopId;
private String getAreaId;
private String putAreaId;
private BigDecimal deliveryFee;
private Integer status;
private Date createTime;
private Date acceptTime;
private Date getTime;
private Date finishTime;
}

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

@ -0,0 +1,37 @@
package cc.hiver.mall.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
@Entity
@Table(name = "mall_order")
@TableName("mall_order")
@ApiModel(value = "核心订单表")
public class MallOrder implements Serializable {
@Id
@TableId
private String id;
private String userId;
private String shopId;
private Integer orderType;
private Integer deliveryType;
private Integer status;
private BigDecimal totalAmount;
private BigDecimal goodsAmount;
private BigDecimal deliveryFee;
private BigDecimal packageFee;
private String addressId;
private String remark;
private Date createTime;
private Date payTime;
}

30
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrderGoods.java

@ -0,0 +1,30 @@
package cc.hiver.mall.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@Entity
@Table(name = "mall_order_goods")
@TableName("mall_order_goods")
@ApiModel(value = "订单商品详情表")
public class MallOrderGoods implements Serializable {
@Id
@TableId
private String id;
private String orderId;
private String productId;
private String productName;
private String productPicture;
private String specs;
private BigDecimal price;
private Integer quantity;
}

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

@ -0,0 +1,37 @@
package cc.hiver.mall.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
@Entity
@Table(name = "mall_order_group")
@TableName("mall_order_group")
@ApiModel(value = "拼团信息表")
public class MallOrderGroup implements Serializable {
@Id
@TableId
private String id;
private String shopId;
private String headUserId;
private String headOrderId;
private String groupUserIds;
private Integer targetMembers;
private Integer currentMembers;
private Integer status;
private BigDecimal groupPrice;
private String workerId;
private BigDecimal workerCommission;
private BigDecimal totalDeliveryFee;
private Date createTime;
private Date expireTime;
}

31
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallRefundRecord.java

@ -0,0 +1,31 @@
package cc.hiver.mall.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
@Entity
@Table(name = "mall_refund_record")
@TableName("mall_refund_record")
@ApiModel(value = "退款记录表")
public class MallRefundRecord implements Serializable {
@Id
@TableId
private String id;
private String orderId;
private String userId;
private BigDecimal refundAmount;
private String reason;
private Integer status;
private Date createTime;
private Date successTime;
}

22
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/WorkerAreaOnlineCountVO.java

@ -0,0 +1,22 @@
package cc.hiver.mall.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 食堂区域在线配送员数量统计
*/
@Data
@ApiModel(value = "食堂区域在线配送员数量统计VO")
public class WorkerAreaOnlineCountVO {
@ApiModelProperty(value = "区域ID")
private String areaId;
@ApiModelProperty(value = "区域名称")
private String areaName;
@ApiModelProperty(value = "在线配送员数量")
private Integer onlineWorkerCount;
}

51
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/WorkerMatchVO.java

@ -0,0 +1,51 @@
package cc.hiver.mall.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* 配送员匹配列表返回 VO
*/
@Data
@ApiModel(value = "配送员匹配列表VO")
public class WorkerMatchVO {
@ApiModelProperty("配送员ID")
private String workerId;
@ApiModelProperty("配送员姓名")
private String workerName;
@ApiModelProperty("手机号")
private String mobile;
@ApiModelProperty("头像")
private String icon;
@ApiModelProperty("评分")
private BigDecimal score;
@ApiModelProperty("平均配送时长(分钟)")
private BigDecimal avgTime;
@ApiModelProperty("交易保障金")
private BigDecimal rebateAmount;
@ApiModelProperty("超高层额外费用")
private BigDecimal highFloorFee;
@ApiModelProperty("匹配规则的配送佣金")
private BigDecimal orderBkge;
@ApiModelProperty("当前待接单数(status=0)")
private Integer orderWaitCount;
@ApiModelProperty("当前待取货数(status=1)")
private Integer orderGetCount;
@ApiModelProperty("当前待送达数(status=2)")
private Integer orderPutCount;
}

116
hiver-modules/hiver-mall/src/main/resources/mapper/WorkerRelaPriceMapper.xml

@ -48,4 +48,120 @@
from t_worker_rela_price
where worker_id = #{workerId,jdbcType=VARCHAR}
</delete>
<!-- =====================================================================
配送员匹配列表:联查 t_worker、t_worker_rela_price、mall_delivery_order
支持:状态过滤、交易保障、相同地址、关键词搜索、动态排序
===================================================================== -->
<resultMap id="WorkerMatchVOMap" type="cc.hiver.mall.pojo.vo.WorkerMatchVO">
<result column="worker_id" property="workerId"/>
<result column="worker_name" property="workerName"/>
<result column="mobile" property="mobile"/>
<result column="icon" property="icon"/>
<result column="score" property="score"/>
<result column="avg_time" property="avgTime"/>
<result column="rebate_amount" property="rebateAmount"/>
<result column="high_floor_fee" property="highFloorFee"/>
<result column="order_bkge" property="orderBkge"/>
<result column="order_wait_count" property="orderWaitCount"/>
<result column="order_get_count" property="orderGetCount"/>
<result column="order_put_count" property="orderPutCount"/>
</resultMap>
<select id="getMatchingWorkerList" resultMap="WorkerMatchVOMap">
SELECT
w.worker_id,
w.worker_name,
w.mobile,
w.icon,
w.score,
w.avg_time,
w.rebate_amount,
w.high_floor_fee,
p.order_bkge,
/* 待接单:status = 0 */
COUNT(CASE WHEN d.status = 0 THEN 1 END) AS order_wait_count,
/* 待取货:status = 1 */
COUNT(CASE WHEN d.status = 1 THEN 1 END) AS order_get_count,
/* 待送达:status = 2 */
COUNT(CASE WHEN d.status = 2 THEN 1 END) AS order_put_count
FROM t_worker w
/* 关联配送规则表:只取满足区域匹配和接单条件的规则 */
INNER JOIN t_worker_rela_price p
ON p.worker_id = w.worker_id
AND p.get_push_order = 1
AND p.get_area_id = #{shopAreaId}
AND p.put_area_id = #{putAreaId}
/* 关联配送订单表:LEFT JOIN 保留无任何订单的配送员 */
LEFT JOIN mall_delivery_order d
ON d.worker_id = w.worker_id
AND d.status IN (0, 1, 2)
WHERE
/* 配送员基础状态:启用 + 上线 + 接收指派 */
w.worker_status = 1
AND w.is_on_line = 1
AND w.get_push_order = 1
/* 交易保障:rebate_amount > 0 */
<if test="baozhang != null and baozhang == true">
AND w.rebate_amount &gt; 0
</if>
/* 相同地址:手上存在送往相同 put_area_id 的进行中订单 */
<if test="xiangtong != null and xiangtong == true">
AND EXISTS (
SELECT 1 FROM mall_delivery_order d2
WHERE d2.worker_id = w.worker_id
AND d2.put_area_id = #{putAreaId}
AND d2.status IN (0, 1, 2)
)
</if>
/* 关键词模糊搜索:姓名或手机号 */
<if test="keyword != null and keyword != ''">
AND (
w.worker_name LIKE CONCAT('%', #{keyword}, '%')
OR w.mobile LIKE CONCAT('%', #{keyword}, '%')
)
</if>
GROUP BY
w.worker_id, w.worker_name, w.mobile, w.icon,
w.score, w.avg_time, w.rebate_amount, w.high_floor_fee, p.order_bkge
ORDER BY
<choose>
<when test="sortField != null and sortField == 'score'">
w.score DESC
</when>
<when test="sortField != null and sortField == 'orderBkge'">
p.order_bkge ASC
</when>
<!-- 默认按 score 倒序 -->
<otherwise>
w.avg_time ASC
</otherwise>
</choose>
</select>
<resultMap id="WorkerAreaOnlineCountVOMap" type="cc.hiver.mall.pojo.vo.WorkerAreaOnlineCountVO">
<result column="area_id" property="areaId"/>
<result column="area_name" property="areaName"/>
<result column="online_worker_count" property="onlineWorkerCount"/>
</resultMap>
<select id="getOnlineWorkerCountByCanteenArea" resultMap="WorkerAreaOnlineCountVOMap">
SELECT
sa.id AS area_id,
sa.title AS area_name,
COUNT(DISTINCT w.worker_id) AS online_worker_count
FROM t_shop_area sa
LEFT JOIN t_worker_rela_price wrp
ON wrp.get_area_id = sa.id
AND wrp.get_push_order = 1
LEFT JOIN t_worker w
ON w.worker_id = wrp.worker_id
AND w.worker_status = 1
AND w.is_on_line = 1
AND w.get_push_order = 1
WHERE sa.is_canteen = 1 and sa.parent_id = #{parentId}
GROUP BY sa.id, sa.title, sa.sort_order, sa.create_time
ORDER BY sa.sort_order ASC, sa.create_time ASC
</select>
</mapper>
Loading…
Cancel
Save