Commit 19b13468 authored by shiyu's avatar shiyu

后台新增寄售退回功能

parent 2308b6ef
......@@ -118,6 +118,7 @@ public class ShiroConfig {
filterChainDefinitionMap.put("/admin/sysAiAssistant/**", "anon");
filterChainDefinitionMap.put("/admin/sysIMRecord/**", "anon");
filterChainDefinitionMap.put("/admin/consignSaleManage/**", "anon");
filterChainDefinitionMap.put("/admin/returnOrderManage/**", "anon");
filterChainDefinitionMap.put("/admin/invitationCode/**", "anon");
// filterChainDefinitionMap.put("/admin/**", "anon");
......
package com.wwdz.ch.admin.controller;
import com.alibaba.fastjson.JSON;
import com.wwdz.ch.admin.service.ConsignSaleService;
import com.wwdz.ch.admin.service.ReturnOrderService;
import com.wwdz.ch.core.consts.ResultCode;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.db.dto.request.ConsignSaleRecordRequestDto;
import com.wwdz.ch.db.dto.request.ConsignSaleRequestDto;
import com.wwdz.ch.db.dto.request.ReturnOrderRequestDto;
import com.xxdxxs.service.FormHandler;
import com.xxdxxs.utils.StringUtils;
import com.xxdxxs.validation.Validator;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 退货单
*/
@RestController
@RequestMapping("/admin/returnOrderManage")
public class ReturnOrderController {
private static final Logger logger = LoggerFactory.getLogger(ReturnOrderController.class);
@Autowired
ReturnOrderService returnOrderService;
@ApiOperation(value = "查询退货单")
@PostMapping("/findList")
public Result findList(@RequestBody ReturnOrderRequestDto dto) {
logger.info("【请求开始】查询退货单,请求参数:{}", JSON.toJSONString(dto));
return returnOrderService.findList(dto);
}
@ApiOperation(value = "查询退货单详情")
@PostMapping("/findDetail")
public Result findDetail(@RequestBody ReturnOrderRequestDto dto) {
logger.info("【请求开始】查询退货单详情,请求参数:{}", JSON.toJSONString(dto));
Validator validator = new Validator(FormHandler.ofEntity(dto));
validator.set("returnOrderId", "退货单号").must().string()
.end();
if (!validator.isValid()) {
return Result.failed(ResultCode.PARAM_ERROR.getCode(), validator.getErrorInfo());
}
return returnOrderService.findDetail(dto);
}
@ApiOperation(value = "平台寄出商品")
@PostMapping("/send")
public Result send(@RequestBody ReturnOrderRequestDto dto) {
logger.info("【请求开始】平台寄出商品,请求参数:{}", JSON.toJSONString(dto));
Validator validator = new Validator(FormHandler.ofEntity(dto));
validator.set("logisticsCode", "快递公司编码").must().string()
.set("waybill", "运单号").must().string()
.set("returnOrderId", "退货单号").must().string()
.end();
if (!validator.isValid()) {
return Result.failed(ResultCode.PARAM_ERROR.getCode(), validator.getErrorInfo());
}
return returnOrderService.send(dto);
}
}
package com.wwdz.ch.admin.entity.vo;
import com.wwdz.ch.db.domain.UserVo;
import com.xxdxxs.entity.Entity;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class ReturnOrderDetailVo implements Entity {
/**
* 退货单号
*/
private String returnOrderId;
/**
* 对应寄售单号
*/
private String consignSaledId;
/**
* 退货单状态
*/
private Integer state;
/**
* 退货单状态
*/
private String stateName;
/**
* 取消寄售的时间
*/
private Date cancelTime;
/**
* 取消寄售类型
*/
private Integer cancelType;
/**
* 取消寄售类型
*/
private String cancelTypeName;
/**
* 取消寄售原因
*/
private String remark;
/**
* 货品信息
*/
private CoinVo itemVo;
/**
* 是否已经寄回
*/
private Boolean isSended;
/**
* 退货单时间线信息
*/
private List<ReturnOrderRecordVo> returnOrderRecordVoList;
/**
* 发布人信息
*/
private UserVo userVo;
}
package com.wwdz.ch.admin.entity.vo;
import com.xxdxxs.entity.Entity;
import lombok.Data;
import java.util.Date;
@Data
public class ReturnOrderRecordVo implements Entity {
/**
* 退货单
*/
private String saleId;
/**
* 操作时间
*/
private Date createTime;
/**
* 操作内容
*/
private String content;
/**
* 操作理由或成交平台
*/
private String remark;
/**
* 操作类型
*/
private Integer type;
private String typeName;
}
......@@ -326,7 +326,7 @@ public class ConsignSaleServiceImpl implements ConsignSaleService {
consignSaleRecordDao.insert(dto.getSaleId(), "", ConsignSaleEnum.OperateTypeEnum.CONFIRM_RECEIVE.getCode(), null);
return Result.success();
} catch (Exception e) {
logger.info("用户寄出商品 error : {}", e);
logger.info("平台确认签收用户寄出商品 error : {}", e);
}
return Result.failed();
}
......
package com.wwdz.ch.admin.impl;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import com.wwdz.ch.admin.entity.vo.*;
import com.wwdz.ch.admin.service.ItemService;
import com.wwdz.ch.admin.service.ReturnOrderService;
import com.wwdz.ch.core.consts.ConsignSaleEnum;
import com.wwdz.ch.core.consts.LogisticsEnum;
import com.wwdz.ch.core.consts.ReturnOrderEnum;
import com.wwdz.ch.core.entity.ReturnOrderVo;
import com.wwdz.ch.core.type.PageSearchResult;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.CacheUtil;
import com.wwdz.ch.core.util.MediaUtil;
import com.wwdz.ch.core.util.PriceUtil;
import com.wwdz.ch.db.dao.ConsignSaleRecordDao;
import com.wwdz.ch.db.dao.ItemDao;
import com.wwdz.ch.db.dao.ReturnOrderDao;
import com.wwdz.ch.db.dao.ReturnOrderRecordDao;
import com.wwdz.ch.db.domain.*;
import com.wwdz.ch.db.dto.request.CoinRequestDto;
import com.wwdz.ch.db.dto.request.ReturnOrderRequestDto;
import com.wwdz.mall.common.vo.response.CloudServerResponse;
import com.wwdz.user.api.dto.res.address.UserAddressDTO;
import com.wwdz.user.api.service.address.UserAddressReadService;
import com.xxdxxs.utils.EntityMapper;
import com.xxdxxs.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
public class ReturnOrderServiceImpl implements ReturnOrderService {
private static final Logger logger = LoggerFactory.getLogger(ReturnOrderServiceImpl.class);
@Autowired
ReturnOrderDao returnOrderDao;
@Autowired
ReturnOrderRecordDao returnOrderRecordDao;
@Autowired
ItemDao itemDao;
@Reference
UserAddressReadService userAddressReadService;
@Autowired
ConsignSaleRecordDao consignSaleRecordDao;
@Autowired
CacheUtil cacheUtil;
@Autowired
ItemService itemService;
@Override
public Result findList(ReturnOrderRequestDto dto) {
try {
//检查退货单商品寄出是否超过7天未确认,只检查一页的数据,并非全量数据
checkTimeOutForReturnSigned();
List<ReturnOrder> list = returnOrderDao.findByPage(dto);
PageInfo<ReturnOrder> pageInfo = new PageInfo<>(list);
if (CollectionUtils.isEmpty(list)) {
return Result.success();
}
List<Long> itemIds = list.stream().map(ReturnOrder::getItemId).collect(Collectors.toList());
//查询商品的信息
List<Item> itemList = itemDao.findDetails(itemIds);
Map<Long, Item> itemMap = itemList.stream().collect(Collectors.toMap(Item::getId, Function.identity()));
List<ReturnOrderVo> returnOrderVos = new ArrayList<>();
list.forEach(returnOrder -> {
Item item = itemMap.get(returnOrder.getItemId());
ReturnOrderVo returnOrderVo = new ReturnOrderVo();
if (StringUtils.hasLength(item.getImages())) {
String[] image = item.getImages().split(";");
returnOrderVo.setItemImg(image[0]);
}
//查询退货单节点
String returnOrderId = returnOrder.getReturnOrderId();
List<ReturnOrderRecord> returnOrderRecordList = returnOrderRecordDao.findByReturnOrderId(returnOrderId);
//查询addressId对应地址
CloudServerResponse<UserAddressDTO> cloudServerResponse = userAddressReadService.getAddressByAddressId(returnOrder.getAddressId());
//成功的code = 1001
if (cloudServerResponse.getCode() == 1001 && cloudServerResponse.getResult() != null) {
UserAddressDTO userAddressDTO = cloudServerResponse.getResult();
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(userAddressDTO.getUserName());
stringBuffer.append("," + userAddressDTO.getUserPhone());
stringBuffer.append("," + userAddressDTO.getArea());
stringBuffer.append("," + userAddressDTO.getAddress());
returnOrderVo.setReturnAddress(stringBuffer.toString());
}
returnOrderVo.setSaleId(returnOrder.getSaleId());
returnOrderVo.setHomePageImage(MediaUtil.getHomePageImage(item.getImages(), item.getVideos()));
returnOrderVo.setItemName(item.getName());
returnOrderVo.setState(returnOrder.getState());
returnOrderVo.setStateName(ReturnOrderEnum.StateEnum.getNameByCode(returnOrder.getState()));
//设置取消寄售的时间
List<ConsignSaleRecord> consignSaleRecordList = consignSaleRecordDao.find(returnOrder.getSaleId());
List<Integer> cancelTypes = Arrays.asList(ConsignSaleEnum.OperateTypeEnum.SYS_CANCEL.getCode(), ConsignSaleEnum.OperateTypeEnum.CUSTOM_CANCEL.getCode(), ConsignSaleEnum.OperateTypeEnum.TIME_OUT_CANCEL.getCode());
ConsignSaleRecord consignSaleRecord = consignSaleRecordList.stream().filter(record -> cancelTypes.contains(record.getType())).findFirst().orElse(null);
returnOrderVo.setCancelTime(consignSaleRecord.getCreateTime());
//设置物流信息
returnOrderVo.setLogisticsCode(returnOrder.getLogisticsCode());
returnOrderVo.setLogisticsName(LogisticsEnum.getNameByCode(returnOrder.getLogisticsCode()));
returnOrderVo.setWaybill(returnOrder.getWaybill());
if (returnOrder.getState() == ReturnOrderEnum.StateEnum.FINISH.getCode()) {
List<Integer> operateType = returnOrderRecordList.stream().map(ReturnOrderRecord::getType).collect(Collectors.toList());
if (operateType.contains(ReturnOrderEnum.OperateTypeEnum.USER_SIGNED.getCode())) {
returnOrderVo.setSignedType(ReturnOrderEnum.OperateTypeEnum.USER_SIGNED.getCode());
returnOrderVo.setSignedTypeName("用户确认");
returnOrderVo.setRemark("用户确认");
} else {
returnOrderVo.setSignedType(ReturnOrderEnum.OperateTypeEnum.SYSTEM_SIGNED.getCode());
returnOrderVo.setSignedTypeName("超时系统自动确认");
returnOrderVo.setRemark("超时系统自动确认");
}
}
returnOrderVos.add(returnOrderVo);
});
PageSearchResult pageSearchResult = PageSearchResult.of(pageInfo, returnOrderVos);
return Result.success(pageSearchResult);
} catch (Exception e) {
logger.error("查询寄售单列表 error:{}", e);
}
return Result.failed();
}
@Override
public Result findDetail(ReturnOrderRequestDto dto) {
try {
//检查退货单是否确认签收超时
checkConfirmSignedTimeOut(dto.getReturnOrderId());
ReturnOrderDetailVo returnOrderDetailVo = new ReturnOrderDetailVo();
ReturnOrder returnOrder = returnOrderDao.findById(dto.getReturnOrderId());
returnOrderDetailVo.setReturnOrderId(dto.getReturnOrderId());
long itemId = returnOrder.getItemId();
CoinRequestDto coinRequestDto = new CoinRequestDto();
coinRequestDto.setId(itemId);
Result<CoinVo> itemResult = itemService.findDetails(coinRequestDto);
if (!itemResult.getSuccess()) {
return itemResult;
}
long userId = returnOrder.getUserId();
User user = cacheUtil.getAppletUsers(userId);
UserVo userVo = new UserVo();
userVo.setNickname(user.getNickname());
userVo.setPhone(user.getMobile());
//查询addressId对应地址
CloudServerResponse<UserAddressDTO> cloudServerResponse = userAddressReadService.getAddressByAddressId(returnOrder.getAddressId());
//成功的code = 1001
if (cloudServerResponse.getCode() == 1001 && cloudServerResponse.getResult() != null) {
UserAddressDTO userAddressDTO = cloudServerResponse.getResult();
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(userAddressDTO.getUserName());
stringBuffer.append("," + userAddressDTO.getUserPhone());
stringBuffer.append("," + userAddressDTO.getArea());
stringBuffer.append("," + userAddressDTO.getAddress());
userVo.setAddress(stringBuffer.toString());
}
returnOrderDetailVo.setUserVo(userVo);
returnOrderDetailVo.setConsignSaledId(returnOrder.getSaleId());
returnOrderDetailVo.setState(returnOrder.getState());
returnOrderDetailVo.setStateName(ReturnOrderEnum.StateEnum.getNameByCode(returnOrder.getState()));
returnOrderDetailVo.setItemVo(itemResult.getData());
//查询寄售单取消类型和理由
List<ConsignSaleRecord> consignSaleRecords = consignSaleRecordDao.find(returnOrder.getSaleId());
List<Integer> cancelTypes = Arrays.asList(ConsignSaleEnum.OperateTypeEnum.SYS_CANCEL.getCode(), ConsignSaleEnum.OperateTypeEnum.CUSTOM_CANCEL.getCode(), ConsignSaleEnum.OperateTypeEnum.TIME_OUT_CANCEL.getCode());
ConsignSaleRecord consignSaleRecord = consignSaleRecords.stream().filter(record -> cancelTypes.contains(record.getType())).findFirst().orElse(null);
returnOrderDetailVo.setCancelTime(consignSaleRecord.getCreateTime());
returnOrderDetailVo.setCancelType(consignSaleRecord.getType());
returnOrderDetailVo.setCancelTypeName(consignSaleRecord.getContent());
returnOrderDetailVo.setRemark(consignSaleRecord.getRemark());
//查询退货单操作信息
List<ReturnOrderRecord> returnOrderRecords = returnOrderRecordDao.findByReturnOrderId(dto.getReturnOrderId());
List<ReturnOrderRecordVo> returnOrderRecordVoList = new ArrayList<>();
//加入初始节点-取消寄售
ReturnOrderRecordVo firstRecordVo = new ReturnOrderRecordVo();
firstRecordVo.setCreateTime(consignSaleRecord.getCreateTime());
firstRecordVo.setTypeName("取消寄售");
firstRecordVo.setContent(consignSaleRecord.getContent() + ";" + consignSaleRecord.getRemark());
returnOrderRecordVoList.add(firstRecordVo);
returnOrderRecords.forEach(returnOrderRecord -> {
ReturnOrderRecordVo returnOrderRecordVo = new ReturnOrderRecordVo();
EntityMapper.copyAttribute(returnOrderRecord, returnOrderRecordVo);
returnOrderRecordVo.setTypeName(ReturnOrderEnum.OperateTypeEnum.getNameByCode(returnOrderRecord.getType()));
returnOrderRecordVoList.add(returnOrderRecordVo);
});
returnOrderDetailVo.setReturnOrderRecordVoList(returnOrderRecordVoList);
return Result.success(returnOrderDetailVo);
} catch (Exception e) {
logger.info("查询退货单详情error:{}", e);
}
return Result.failed();
}
@Override
public Result send(ReturnOrderRequestDto dto) {
try {
//平台寄出要退回的商品,状态改为已寄出
ReturnOrder returnOrder = new ReturnOrder();
returnOrder.setReturnOrderId(dto.getReturnOrderId());
returnOrder.setLogisticsCode(dto.getLogisticsCode());
returnOrder.setWaybill(dto.getWaybill());
returnOrder.setState(ReturnOrderEnum.StateEnum.SENDED.getCode());
returnOrderDao.update(returnOrder);
//插入操作记录
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("平台寄出,");
stringBuffer.append("物流公司:");
stringBuffer.append(LogisticsEnum.getNameByCode(dto.getLogisticsCode()) + "; ");
stringBuffer.append("快递单号:");
stringBuffer.append(dto.getWaybill());
returnOrderRecordDao.insert(dto.getReturnOrderId(), stringBuffer.toString(), ReturnOrderEnum.OperateTypeEnum.SEND_RETURN.getCode(), null);
return Result.success();
} catch (Exception e) {
logger.info("平台寄回商品 error : {}", e);
}
return Result.failed();
}
/**
* 退货发出超过7天,系统默认已签收
*/
private void checkTimeOutForReturnSigned() {
//查询商品已寄出的退货单
ReturnOrderRequestDto returnOrderRequestDto = new ReturnOrderRequestDto();
returnOrderRequestDto.setState(ReturnOrderEnum.StateEnum.SENDED.getCode());
List<ReturnOrder> waitConfirmList = returnOrderDao.findByPage(returnOrderRequestDto);
for (ReturnOrder returnOrder : waitConfirmList) {
//查询退货寄回的时间
ReturnOrderRecord returnOrderRecord = returnOrderRecordDao.findByType(returnOrder.getReturnOrderId(), ReturnOrderEnum.OperateTypeEnum.SEND_RETURN.getCode());
Date startTime = returnOrderRecord.getCreateTime();
Date endTime = new Date();
long diffInMillies = Math.abs(endTime.getTime() - startTime.getTime());
long diffInHours = diffInMillies / (60 * 60 * 1000);
if (diffInHours >= (24 * 7)) {
//超时未签收
timeOutSystemSigned(returnOrder.getReturnOrderId());
logger.info(">>>>>> 退货单号: {} 退货发出超过7天,系统默认已签收,更改退货单状态为已完成,并记录操作节点 <<<<<<<", returnOrder.getReturnOrderId());
}
}
}
/**
* 确认超时系统默认签收
* @param returnOrderId
* @return
*/
@Transactional
public Result timeOutSystemSigned(String returnOrderId) {
try {
ReturnOrder returnOrder = new ReturnOrder();
returnOrder.setReturnOrderId(returnOrderId);
returnOrder.setState(ReturnOrderEnum.StateEnum.FINISH.getCode());
returnOrderDao.update(returnOrder);
//寄出超过7天,系统默认签收
returnOrderRecordDao.insert(returnOrderId, "用户未确认,超过7天系统自动确认收货", ReturnOrderEnum.OperateTypeEnum.SYSTEM_SIGNED.getCode(), "");
return Result.success();
} catch (Exception e) {
logger.error("用户未确认,超过7天系统自动确认收货 error : {}", e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return Result.failed();
}
/**
* 检查该退货单是否寄出确认收货超时
* @param returnOrderId
*/
private void checkConfirmSignedTimeOut(String returnOrderId){
//查询退货单
ReturnOrder returnOrder = returnOrderDao.findById(returnOrderId);
if (returnOrder.getState() == ReturnOrderEnum.StateEnum.SENDED.getCode()) {
ReturnOrderRecord returnOrderRecord = returnOrderRecordDao.findByType(returnOrderId, ReturnOrderEnum.OperateTypeEnum.SEND_RETURN.getCode());
if (returnOrderRecord != null && returnOrderRecord.getCreateTime() != null) {
Date startTime = returnOrderRecord.getCreateTime();
Date endTime = new Date();
long diffInMillies = Math.abs(endTime.getTime() - startTime.getTime());
long diffInHours = diffInMillies / (60 * 60 * 1000);
if (diffInHours >= (24 * 7)) {
timeOutSystemSigned(returnOrderId);
logger.info(">>>>>> 检测到退货单号:{} 寄出待用户确认收货超时,更改退货单状态为已完成,并记录操作节点 <<<<<<<", returnOrderId);
}
}
}
}
}
package com.wwdz.ch.admin.service;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.db.dto.request.ConsignSaleRecordRequestDto;
import com.wwdz.ch.db.dto.request.ConsignSaleRequestDto;
import com.wwdz.ch.db.dto.request.ReturnOrderRequestDto;
public interface ReturnOrderService {
/**
* 查询退货单
* @param dto
* @return
*/
Result findList(ReturnOrderRequestDto dto);
/**
* 查询退货单详情
* @param dto
* @return
*/
Result findDetail(ReturnOrderRequestDto dto);
/**
/**
* 寄出退货商品
* @param dto
* @return
*/
Result send(ReturnOrderRequestDto dto);
}
......@@ -7,7 +7,7 @@ public class ReturnOrderEnum {
*/
public enum StateEnum {
WAIT_RETURN(10, "待退回"),
OUTBOUND(20, "已出库"),
SENDED(20, "已寄出"),
FINISH(30, "完成退货"),
;
......@@ -20,10 +20,9 @@ public class ReturnOrderEnum {
}
public static String getNameByCode(int code) {
for (ConsignSaleEnum.SaleForUserStateEnum saleForUserStateEnum : ConsignSaleEnum.SaleForUserStateEnum.values()) {
if (code == saleForUserStateEnum.getCode()) {
return saleForUserStateEnum.getDes();
for (ReturnOrderEnum.StateEnum stateEnum : ReturnOrderEnum.StateEnum.values()) {
if (code == stateEnum.getCode()) {
return stateEnum.getDes();
}
}
return null;
......@@ -61,7 +60,7 @@ public class ReturnOrderEnum {
}
public static String getNameByCode(int code) {
for (ConsignSaleEnum.OperateTypeEnum operateTypeEnum : ConsignSaleEnum.OperateTypeEnum.values()) {
for (ReturnOrderEnum.OperateTypeEnum operateTypeEnum : ReturnOrderEnum.OperateTypeEnum.values()) {
if (code == operateTypeEnum.getCode()) {
return operateTypeEnum.getDes();
}
......
......@@ -58,6 +58,11 @@ public class ReturnOrderVo implements Entity {
*/
private Date createTime;
/**
* 取消寄售的时间
*/
private Date cancelTime;
/**
* 原因
......@@ -78,4 +83,24 @@ public class ReturnOrderVo implements Entity {
* 快递单号
*/
private String waybill;
/**
* 是否已经寄出快递
*/
private Boolean isSended;
/**
* 退货地址
*/
private String returnAddress;
/**
* 签收类型
*/
private Integer signedType;
/**
* 签收类型
*/
private String signedTypeName;
}
......@@ -52,4 +52,5 @@ public interface ReturnOrderDao {
*/
long countByState(long userId, List<Integer> filterStates);
}
......@@ -8,5 +8,6 @@ public class UserVo implements Entity {
private String nickname;
private String avatar;
private String phone;
private String address;
}
......@@ -41,7 +41,8 @@ public class WebMvcConfiguration implements WebMvcConfigurer {
, "/wx/user/loginByWx", "/wx/user/finishLogin", "/wx/user/loginByMobile", "/wx/user/loginRegCaptcha", "/wx/user/updateRegCaptcha", "/wx/user/login", "/wx/user/fillCode",
"/officialAccountCallback/**",
"/imCallback/**", "/wx/category/**",
"/wx/consignSale/**", "/wx/item/**"
"/wx/consignSale/**", "/wx/item/**",
"/wx/returnOrder/**"
/* "/wx/officialAccount/**",
"/wx/item/**",
"/wx/aiAssistant/**",
......
......@@ -82,6 +82,11 @@ public class ReturnOrderAppletVo implements Entity {
*/
private Date finishTime;
/**
* 退货地址
*/
private String returnAddress;
/**
* 寄售单状态时间线
*/
......
......@@ -13,19 +13,14 @@ import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.IdUtils;
import com.wwdz.ch.core.util.MediaUtil;
import com.wwdz.ch.core.util.RegexUtil;
import com.wwdz.ch.db.dao.ConsignSaleDao;
import com.wwdz.ch.db.dao.ConsignSaleRecordDao;
import com.wwdz.ch.db.dao.ItemDao;
import com.wwdz.ch.db.dao.UserDao;
import com.wwdz.ch.db.domain.ConsignSale;
import com.wwdz.ch.db.domain.ConsignSaleRecord;
import com.wwdz.ch.db.domain.Item;
import com.wwdz.ch.db.domain.User;
import com.wwdz.ch.db.dao.*;
import com.wwdz.ch.db.domain.*;
import com.wwdz.ch.db.dto.request.CoinRequestDto;
import com.wwdz.ch.db.dto.request.ConsignSaleRequestDto;
import com.wwdz.ch.wx.entity.vo.AppletStateNodeVo;
import com.wwdz.ch.wx.entity.vo.ConsignSaleAppletVo;
import com.wwdz.ch.wx.service.ConsignSaleService;
import com.wwdz.ch.wx.service.ReturnOrderService;
import com.wwdz.user.api.service.user.UserReadService;
import com.xxdxxs.utils.DateUtils;
import com.xxdxxs.utils.EntityMapper;
......@@ -65,6 +60,12 @@ public class ConsignSaleServiceImpl implements ConsignSaleService {
@Autowired
UserDao userDao;
@Autowired
ReturnOrderService returnOrderService;
@Autowired
ReturnOrderRecordDao returnOrderRecordDao;
@Override
public Result createConsignSaleOrder(ConsignSaleRequestDto dto) {
......@@ -166,6 +167,13 @@ public class ConsignSaleServiceImpl implements ConsignSaleService {
//超时未确认取消
timeOutForCancel(dto);
logger.info(">>>>>> 查询寄售单列表,检测到寄售单号:{} 实物鉴定超时未确认,更改寄售单状态为已取消,并记录操作节点 <<<<<<<", consignSale.getSaleId());
//创建退货单
ReturnOrder returnOrder = new ReturnOrder();
returnOrder.setUserId(consignSale.getUserId());
returnOrder.setItemId(consignSale.getItemId());
returnOrder.setAddressId(consignSale.getAddressId());
returnOrder.setSaleId(consignSale.getSaleId());
returnOrderService.create(returnOrder);
}
}
if (StringUtils.hasLength(dto.getSearchParam())) {
......@@ -436,6 +444,14 @@ public class ConsignSaleServiceImpl implements ConsignSaleService {
timeOutForCancel(dto);
consignSaleRecordVo.setCustomState(ConsignSaleEnum.SaleForUserStateEnum.CANCEL.getCode());
logger.info(">>>>>> 寄售单实物鉴定超时未确认,更改寄售单状态为已取消,并记录操作节点 <<<<<<<");
//创建退货单
ReturnOrder returnOrder = new ReturnOrder();
returnOrder.setUserId(consignSale.getUserId());
returnOrder.setItemId(consignSale.getItemId());
returnOrder.setAddressId(consignSale.getAddressId());
returnOrder.setSaleId(consignSale.getSaleId());
returnOrderService.create(returnOrder);
logger.info(">>>>>> 寄售单实物鉴定超时未确认,取消寄售创建退货单 <<<<<<<");
} else {
logger.info(">>>>>> 寄售单号:{} , 查看实物鉴定详情,已是取消状态 <<<<<<<", saleId);
}
......@@ -570,6 +586,13 @@ public class ConsignSaleServiceImpl implements ConsignSaleService {
//插入操作记录,用户不满意建议零售价
consignSaleRecordDao.insert(dto.getSaleId(), "取消类型:用户主动取消", ConsignSaleEnum.OperateTypeEnum.CUSTOM_CANCEL.getCode(), "理由:不满意建议寄售价");
//创建退货单
ReturnOrder returnOrder = new ReturnOrder();
returnOrder.setUserId(consignSaleInfo.getUserId());
returnOrder.setItemId(consignSaleInfo.getItemId());
returnOrder.setAddressId(consignSaleInfo.getAddressId());
returnOrder.setSaleId(consignSaleInfo.getSaleId());
returnOrderService.create(returnOrder);
}
return Result.success();
} catch (Exception e) {
......
package com.wwdz.ch.wx.impl;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import com.wwdz.ch.core.consts.ConsignSaleEnum;
import com.wwdz.ch.core.consts.LogisticsEnum;
import com.wwdz.ch.core.consts.ReturnOrderEnum;
import com.wwdz.ch.core.entity.ConsignSaleVo;
import com.wwdz.ch.core.entity.ReturnOrderVo;
import com.wwdz.ch.core.type.PageSearchResult;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.IdUtils;
import com.wwdz.ch.core.util.MediaUtil;
import com.wwdz.ch.core.util.RegexUtil;
import com.wwdz.ch.db.dao.ConsignSaleRecordDao;
import com.wwdz.ch.db.dao.ItemDao;
import com.wwdz.ch.db.dao.ReturnOrderDao;
import com.wwdz.ch.db.dao.ReturnOrderRecordDao;
import com.wwdz.ch.db.domain.*;
import com.wwdz.ch.db.dto.request.CoinRequestDto;
import com.wwdz.ch.db.dto.request.ConsignSaleRequestDto;
import com.wwdz.ch.db.dto.request.ReturnOrderRequestDto;
import com.wwdz.ch.wx.entity.vo.AppletStateNodeVo;
import com.wwdz.ch.wx.entity.vo.ReturnOrderAppletVo;
import com.wwdz.ch.wx.service.ReturnOrderService;
import com.wwdz.mall.common.vo.response.CloudServerResponse;
import com.wwdz.user.api.dto.res.address.UserAddressDTO;
import com.wwdz.user.api.enums.UserAddressTypeEnum;
import com.wwdz.user.api.service.address.UserAddressReadService;
import com.xxdxxs.utils.EntityMapper;
import com.xxdxxs.utils.JsonUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
......@@ -39,6 +42,8 @@ public class ReturnOrderServiceImpl implements ReturnOrderService {
private static final Logger logger = LoggerFactory.getLogger(ReturnOrderServiceImpl.class);
private static final String RUTURN_ORDER_PREFIX = "RB";
@Autowired
ReturnOrderDao returnOrderDao;
......@@ -48,6 +53,30 @@ public class ReturnOrderServiceImpl implements ReturnOrderService {
@Autowired
ItemDao itemDao;
@Autowired
ConsignSaleRecordDao consignSaleRecordDao;
@Reference
UserAddressReadService userAddressReadService;
@Override
public Result create(ReturnOrder returnOrder) {
try {
String returnOrderId = IdUtils.getOrderNumber(RUTURN_ORDER_PREFIX);
returnOrder.setReturnOrderId(returnOrderId);
Date now = new Date();
returnOrder.setCreateTime(now);
returnOrder.setUpdateTime(now);
returnOrder.setState(ReturnOrderEnum.StateEnum.WAIT_RETURN.getCode());
returnOrderDao.insert(returnOrder);
//插入待退回节点
returnOrderRecordDao.insert(returnOrderId, ReturnOrderEnum.NodeDescEnum.WAIT_RETURN.getDes(), ReturnOrderEnum.OperateTypeEnum.WAIT_RETURN.getCode(), null);
return Result.success();
} catch (Exception e) {
logger.error("创建退货单error:{}", e);
}
return Result.failed();
}
@Override
public Result findList(ReturnOrderRequestDto dto) {
......@@ -100,42 +129,107 @@ public class ReturnOrderServiceImpl implements ReturnOrderService {
@Override
public Result findDetail(ReturnOrderRequestDto dto) {
try {
String returnOrderId = dto.getReturnOrderId();
List<ReturnOrderRecord> returnOrderRecordList = returnOrderRecordDao.findByReturnOrderId(returnOrderId);
ReturnOrder returnOrder = returnOrderDao.findById(returnOrderId);
long itemId = returnOrder.getItemId();
String saleId = returnOrder.getSaleId();
long addressId = returnOrder.getAddressId();
Item item = itemDao.findById(itemId);
ReturnOrderAppletVo returnOrderAppletVo = new ReturnOrderAppletVo();
//查询id对应地址
CloudServerResponse<UserAddressDTO> cloudServerResponse = userAddressReadService.getAddressByAddressId(addressId);
//成功的code = 1001
if (cloudServerResponse.getCode() == 1001 && cloudServerResponse.getResult() != null) {
UserAddressDTO userAddressDTO = cloudServerResponse.getResult();
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(userAddressDTO.getUserName());
stringBuffer.append("," + userAddressDTO.getUserPhone());
stringBuffer.append("," + userAddressDTO.getArea());
stringBuffer.append("," + userAddressDTO.getAddress());
returnOrderAppletVo.setReturnAddress(stringBuffer.toString());
}
returnOrderAppletVo.setSaleId(returnOrder.getSaleId());
returnOrderAppletVo.setReturnOrderId(returnOrderId);
returnOrderAppletVo.setHomePageImage(MediaUtil.getHomePageImage(item.getImages(), item.getVideos()));
returnOrderAppletVo.setItemName(item.getName());
returnOrderAppletVo.setLogisticsCode(returnOrder.getLogisticsCode());
returnOrderAppletVo.setLogisticsName(LogisticsEnum.getNameByCode(returnOrder.getLogisticsCode()));
returnOrderAppletVo.setWaybill(returnOrder.getWaybill());
returnOrderAppletVo.setState(returnOrder.getState());
returnOrderAppletVo.setStateName(ReturnOrderEnum.StateEnum.getNameByCode(returnOrder.getState()));
ReturnOrderRecord sendRecord = returnOrderRecordList.stream().filter(returnOrderRecord -> returnOrderRecord.getType() == ReturnOrderEnum.OperateTypeEnum.SEND_RETURN.getCode()).findFirst().orElse(null);
//货品寄回时间
returnOrderAppletVo.setSendTime(sendRecord == null ? null : sendRecord.getCreateTime());
String returnOrderId = dto.getReturnOrderId();
List<ReturnOrderRecord> returnOrderRecordList = returnOrderRecordDao.findByReturnOrderId(returnOrderId);
ReturnOrder returnOrder = returnOrderDao.findById(returnOrderId);
long itemId = returnOrder.getItemId();
Item item = itemDao.findById(itemId);
ReturnOrderAppletVo returnOrderAppletVo = new ReturnOrderAppletVo();
returnOrderAppletVo.setSaleId(returnOrder.getSaleId());
returnOrderAppletVo.setReturnOrderId(returnOrderId);
returnOrderAppletVo.setHomePageImage(MediaUtil.getHomePageImage(item.getImages(), item.getVideos()));
returnOrderAppletVo.setItemName(item.getName());
returnOrderAppletVo.setLogisticsCode(returnOrder.getLogisticsCode());
returnOrderAppletVo.setLogisticsName(LogisticsEnum.getNameByCode(returnOrder.getLogisticsCode()));
returnOrderAppletVo.setWaybill(returnOrder.getWaybill());
returnOrderAppletVo.setState(returnOrder.getState());
returnOrderAppletVo.setStateName(ReturnOrderEnum.StateEnum.getNameByCode(returnOrder.getState()));
//货品寄回时间
returnOrderAppletVo.setSendTime(returnOrder.getCreateTime());
//货品寄回签收
returnOrderAppletVo.setSignedTime(null);
List<AppletStateNodeVo> appletStateNodeVoList = new ArrayList<>();
ReturnOrderEnum.NodeDescEnum[] nodeDescEnums = ReturnOrderEnum.NodeDescEnum.values();
List<ReturnOrderEnum.NodeDescEnum> nodeDescEnumList = Arrays.stream(nodeDescEnums).collect(Collectors.toList());
for (ReturnOrderEnum.NodeDescEnum nodeDescEnum : nodeDescEnumList) {
AppletStateNodeVo appletStateNodeVo = new AppletStateNodeVo();
appletStateNodeVo.setNode(nodeDescEnum.getNode());
appletStateNodeVo.setDesc(appletStateNodeVo.getDesc());
appletStateNodeVo.setPassed(false);
appletStateNodeVoList.add(appletStateNodeVo);
ReturnOrderRecord signedRecord = returnOrderRecordList.stream().filter(returnOrderRecord -> returnOrderRecord.getType() == ReturnOrderEnum.OperateTypeEnum.USER_SIGNED.getCode()).findFirst().orElse(null);
if (signedRecord == null) {
signedRecord = returnOrderRecordList.stream().filter(returnOrderRecord -> returnOrderRecord.getType() == ReturnOrderEnum.OperateTypeEnum.SYSTEM_SIGNED.getCode()).findFirst().orElse(null);
}
//货品寄回签收
returnOrderAppletVo.setSignedTime(signedRecord == null ? null : signedRecord.getCreateTime());
List<AppletStateNodeVo> appletStateNodeVoList = new ArrayList<>();
ReturnOrderEnum.NodeDescEnum[] nodeDescEnums = ReturnOrderEnum.NodeDescEnum.values();
List<ReturnOrderEnum.NodeDescEnum> nodeDescEnumList = Arrays.stream(nodeDescEnums).collect(Collectors.toList());
for (ReturnOrderEnum.NodeDescEnum nodeDescEnum : nodeDescEnumList) {
AppletStateNodeVo appletStateNodeVo = new AppletStateNodeVo();
appletStateNodeVo.setNode(nodeDescEnum.getNode());
appletStateNodeVo.setDesc(nodeDescEnum.getDes());
appletStateNodeVo.setPassed(false);
appletStateNodeVoList.add(appletStateNodeVo);
}
//拼接退货详情中的节点时间线
//取消寄售节点
appletStateNodeVoList.get(0).setPassed(true);
List<ConsignSaleRecord> consignSaleRecordList = consignSaleRecordDao.find(saleId);
List<Integer> cancelTypes = Arrays.asList(ConsignSaleEnum.OperateTypeEnum.SYS_CANCEL.getCode(), ConsignSaleEnum.OperateTypeEnum.CUSTOM_CANCEL.getCode(), ConsignSaleEnum.OperateTypeEnum.TIME_OUT_CANCEL.getCode());
ConsignSaleRecord consignSaleRecord = consignSaleRecordList.stream().filter(record -> cancelTypes.contains(record.getType())).findFirst().orElse(null);
appletStateNodeVoList.get(0).setDesc(consignSaleRecord.getContent() + ";" + (consignSaleRecord.getRemark() == null ? "" : consignSaleRecord.getRemark()));
//货品待退回
appletStateNodeVoList.get(1).setPassed(true);
for (ReturnOrderRecord returnOrderRecord : returnOrderRecordList) {
//货品已出库
if (returnOrderRecord.getType() == ReturnOrderEnum.OperateTypeEnum.SEND_RETURN.getCode()) {
appletStateNodeVoList.get(2).setPassed(true);
appletStateNodeVoList.get(2).setDesc(returnOrderRecord.getContent());
}
//货品已签收
if (returnOrderRecord.getType() == ReturnOrderEnum.OperateTypeEnum.USER_SIGNED.getCode() || returnOrderRecord.getType() == ReturnOrderEnum.OperateTypeEnum.SYSTEM_SIGNED.getCode()) {
appletStateNodeVoList.get(3).setPassed(true);
appletStateNodeVoList.get(3).setDesc(returnOrderRecord.getContent());
}
}
returnOrderAppletVo.setNodeVoList(appletStateNodeVoList);
return Result.success(returnOrderAppletVo);
} catch (Exception e) {
logger.error("查询退货单详情error:{}", e);
}
return Result.failed();
}
return null;
@Override
public Result userConfirmSigned(ReturnOrderRequestDto dto) {
try {
//用户确认签收退货商品
ReturnOrder returnOrder = new ReturnOrder();
returnOrder.setReturnOrderId(dto.getReturnOrderId());
returnOrder.setState(ReturnOrderEnum.StateEnum.FINISH.getCode());
returnOrderDao.update(returnOrder);
returnOrderRecordDao.insert(dto.getSaleId(), "用户确认签收", ReturnOrderEnum.OperateTypeEnum.USER_SIGNED.getCode(), null);
return Result.success();
} catch (Exception e) {
logger.info("用户确认签收退货商品 error : {}", e);
}
return Result.failed();
}
}
package com.wwdz.ch.wx.service;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.db.domain.ReturnOrder;
import com.wwdz.ch.db.dto.request.ReturnOrderRequestDto;
public interface ReturnOrderService {
/**
* 查询退货单
* @param returnOrder
* @return
*/
Result create(ReturnOrder returnOrder);
/**
* 查询退货单
* @param dto
......@@ -19,5 +29,12 @@ public interface ReturnOrderService {
*/
Result findDetail(ReturnOrderRequestDto dto);
/**
* 用户确认签收退货商品
* @param dto
* @return
*/
Result userConfirmSigned(ReturnOrderRequestDto dto);
}
......@@ -5,9 +5,12 @@ import com.wwdz.ch.core.consts.LogisticsEnum;
import com.wwdz.ch.core.consts.ResultCode;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.db.dto.request.ConsignSaleRequestDto;
import com.wwdz.ch.db.dto.request.ReturnOrderRequestDto;
import com.wwdz.ch.wx.entity.request.ItemRequestDto;
import com.wwdz.ch.wx.impl.ReturnOrderServiceImpl;
import com.wwdz.ch.wx.service.ConsignSaleService;
import com.wwdz.ch.wx.service.ItemService;
import com.wwdz.ch.wx.service.ReturnOrderService;
import com.xxdxxs.service.FormHandler;
import com.xxdxxs.utils.StringUtils;
import com.xxdxxs.validation.Validator;
......@@ -33,7 +36,7 @@ public class ReturnOrderController {
private static final Logger logger = LoggerFactory.getLogger(ReturnOrderController.class);
@Autowired
ConsignSaleService consignSaleService;
ReturnOrderService returnOrderService;
@Autowired
ItemService itemService;
......@@ -41,29 +44,43 @@ public class ReturnOrderController {
@ApiOperation(value = "用户查询退货单")
@PostMapping("/findList")
public Result findList(@RequestBody ConsignSaleRequestDto dto) {
logger.info("【请求开始】用户查询寄售单,请求参数:{}", JSON.toJSONString(dto));
public Result findList(@RequestBody ReturnOrderRequestDto dto) {
logger.info("【请求开始】用户查询退货单,请求参数:{}", JSON.toJSONString(dto));
Validator validator = new Validator(FormHandler.ofEntity(dto));
validator.set("userId", "用户id").must().number()
.end();
if (!validator.isValid()) {
return Result.failed(ResultCode.PARAM_ERROR.getCode(), validator.getErrorInfo());
}
return consignSaleService.findList(dto);
return returnOrderService.findList(dto);
}
@ApiOperation(value = "用户查询退货单详情")
@PostMapping("/findDetail")
public Result findDetail(@RequestBody ConsignSaleRequestDto dto) {
logger.info("【请求开始】用户查询寄售单详情,请求参数:{}", JSON.toJSONString(dto));
public Result findDetail(@RequestBody ReturnOrderRequestDto dto) {
logger.info("【请求开始】用户查询退货单,请求参数:{}", JSON.toJSONString(dto));
Validator validator = new Validator(FormHandler.ofEntity(dto));
validator.set("saleId", "寄售单号").must().string()
validator.set("returnOrderId", "退货单号").must().string()
.end();
if (!validator.isValid()) {
return Result.failed(ResultCode.PARAM_ERROR.getCode(), validator.getErrorInfo());
}
return consignSaleService.findDetail(dto);
return returnOrderService.findDetail(dto);
}
@ApiOperation(value = "用户确认签收退货商品")
@PostMapping("/userConfirmSigned")
public Result userConfirmSigned(@RequestBody ReturnOrderRequestDto dto) {
logger.info("【请求开始】用户确认签收退货商品,请求参数:{}", JSON.toJSONString(dto));
Validator validator = new Validator(FormHandler.ofEntity(dto));
validator.set("returnOrderId", "退货单号").must().string()
.end();
if (!validator.isValid()) {
return Result.failed(ResultCode.PARAM_ERROR.getCode(), validator.getErrorInfo());
}
return returnOrderService.userConfirmSigned(dto);
}
......
......@@ -32,5 +32,10 @@ public class UserAddressServiceTest {
CloudServerResponse<UserAddressDTO> cloudServerResponse = userAddressReadService.getDefaultByType(userId, UserAddressTypeEnum.RECEIVE_ADDRESS.getType());
logger.info("cloudServerResponse = {}", cloudServerResponse);
logger.info("result = {}", JsonUtils.from(cloudServerResponse.getResult()));
long addressId = 1231000111;
CloudServerResponse<UserAddressDTO> addressDTOCloudServerResponse = userAddressReadService.getAddressByAddressId(addressId);
logger.info("addressDTOCloudServerResponse = {}", addressDTOCloudServerResponse);
logger.info("addressDTOCloudServerResponse result = {}", JsonUtils.from(addressDTOCloudServerResponse.getResult()));
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment