订单业务功能开发v3

wxpay
LI-CCONG\李聪聪 8 months ago
parent 97f7dbec88
commit 3f32910bef

@ -3,7 +3,13 @@ package cc.yunxi.common.utils;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GeodeticCurve;
import org.gavaghan.geodesy.GlobalCoordinates;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Random; import java.util.Random;
@ -37,7 +43,7 @@ public class CommonUtil {
/** /**
* *
* @param prefix * @param prefix
* @return String * @return String
*/ */
@ -50,7 +56,31 @@ public class CommonUtil {
return new StringBuilder().append(prefix).append(currentTimeStr).append(randomNumberStr).toString(); return new StringBuilder().append(prefix).append(currentTimeStr).append(randomNumberStr).toString();
} }
/**
*
* @param lon1
* @param lat1
* @param lon2
* @param lat2
* @return km
*/
public static String getDistance(String lon1, String lat1, String lon2, String lat2) {
GlobalCoordinates source = new GlobalCoordinates(Double.parseDouble(lat1), Double.parseDouble(lon1));
GlobalCoordinates target = new GlobalCoordinates(Double.parseDouble(lat2), Double.parseDouble(lon2));
GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.Sphere, source, target);
double distance = geoCurve.getEllipsoidalDistance();
BigDecimal distanceBig = new BigDecimal(distance).setScale(2, RoundingMode.UP);
distanceBig = distanceBig.multiply(new BigDecimal("0.001")).setScale(2, RoundingMode.UP);
return distanceBig.toString().concat("km");
}
public static void main(String[] args) { public static void main(String[] args) {
System.out.println(humpToUnderline("helloWorld")); String lon1 = "119.6438888888889";
String lat1 = "37.966944444444444";
String lon2 = "119.63916666666667";
String lat2 = "37.9675";
System.out.println(getDistance(lon1, lat1, lon2, lat2));
} }
} }

@ -5,6 +5,7 @@ import cc.yunxi.aspect.UserTypeAnnotation;
import cc.yunxi.common.domain.CommonResult; import cc.yunxi.common.domain.CommonResult;
import cc.yunxi.common.domain.PageDTO; import cc.yunxi.common.domain.PageDTO;
import cc.yunxi.common.utils.BeanUtils; import cc.yunxi.common.utils.BeanUtils;
import cc.yunxi.common.utils.CommonUtil;
import cc.yunxi.domain.vo.recycleorder.RecycleOrderCreateVO; import cc.yunxi.domain.vo.recycleorder.RecycleOrderCreateVO;
import cc.yunxi.domain.po.RecycleOrder; import cc.yunxi.domain.po.RecycleOrder;
import cc.yunxi.domain.query.RecycleOrderQuery; import cc.yunxi.domain.query.RecycleOrderQuery;
@ -13,6 +14,8 @@ import cc.yunxi.domain.vo.recycleorder.RecycleOrderTakingVO;
import cc.yunxi.domain.vo.recycleorder.RecycleOrderUpdateVO; import cc.yunxi.domain.vo.recycleorder.RecycleOrderUpdateVO;
import cc.yunxi.enums.UserTypeEnum; import cc.yunxi.enums.UserTypeEnum;
import cc.yunxi.service.IRecycleOrderService; import cc.yunxi.service.IRecycleOrderService;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -43,6 +46,17 @@ public class RecycleOrderController {
public CommonResult<PageDTO<RecycleOrderRespVO>> queryOrderByPage(@RequestBody RecycleOrderQuery recycleOrderQuery) { public CommonResult<PageDTO<RecycleOrderRespVO>> queryOrderByPage(@RequestBody RecycleOrderQuery recycleOrderQuery) {
// 1.分页查询 // 1.分页查询
Page<RecycleOrder> result = recycleOrderService.queryOrderByPage(recycleOrderQuery); Page<RecycleOrder> result = recycleOrderService.queryOrderByPage(recycleOrderQuery);
// 1.1 订单距离计算
if (ObjectUtil.isNotEmpty(recycleOrderQuery.getLocation())) {
String longitude = recycleOrderQuery.getLocation().getLongitude();
String latitude = recycleOrderQuery.getLocation().getLatitude();
if (StrUtil.isNotEmpty(longitude) && StrUtil.isNotEmpty(latitude)) {
for(RecycleOrder recycleOrder : result.getRecords()) {
String distance = CommonUtil.getDistance(longitude, latitude, recycleOrder.getLongitude(), recycleOrder.getLatitude());
recycleOrder.setDistance(distance);
}
}
}
// 2.封装并返回 // 2.封装并返回
PageDTO<RecycleOrderRespVO> recyclerPageDTO = PageDTO.of(result, RecycleOrderRespVO.class); PageDTO<RecycleOrderRespVO> recyclerPageDTO = PageDTO.of(result, RecycleOrderRespVO.class);
return CommonResult.success(recyclerPageDTO); return CommonResult.success(recyclerPageDTO);

@ -0,0 +1,16 @@
package cc.yunxi.domain.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(description = "当前位置实体")
public class LocationDTO {
@ApiModelProperty(value = "当前经度", required = true, example = "119.643888")
private String longitude;
@ApiModelProperty(value = "当前经度", required = true, example = "37.966944")
private String latitude;
}

@ -1,23 +1,35 @@
package cc.yunxi.domain.dto; package cc.yunxi.domain.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
/** /**
* DTO * DTO
*/ */
@Data @Data
@ApiModel(description = "用户信息实体")
public class UserDTO { public class UserDTO {
private String userType; // 1 回收员 2 散户 @ApiModelProperty(value = "用户类型 (1 回收员 2 散户)", required = true)
private String userType;
@ApiModelProperty(value = "用户id", required = true)
private String id; private String id;
@ApiModelProperty(value = "回收站id(回收员专用)", required = false)
private String stationId;
@ApiModelProperty(value = "用户名称", required = false)
private String username; private String username;
@ApiModelProperty(value = "用户手机号", required = true)
private String phone; private String phone;
@ApiModelProperty(value = "openid", required = true)
private String openid; private String openid;
private String token; // 访问token @ApiModelProperty(value = "访问token", required = false)
private String token; // 返回时有用
} }

@ -64,11 +64,18 @@ public class RecycleOrder {
@TableField("client_mobile") @TableField("client_mobile")
private String clientMobile; private String clientMobile;
@ApiModelProperty("散户下单地址")
@ApiModelProperty("回收地址")
@TableField("recycle_address") @TableField("recycle_address")
private String recycleAddress; private String recycleAddress;
@ApiModelProperty("下单地址-经度")
@TableField("longitude")
private String longitude;
@ApiModelProperty("下单地址-纬度")
@TableField("latitude")
private String latitude;
@ApiModelProperty("回收员id") @ApiModelProperty("回收员id")
@TableField("staffs_id") @TableField("staffs_id")
private String staffsId; private String staffsId;
@ -90,13 +97,13 @@ public class RecycleOrder {
@TableField("appointment_time_end") @TableField("appointment_time_end")
private LocalDateTime appointmentTimeEnd; private LocalDateTime appointmentTimeEnd;
@ApiModelProperty("协商上门时间起") // @ApiModelProperty("协商上门时间起")
@TableField("consult_time_start") // @TableField("consult_time_start")
private LocalDateTime consultTimeStart; // private LocalDateTime consultTimeStart;
//
@ApiModelProperty("协商上门时间止") // @ApiModelProperty("协商上门时间止")
@TableField("consult_time_end") // @TableField("consult_time_end")
private LocalDateTime consultTimeEnd; // private LocalDateTime consultTimeEnd;
@ApiModelProperty("收货时间") @ApiModelProperty("收货时间")
@TableField("receive_time") @TableField("receive_time")
@ -110,32 +117,36 @@ public class RecycleOrder {
@TableField("remark") @TableField("remark")
private String remark; private String remark;
@ApiModelProperty("综合评分") // @ApiModelProperty("综合评分")
@TableField("star_score") // @TableField("star_score")
private Integer starScore; // private Integer starScore;
//
@ApiModelProperty("评价详情") // @ApiModelProperty("评价详情")
@TableField("comment") // @TableField("comment")
private String comment; // private String comment;
//
@ApiModelProperty("评价图片") // @ApiModelProperty("评价图片")
@TableField("comment_pics") // @TableField("comment_pics")
private String commentPics; // private String commentPics;
//
@ApiModelProperty("响应速度") // @ApiModelProperty("响应速度")
@TableField("response_star") // @TableField("response_star")
private Integer responseStar; // private Integer responseStar;
//
@ApiModelProperty("服务态度") // @ApiModelProperty("服务态度")
@TableField("attitude_star") // @TableField("attitude_star")
private Integer attitudeStar; // private Integer attitudeStar;
//
@ApiModelProperty("平台价格") // @ApiModelProperty("平台价格")
@TableField("price_star") // @TableField("price_star")
private Integer priceStar; // private Integer priceStar;
//
@ApiModelProperty("系统是否删除") // @ApiModelProperty("系统是否删除")
@TableField("is_deleted") // @TableField("is_deleted")
private Integer isDeleted; // private Integer isDeleted;
@ApiModelProperty("订单距离(回收员专用)")
@TableField(exist = false)
private String distance;
} }

@ -1,6 +1,7 @@
package cc.yunxi.domain.query; package cc.yunxi.domain.query;
import cc.yunxi.common.domain.PageQuery; import cc.yunxi.common.domain.PageQuery;
import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.enums.OrderStatusEnum; import cc.yunxi.enums.OrderStatusEnum;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -18,10 +19,8 @@ public class RecycleOrderQuery extends PageQuery {
@ApiModelProperty(value = "订单状态", required = false, example = "PENDING") @ApiModelProperty(value = "订单状态", required = false, example = "PENDING")
private OrderStatusEnum status; private OrderStatusEnum status;
@ApiModelProperty(value = "散户经度", required = false, example = "30.20")
private Double longitude;
@ApiModelProperty(value = "散户纬度", required = false, example = "30.20") @ApiModelProperty(value = "回收员当前经度", required = false)
private Double latitude; private LocationDTO location;
} }

@ -30,6 +30,14 @@ public class RecycleOrderCreateVO {
@NotBlank(message = "散户地址不能为空") @NotBlank(message = "散户地址不能为空")
private String recycleAddress; private String recycleAddress;
@ApiModelProperty(value = "下单地址经度", required = true, example = "119.643888")
@NotBlank(message = "下单地址经度不能为空")
private Double longitude;
@ApiModelProperty(value = "下单地址纬度", required = true, example = "37.966944")
@NotBlank(message = "下单地址纬度不能为空")
private Double latitude;
@ApiModelProperty(value = "预约上门时间起", required = true, example = "2024-03-01 15:58:49") @ApiModelProperty(value = "预约上门时间起", required = true, example = "2024-03-01 15:58:49")
@NotNull(message = "预约上门时间起不能为空") @NotNull(message = "预约上门时间起不能为空")
@Future(message = "预约上门时间起不正确") @Future(message = "预约上门时间起不正确")

@ -66,11 +66,11 @@ public class RecycleOrderRespVO {
@ApiModelProperty("预约上门时间止") @ApiModelProperty("预约上门时间止")
private LocalDateTime appointmentTimeEnd; private LocalDateTime appointmentTimeEnd;
@ApiModelProperty("协商上门时间起") // @ApiModelProperty("协商上门时间起")
private LocalDateTime consultTimeStart; // private LocalDateTime consultTimeStart;
//
@ApiModelProperty("协商上门时间止") // @ApiModelProperty("协商上门时间止")
private LocalDateTime consultTimeEnd; // private LocalDateTime consultTimeEnd;
@ApiModelProperty("收货时间") @ApiModelProperty("收货时间")
private LocalDateTime receiveTime; private LocalDateTime receiveTime;
@ -81,25 +81,28 @@ public class RecycleOrderRespVO {
@ApiModelProperty("备注") @ApiModelProperty("备注")
private String remark; private String remark;
@ApiModelProperty("综合评分") // @ApiModelProperty("综合评分")
private Integer starScore; // private Integer starScore;
//
@ApiModelProperty("评价详情") // @ApiModelProperty("评价详情")
private String comment; // private String comment;
//
@ApiModelProperty("评价图片") // @ApiModelProperty("评价图片")
private String commentPics; // private String commentPics;
//
@ApiModelProperty("响应速度") // @ApiModelProperty("响应速度")
private Integer responseStar; // private Integer responseStar;
//
@ApiModelProperty("服务态度") // @ApiModelProperty("服务态度")
private Integer attitudeStar; // private Integer attitudeStar;
//
@ApiModelProperty("平台价格") // @ApiModelProperty("平台价格")
private Integer priceStar; // private Integer priceStar;
//
@ApiModelProperty("系统是否删除") // @ApiModelProperty("系统是否删除")
private Integer isDeleted; // private Integer isDeleted;
@ApiModelProperty("订单距离(回收员专用)")
private String distance;
} }

@ -1,5 +1,6 @@
package cc.yunxi.service.impl; package cc.yunxi.service.impl;
import cc.yunxi.common.exception.BizIllegalException;
import cc.yunxi.common.exception.DbException; import cc.yunxi.common.exception.DbException;
import cc.yunxi.common.utils.BeanUtils; import cc.yunxi.common.utils.BeanUtils;
import cc.yunxi.common.utils.CommonUtil; import cc.yunxi.common.utils.CommonUtil;
@ -14,15 +15,18 @@ import cc.yunxi.domain.vo.recycleorder.RecycleOrderUpdateVO;
import cc.yunxi.enums.BusinessCodeEnum; import cc.yunxi.enums.BusinessCodeEnum;
import cc.yunxi.enums.OrderStatusEnum; import cc.yunxi.enums.OrderStatusEnum;
import cc.yunxi.enums.OrderTypeEnum; import cc.yunxi.enums.OrderTypeEnum;
import cc.yunxi.enums.UserTypeEnum;
import cc.yunxi.mapper.RecycleOrderMapper; import cc.yunxi.mapper.RecycleOrderMapper;
import cc.yunxi.service.IClientService; import cc.yunxi.service.IClientService;
import cc.yunxi.service.IRecycleOrderService; import cc.yunxi.service.IRecycleOrderService;
import cc.yunxi.utils.UserContext; import cc.yunxi.utils.UserContext;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -40,16 +44,32 @@ import javax.validation.Valid;
*/ */
@Service @Service
@Validated @Validated
@Slf4j
public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, RecycleOrder> implements IRecycleOrderService { public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, RecycleOrder> implements IRecycleOrderService {
@Resource @Resource
private IClientService clientService; private IClientService clientService;
public Page<RecycleOrder> queryOrderByPage(RecycleOrderQuery recycleOrderQuery) { public Page<RecycleOrder> queryOrderByPage(RecycleOrderQuery recycleOrderQuery) {
QueryWrapper<RecycleOrder> wrapper = new QueryWrapper<>(); LambdaQueryWrapper<RecycleOrder> wrapper = new LambdaQueryWrapper<>();
wrapper.lambda() UserDTO userDTO = UserContext.getUser();
.eq(StrUtil.isNotEmpty(recycleOrderQuery.getId()), RecycleOrder::getId, recycleOrderQuery.getId()) if (userDTO.getUserType().equals(UserTypeEnum.CLIENT.getCode())) { // 散户查询
.eq(ObjectUtil.isNotEmpty(recycleOrderQuery.getStatus()), RecycleOrder::getOrderStatus, recycleOrderQuery.getStatus()); wrapper.eq(RecycleOrder::getClientId, userDTO.getId());
wrapper.eq(ObjectUtil.isNotEmpty(recycleOrderQuery.getStatus()), RecycleOrder::getOrderStatus, recycleOrderQuery.getStatus());
} else { // 回收员查询
if (StrUtil.isEmpty(userDTO.getStationId())) {
throw new BizIllegalException("请先联系管理员绑定回收站点!");
}
// 只查回收员所在回收站下的订单
wrapper.eq(RecycleOrder::getRecycleStationId, userDTO.getStationId());
// 不为待接单状态时, 只查自己的订单
if (!recycleOrderQuery.getStatus().equals(OrderStatusEnum.PENDING)) {
wrapper.eq(RecycleOrder::getStaffsId, userDTO.getId());
}
// 必须有订单状态查询
wrapper.eq(true, RecycleOrder::getOrderStatus, recycleOrderQuery.getStatus());
}
wrapper.eq(StrUtil.isNotEmpty(recycleOrderQuery.getId()), RecycleOrder::getId, recycleOrderQuery.getId());
Page<RecycleOrder> recycleOrderPage = page( Page<RecycleOrder> recycleOrderPage = page(
recycleOrderQuery.buildPageByDefaultOrder(RecycleOrder::getCreatorTime, true), wrapper); recycleOrderQuery.buildPageByDefaultOrder(RecycleOrder::getCreatorTime, true), wrapper);
return recycleOrderPage; return recycleOrderPage;
@ -77,6 +97,7 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
recycleOrder.setOrderNumber(idNumber); recycleOrder.setOrderNumber(idNumber);
recycleOrder.setOrderType(OrderTypeEnum.SH_ORDER); recycleOrder.setOrderType(OrderTypeEnum.SH_ORDER);
recycleOrder.setOrderStatus(OrderStatusEnum.PENDING); recycleOrder.setOrderStatus(OrderStatusEnum.PENDING);
log.info("create recycleOrder info : {}", recycleOrder);
this.save(recycleOrder); this.save(recycleOrder);
return recycleOrder.getId(); return recycleOrder.getId();
} }
@ -85,8 +106,10 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateOrder(RecycleOrderUpdateVO orderUpdateVO) { public void updateOrder(RecycleOrderUpdateVO orderUpdateVO) {
// 接单后无法修改地址 todo
validateOrderExists(orderUpdateVO.getId()); validateOrderExists(orderUpdateVO.getId());
RecycleOrder recycleOrder = BeanUtils.copyBean(orderUpdateVO, RecycleOrder.class); RecycleOrder recycleOrder = BeanUtils.copyBean(orderUpdateVO, RecycleOrder.class);
log.info("recycleOrder updateVO: {}", recycleOrder);
this.updateById(recycleOrder); this.updateById(recycleOrder);
} }
@ -97,6 +120,7 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
validateOrderExists(userDTO.getId()); validateOrderExists(userDTO.getId());
RecycleOrder recycleOrder = BeanUtils.copyBean(orderTakingVO, RecycleOrder.class); RecycleOrder recycleOrder = BeanUtils.copyBean(orderTakingVO, RecycleOrder.class);
recycleOrder.setOrderStatus(OrderStatusEnum.UNPROCESSED); recycleOrder.setOrderStatus(OrderStatusEnum.UNPROCESSED);
log.info("recycleOrder takingVO: {}", recycleOrder);
this.updateById(recycleOrder); this.updateById(recycleOrder);
} }

Loading…
Cancel
Save