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 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() .eq("create_by", userId).eq("order_id", dto.getOrderId())); if(count >= 2){ throw new ValidationException("售后申请超过限额"); } count = salesMapper.selectCount(new QueryWrapper() .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 selectSalesList(Page page, OrderSalesQueryDTO dto){ List 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 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 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 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() .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); } }