定点、到站回收订单业务功能开发v1

door
LI-CCONG\李聪聪 7 months ago
parent feafd4d4f0
commit 19db7d4b03

@ -7,7 +7,6 @@ import cc.yunxi.common.utils.CommonUtil;
import cc.yunxi.domain.dto.LocationDTO; import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.po.HousingEstate; import cc.yunxi.domain.po.HousingEstate;
import cc.yunxi.domain.vo.housingestate.HousingEstateRespVO; import cc.yunxi.domain.vo.housingestate.HousingEstateRespVO;
import cc.yunxi.domain.vo.recycleorder.RecycleOrderRespVO;
import cc.yunxi.service.IHousingEstateService; import cc.yunxi.service.IHousingEstateService;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@ -15,14 +14,10 @@ import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.constraints.NotBlank;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
@ -57,6 +52,20 @@ public class HousingEstateController {
return CommonResult.success(housingEstateRespVOList); return CommonResult.success(housingEstateRespVOList);
} }
@ApiOperation("回收站下辖小区")
@GetMapping("/list-by-station")
public CommonResult<List<HousingEstateRespVO>> getHousingListByStation(
@NotBlank(message = "回收站id不能为空") @RequestParam("stationId") String stationId) {
List<HousingEstate> housingList = housingEstateService.getHousingListByStation(stationId);
List<HousingEstateRespVO> housingEstateRespVOList = BeanUtils.copyList(housingList, HousingEstateRespVO.class, (s,t) -> {
t.setLocation(new LocationDTO(s.getLongitude(), s.getLatitude()));
// t.setDistance(String.valueOf(new Double(s.getDistance()) / 1000));
});
return CommonResult.success(housingEstateRespVOList);
}
@ApiOperation("小区详情") @ApiOperation("小区详情")
@GetMapping("/info") @GetMapping("/info")
public CommonResult<HousingEstateRespVO> getNearbyHousing(String housingEstateId, LocationDTO location) { public CommonResult<HousingEstateRespVO> getNearbyHousing(String housingEstateId, LocationDTO location) {

@ -12,8 +12,10 @@ import cc.yunxi.domain.dto.UserDTO;
import cc.yunxi.domain.po.*; import cc.yunxi.domain.po.*;
import cc.yunxi.domain.vo.clientaddress.ClientAddressSimpleVO; import cc.yunxi.domain.vo.clientaddress.ClientAddressSimpleVO;
import cc.yunxi.domain.vo.priceproduct.ProductSimpleVO; import cc.yunxi.domain.vo.priceproduct.ProductSimpleVO;
import cc.yunxi.domain.vo.recycleorder.*;
import cc.yunxi.domain.query.RecycleOrderQuery; import cc.yunxi.domain.query.RecycleOrderQuery;
import cc.yunxi.domain.vo.recycleorder.dzorder.DZRecycleOrderCreateVO;
import cc.yunxi.domain.vo.recycleorder.shorder.*;
import cc.yunxi.domain.vo.recycleorder.tmorder.TMRecycleOrderCreateVO;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailResponseVO; import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailResponseVO;
import cc.yunxi.domain.vo.recycler.RecyclerSimpleVO; import cc.yunxi.domain.vo.recycler.RecyclerSimpleVO;
import cc.yunxi.enums.UserTypeEnum; import cc.yunxi.enums.UserTypeEnum;
@ -25,10 +27,8 @@ 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;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -60,6 +60,9 @@ public class RecycleOrderController {
@ApiOperation("分页查询回收订单") @ApiOperation("分页查询回收订单")
@PostMapping("/page") @PostMapping("/page")
public CommonResult<PageDTO<RecycleOrderRespVO>> queryOrderByPage(@RequestBody RecycleOrderQuery recycleOrderQuery) { public CommonResult<PageDTO<RecycleOrderRespVO>> queryOrderByPage(@RequestBody RecycleOrderQuery recycleOrderQuery) {
if (ObjectUtil.isEmpty(recycleOrderQuery.getOrderType())) {
throw new BizIllegalException("请确定要查询的订单类型");
}
// 1.解析用户上下文 // 1.解析用户上下文
UserDTO userDTO = UserContext.getUser(); UserDTO userDTO = UserContext.getUser();
recycleOrderQuery.setUserType(userDTO.getUserType()).setUserId(userDTO.getId()).setStationId(userDTO.getStationId()); recycleOrderQuery.setUserType(userDTO.getUserType()).setUserId(userDTO.getId()).setStationId(userDTO.getStationId());
@ -74,7 +77,7 @@ public class RecycleOrderController {
return CommonResult.success(recycleOrderPageVO); return CommonResult.success(recycleOrderPageVO);
} }
@ApiOperation("散户创建回收订单") @ApiOperation("散户预约回收订单")
@PostMapping("/create") @PostMapping("/create")
@UserTypeAnnotation(UserTypeEnum.CLIENT) @UserTypeAnnotation(UserTypeEnum.CLIENT)
public CommonResult<String> createOrder(@RequestBody RecycleOrderCreateVO orderCreateVO) { public CommonResult<String> createOrder(@RequestBody RecycleOrderCreateVO orderCreateVO) {
@ -85,7 +88,30 @@ public class RecycleOrderController {
} }
@ApiOperation("回收订单详情") @ApiOperation("定点回收订单")
@PostMapping("/create-by-housing")
@UserTypeAnnotation(UserTypeEnum.CLIENT)
public CommonResult<String> createOrderByHousing(@RequestBody TMRecycleOrderCreateVO tmOrderCreateVO) {
UserDTO userDTO = UserContext.getUser();
tmOrderCreateVO.setClientId(userDTO.getId());
String orderId = recycleOrderService.createOrderByHousing(tmOrderCreateVO);
return CommonResult.success(orderId);
}
@ApiOperation("到站回收订单")
@PostMapping("/create-by-station")
@UserTypeAnnotation(UserTypeEnum.RECYCLER)
public CommonResult<String> createOrderByStation(@RequestBody DZRecycleOrderCreateVO dzOrderCreateVO) {
UserDTO userDTO = UserContext.getUser();
dzOrderCreateVO.setRecyclerId(userDTO.getId());
String orderId = recycleOrderService.createOrderByStation(dzOrderCreateVO);
return CommonResult.success(orderId);
}
@ApiOperation("回收订单详情") // todo
@GetMapping("/info") @GetMapping("/info")
public CommonResult<RecycleOrderRespVO> findOrder(@RequestParam("orderId") String orderId, LocationDTO location) { public CommonResult<RecycleOrderRespVO> findOrder(@RequestParam("orderId") String orderId, LocationDTO location) {
RecycleOrder recycleOrder = recycleOrderService.getOrderById(orderId); RecycleOrder recycleOrder = recycleOrderService.getOrderById(orderId);
@ -116,7 +142,6 @@ public class RecycleOrderController {
} }
@ApiOperation("回收订单更新") @ApiOperation("回收订单更新")
@PostMapping("/update") @PostMapping("/update")
@UserTypeAnnotation(UserTypeEnum.CLIENT) @UserTypeAnnotation(UserTypeEnum.CLIENT)
@ -166,6 +191,19 @@ public class RecycleOrderController {
return CommonResult.success(true); return CommonResult.success(true);
} }
@ApiOperation("确认完成定点订单")
@PostMapping("/complete-dz")
@UserTypeAnnotation(UserTypeEnum.RECYCLER)
public CommonResult<Boolean> completeTMOrder(@RequestBody RecycleOrderFinishVO orderCompleteVO) {
UserDTO userDTO = UserContext.getUser();
orderCompleteVO.setStaffsId(userDTO.getId());
recycleOrderService.finishOrder(orderCompleteVO);
return CommonResult.success(true);
}
/** /**
* *
* @param orderRespVOList * @param orderRespVOList

@ -10,7 +10,6 @@ import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.po.RecycleStation; import cc.yunxi.domain.po.RecycleStation;
import cc.yunxi.domain.query.RecycleStationQuery; import cc.yunxi.domain.query.RecycleStationQuery;
import cc.yunxi.domain.vo.priceproduct.ProductRespVO; import cc.yunxi.domain.vo.priceproduct.ProductRespVO;
import cc.yunxi.domain.vo.recycleorder.RecycleOrderRespVO;
import cc.yunxi.domain.vo.recyclestation.RecycleStationRespVO; import cc.yunxi.domain.vo.recyclestation.RecycleStationRespVO;
import cc.yunxi.service.IRecycleStationService; import cc.yunxi.service.IRecycleStationService;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;

@ -6,6 +6,7 @@ import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -17,8 +18,7 @@ import lombok.Setter;
* @author ccongli * @author ccongli
* @since 2024-03-14 10:26:03 * @since 2024-03-14 10:26:03
*/ */
@Getter @Data
@Setter
@TableName("nx_client_address") @TableName("nx_client_address")
@ApiModel(value = "ClientAddress", description = "散户地址信息") @ApiModel(value = "ClientAddress", description = "散户地址信息")
public class ClientAddress { public class ClientAddress {

@ -79,7 +79,7 @@ public class RecycleOrder {
@TableField("latitude") @TableField("latitude")
private String latitude; private String latitude;
@ApiModelProperty(value = "废品预估重量", required = true) @ApiModelProperty(value = "废品预估重量")
@TableField("predict_weight") @TableField("predict_weight")
private ProductWeightEnum predictWeight; private ProductWeightEnum predictWeight;
@ -135,6 +135,10 @@ public class RecycleOrder {
@TableField("settle_time") @TableField("settle_time")
private LocalDateTime settleTime; private LocalDateTime settleTime;
@ApiModelProperty("小区id")
@TableField("housing_estate_id")
private String housingEstateId;
@ApiModelProperty("备注") @ApiModelProperty("备注")
@TableField("remark") @TableField("remark")
private String remark; private String remark;

@ -10,6 +10,7 @@ import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -21,8 +22,7 @@ import lombok.Setter;
* @author ccongli * @author ccongli
* @since 2024-03-09 09:29:28 * @since 2024-03-09 09:29:28
*/ */
@Getter @Data
@Setter
@TableName("nx_recycle_order_product") @TableName("nx_recycle_order_product")
@ApiModel(value = "RecycleOrderProduct对象", description = "回收订单-废品信息表") @ApiModel(value = "RecycleOrderProduct对象", description = "回收订单-废品信息表")
public class RecycleOrderProduct { public class RecycleOrderProduct {

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -20,8 +21,7 @@ import java.util.Date;
* @author ccongli * @author ccongli
* @since 2024-03-08 01:41:56 * @since 2024-03-08 01:41:56
*/ */
@Getter @Data
@Setter
@TableName("nx_price_recycle") @TableName("nx_price_recycle")
@ApiModel(value = "RecycleStationPrice", description = "回收站价目表") @ApiModel(value = "RecycleStationPrice", description = "回收站价目表")
public class RecycleStationPrice { public class RecycleStationPrice {

@ -4,6 +4,7 @@ import cc.yunxi.common.domain.PageQuery;
import cc.yunxi.domain.dto.LocationDTO; import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.po.RecycleOrder; import cc.yunxi.domain.po.RecycleOrder;
import cc.yunxi.enums.OrderStatusEnum; import cc.yunxi.enums.OrderStatusEnum;
import cc.yunxi.enums.OrderTypeEnum;
import cc.yunxi.enums.UserTypeEnum; import cc.yunxi.enums.UserTypeEnum;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -23,6 +24,16 @@ public class RecycleOrderQuery extends PageQuery<RecycleOrder> {
@ApiModelProperty(value = "订单状态", required = false, example = "PENDING") @ApiModelProperty(value = "订单状态", required = false, example = "PENDING")
private OrderStatusEnum status; private OrderStatusEnum status;
@ApiModelProperty(value = "订单类型", required = true, example = "SH_ORDER")
private OrderTypeEnum orderType;
@ApiModelProperty(value = "小区ID", required = false, example = "520190202195480901")
private String housingEstateId;
@ApiModelProperty(value = "散户手机号", required = false, example = "17802164218")
private String mobile;
// 计算距离使用,不参与条件查询
@ApiModelProperty(value = "回收员当前位置", required = false) @ApiModelProperty(value = "回收员当前位置", required = false)
private LocationDTO location; private LocationDTO location;

@ -11,7 +11,7 @@ import java.time.LocalDateTime;
/** /**
* <p> * <p>
* *
* </p> * </p>
* *
* @author ccongli * @author ccongli

@ -0,0 +1,60 @@
package cc.yunxi.domain.vo.housingestate;
import cc.yunxi.domain.dto.LocationDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author ccongli
* @since 2024-03-18 02:31:50
*/
@Data
@ApiModel(value = "HousingEstate", description = "小区信息 Simple VO")
public class HousingEstateSimpleVO {
@ApiModelProperty("主键id")
private String id;
@ApiModelProperty("小区名")
private String name;
@ApiModelProperty("小区详细地址")
private String address;
@ApiModelProperty("位置信息")
private LocationDTO location;
@ApiModelProperty("定点回收地址")
private String recycleAddress;
@ApiModelProperty("定点回收时间起")
private String appointmentTimeStart;
@ApiModelProperty("定点回收时间止")
private String appointmentTimeEnd;
@ApiModelProperty("所属回收站id")
private String stationId;
// @ApiModelProperty("有效标志(0-禁用1-启用)")
// @TableField("enabled_mark")
// private Integer enabledMark;
@ApiModelProperty("创建时间")
private LocalDateTime creatorTime;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("小区距离(km)")
private String distance;
}

@ -0,0 +1,31 @@
package cc.yunxi.domain.vo.recycleorder.dzorder;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailUpdateVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
@ApiModel(description = "到站回收订单- 到站下单 Request VO")
@Data
public class DZRecycleOrderCreateVO {
@ApiModelProperty(value = "散户手机号", required = true, example = "17802164218")
private String clientMobile;
@ApiModelProperty(value = "订单明细", required = true)
@NotNull(message = "订单明细未提交")
@Valid
private List<RecycleOrderDetailUpdateVO> orderDetails;
@ApiModelProperty(value = "订单备注", required = false, example = "请尽快上门")
private String remark;
@ApiModelProperty(value = "回收员id", hidden = true, example = "17802164218")
private String recyclerId;
}

@ -0,0 +1,63 @@
package cc.yunxi.domain.vo.recycleorder.dzorder;
import cc.yunxi.domain.vo.housingestate.HousingEstateSimpleVO;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailResponseVO;
import cc.yunxi.domain.vo.recycler.RecyclerSimpleVO;
import cc.yunxi.enums.OrderStatusEnum;
import cc.yunxi.enums.OrderTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@ApiModel(description = "到站回收订单 Response VO")
@Data
public class DZRecycleOrderRespVO {
@ApiModelProperty("主键id")
private String id;
@ApiModelProperty("回收站id")
private String recycleStationId;
@ApiModelProperty("订单编号")
private String orderNumber;
@ApiModelProperty("订单类型")
private OrderTypeEnum orderType;
@ApiModelProperty("订单金额(元)")
private BigDecimal orderAmount;
@ApiModelProperty("订单状态")
private OrderStatusEnum orderStatus;
@ApiModelProperty("散户id")
private String clientId;
@ApiModelProperty("散户姓名")
private String clientName;
@ApiModelProperty("散户手机号")
private String clientMobile;
@ApiModelProperty("回收员id")
private String staffsId;
@ApiModelProperty("回收员信息")
private RecyclerSimpleVO recyclerInfo;
@ApiModelProperty("订单明细详情")
private List<RecycleOrderDetailResponseVO> orderDetails;
@ApiModelProperty("订单创建时间")
private LocalDateTime creatorTime;
@ApiModelProperty("完成时间")
private LocalDateTime completeTime;
}

@ -1,4 +1,4 @@
package cc.yunxi.domain.vo.recycleorder; package cc.yunxi.domain.vo.recycleorder.shorder;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;

@ -1,4 +1,4 @@
package cc.yunxi.domain.vo.recycleorder; package cc.yunxi.domain.vo.recycleorder.shorder;
import cc.yunxi.domain.dto.LocationDTO; import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailCreateVO; import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailCreateVO;

@ -1,4 +1,4 @@
package cc.yunxi.domain.vo.recycleorder; package cc.yunxi.domain.vo.recycleorder.shorder;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailUpdateVO; import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailUpdateVO;

@ -1,4 +1,4 @@
package cc.yunxi.domain.vo.recycleorder; package cc.yunxi.domain.vo.recycleorder.shorder;
import cc.yunxi.domain.dto.LocationDTO; import cc.yunxi.domain.dto.LocationDTO;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;

@ -1,4 +1,4 @@
package cc.yunxi.domain.vo.recycleorder; package cc.yunxi.domain.vo.recycleorder.shorder;
import cc.yunxi.domain.dto.LocationDTO; import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.vo.clientaddress.ClientAddressSimpleVO; import cc.yunxi.domain.vo.clientaddress.ClientAddressSimpleVO;

@ -1,4 +1,4 @@
package cc.yunxi.domain.vo.recycleorder; package cc.yunxi.domain.vo.recycleorder.shorder;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;

@ -1,4 +1,4 @@
package cc.yunxi.domain.vo.recycleorder; package cc.yunxi.domain.vo.recycleorder.shorder;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;

@ -0,0 +1,32 @@
package cc.yunxi.domain.vo.recycleorder.tmorder;
import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailCreateVO;
import cc.yunxi.enums.ProductWeightEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.Future;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.List;
@ApiModel(description = "定点回收订单- 指定小区下单 Request VO")
@Data
public class TMRecycleOrderCreateVO {
@ApiModelProperty(value = "散户id", hidden = true, example = "1763507031581421570")
private String clientId;
@ApiModelProperty(value = "小区id", required = true, example = "520193382480351557")
@NotBlank(message = "小区id不能为空")
private String housingEstateId;
@ApiModelProperty(value = "备注", required = false, example = "请尽快上门")
private String remark;
}

@ -0,0 +1,68 @@
package cc.yunxi.domain.vo.recycleorder.tmorder;
import cc.yunxi.domain.vo.clientaddress.ClientAddressSimpleVO;
import cc.yunxi.domain.vo.housingestate.HousingEstateSimpleVO;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailResponseVO;
import cc.yunxi.domain.vo.recycler.RecyclerSimpleVO;
import cc.yunxi.enums.OrderStatusEnum;
import cc.yunxi.enums.OrderTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@ApiModel(description = "定点回收订单 Response VO")
@Data
public class TMRecycleOrderRespVO {
@ApiModelProperty("主键id")
private String id;
@ApiModelProperty("回收站id")
private String recycleStationId;
@ApiModelProperty("订单编号")
private String orderNumber;
@ApiModelProperty("订单类型")
private OrderTypeEnum orderType;
@ApiModelProperty("订单金额(元)")
private BigDecimal orderAmount;
@ApiModelProperty("订单状态")
private OrderStatusEnum orderStatus;
@ApiModelProperty("散户id")
private String clientId;
@ApiModelProperty("散户姓名")
private String clientName;
@ApiModelProperty("散户手机号")
private String clientMobile;
@ApiModelProperty("回收员id")
private String staffsId;
@ApiModelProperty("小区地址信息")
private HousingEstateSimpleVO housingInfo;
@ApiModelProperty("回收员信息")
private RecyclerSimpleVO recyclerInfo;
@ApiModelProperty("订单明细详情")
private List<RecycleOrderDetailResponseVO> orderDetails;
@ApiModelProperty("创建时间")
private LocalDateTime creatorTime;
@ApiModelProperty("完成时间")
private LocalDateTime completeTime;
}

@ -11,7 +11,7 @@ import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ApiModel(description = "回收订单更新明细 Request VO") @ApiModel(description = "回收订单更新/结算明细 Request VO")
@Data @Data
public class RecycleOrderDetailUpdateVO { public class RecycleOrderDetailUpdateVO {
@ -28,10 +28,11 @@ public class RecycleOrderDetailUpdateVO {
@DecimalMin(value = "0.00", message = "废品实际重量数值错误") @DecimalMin(value = "0.00", message = "废品实际重量数值错误")
private Double productActualWeight; private Double productActualWeight;
@ApiModelProperty(value = "当前回收单价", required = true, example = "100.00")
// @NotBlank(message = "当前回收单价不能为空")
@DecimalMin(value = "0.01", message = "当前回收单价数值错误")
private BigDecimal recoveryPrice;
// @ApiModelProperty(value = "实际回收单价", required = true, example = "100.00")
// @NotBlank(message = "实际回收单价不能为空")
// @DecimalMin(value = "0.01", message = "实际回收单价数值错误")
@ApiModelProperty(value = "实际回收单价", hidden = true) @ApiModelProperty(value = "实际回收单价", hidden = true)
private BigDecimal actualRecoveryPrice; private BigDecimal actualRecoveryPrice;

@ -48,12 +48,19 @@ public interface IClientService extends IService<Client> {
Client getClientByOpenid(String openid); Client getClientByOpenid(String openid);
/** /**
* keyId * idopenId
* @param keyId * @param keyId
* @return Client * @return Client
*/ */
Client getClientByKeyId(String keyId); Client getClientByKeyId(String keyId);
/**
*
* @param mobile
* @return Client
*/
Client getClientByMobile(String mobile);
/** /**
* *
* @param phoneNumber * @param phoneNumber

@ -26,6 +26,14 @@ public interface IHousingEstateService extends IService<HousingEstate> {
List<HousingEstate> getNearbyHousingList(@Valid LocationDTO location); List<HousingEstate> getNearbyHousingList(@Valid LocationDTO location);
/**
*
* @param stationId
* @return HousingEstate
*/
List<HousingEstate> getHousingListByStation(String stationId);
/** /**
* *
* @param housingEstateId * @param housingEstateId

@ -1,16 +1,14 @@
package cc.yunxi.service; package cc.yunxi.service;
import cc.yunxi.domain.po.RecycleOrder; import cc.yunxi.domain.po.RecycleOrder;
import cc.yunxi.domain.po.RecycleOrderProduct;
import cc.yunxi.domain.po.Recycler;
import cc.yunxi.domain.query.RecycleOrderQuery; import cc.yunxi.domain.query.RecycleOrderQuery;
import cc.yunxi.domain.query.RecyclerQuery; import cc.yunxi.domain.vo.recycleorder.dzorder.DZRecycleOrderCreateVO;
import cc.yunxi.domain.vo.recycleorder.*; import cc.yunxi.domain.vo.recycleorder.shorder.*;
import cc.yunxi.domain.vo.recycleorder.tmorder.TMRecycleOrderCreateVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List;
/** /**
* <p> * <p>
@ -38,13 +36,29 @@ public interface IRecycleOrderService extends IService<RecycleOrder> {
/** /**
* *
* @param orderCreateVO * @param orderCreateVO
* @return ID * @return ID
*/ */
String createOrder(@Valid RecycleOrderCreateVO orderCreateVO); String createOrder(@Valid RecycleOrderCreateVO orderCreateVO);
/**
*
* @param tmOrderCreateVO
* @return ID
*/
String createOrderByHousing(@Valid TMRecycleOrderCreateVO tmOrderCreateVO);
/**
*
* @param dzOrderCreateVO
* @return ID
*/
String createOrderByStation(@Valid DZRecycleOrderCreateVO dzOrderCreateVO);
/** /**
* *
* @param orderUpdateVO * @param orderUpdateVO
@ -71,8 +85,9 @@ public interface IRecycleOrderService extends IService<RecycleOrder> {
*/ */
void reachOrder(@Valid RecycleOrderReachVO orderReachVO); void reachOrder(@Valid RecycleOrderReachVO orderReachVO);
/** /**
* *
* @param orderFinishVO * @param orderFinishVO
*/ */
void finishOrder(@Valid RecycleOrderFinishVO orderFinishVO); void finishOrder(@Valid RecycleOrderFinishVO orderFinishVO);

@ -119,6 +119,17 @@ public class ClientServiceImpl extends ServiceImpl<ClientMapper, Client> impleme
return client; return client;
} }
@Override
public Client getClientByMobile(String mobile) {
LambdaQueryWrapper<Client> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Client::getMobilePhone, mobile);
Client client = this.getOne(wrapper);
if (client == null) {
throw new BizIllegalException("散户不存在");
}
return client;
}
@Override @Override
@Transactional @Transactional

@ -1,5 +1,6 @@
package cc.yunxi.service.impl; package cc.yunxi.service.impl;
import cc.yunxi.common.domain.LambdaQueryWrapperX;
import cc.yunxi.common.exception.BizIllegalException; import cc.yunxi.common.exception.BizIllegalException;
import cc.yunxi.domain.dto.LocationDTO; import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.po.HousingEstate; import cc.yunxi.domain.po.HousingEstate;
@ -7,6 +8,7 @@ import cc.yunxi.domain.po.RecycleOrder;
import cc.yunxi.mapper.HousingEstateMapper; import cc.yunxi.mapper.HousingEstateMapper;
import cc.yunxi.service.IHousingEstateService; import cc.yunxi.service.IHousingEstateService;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -36,6 +38,13 @@ public class HousingEstateServiceImpl extends ServiceImpl<HousingEstateMapper, H
return housingEstateMapper.getNearbyHousingList(location); return housingEstateMapper.getNearbyHousingList(location);
} }
@Override
public List<HousingEstate> getHousingListByStation(String stationId) {
LambdaQueryWrapper<HousingEstate> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(HousingEstate::getStationId, stationId);
return this.list(wrapper);
}
@Override @Override
public HousingEstate getHousingInfo(String housingEstateId) { public HousingEstate getHousingInfo(String housingEstateId) {
if (StrUtil.isEmpty(housingEstateId)) { if (StrUtil.isEmpty(housingEstateId)) {

@ -1,14 +1,16 @@
package cc.yunxi.service.impl; package cc.yunxi.service.impl;
import cc.yunxi.common.domain.LambdaQueryWrapperX;
import cc.yunxi.common.exception.BizIllegalException; import cc.yunxi.common.exception.BizIllegalException;
import cc.yunxi.common.exception.DbException;
import cc.yunxi.common.exception.ForbiddenException; import cc.yunxi.common.exception.ForbiddenException;
import cc.yunxi.common.utils.BeanUtils; import cc.yunxi.common.utils.BeanUtils;
import cc.yunxi.common.utils.CommonUtil; import cc.yunxi.common.utils.CommonUtil;
import cc.yunxi.domain.dto.LocationDTO; import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.po.*; import cc.yunxi.domain.po.*;
import cc.yunxi.domain.query.RecycleOrderQuery; import cc.yunxi.domain.query.RecycleOrderQuery;
import cc.yunxi.domain.vo.recycleorder.*; import cc.yunxi.domain.vo.recycleorder.dzorder.DZRecycleOrderCreateVO;
import cc.yunxi.domain.vo.recycleorder.shorder.*;
import cc.yunxi.domain.vo.recycleorder.tmorder.TMRecycleOrderCreateVO;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailCreateVO; import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailCreateVO;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailUpdateVO; import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailUpdateVO;
import cc.yunxi.enums.*; import cc.yunxi.enums.*;
@ -16,7 +18,6 @@ import cc.yunxi.mapper.RecycleOrderMapper;
import cc.yunxi.service.*; import cc.yunxi.service.*;
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.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 lombok.extern.slf4j.Slf4j;
@ -55,29 +56,49 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
@Resource @Resource
private IRecycleStationService recycleStationService; private IRecycleStationService recycleStationService;
@Resource
private IHousingEstateService housingEstateService;
public Page<RecycleOrder> queryOrderByPage(RecycleOrderQuery recycleOrderQuery) { public Page<RecycleOrder> queryOrderByPage(RecycleOrderQuery recycleOrderQuery) {
LambdaQueryWrapper<RecycleOrder> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapperX<RecycleOrder> wrapper = new LambdaQueryWrapperX<>();
// 订单类型首要条件
wrapper.eq(RecycleOrder::getOrderType, recycleOrderQuery.getOrderType());
if (recycleOrderQuery.getUserType().equals(UserTypeEnum.CLIENT)) { // 散户查询 if (recycleOrderQuery.getUserType().equals(UserTypeEnum.CLIENT)) { // 散户查询
wrapper.eq(RecycleOrder::getClientId, recycleOrderQuery.getUserId()); wrapper.eq(RecycleOrder::getClientId, recycleOrderQuery.getUserId());
wrapper.eq(ObjectUtil.isNotEmpty(recycleOrderQuery.getStatus()), RecycleOrder::getOrderStatus, recycleOrderQuery.getStatus()); wrapper.eqIfPresent(RecycleOrder::getOrderStatus, recycleOrderQuery.getStatus());
} else { // 回收员查询 } else { // 回收员查询
if (StrUtil.isEmpty(recycleOrderQuery.getStationId())) { if (StrUtil.isEmpty(recycleOrderQuery.getStationId())) {
throw new ForbiddenException("请先联系管理员绑定回收站点!"); throw new ForbiddenException("请先联系管理员绑定回收站点!");
} }
// 只查回收员所在回收站下的订单 // 只查回收员所在回收站下的订单
wrapper.eq(RecycleOrder::getRecycleStationId, recycleOrderQuery.getStationId()); wrapper.eq(RecycleOrder::getRecycleStationId, recycleOrderQuery.getStationId());
// 不为待接单状态时, 只查自己的订单 switch (recycleOrderQuery.getOrderType()) {
if (!OrderStatusEnum.PENDING.equals(recycleOrderQuery.getStatus())) { case SH_ORDER:
wrapper.eq(RecycleOrder::getStaffsId, recycleOrderQuery.getUserId()); // 不为待接单状态时, 只查自己的订单
} if (!OrderStatusEnum.PENDING.equals(recycleOrderQuery.getStatus())) {
// 订单状态查询 wrapper.eq(RecycleOrder::getStaffsId, recycleOrderQuery.getUserId());
if (OrderStatusEnum.UNPROCESSED.equals(recycleOrderQuery.getStatus())) { // 进行中 }
wrapper.in(RecycleOrder::getOrderStatus, OrderStatusEnum.UNPROCESSED.getCode(), OrderStatusEnum.RECYCLING.getCode()); // 订单状态查询
} else { if (OrderStatusEnum.UNPROCESSED.equals(recycleOrderQuery.getStatus())) { // 进行中
wrapper.eq(RecycleOrder::getOrderStatus, recycleOrderQuery.getStatus()); wrapper.in(RecycleOrder::getOrderStatus, OrderStatusEnum.UNPROCESSED.getCode(), OrderStatusEnum.RECYCLING.getCode());
} else {
wrapper.eq(RecycleOrder::getOrderStatus, recycleOrderQuery.getStatus());
}
break;
case TM_RECOVERY:
// 根据小区id查询
wrapper.eq(RecycleOrder::getHousingEstateId, recycleOrderQuery.getHousingEstateId());
// 散户手机号查询
wrapper.likeIfPresent(RecycleOrder::getClientMobile, recycleOrderQuery.getMobile());
break;
case DZ_RECOVERY:
// 散户手机号查询
wrapper.likeIfPresent(RecycleOrder::getClientMobile, recycleOrderQuery.getMobile());
break;
} }
} }
wrapper.eq(StrUtil.isNotEmpty(recycleOrderQuery.getId()), RecycleOrder::getId, recycleOrderQuery.getId()); // 订单id查询
wrapper.eqIfPresent(RecycleOrder::getId, recycleOrderQuery.getId());
// 默认按创建时间倒序、已完成则按结算时间倒序 // 默认按创建时间倒序、已完成则按结算时间倒序
if (OrderStatusEnum.FINISHED.equals(recycleOrderQuery.getStatus())) { if (OrderStatusEnum.FINISHED.equals(recycleOrderQuery.getStatus())) {
recycleOrderQuery.addOrderItem(RecycleOrder::getCompleteTime, false); recycleOrderQuery.addOrderItem(RecycleOrder::getCompleteTime, false);
@ -105,9 +126,6 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
public String createOrder(RecycleOrderCreateVO orderCreateVO) { public String createOrder(RecycleOrderCreateVO orderCreateVO) {
// 查询散户是否存在 // 查询散户是否存在
Client client = clientService.getClientById(orderCreateVO.getClientId()); Client client = clientService.getClientById(orderCreateVO.getClientId());
if (ObjectUtil.isEmpty(client)) {
throw new DbException("散户不存在!");
}
// 判断下单地址和回收站的距离 // 判断下单地址和回收站的距离
LocationDTO location = orderCreateVO.getLocation(); LocationDTO location = orderCreateVO.getLocation();
RecycleStation recycleStation = recycleStationService.getStationById(orderCreateVO.getRecycleStationId()); RecycleStation recycleStation = recycleStationService.getStationById(orderCreateVO.getRecycleStationId());
@ -117,6 +135,7 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
if (acceptRange.compareTo(distance) < 0) { if (acceptRange.compareTo(distance) < 0) {
throw new BizIllegalException("超出回收站接单范围!"); throw new BizIllegalException("超出回收站接单范围!");
} }
LocalDateTime now = LocalDateTime.now();
// 创建订单 // 创建订单
RecycleOrder recycleOrder = BeanUtils.copyBean(orderCreateVO, RecycleOrder.class, (source, target) -> { RecycleOrder recycleOrder = BeanUtils.copyBean(orderCreateVO, RecycleOrder.class, (source, target) -> {
target.setLatitude(source.getLocation().getLatitude()); target.setLatitude(source.getLocation().getLatitude());
@ -130,7 +149,7 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
recycleOrder.setDistance(distance.doubleValue()); recycleOrder.setDistance(distance.doubleValue());
recycleOrder.setOrderType(OrderTypeEnum.SH_ORDER); recycleOrder.setOrderType(OrderTypeEnum.SH_ORDER);
recycleOrder.setOrderStatus(OrderStatusEnum.PENDING); recycleOrder.setOrderStatus(OrderStatusEnum.PENDING);
recycleOrder.setCreatorTime(LocalDateTime.now()); recycleOrder.setCreatorTime(now);
log.info("create recycleOrder info : {}", recycleOrder); log.info("create recycleOrder info : {}", recycleOrder);
this.save(recycleOrder); this.save(recycleOrder);
@ -139,7 +158,7 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
List<RecycleOrderDetailCreateVO> recycleOrderProductVOList = orderCreateVO.getOrderDetails(); List<RecycleOrderDetailCreateVO> recycleOrderProductVOList = orderCreateVO.getOrderDetails();
recycleOrderProductVOList.forEach(rp -> { recycleOrderProductVOList.forEach(rp -> {
rp.setRecycleOrderId(orderId); rp.setRecycleOrderId(orderId);
rp.setCreatorTime(LocalDateTime.now()); rp.setCreatorTime(now);
}); });
List<RecycleOrderProduct> recycleOrderProducts = BeanUtils.copyList(recycleOrderProductVOList, RecycleOrderProduct.class); List<RecycleOrderProduct> recycleOrderProducts = BeanUtils.copyList(recycleOrderProductVOList, RecycleOrderProduct.class);
this.recycleOrderProductService.createOrderProducts(recycleOrderProducts); this.recycleOrderProductService.createOrderProducts(recycleOrderProducts);
@ -147,6 +166,86 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
return orderId; return orderId;
} }
@Override
@Transactional(rollbackFor = Exception.class)
public String createOrderByHousing(TMRecycleOrderCreateVO tmOrderCreateVO) {
// 查询散户是否存在
Client client = clientService.getClientById(tmOrderCreateVO.getClientId());
String idNumber = CommonUtil.getIdNumber(BusinessCodeEnum.ORDER.getCode());
String housingEstateId = tmOrderCreateVO.getHousingEstateId();
HousingEstate housingInfo = housingEstateService.getHousingInfo(housingEstateId);
if (housingInfo.getHasSchedule() != 1 || StrUtil.isEmpty(housingInfo.getStationId())) {
throw new BizIllegalException("该小区不支持定点回收或未绑定回收站点!");
}
RecycleOrder recycleOrder = BeanUtils.copyBean(tmOrderCreateVO, RecycleOrder.class);
recycleOrder.setClientId(client.getId());
recycleOrder.setClientName(client.getNickName());
recycleOrder.setClientMobile(client.getMobilePhone());
recycleOrder.setOrderNumber(idNumber);
recycleOrder.setOrderType(OrderTypeEnum.TM_RECOVERY);
recycleOrder.setOrderStatus(OrderStatusEnum.UNPROCESSED);
recycleOrder.setCreatorTime(LocalDateTime.now());
this.save(recycleOrder);
return recycleOrder.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public String createOrderByStation(DZRecycleOrderCreateVO dzOrderCreateVO) {
// 查询散户、回收员信息
Client client = clientService.getClientByMobile(dzOrderCreateVO.getClientMobile());
Recycler recycler = recyclerService.getRecyclerById(dzOrderCreateVO.getRecyclerId());
if (StrUtil.isEmpty(recycler.getStationId())) {
throw new BizIllegalException("警告,该回收员未绑定回收站点!");
}
// 创建订单
String orderNo = CommonUtil.getIdNumber(BusinessCodeEnum.ORDER.getCode());
LocalDateTime now = LocalDateTime.now();
RecycleOrder recycleOrder = new RecycleOrder();
recycleOrder.setClientId(client.getId());
recycleOrder.setClientName(client.getNickName());
recycleOrder.setClientMobile(client.getMobilePhone());
recycleOrder.setOrderNumber(orderNo);
recycleOrder.setOrderType(OrderTypeEnum.DZ_RECOVERY);
recycleOrder.setOrderStatus(OrderStatusEnum.FINISHED); // 直接完成
recycleOrder.setCreatorTime(now);
recycleOrder.setCompleteTime(now); // 完成时间
this.save(recycleOrder);
// 创建订单明细
String orderId = recycleOrder.getId();
List<RecycleOrderDetailUpdateVO> recycleOrderProductVOList = dzOrderCreateVO.getOrderDetails();
List<RecycleOrderProduct> recycleOrderProducts = BeanUtils.copyList(recycleOrderProductVOList, RecycleOrderProduct.class);
recycleOrderProducts.forEach(rp -> {
rp.setRecycleOrderId(orderId);
rp.setCreatorTime(now);
rp.setUpdateTime(now);
PriceProduct latestPriceProduct = this.recycleOrderProductService.getLatestPriceProduct(rp.getProductId());
log.info("latest price product: {}", latestPriceProduct);
if (ObjectUtil.isEmpty(latestPriceProduct)) {
throw new BizIllegalException("产品价格信息未公布,请联系商户!");
}
BigDecimal recoveryPrice = Optional.ofNullable(latestPriceProduct.getRecoveryPrice()).orElse(new BigDecimal("0.00"));
rp.setActualRecoveryPrice(recoveryPrice);
});
this.recycleOrderProductService.createOrderProducts(recycleOrderProducts);
// 订单结算
BigDecimal totalAmount = new BigDecimal("0.00");
for (RecycleOrderProduct recycleOrderProduct : recycleOrderProducts) {
BigDecimal weight = BigDecimal.valueOf(recycleOrderProduct.getProductActualWeight());
BigDecimal price = recycleOrderProduct.getActualRecoveryPrice();
totalAmount = totalAmount.add(weight.multiply(price));
}
recycleOrder.setOrderAmount(totalAmount);
this.updateById(recycleOrder);
// 增加收入余额 异步? todo
clientService.addBalance(client.getId(), totalAmount, orderNo, recycler.getStationId());
return orderId;
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -233,7 +332,6 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
if (recycleOrder.getOrderStatus().equals(OrderStatusEnum.FINISHED)) { if (recycleOrder.getOrderStatus().equals(OrderStatusEnum.FINISHED)) {
throw new BizIllegalException("订单已完成结算!"); throw new BizIllegalException("订单已完成结算!");
} }
// 更新订单明细信息 // 更新订单明细信息
List<RecycleOrderDetailUpdateVO> recycleOrderProductVOList = orderFinishVO.getOrderDetails(); List<RecycleOrderDetailUpdateVO> recycleOrderProductVOList = orderFinishVO.getOrderDetails();
recycleOrderProductVOList.forEach(rp -> { recycleOrderProductVOList.forEach(rp -> {
@ -280,6 +378,8 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
} }
// 校验订单是否存在 // 校验订单是否存在
private void validateOrderExists(String id) { private void validateOrderExists(String id) {
if (this.getOrderById(id) == null) { if (this.getOrderById(id) == null) {

Loading…
Cancel
Save