| 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 UserPaymentV3Service paymentV3Service; | 
|   | 
|     @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){ | 
|         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 = paymentV3Service.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); | 
|     } | 
| } |