package com.mzl.flower.service.payment;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.mzl.flower.component.SequenceNo;
|
import com.mzl.flower.config.PyamentV3Configurer;
|
import com.mzl.flower.config.exception.ValidationException;
|
import com.mzl.flower.config.security.SecurityUtils;
|
import com.mzl.flower.constant.Constants;
|
import com.mzl.flower.dto.request.payment.*;
|
import com.mzl.flower.dto.response.payment.*;
|
import com.mzl.flower.entity.customer.Customer;
|
import com.mzl.flower.entity.payment.*;
|
import com.mzl.flower.entity.system.User;
|
import com.mzl.flower.entity.system.UserWechat;
|
import com.mzl.flower.mapper.payment.*;
|
import com.mzl.flower.mapper.system.UserWechatMapper;
|
import com.mzl.flower.service.BaseService;
|
import com.mzl.flower.utils.UUIDGenerator;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.util.StringUtils;
|
|
import java.math.BigDecimal;
|
import java.time.LocalDateTime;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
@Slf4j
|
@Service
|
@Transactional
|
public class OrderSalesService extends BaseService {
|
|
@Autowired
|
private OrderSalesMapper salesMapper;
|
|
@Autowired
|
private OrderSalesItemMapper salesItemMapper;
|
|
@Autowired
|
private SequenceNo sequenceNo;
|
|
@Autowired
|
private OrderMapper orderMapper;
|
|
@Autowired
|
private OrderItemMapper orderItemMapper;
|
|
@Autowired
|
private UserWechatMapper wechatMapper;
|
|
@Autowired
|
private UserPaymentSybService paymentSybService;
|
|
@Autowired
|
private OrderRefundMapper orderRefundMapper;
|
|
public String createSales(OrderSalesCreateDTO dto){
|
List<String> orderItems = dto.getOrderItems();
|
if(orderItems == null || orderItems.size() == 0){
|
throw new ValidationException("商品列表不能为空");
|
}
|
|
//收货前可以申请售后,售后最多申请两次
|
Order o = orderMapper.selectById(dto.getOrderId());
|
String status = o.getStatus();
|
if(!Constants.ORDER_STATUS.RECEIVE.name().equals(status)){
|
throw new ValidationException("无法申请售后");
|
}
|
|
String userId = SecurityUtils.getUserId();
|
int count = salesMapper.selectCount(new QueryWrapper<OrderSales>()
|
.eq("create_by", userId).eq("order_id", dto.getOrderId()));
|
if(count >= 2){
|
throw new ValidationException("售后申请超过限额");
|
}
|
|
count = salesMapper.selectCount(new QueryWrapper<OrderSales>()
|
.eq("create_by", userId)
|
.eq("order_id", dto.getOrderId())
|
.eq("status", Constants.SALES_STATUS.PENDING.name())
|
);
|
if(count > 0){
|
throw new ValidationException("有未处理售后,无法申请");
|
}
|
|
OrderSales s = new OrderSales();
|
s.setId(UUIDGenerator.getUUID());
|
s.setOrderId(dto.getOrderId());
|
s.setSalesNo(getSalesNo());
|
s.setImages(toJSONString(dto.getImageList()));
|
s.setVideos(toJSONString(dto.getVideoList()));
|
s.setReason(dto.getReason());
|
s.setStatus(Constants.SALES_STATUS.PENDING.name());
|
s.create(userId);
|
salesMapper.insert(s);
|
|
for(String i : orderItems){
|
OrderSalesItem si = new OrderSalesItem();
|
si.setId(UUIDGenerator.getUUID());
|
si.setOrderId(dto.getOrderId());
|
si.setOrderItemId(i);
|
si.setSalesId(s.getId());
|
si.create(userId);
|
salesItemMapper.insert(si);
|
}
|
|
return s.getId();
|
}
|
|
private String getSalesNo(){
|
String seq = sequenceNo.getSeqNo(SequenceNo.ORDER_SALES);
|
return "SH" + format(LocalDateTime.now(), "yyyyMMdd") + seq;
|
}
|
|
public void cancelSales(String id){
|
OrderSales s = salesMapper.selectById(id);
|
String userId = SecurityUtils.getUserId();
|
if(!userId.equals(s.getCreateBy())){
|
throw new ValidationException("无权操作");
|
}
|
|
String status = s.getStatus();
|
if(!Constants.SALES_STATUS.PENDING.name().equals(status)){
|
throw new ValidationException("已处理完成不用取消");
|
}
|
|
s.setStatus(Constants.SALES_STATUS.CANCEL.name());
|
s.update(userId);
|
salesMapper.updateById(s);
|
}
|
|
public Page<OrderSalesListDTO> selectSalesList(Page page, OrderSalesQueryDTO dto){
|
List<OrderSalesListDTO> ls = salesMapper.selectSalesList(page, dto);
|
|
page.setRecords(ls);
|
return page;
|
}
|
|
public OrderSalesDTO getSalesInfo(String id, Long supplierId){
|
OrderSalesDTO rr = new OrderSalesDTO();
|
OrderSales sl = salesMapper.selectById(id);
|
BeanUtils.copyProperties(sl, rr);
|
|
rr.setImageList(parseArray(sl.getImages(), String.class));
|
rr.setVideoList(parseArray(sl.getVideos(), String.class));
|
|
User user = userMapper.selectById(sl.getCreateBy());
|
rr.setCreateName(user.getNickName());
|
|
Order o = orderMapper.selectById(sl.getOrderId());
|
rr.setOrderNo(o.getOrderNo());
|
rr.setCustomer(o.getCustomer());
|
rr.setCustomerTel(o.getCustomerTel());
|
rr.setCustomerProvince(o.getCustomerProvince());
|
rr.setCustomerCity(o.getCustomerCity());
|
rr.setCustomerRegion(o.getCustomerRegion());
|
rr.setCustomerAddress(o.getCustomerAddress());
|
rr.setTotalOrderAmount(o.getTotalAmount());
|
|
String transferId = sl.getTransferId();
|
if(!StringUtils.isEmpty(transferId)){
|
OrderRefund t = orderRefundMapper.selectById(transferId);
|
rr.setTransferStatus(t == null ? "" : t.getStatus());
|
}
|
|
OrderSalesItemQueryDTO queryDTO = new OrderSalesItemQueryDTO();
|
queryDTO.setSalesId(id);
|
queryDTO.setSupplierId(supplierId);
|
List<OrderItemSalesListDTO> result = salesItemMapper.selectSalesItemList(queryDTO);
|
if(result != null && result.size() > 0){
|
for(OrderItemSalesListDTO r : result){
|
r.setChargePersonList(parseArray(r.getChargePersons(), OrderSalesItemChargeDTO.class));
|
}
|
}
|
rr.setItems(result);
|
|
return rr;
|
}
|
|
public void setSalesItemAmount(OrderSalesItemAmountDTO dto){
|
OrderSalesItem item = salesItemMapper.selectById(dto.getId());
|
BeanUtils.copyProperties(dto, item);
|
|
item.setChargePersons(toJSONString(dto.getChargePersonList()));
|
|
salesItemMapper.updateById(item);
|
}
|
|
public void doAudit(OrderSalesAuditDTO dto) throws Exception {
|
OrderSales s = salesMapper.selectById(dto.getId());
|
s.setAuditRemarks(dto.getAuditRemarks());
|
s.setAuditStatus(dto.getAuditStatus());
|
s.setStatus(Constants.SALES_STATUS.COMPLETED.name());
|
s.setAuditTime(LocalDateTime.now());
|
|
List<OrderSalesItemAmountDTO> items = dto.getItems();
|
BigDecimal totalAmount = new BigDecimal(0);
|
if(items != null && items.size() > 0){
|
for(OrderSalesItemAmountDTO i : items){
|
setSalesItemAmount(i);
|
BigDecimal a = i.getAmount() == null ? new BigDecimal(0) : i.getAmount();
|
totalAmount = totalAmount.add(a);
|
}
|
}
|
|
s.setTotalAmount(totalAmount);
|
|
if(Constants.SALES_AUDIT_STATUS.AGREE.name().equals(s.getAuditStatus())){
|
if(totalAmount.doubleValue() > 0) {
|
Order o = orderMapper.selectById(s.getOrderId());
|
String transferId = paymentSybService.refundOrderSub(o, totalAmount);
|
s.setTransferId(transferId);
|
|
/*if(totalAmount.doubleValue() > o.getTotalAmount().doubleValue()){
|
throw new ValidationException("赔款金额不能大于订单金额");
|
}
|
|
String remarks = "售后理赔";
|
String openId = o.getPayOpenid();
|
|
List<TransferDetailReqDTO> details = new ArrayList<>();
|
TransferDetailReqDTO dr = new TransferDetailReqDTO();
|
dr.setAmount(totalAmount.multiply(new BigDecimal(100)).longValue());
|
dr.setOpenId(openId);
|
dr.setRemarks(remarks);
|
if(totalAmount.doubleValue() >= 2000){
|
Customer p = customerMapper.selectOne(new QueryWrapper<Customer>()
|
.eq("user_id", s.getCreateBy()));
|
dr.setUserName(p.getName());
|
}
|
details.add(dr);
|
|
TransferReqDTO transferReqDTO = new TransferReqDTO();
|
transferReqDTO.setDetails(details);
|
transferReqDTO.setAppId(PyamentV3Configurer.customer_app_id);
|
transferReqDTO.setName(s.getSalesNo());
|
transferReqDTO.setRemarks(remarks);
|
|
String transferId = paymentV3Service.doBatchTransfer(transferReqDTO, SecurityUtils.getUserId()); //发起转账
|
s.setTransferId(transferId);*/
|
}
|
}
|
|
s.update(SecurityUtils.getUserId());
|
salesMapper.updateById(s);
|
}
|
}
|