package com.ruoyi.system.service.impl;
|
|
import com.alibaba.fastjson2.JSON;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.common.core.domain.R;
|
import com.ruoyi.common.exception.ServiceException;
|
import com.ruoyi.common.utils.wx.PaymentUtil;
|
import com.ruoyi.common.utils.wx.RefundCallbackResult;
|
import com.ruoyi.common.utils.wx.RefundResult;
|
import com.ruoyi.system.domain.*;
|
import com.ruoyi.system.mapper.*;
|
import com.ruoyi.system.pojo.dto.AddAgreementDTO;
|
import com.ruoyi.system.pojo.dto.OrderPageDTO;
|
import com.ruoyi.system.pojo.model.DailyStatistics;
|
import com.ruoyi.system.pojo.model.DrawSheet;
|
import com.ruoyi.system.pojo.vo.*;
|
import com.ruoyi.system.service.AgreementService;
|
import com.ruoyi.system.service.OrderService;
|
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 javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.time.LocalDate;
|
import java.time.LocalDateTime;
|
import java.time.format.DateTimeFormatter;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Optional;
|
|
@Slf4j
|
@Service
|
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
|
|
@Resource
|
private PermitMapper permitMapper;
|
|
@Resource
|
private OpeningBankMapper openingBankMapper;
|
@Resource
|
private BuyerCompanyInfoMapper buyerCompanyInfoMapper;
|
@Resource
|
private ShareholderMapper shareholderMapper;
|
@Resource
|
private ScheduleMapper scheduleMapper;
|
@Resource
|
private CompanyMapper companyMapper;
|
@Autowired
|
private SystemConfigMapper systemConfigMapper;
|
|
@Override
|
public IPage<OrderPageVO> getOrderPage(OrderPageDTO dto) {
|
IPage<OrderPageVO> page = new Page<>(dto.getPageNum(), dto.getPageSize());
|
return this.baseMapper.getOrderPage(page,dto);
|
}
|
|
@Override
|
public OrderDetailVO detail(String id) {
|
OrderDetailVO vo = this.baseMapper.getDetailById(id);
|
if (null == vo) {
|
throw new ServiceException("该公司不存在");
|
}
|
//许可证集合
|
List<Permit> permits = permitMapper.selectList(new LambdaQueryWrapper<Permit>().eq(Permit::getCompanyId, id));
|
List<PermitVO> permitVOs = new ArrayList<>();
|
LocalDateTime now = LocalDateTime.now();
|
for (Permit permit : permits) {
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
LocalDateTime expireTime = LocalDateTime.parse(permit.getExpireTime(), formatter);
|
if (now.isAfter(expireTime)) {
|
//过滤 未过期的
|
PermitVO permitVO = new PermitVO();
|
permitVO.setName(permit.getName());
|
permitVO.setLevel(permit.getLevel());
|
permitVOs.add(permitVO);
|
}
|
}
|
vo.setPermitVOList(permitVOs);
|
//开户行信息集合
|
List<OpeningBank> openingBanks = openingBankMapper.selectList(new LambdaQueryWrapper<OpeningBank>().eq(OpeningBank::getCompanyId, id));
|
List<OpeningBankVO> openingBankVOs = new ArrayList<>();
|
for (OpeningBank openingBank : openingBanks) {
|
OpeningBankVO openingBankVO = new OpeningBankVO();
|
BeanUtils.copyProperties(openingBank, openingBankVO);
|
openingBankVOs.add(openingBankVO);
|
}
|
vo.setOpeningBankVOList(openingBankVOs);
|
|
if (vo.getStatus() != 4 && vo.getStatus() != 5) {
|
return vo;
|
}
|
|
//状态为办理中和已完成
|
//客户信息
|
BuyerCompanyInfo buyerCompanyInfo = buyerCompanyInfoMapper.selectOne(new LambdaQueryWrapper<BuyerCompanyInfo>().eq(BuyerCompanyInfo::getOrderId, vo.getOrderId()));
|
copyProperties(vo,buyerCompanyInfo);
|
//股东占比
|
List<Shareholder> shareholders = shareholderMapper.selectList(new LambdaQueryWrapper<Shareholder>().eq(Shareholder::getOrderId, vo.getOrderId()));
|
vo.setShareholderList(shareholders);
|
//进度汇报
|
List<Schedule> schedules = scheduleMapper.selectList(new LambdaQueryWrapper<Schedule>().eq(Schedule::getOrderId, vo.getOrderId()));
|
//构建进度汇报结构
|
List<Schedule> scheduleVOList = new ArrayList<>();
|
for (Schedule schedule : schedules) {
|
if (schedule.getParentId() == null) {
|
scheduleVOList.add(schedule);
|
}else {
|
//查找到父类的集合
|
for (Schedule schedule1 : scheduleVOList) {
|
if (schedule1.getId().equals(schedule.getParentId())) {
|
schedule1.setSchedule(schedule);
|
}
|
}
|
}
|
}
|
vo.setScheduleList(scheduleVOList);
|
return vo;
|
}
|
|
private static void copyProperties(OrderDetailVO vo,BuyerCompanyInfo info){
|
vo.setLegalPersonImg(info.getLegalPersonImg());
|
vo.setNewName(info.getNewName());
|
vo.setBackupsName(info.getBackupsName());
|
vo.setBackupsNameOne(info.getBackupsNameOne());
|
vo.setBackupsNameTwo(info.getBackupsNameTwo());
|
vo.setNewRegisteredCapital(info.getRegisteredCapital());
|
vo.setAccount(info.getAccount());
|
vo.setAddress(info.getAddress());
|
vo.setPassword(info.getPassword());
|
vo.setTenancyAgreement(info.getTenancyAgreement());
|
vo.setPropertyOwnershipCertificate(info.getPropertyOwnershipCertificate());
|
vo.setBusinessScope(info.getBusinessScope());
|
}
|
|
@Override
|
public BusinessVO business(String id) {
|
Company company = companyMapper.selectById(id);
|
if (null == company || company.getIsDelete() != 0) {
|
throw new ServiceException("公司不存在");
|
}
|
BusinessVO vo = new BusinessVO();
|
BeanUtils.copyProperties(company, vo);
|
vo.setPlace(company.getCity()+company.getProvince()+company.getArea());
|
return vo;
|
}
|
|
@Override
|
public ErrorVO error(String id) {
|
return null;
|
}
|
|
@Override
|
public ChangeVO change(String id) {
|
return null;
|
}
|
|
@Override
|
public TaxVO tax(String id) {
|
return null;
|
}
|
|
@Override
|
public InvoiceVO invoice(String id) {
|
return null;
|
}
|
|
@Transactional
|
@Override
|
public void delete(String id) {
|
Company company = companyMapper.selectById(id);
|
if (null == company || company.getIsDelete() != 0) {
|
throw new ServiceException("公司不存在");
|
}
|
if (company.getStatus().equals(3)){//已完成
|
throw new ServiceException("状态错误,已完成订单不能删除");
|
}
|
|
if (company.getStatus().equals(4)){//锁定中
|
//查看订单状态是否为待确认
|
Order order = this.baseMapper.selectOne(new LambdaQueryWrapper<Order>()
|
.eq(Order::getCompanyId, company.getId())
|
.ne(Order::getStatus,-1));//取消的订单不要
|
if (null == order) {
|
throw new ServiceException("订单不存在");
|
}
|
if (!order.getStatus().equals(2)) {//不在待确认状态的
|
throw new ServiceException("状态错误,不能删除");
|
}
|
//删除订单
|
this.baseMapper.deleteById(order.getId());
|
}
|
//删除公司
|
company.setIsDelete(1);
|
companyMapper.updateById(company);
|
}
|
|
/**
|
* 上下架
|
*/
|
@Override
|
public void shelves(String id) {
|
Company company = companyMapper.selectById(id);
|
if (null == company || company.getIsDelete() != 0) {
|
throw new ServiceException("公司不存在");
|
}
|
if (company.getStatus().equals(3)){//已完成
|
throw new ServiceException("状态错误,已完成订单不能修改");
|
}
|
|
if (company.getStatus().equals(4)){//锁定中
|
//查看订单状态是否为待确认
|
Order order = this.baseMapper.selectOne(new LambdaQueryWrapper<Order>()
|
.eq(Order::getCompanyId, company.getId())
|
.ne(Order::getStatus,-1)//取消的不要
|
);
|
if (null == order) {
|
throw new ServiceException("订单不存在");
|
}
|
if (!order.getStatus().equals(2)) {//不在待确认状态的
|
throw new ServiceException("状态错误,不能修改");
|
}
|
//删除订单
|
this.baseMapper.deleteById(order.getId());
|
}
|
//上下架
|
if (company.getStatus().equals(1)||company.getStatus().equals(4)){//1-上架中 4-锁定中(待确认)
|
company.setStatus(2);//2-下架中
|
}else if (company.getStatus().equals(2)){
|
company.setStatus(1);
|
}
|
companyMapper.updateById(company);
|
|
}
|
|
@Override
|
public void cancel(String id) {
|
Company company = companyMapper.selectById(id);
|
if (null == company || company.getIsDelete() != 0) {
|
throw new ServiceException("公司不存在");
|
}
|
if (!company.getStatus().equals(4)){// 4-锁定中
|
throw new ServiceException("订单状态错误,不能操作");
|
}
|
//查看订单 取消的不要
|
Order order = this.baseMapper.selectOne(new LambdaQueryWrapper<Order>()
|
.eq(Order::getCompanyId, company.getId())
|
.ne(Order::getStatus,-1));
|
if (null == order) {
|
throw new ServiceException("订单不存在");
|
}
|
//检查状态 3已确认(未付款) 4办理中 5卖家已完成
|
if (!order.getStatus().equals(3)||!order.getStatus().equals(4)||!order.getStatus().equals(5)) {
|
throw new ServiceException("订单状态错误,不能操作");
|
}
|
if (company.getStatus().equals(3)){
|
//未付款 直接取消订单
|
order.setStatus(-1);
|
this.baseMapper.updateById(order);
|
}else{
|
//退款
|
order.setStatus(-1);
|
R r = refundPayMoney(order);//退款
|
if (200 == r.getCode()) {
|
this.updateById(order);
|
}
|
}
|
}
|
|
@Override
|
public R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult) {
|
String code = refundCallbackResult.getR3_RefundOrderNo().substring(1);
|
log.info("退款回调:{}",code);
|
Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, code));
|
if (null == order || order.getStatus() == -1) {
|
return R.ok();
|
}
|
order.setStatus(-1);
|
this.updateById(order);
|
return R.ok();
|
}
|
/**
|
* 返回订单支付金额
|
*/
|
public R refundPayMoney(Order order) {
|
//开始退款
|
BigDecimal paymentAmount = order.getPrice();
|
if (BigDecimal.ZERO.compareTo(order.getPrice()) < 0) {//支付的金额是否大于0
|
//微信退款
|
RefundResult refund = PaymentUtil.refund(order.getOrderNo(), "R" + order.getOrderNo(), paymentAmount.doubleValue(),
|
"/system/order/refundPayMoneyCallback");
|
if (!"100".equals(refund.getRa_Status())) {
|
return R.fail(refund.getRc_CodeMsg());//退款失败
|
}
|
}
|
return R.ok();
|
}
|
|
|
@Override
|
public TodayStatisticsVO today() {
|
LocalDateTime startTime = LocalDate.now().atStartOfDay();
|
LocalDateTime endTime =LocalDate.now().atTime(23, 59, 59);
|
return this.baseMapper.today(startTime, endTime);
|
}
|
|
@Override
|
public IndexLineChartVO chart(LocalDate startDate, LocalDate endDate) {
|
// 查询数据库
|
List<DailyStatistics> statisticsList = this.baseMapper.getDailyStatistics(
|
startDate.atStartOfDay(),
|
endDate.atTime(23, 59, 59)
|
);
|
// 构建返回对象
|
IndexLineChartVO vo = new IndexLineChartVO();
|
vo.setDays(new ArrayList<>());
|
vo.setTotalList(new ArrayList<>());
|
vo.setProfitList(new ArrayList<>());
|
// 按日期顺序填充数据
|
LocalDate currentDate = startDate;
|
while (!currentDate.isAfter(endDate)) {
|
String dateStr = currentDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
|
vo.getDays().add(currentDate);
|
|
// 查找当天数据,若无则默认为0
|
Optional<DailyStatistics> statOptional = statisticsList.stream()
|
.filter(s -> s.getDate().equals(dateStr))
|
.findFirst();
|
|
DailyStatistics stat = statOptional.orElse(
|
new DailyStatistics(dateStr, BigDecimal.ZERO, BigDecimal.ZERO)
|
);
|
|
vo.getTotalList().add(stat.getTotalPrice());
|
vo.getProfitList().add(stat.getPlatformCommission());
|
|
currentDate = currentDate.plusDays(1);
|
}
|
return vo;
|
|
}
|
|
|
}
|