|
|
@@ -1,679 +0,0 @@
|
|
|
-package com.uas.platform.b2c.trade.aftersale.service.impl;
|
|
|
-
|
|
|
-import com.uas.platform.b2c.core.support.SystemSession;
|
|
|
-import com.uas.platform.b2c.core.utils.DoubleArith;
|
|
|
-import com.uas.platform.b2c.core.utils.NumberUtil;
|
|
|
-import com.uas.platform.b2c.fa.settlement.dao.RefundDao;
|
|
|
-import com.uas.platform.b2c.fa.settlement.model.Refund;
|
|
|
-import com.uas.platform.b2c.fa.settlement.model.RefundDetail;
|
|
|
-import com.uas.platform.b2c.fa.settlement.service.RefundService;
|
|
|
-import com.uas.platform.b2c.logistics.dao.InvoiceFPurchaseDao;
|
|
|
-import com.uas.platform.b2c.logistics.dao.ReceiptDao;
|
|
|
-import com.uas.platform.b2c.logistics.model.Receipt;
|
|
|
-import com.uas.platform.b2c.logistics.model.ReceiptDetail;
|
|
|
-import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
|
|
|
-import com.uas.platform.b2c.trade.aftersale.dao.ReturnFB2cDao;
|
|
|
-import com.uas.platform.b2c.trade.aftersale.dao.ReturnFCustDao;
|
|
|
-import com.uas.platform.b2c.trade.aftersale.dao.ReturnFCustDetailDao;
|
|
|
-import com.uas.platform.b2c.trade.aftersale.model.*;
|
|
|
-import com.uas.platform.b2c.trade.aftersale.service.ReturnFCustDetailService;
|
|
|
-import com.uas.platform.b2c.trade.aftersale.service.ReturnService;
|
|
|
-import com.uas.platform.b2c.trade.order.dao.OrderDao;
|
|
|
-import com.uas.platform.b2c.trade.order.dao.OrderDetailDao;
|
|
|
-import com.uas.platform.b2c.trade.order.dao.PurchaseDao;
|
|
|
-import com.uas.platform.b2c.trade.order.dao.PurchaseDetailDao;
|
|
|
-import com.uas.platform.b2c.trade.order.model.Order;
|
|
|
-import com.uas.platform.b2c.trade.order.model.OrderDetail;
|
|
|
-import com.uas.platform.b2c.trade.order.model.Purchase;
|
|
|
-import com.uas.platform.b2c.trade.order.model.PurchaseDetail;
|
|
|
-import com.uas.platform.core.exception.IllegalOperatorException;
|
|
|
-import com.uas.platform.core.exception.IllegalStatusException;
|
|
|
-import com.uas.platform.core.model.EncodingRulesConstant;
|
|
|
-import com.uas.platform.core.model.PageInfo;
|
|
|
-import com.uas.platform.core.model.Status;
|
|
|
-import com.uas.platform.core.persistence.criteria.PredicateUtils;
|
|
|
-import com.uas.platform.core.persistence.criteria.SimpleExpression;
|
|
|
-import org.apache.commons.collections.CollectionUtils;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.data.domain.Page;
|
|
|
-import org.springframework.data.jpa.domain.Specification;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-import org.springframework.transaction.annotation.Transactional;
|
|
|
-import org.springframework.ui.ModelMap;
|
|
|
-import org.springframework.util.StringUtils;
|
|
|
-
|
|
|
-import javax.persistence.criteria.CriteriaBuilder;
|
|
|
-import javax.persistence.criteria.CriteriaQuery;
|
|
|
-import javax.persistence.criteria.Predicate;
|
|
|
-import javax.persistence.criteria.Root;
|
|
|
-import java.util.*;
|
|
|
-
|
|
|
-/**
|
|
|
- * The type Return service implementation.
|
|
|
- *
|
|
|
- * @author aof
|
|
|
- * @version 2017-08-02 17:16:56 创建文件
|
|
|
- */
|
|
|
-@Service
|
|
|
-@Transactional
|
|
|
-public class ReturnServiceImpl implements ReturnService {
|
|
|
-
|
|
|
- private final CreateNumberService createNumberService;
|
|
|
-
|
|
|
- private final PurchaseDetailDao purchaseDetailDao;
|
|
|
-
|
|
|
- private final ReturnFCustDao returnFCustDao;
|
|
|
-
|
|
|
- private final ReturnFCustDetailDao returnFCustDetailDao;
|
|
|
-
|
|
|
- private final ReturnFB2cDao returnFB2cDao;
|
|
|
-
|
|
|
- private final ReceiptDao receiptDao;
|
|
|
-
|
|
|
- private final OrderDao orderDao;
|
|
|
-
|
|
|
- private final OrderDetailDao orderDetailDao;
|
|
|
-
|
|
|
- private final PurchaseDao purchaseDao;
|
|
|
-
|
|
|
- private final InvoiceFPurchaseDao invoiceFPurchaseDao;
|
|
|
-
|
|
|
- private final ReturnFCustDetailService returnFCustDetailService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private RefundService refundService;
|
|
|
-
|
|
|
- private final RefundDao refundDao;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- public ReturnServiceImpl(CreateNumberService createNumberService, PurchaseDetailDao purchaseDetailDao, ReturnFCustDao returnFCustDao, ReturnFCustDetailDao returnFCustDetailDao, ReturnFB2cDao returnFB2cDao, ReceiptDao receiptDao, OrderDao orderDao, OrderDetailDao orderDetailDao, PurchaseDao purchaseDao, InvoiceFPurchaseDao invoiceFPurchaseDao, ReturnFCustDetailService returnFCustDetailService, RefundDao refundDao) {
|
|
|
- this.createNumberService = createNumberService;
|
|
|
- this.purchaseDetailDao = purchaseDetailDao;
|
|
|
- this.returnFCustDao = returnFCustDao;
|
|
|
- this.returnFCustDetailDao = returnFCustDetailDao;
|
|
|
- this.returnFB2cDao = returnFB2cDao;
|
|
|
- this.receiptDao = receiptDao;
|
|
|
- this.orderDao = orderDao;
|
|
|
- this.orderDetailDao = orderDetailDao;
|
|
|
- this.purchaseDao = purchaseDao;
|
|
|
- this.invoiceFPurchaseDao = invoiceFPurchaseDao;
|
|
|
- this.returnFCustDetailService = returnFCustDetailService;
|
|
|
- this.refundDao = refundDao;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- @Transactional
|
|
|
- public ReturnFCust ensureReturn(Order order) {
|
|
|
- if (!orderDao.findOne(order.getId()).getStatus().equals(Status.RECEIVED.value())) {
|
|
|
- throw new IllegalOperatorException("订单"+ order.getOrderid() +"的状态是"+ Status.valueOf(order.getStatus()).getPhrase() +",已收货,不可做退货操作!");
|
|
|
- }
|
|
|
- Long uu = SystemSession.getUser().getUserUU();
|
|
|
- Set<ReturnFCustDetail> returnDetails = new HashSet<>();
|
|
|
- ReturnFCust cust = new ReturnFCust(order);
|
|
|
- Double totalPrice = (double) 0;
|
|
|
- Double taxes = (double) 0;
|
|
|
- // 生成退货单号
|
|
|
- String returnid = EncodingRulesConstant.RETURN_FROMCUST.replace("_TIMESTAP_NUMBER", createNumberService.getTimeNumber("trade$return_fmcust", 8));
|
|
|
- // 这里由于前台传过来的order对象被切断了双向关联,这里需要重新set进去
|
|
|
- Set<OrderDetail> orDetails = new HashSet<>();
|
|
|
- for (OrderDetail detail : order.getOrderDetails()) {
|
|
|
- if (detail.getReturnQty() > 0) {
|
|
|
- if(detail.getStatus() != Status.RECEIVED.value()) {
|
|
|
- throw new IllegalOperatorException("当前订单" + detail.getDetailid() + "的状态是" + Status.valueOf(detail.getStatus()).getPhrase() + ", 不能进行退货");
|
|
|
- }
|
|
|
- if (detail.getReturnQty() > detail.getNumber() - detail.getCustreturnQty()) {
|
|
|
- throw new IllegalOperatorException("退货数量超过订单现有数量");
|
|
|
- }
|
|
|
- ReturnFCustDetail returnDetail = new ReturnFCustDetail(detail);
|
|
|
- String detailid = EncodingRulesConstant.RETURN_DETAIL_FROMCUST.replace("_TIMESTAP_NUMBER", createNumberService.getTimeNumber("trade$return_fmcust_dt", 9));
|
|
|
- returnDetail.setDetailid(detailid);
|
|
|
- // 退货数量
|
|
|
- returnDetail.setNumber(detail.getReturnQty());
|
|
|
- taxes = DoubleArith.add(taxes, returnDetail.getTaxes());
|
|
|
- // 计算明细总价
|
|
|
- returnDetail.setPrice(returnDetail.getNumber() * returnDetail.getTaxUnitprice());
|
|
|
- totalPrice = DoubleArith.add(totalPrice, returnDetail.getPrice());
|
|
|
- returnDetail.setOrd_id(detail.getDetailid());
|
|
|
- returnDetail.setCustreturn(cust);
|
|
|
- returnDetail.setStatus(Status.UNAUDIT.value());
|
|
|
- returnDetails.add(returnDetail);
|
|
|
- detail.setStatusInaftersales(uu);
|
|
|
- detail.setCustreturnQty(DoubleArith.add(detail.getCustreturnQty(), detail.getReturnQty()));
|
|
|
- order.setCustreturnQty(DoubleArith.add(detail.getReturnQty(), order.getCustreturnQty()));
|
|
|
- }
|
|
|
- detail.setOrder(order);
|
|
|
- orDetails.add(detail);
|
|
|
- }
|
|
|
- cust.setReturnDetails(returnDetails);
|
|
|
- cust.setReturnid(returnid);
|
|
|
- cust.setPrice(totalPrice);
|
|
|
- cust.setTaxes(taxes);
|
|
|
- cust.setOrid(order.getOrderid());
|
|
|
- order.setOrderDetails(orDetails);
|
|
|
- orderDao.save(order);
|
|
|
- // 设置状态为申请中
|
|
|
- cust.setQtys();
|
|
|
- cust.setStatusUnaudit(uu);
|
|
|
- return returnFCustDao.save(cust);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ReturnFCust auditReturn(Long id, Long boo) {
|
|
|
- Long uu = SystemSession.getUser().getUserUU();
|
|
|
- ReturnFCust thiscust = returnFCustDao.findOne(id);
|
|
|
- if (thiscust == null) {
|
|
|
- throw new IllegalOperatorException("退货单[ID:" + id + "]不存在");
|
|
|
- } else if (Status.UNAUDIT.value() != thiscust.getStatus()) {
|
|
|
- throw new IllegalOperatorException("退货单" + thiscust.getReturnid() + "的状态是" + Status.valueOf(thiscust.getStatus()).getPhrase() + ",不能操作");
|
|
|
- }
|
|
|
- if (boo == 1) {
|
|
|
- // 审核通过
|
|
|
- thiscust.setStatusTobeshippedback(uu);
|
|
|
- Set<ReturnFCustDetail> returnDetails = thiscust.getReturnDetails();
|
|
|
- for (ReturnFCustDetail returnFCustDetail : returnDetails) {
|
|
|
- returnFCustDetail.setStatus(Status.TOBESHIPPEDBACK.value());
|
|
|
- }
|
|
|
- } else {
|
|
|
- // 审核不通过
|
|
|
- thiscust.setStatusNotallow(uu);
|
|
|
- Set<ReturnFCustDetail> returnDetails = thiscust.getReturnDetails();
|
|
|
- // 将关联的订单解绑
|
|
|
- Order order = orderDao.findByOrderid(thiscust.getOrid());
|
|
|
- order.setStatusReceived(uu);
|
|
|
- for (ReturnFCustDetail returnFCustDetail : returnDetails) {
|
|
|
- returnFCustDetail.setStatus(Status.NOTALLOW.value());
|
|
|
- String ord_id = returnFCustDetail.getOrd_id();
|
|
|
- OrderDetail orderDetail = orderDetailDao.findByDetailid(ord_id);
|
|
|
- orderDetail.setStatusReceived(uu);
|
|
|
- //修改
|
|
|
- orderDetail.setCustreturnQty(DoubleArith.sub(orderDetail.getCustreturnQty(), returnFCustDetail.getNumber()));
|
|
|
- order.setCustreturnQty(DoubleArith.sub(order.getCustreturnQty(), returnFCustDetail.getNumber()));
|
|
|
- orderDetailDao.save(orderDetail);
|
|
|
- }
|
|
|
- orderDao.save(order);
|
|
|
- }
|
|
|
- return returnFCustDao.save(thiscust);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<ReturnFCust> findByStatus(Integer status) {
|
|
|
- return returnFCustDao.findByStatus(status);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<ReturnFCust> findOnesByStatuses(List<Integer> statuses) {
|
|
|
- List<ReturnFCust> custs = new ArrayList<>();
|
|
|
- for (Integer statue : statuses) {
|
|
|
- custs.addAll(findByStatus(statue));
|
|
|
- }
|
|
|
- return custs;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- @Transactional
|
|
|
- public ReturnFCust sendReturn(ReturnFCust cust) {
|
|
|
- if (cust == null) {
|
|
|
- throw new IllegalOperatorException("退货单不存在");
|
|
|
- } else if (Status.TOBESHIPPEDBACK.value() != cust.getStatus()) {
|
|
|
- throw new IllegalOperatorException("退货单"+ cust.getReturnid() +"的状态是" + Status.valueOf(cust.getStatus()).getPhrase() + ",不可进行当前操作");
|
|
|
- }
|
|
|
- for (ReturnFCustDetail detail : cust.getReturnDetails()) {
|
|
|
- detail.setCustreturn(cust);
|
|
|
- detail.setStatus(Status.INSPECTING.value());
|
|
|
- }
|
|
|
- cust.setStatusInspecting(SystemSession.getUser().getUserUU());
|
|
|
- String orid = cust.getOrid();
|
|
|
- Order order = orderDao.findByOrderid(orid);
|
|
|
- order.setReturnStatus(Status.INSPECTING.value());
|
|
|
- orderDao.save(order);
|
|
|
- return returnFCustDao.save(cust);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public String batchSendForVender(List<ReturnFB2c> b2cs) {
|
|
|
- for (ReturnFB2c b2c : b2cs) {
|
|
|
- if (b2c == null) {
|
|
|
- throw new IllegalOperatorException("平台退货单不存在");
|
|
|
- } else if (Status.TOBESHIPPEDBACK.value() != b2c.getStatus()) {
|
|
|
- throw new IllegalOperatorException("退货单" + b2c.getReturnid() +",状态为"+ Status.valueOf(b2c.getStatus()).getPhrase() +",不可做发货操作!");
|
|
|
- }
|
|
|
- for (ReturnFB2cDetail detail : b2c.getReturnDetails()) {
|
|
|
- detail.setB2creturn(b2c);
|
|
|
- detail.setStatus(Status.INSPECTING.value());
|
|
|
- }
|
|
|
- b2c.setStatusInspecting(SystemSession.getUser().getUserUU());
|
|
|
-
|
|
|
- Purchase purchase = purchaseDao.findByPurchaseid(b2c.getPuid());
|
|
|
- if(purchase != null) {
|
|
|
- purchase.setReturnPuStatus(Status.INSPECTING.value());
|
|
|
- purchaseDao.save(purchase);
|
|
|
- }else {
|
|
|
- throw new IllegalOperatorException("换货单对应的采购单信息丢失。");
|
|
|
- }
|
|
|
- returnFB2cDao.save(b2c);
|
|
|
- }
|
|
|
- return "success";
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- @Transactional
|
|
|
- public ReturnFB2c venderAccept(Long returnid) {
|
|
|
- Long uu = SystemSession.getUser().getUserUU();
|
|
|
- ReturnFB2c b2c = returnFB2cDao.findOne(returnid);
|
|
|
- if(b2c == null) {
|
|
|
- throw new IllegalOperatorException("单据信息缺失,请重新刷新界面操作");
|
|
|
- } else if (Status.INSPECTING.value() != b2c.getStatus()) {
|
|
|
- throw new IllegalOperatorException("退货单" + b2c.getReturnid() + "的状态是" + Status.valueOf(b2c.getStatus()).getPhrase()+ ",不能进行相应的操作");
|
|
|
- }
|
|
|
- // 记录需要更新状态的客户退款单、采购单以及退款单对应的订单明细单据ID
|
|
|
- Set<String> reCustDetailIds = new HashSet<>();
|
|
|
- Set<String> puIds = new HashSet<>();
|
|
|
- Set<String> orderDetailIds = new HashSet<>();
|
|
|
- // 记录平台退货单是否在取消购买时产生
|
|
|
- boolean isCancelOrder = b2c.getCustid() == null;
|
|
|
-
|
|
|
- // 创建供应商的入库单以及明细,并持久化
|
|
|
- Receipt receipt = createReceiptForVendor(b2c);
|
|
|
- if (receipt != null) {
|
|
|
- receiptDao.save(receipt);
|
|
|
- }
|
|
|
-
|
|
|
- // 更新平台退货单以及明细的状态
|
|
|
- Set<ReturnFB2cDetail> returnFB2cDetails = b2c.getReturnDetails();
|
|
|
- for (ReturnFB2cDetail fb2cDetail : returnFB2cDetails) {
|
|
|
- if (Status.RECEIVED.value() == fb2cDetail.getStatus()) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- fb2cDetail.setStatus(Status.RECEIVED.value());
|
|
|
- if (!isCancelOrder) {
|
|
|
- // 记录需要修改状态的明细单据ID
|
|
|
- reCustDetailIds.add(fb2cDetail.getRfcdid());
|
|
|
- }
|
|
|
- puIds.add(fb2cDetail.getPuid());
|
|
|
- orderDetailIds.add(fb2cDetail.getOrdetailid());
|
|
|
- }
|
|
|
- b2c.setReturnDetails(returnFB2cDetails);
|
|
|
- b2c.setStatusReceived(uu);
|
|
|
- b2c = returnFB2cDao.save(b2c);
|
|
|
-
|
|
|
- // 更新客户退货单以及明细的状态
|
|
|
- if (!isCancelOrder) {
|
|
|
- ReturnFCust returnFCust = returnFCustDao.findOne(b2c.getCustid());
|
|
|
- returnFCust = updateReturnFCustByB2c(reCustDetailIds, returnFCust);
|
|
|
- returnFCustDao.save(returnFCust);
|
|
|
- }
|
|
|
-
|
|
|
- // 更新采购单退货的数量和状态信息(更新主单据状态必须更新明细状态)
|
|
|
- Purchase purchase = purchaseDao.findByPurchaseid(b2c.getPuid());
|
|
|
- purchase = updatePurchaseByReturn(puIds, isCancelOrder, purchase);
|
|
|
- purchaseDao.save(purchase);
|
|
|
-
|
|
|
- // 更新退款单明细的状态以及退款单的状态
|
|
|
- Refund refund = refundDao.findByOrderid(purchase.getOrderid());
|
|
|
- refund = updateRefundByReturn(orderDetailIds, refund);
|
|
|
- refundDao.save(refund);
|
|
|
- return b2c;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 根据待更新状态的退款单明细单据ID更新明细状态,以及退款单的状态信息
|
|
|
- *
|
|
|
- * history:
|
|
|
- * Created by huxz 2017-1-20 09:50:10
|
|
|
- *
|
|
|
- * @param orderDetailIds 待更新状态的退款单明细的单据ID
|
|
|
- * @param refund 待更新状态的退款单实例
|
|
|
- * @return 待持久化的退款单
|
|
|
- */
|
|
|
- private Refund updateRefundByReturn(Set<String> orderDetailIds, Refund refund) {
|
|
|
- if (refund == null) {
|
|
|
- throw new IllegalStatusException("没有生成退货单对应的退款单");
|
|
|
- }
|
|
|
- Set<RefundDetail> refundDetails = refund.getRefundDetails();
|
|
|
- if (CollectionUtils.isNotEmpty(refundDetails)) {
|
|
|
- int count = 0;
|
|
|
- for (RefundDetail refundDetail : refundDetails) {
|
|
|
- if (orderDetailIds.contains(refundDetail.getOrderDetail().getDetailid())) {
|
|
|
- refundDetail.setStatus(Refund.RefundStatus.TOBEREFUND.toString());
|
|
|
- }
|
|
|
- if (Refund.RefundStatus.TOBEREFUND.toString().equals(refundDetail.getStatus())) {
|
|
|
- count ++;
|
|
|
- }
|
|
|
- }
|
|
|
- refund.setRefundDetails(refundDetails);
|
|
|
- if (count == refundDetails.size()) {
|
|
|
- refund.setStatus(Refund.RefundStatus.TOBEREFUND.toString());
|
|
|
- }
|
|
|
- }
|
|
|
- return refund;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 根据待更新状态的采购单明细单据ID更新明细状态,以及更新采购单的状态信息
|
|
|
- *
|
|
|
- * history:
|
|
|
- * Created by huxz 2017-1-20 09:44:43
|
|
|
- *
|
|
|
- * @param puIds 待更新状态的采购单明细单据ID
|
|
|
- * @param isCancelOrder 是否为取消购买产生的退货单
|
|
|
- * @param purchase 待更新状态的采购单
|
|
|
- * @return 待持久化的采购单
|
|
|
- */
|
|
|
- private Purchase updatePurchaseByReturn(Set<String> puIds, boolean isCancelOrder, Purchase purchase) {
|
|
|
- Long uu = SystemSession.getUser().getUserUU();
|
|
|
- if (purchase == null) {
|
|
|
- throw new IllegalStatusException("采购单信息丢失");
|
|
|
- }
|
|
|
- purchase.totalReturnQty(purchase.getPurchaseDetails());
|
|
|
- Status newStatus;
|
|
|
- if (isCancelOrder) {
|
|
|
- newStatus = Status.UNAVAILABLE_PERSONAL;
|
|
|
- } else {
|
|
|
- newStatus = Status.UNAVAILABLE_RETURN;
|
|
|
- }
|
|
|
- // 根据采购单明细设置采购单的失效状态
|
|
|
- Set<PurchaseDetail> purchaseDetails = purchase.getPurchaseDetails();
|
|
|
- if (CollectionUtils.isNotEmpty(purchaseDetails)) {
|
|
|
- int count = 0;
|
|
|
- for (PurchaseDetail purchaseDetail : purchaseDetails) {
|
|
|
- if (puIds.contains(purchaseDetail.getDetailid())) {
|
|
|
- purchaseDetail.setStatus(newStatus.value(), uu);
|
|
|
- }
|
|
|
- if (Status.isUnavailable(purchaseDetail.getStatus())) {
|
|
|
- count ++;
|
|
|
- }
|
|
|
- }
|
|
|
- purchase.setPurchaseDetails(purchaseDetails);
|
|
|
- if (count == purchaseDetails.size()) {
|
|
|
- purchase.setStatus(newStatus.value(), SystemSession.getUser().getUserUU());
|
|
|
- }
|
|
|
- }
|
|
|
- return purchase;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 根据待更新状态的客户退货单明细单据ID更新明细状态,以及更新客户退货单的状态信息
|
|
|
- *
|
|
|
- * history:
|
|
|
- * Created by huxz 2017-1-20 09:43:29
|
|
|
- *
|
|
|
- * @param reCustDetailIds 待更新状态的客户退货单明细单据ID
|
|
|
- * @param returnFCust 待更新状态的客户退货单
|
|
|
- * @return 待持久化的客户退货单
|
|
|
- */
|
|
|
- private ReturnFCust updateReturnFCustByB2c(Set<String> reCustDetailIds, ReturnFCust returnFCust) {
|
|
|
- Long uu = SystemSession.getUser().getUserUU();
|
|
|
- if (returnFCust == null || Status.INSPECTED.value() != returnFCust.getStatus()) {
|
|
|
- throw new IllegalOperatorException("没有传入有效的客户退货单信息");
|
|
|
- }
|
|
|
- Set<ReturnFCustDetail> returnDetails = returnFCust.getReturnDetails();
|
|
|
- if (CollectionUtils.isNotEmpty(returnDetails)) {
|
|
|
- int count = 0;
|
|
|
- for (ReturnFCustDetail returnFCustDetail : returnDetails) {
|
|
|
- if (reCustDetailIds.contains(returnFCustDetail.getDetailid())) {
|
|
|
- returnFCustDetail.setStatus(Status.TOBEREFUNDED.value());
|
|
|
- }
|
|
|
- if (Status.TOBEREFUNDED.value() == returnFCustDetail.getStatus()) {
|
|
|
- count ++;
|
|
|
- }
|
|
|
- }
|
|
|
- returnFCust.setReturnDetails(returnDetails);
|
|
|
- if(count == returnDetails.size()) {
|
|
|
- returnFCust.setStatusToberefunded(uu);
|
|
|
- }
|
|
|
- }
|
|
|
- return returnFCust;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 根据平台退货单生成相应的供应商入库单及其明细信息
|
|
|
- *
|
|
|
- * history:
|
|
|
- * Created by huxz 2017-1-19 17:27:37
|
|
|
- *
|
|
|
- * @param returnFB2c 查询到的平台退货单实例
|
|
|
- * @return 待持久化的入库单
|
|
|
- */
|
|
|
- private Receipt createReceiptForVendor(ReturnFB2c returnFB2c) {
|
|
|
- Long uu = SystemSession.getUser().getUserUU();
|
|
|
- if (returnFB2c == null) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- // 生成销售验退单 (供应商销售退货单)
|
|
|
- Receipt receipt = new Receipt(returnFB2c);
|
|
|
- // 生成入库单号
|
|
|
- String receiptid = EncodingRulesConstant.RECEIPT_FROMPURCHASE.replace("_TIMESTAP_NUMBER", createNumberService.getTimeNumber("trade$receipt", 8));
|
|
|
- receipt.setReceiptid(receiptid);
|
|
|
- Set<ReceiptDetail> receiptdetais = new HashSet<>();
|
|
|
- Set<ReturnFB2cDetail> returnFB2cDetails = returnFB2c.getReturnDetails();
|
|
|
- if (CollectionUtils.isEmpty(returnFB2cDetails)) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- // 根据退货单明细信息生成对应的销售验退单明细信息
|
|
|
- for (ReturnFB2cDetail b2cDetail : returnFB2cDetails) {
|
|
|
- ReceiptDetail reD = new ReceiptDetail(b2cDetail);
|
|
|
- String detailid = EncodingRulesConstant.RECEIPT_DETAIL_FROMPURCHASE.replace("_TIMESTAP_NUMBER", createNumberService.getTimeNumber("trade$receipt_detail", 9));
|
|
|
- reD.setDetailid(detailid);
|
|
|
- reD.setReceipt(receipt);
|
|
|
- reD.setStatus(Status.AVAILABLE.value());
|
|
|
- receiptdetais.add(reD);
|
|
|
- }
|
|
|
- receipt.setStatusAvailable(uu);
|
|
|
- receipt.setReceiptDetails(receiptdetais);
|
|
|
- return receipt;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ReturnFCust ensurePaid(Long returnid) {
|
|
|
- ReturnFCust cust = returnFCustDao.findOne(returnid);
|
|
|
- if(cust == null) {
|
|
|
- throw new IllegalOperatorException("对应的数据不存在,操作有误");
|
|
|
- }
|
|
|
- if (!cust.getStatus().equals(Status.TOBEREFUNDED.value())) {
|
|
|
- throw new IllegalOperatorException("退货单"+cust.getReturnid()+"的状态是"+Status.valueOf(cust.getStatus()).getPhrase() +",不为待退款,不能做退款操作!");
|
|
|
- }
|
|
|
- Long uu = SystemSession.getUser().getUserUU();
|
|
|
- // 将客户退货单更改状态为已退款
|
|
|
- cust.setStatusRefunded(uu);
|
|
|
- Set<ReturnFCustDetail> returnDetails = cust.getReturnDetails();
|
|
|
- // 变更退款明细表的状态为已退款
|
|
|
- for (ReturnFCustDetail returnFCustDetail : returnDetails) {
|
|
|
- returnFCustDetail.setStatus(Status.REFUNDED.value());
|
|
|
- }
|
|
|
- cust = returnFCustDao.save(cust);
|
|
|
- return cust;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ModelMap hasReturns() {
|
|
|
- ModelMap map = new ModelMap();
|
|
|
- List<ReturnFCust> list = returnFCustDao.findByBuyeruu(SystemSession.getUser().getUserUU());
|
|
|
- if (CollectionUtils.isEmpty(list)) {
|
|
|
- map.put("data", "error");
|
|
|
- } else {
|
|
|
- map.put("data", "success");
|
|
|
- }
|
|
|
- return map;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Page<ReturnFCust> findIndividualReturns(final PageInfo pageInfo, String keyword, String status) {
|
|
|
- handlerStatus(pageInfo, status);
|
|
|
- if (StringUtils.hasText(keyword)) {
|
|
|
- // 输订单号,按订单号查询
|
|
|
- pageInfo.filter("returnid", keyword);
|
|
|
- }
|
|
|
- return returnFCustDao.findAll(new Specification<ReturnFCust>() {
|
|
|
- public Predicate toPredicate(Root<ReturnFCust> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
|
|
|
- query.where(pageInfo.getPredicates(root, query, builder));
|
|
|
- return null;
|
|
|
- }
|
|
|
- }, pageInfo);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ReturnFCust findByReturnId(String returnid) {
|
|
|
- return returnFCustDao.findByReturnid(returnid);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Page<ReturnFB2c> findIndividualVender(final PageInfo pageInfo, String keyword, String status) {
|
|
|
- handlerStatus(pageInfo, status);
|
|
|
- if (StringUtils.hasText(keyword)) {
|
|
|
- // 输订单号,按订单号查询
|
|
|
- pageInfo.filter("returnid", keyword);
|
|
|
- }
|
|
|
- return returnFB2cDao.findAll(new Specification<ReturnFB2c>() {
|
|
|
- public Predicate toPredicate(Root<ReturnFB2c> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
|
|
|
- query.where(pageInfo.getPredicates(root, query, builder));
|
|
|
- return null;
|
|
|
- }
|
|
|
- }, pageInfo);
|
|
|
- }
|
|
|
-
|
|
|
- private void handlerStatus(PageInfo pageInfo, String status) {
|
|
|
- if (status.contains("-")) {
|
|
|
- String[] statuses = status.split("-");
|
|
|
- SimpleExpression[] expressions = new SimpleExpression[statuses.length];
|
|
|
- for (int i = 0; i < statuses.length; i++) {
|
|
|
- String s = statuses[i];
|
|
|
- expressions[i] = PredicateUtils.eq("status", Short.parseShort(s), false);
|
|
|
- }
|
|
|
- pageInfo.expression(PredicateUtils.or(expressions));
|
|
|
- } else {
|
|
|
- pageInfo.filter("status", Short.parseShort(status));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ReturnFB2cSimpleInfo findByReturnidAndSellerenuu(String returnid) {
|
|
|
- Long sellerenuu = SystemSession.getUser().getEnterprise().getUu();
|
|
|
- ReturnFB2c returnFB2c = returnFB2cDao.findByReturnidAndSellerenuu(returnid, sellerenuu);
|
|
|
- if (returnFB2c == null) {
|
|
|
- throw new IllegalOperatorException("非法操作");
|
|
|
- }
|
|
|
- String puid = returnFB2c.getPuid();
|
|
|
- Purchase purchase = purchaseDao.findByPurchaseid(puid);
|
|
|
- if (purchase == null) {
|
|
|
- throw new IllegalOperatorException("对应的采购单信息为空,操作有误");
|
|
|
- }
|
|
|
- return new ReturnFB2cSimpleInfo(returnFB2c);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ReturnFB2c findB2CByReturnid(String returnid) {
|
|
|
- return returnFB2cDao.findByReturnid(returnid);
|
|
|
- }
|
|
|
-
|
|
|
- @Transactional
|
|
|
- @Override
|
|
|
- public ReturnFCust createReturnFCust(List<OrderDetail> orderDetails, Order order) {
|
|
|
- if(CollectionUtils.isEmpty(orderDetails)) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- Long userUU = SystemSession.getUser().getUserUU();
|
|
|
- ReturnFCust returnFCust = new ReturnFCust(order);
|
|
|
- List<ReturnFCustDetail> returnFCustDetails = returnFCustDetailService.createReturnFCustDetail(orderDetails, order);
|
|
|
- Double total = 0.0d;
|
|
|
- Double qty = 0.0d;
|
|
|
- Double taxes = 0.0d;
|
|
|
- // 计算退货订单的退货数量、总金额和税金,并关联主表信息
|
|
|
- for (ReturnFCustDetail returnFCustDetail : returnFCustDetails) {
|
|
|
- qty = NumberUtil.add(qty, returnFCustDetail.getNumber());
|
|
|
- total = NumberUtil.add(total, returnFCustDetail.getPrice());
|
|
|
- taxes = NumberUtil.add(taxes, returnFCustDetail.getTaxes());
|
|
|
- returnFCustDetail.setCustreturn(returnFCust);
|
|
|
- }
|
|
|
- String timeNumber = createNumberService.getTimeNumber("trade$return_fmcust", 8);
|
|
|
- String reid = EncodingRulesConstant.RETURN_FROMCUST.replaceAll("_TIMESTAP_NUMBER", timeNumber);
|
|
|
- returnFCust.setReturnid(reid);
|
|
|
- returnFCust.setOrid(order.getOrderid());
|
|
|
- returnFCust.setStatusTobeshippedback(userUU);
|
|
|
- returnFCust.setTotal(total);
|
|
|
- returnFCust.setQty(qty);
|
|
|
- returnFCust.setTaxes(taxes);
|
|
|
- HashSet<ReturnFCustDetail> set = new HashSet<>();
|
|
|
- set.addAll(returnFCustDetails);
|
|
|
- returnFCust.setReturnDetails(set);
|
|
|
- ReturnFCust reFCust = returnFCustDao.save(returnFCust);
|
|
|
-
|
|
|
- //创建退款单
|
|
|
- Refund refund = refundService.createRefund(reFCust, Refund.RefundOrigin.RETURN);
|
|
|
- order.setRefundId(refund.getReid());
|
|
|
- return reFCust;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ReturnFB2c createReturnFB2c(List<PurchaseDetail> list, Long id) {
|
|
|
- Purchase purchase = purchaseDao.getOne(id);
|
|
|
- String orderid = purchase.getOrderid();
|
|
|
- Order order = orderDao.findByOrderid(orderid);
|
|
|
- ReturnFB2c returnFB2c = new ReturnFB2c(purchase);
|
|
|
- String timeNumber = createNumberService.getTimeNumber("trade$return_fmb2c", 8);
|
|
|
- String returnId = EncodingRulesConstant.RETURN_FROMB2C.replace("_TIMESTAP_NUMBER", timeNumber);
|
|
|
- returnFB2c.setReturnid(returnId);
|
|
|
- returnFB2c.setBuyeruu(order.getBuyeruu());
|
|
|
- returnFB2c.setBuyername(order.getBuyername());
|
|
|
- returnFB2c.setBuyerenuu(order.getBuyerenuu());
|
|
|
- returnFB2c.setDeliverytype(order.getDeliverytype());
|
|
|
- returnFB2c.setInvoicetitle(order.getInvoicetitle());
|
|
|
- returnFB2c.setOrid(order.getOrderid());
|
|
|
- returnFB2c.setInvoicetype(order.getInvoicetype());
|
|
|
- returnFB2c.setPaytype(order.getPaytype());
|
|
|
- Set<ReturnFB2cDetail> set = new HashSet<>();
|
|
|
- short detno = 1;
|
|
|
- Double price = 0.0d;
|
|
|
- Double taxes = 0.0d;
|
|
|
- Double qty = 0.0d;
|
|
|
- for (PurchaseDetail purchaseDetail : list) {
|
|
|
- ReturnFB2cDetail rBDetail = new ReturnFB2cDetail(purchaseDetail);
|
|
|
- rBDetail.setDetno(detno++);
|
|
|
- timeNumber = createNumberService.getTimeNumber("trade$return_fmb2c_dt", 8);
|
|
|
- String detailid = EncodingRulesConstant.RETURN_DETAIL_FROMB2C.replace("_TIMESTAP_NUMBER", timeNumber);
|
|
|
- rBDetail.setDetailid(detailid);
|
|
|
- rBDetail.setStatus(Status.TOBESHIPPEDBACK.value());
|
|
|
- qty += rBDetail.getNumber();
|
|
|
- taxes += rBDetail.getTaxes();
|
|
|
- price += rBDetail.getPrice();
|
|
|
- rBDetail.setB2creturn(returnFB2c);
|
|
|
- set.add(rBDetail);
|
|
|
- }
|
|
|
- returnFB2c.setQty(qty);
|
|
|
- returnFB2c.setTaxes(taxes);
|
|
|
- returnFB2c.setPrice(price);
|
|
|
- returnFB2c.setReturnDetails(set);
|
|
|
- returnFB2c.setStatusTobeshippedback(SystemSession.getUser().getUserUU());
|
|
|
- returnFB2cDao.save(returnFB2c);
|
|
|
- return returnFB2c;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Map<String, ReturnFB2c> getReturnByPurchaseIds(String[] purchaseIds) {
|
|
|
- Map<String, ReturnFB2c> puReturnMap = new HashMap<>();
|
|
|
- ReturnFB2c returnFB2c;
|
|
|
- if(purchaseIds != null) {
|
|
|
- for(String purchaseId : purchaseIds) {
|
|
|
- returnFB2c = returnFB2cDao.findByPuid(purchaseId);
|
|
|
- ReturnFB2c puReturn = null;
|
|
|
- if(returnFB2c != null) {
|
|
|
- puReturn = new ReturnFB2c();
|
|
|
- puReturn.setId(returnFB2c.getId());
|
|
|
- puReturn.setReturnid(returnFB2c.getReturnid());
|
|
|
- puReturn.setStatus(returnFB2c.getStatus());
|
|
|
-
|
|
|
- Set<ReturnFB2cDetail> detailSet = new HashSet<>();
|
|
|
- ReturnFB2cDetail returnFB2cDetail;
|
|
|
- for(ReturnFB2cDetail detail : returnFB2c.getReturnDetails()) {
|
|
|
- returnFB2cDetail = new ReturnFB2cDetail();
|
|
|
- returnFB2cDetail.setDetailid(detail.getPuid());
|
|
|
- detailSet.add(returnFB2cDetail);
|
|
|
- }
|
|
|
- puReturn.setReturnDetails(detailSet);
|
|
|
- }
|
|
|
- puReturnMap.put(purchaseId, puReturn);
|
|
|
- }
|
|
|
- }
|
|
|
- return puReturnMap;
|
|
|
- }
|
|
|
-}
|