package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.dto.TSysOrderDto;
import com.ruoyi.system.dto.TSysOrderNextDto;
import com.ruoyi.system.mapper.*;
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.TSysOrderQuery;
import com.ruoyi.system.service.TCrmClinicService;
import com.ruoyi.system.service.TErpClinicOutboundService;
import com.ruoyi.system.service.TSysOrderService;
import com.ruoyi.system.vo.TSysOrderPageVo;
import com.ruoyi.system.vo.TSysOrderVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 订单管理 服务实现类
*
*
* @author xiaochen
* @since 2025-08-20
*/
@Service
public class TSysOrderServiceImpl extends ServiceImpl implements TSysOrderService {
@Autowired
private TSysOrderGoodsMapper sysOrderGoodsMapper;
@Resource
private TErpClinicWarehousingBatchMapper erpClinicWarehousingBatchMapper;
@Resource
private TErpClinicOutboundGoodsMapper erpClinicOutboundGoodsMapper;
@Resource
private TErpGoodsMapper erpGoodsMapper;
@Resource
private TErpGoodsTypeMapper erpGoodsTypeMapper;
@Resource
private TErpGoodsUnitMapper erpGoodsUnitMapper;
@Resource
private TErpClinicOutboundMapper erpClinicOutboundMapper;
@Override
public List queryListByAppUserId(String id) {
List sysOrderVOS = this.baseMapper.queryListByAppUserId(id);
if(CollectionUtils.isEmpty(sysOrderVOS)){
return sysOrderVOS;
}
List orderIds = sysOrderVOS.stream().map(TSysOrderVO::getId).collect(Collectors.toList());
List sysOrderGoodsList = sysOrderGoodsMapper.selectList(Wrappers.lambdaQuery(TSysOrderGoods.class)
.in(TSysOrderGoods::getOrderId, orderIds));
for (TSysOrderVO sysOrderVO : sysOrderVOS) {
sysOrderVO.setSysOrderGoods(sysOrderGoodsList.stream().filter(sysOrderGoods -> sysOrderGoods.getOrderId().equals(sysOrderVO.getId())).collect(Collectors.toList()));
}
return this.baseMapper.queryListByAppUserId(id);
}
@Override
public PageInfo pageList(TSysOrderQuery query) {
PageInfo page = new PageInfo<>(query.getPageNum(), query.getPageSize());
String sTime =null;
String eTime = null;
if(query.getTime() != null && !query.getTime().isEmpty()){
String[] split = query.getTime().split(" - ");
sTime = split[0] + " 00:00:00";
eTime = split[1] + " 23:59:59";
}
List sysOrderPageVOS = this.baseMapper.pageList(page, query,sTime,eTime);
page.setRecords(sysOrderPageVOS);
return page;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void add(TSysOrderDto dto, TCrmClinic crmClinic) {
// 判断库存够不够 添加订单 添加订单二级 出库记录
List dtoList = dto.getDtoList();
ArrayList tSysOrderGoods = new ArrayList<>();
ArrayList erpClinicOutboundGoods = new ArrayList<>();
for (TSysOrderNextDto sysOrderNextDto : dtoList) {
TErpClinicWarehousingBatch tErpClinicWarehousingBatch = erpClinicWarehousingBatchMapper.selectById(sysOrderNextDto.getBatchId());
// 找出这个批次出库多少
List tErpClinicOutboundGoods = erpClinicOutboundGoodsMapper.selectList(new LambdaQueryWrapper().eq(TErpClinicOutboundGoods::getWarehousingBatchId, sysOrderNextDto.getBatchId()));
int count = tErpClinicOutboundGoods.stream().mapToInt(TErpClinicOutboundGoods::getOutboundCount).sum();
if(tErpClinicWarehousingBatch.getPurchaseCount() < count + sysOrderNextDto.getNum()){
throw new RuntimeException("库存不足");
}
TErpGoods goods = erpGoodsMapper.selectById(tErpClinicWarehousingBatch.getGoodsId());
TSysOrderGoods tSysOrderGoods1 = new TSysOrderGoods();
tSysOrderGoods1.setGoodsName(goods.getGoodsName());
TErpGoodsType tErpGoodsType = erpGoodsTypeMapper.selectById(goods.getTypeId());
tSysOrderGoods1.setTypeName(tErpGoodsType.getTypeName());
tSysOrderGoods1.setQuasiNumber(goods.getQuasiNumber());
TErpGoodsUnit tErpGoodsUnit = erpGoodsUnitMapper.selectById(goods.getPackingUnitId());
tSysOrderGoods1.setGoodsUnit(tErpGoodsUnit.getUnitName());
tSysOrderGoods1.setSaleCount(sysOrderNextDto.getNum());
tSysOrderGoods1.setSaleAmount(goods.getSalesAmount());
tSysOrderGoods1.setBatchId(tErpClinicWarehousingBatch.getId());
tSysOrderGoods1.setBatchNumber(tErpClinicWarehousingBatch.getBatchNumber());
tSysOrderGoods1.setRemainingQuantity(sysOrderNextDto.getRemainingQuantity());
tSysOrderGoods.add(tSysOrderGoods1);
TErpClinicOutboundGoods tErpClinicOutboundGoods1 = new TErpClinicOutboundGoods();
tErpClinicOutboundGoods1.setWarehousingId(tErpClinicWarehousingBatch.getWarehousingId());
tErpClinicOutboundGoods1.setWarehousingBatchId(tErpClinicWarehousingBatch.getId());
tErpClinicOutboundGoods1.setOutboundCount(sysOrderNextDto.getNum());
tErpClinicOutboundGoods1.setGoodsId(goods.getId());
tErpClinicOutboundGoods1.setTotalPrice(sysOrderNextDto.getSaleAmount().multiply(BigDecimal.valueOf(sysOrderNextDto.getNum())));
erpClinicOutboundGoods.add(tErpClinicOutboundGoods1);
}
TSysOrder tSysOrder = new TSysOrder();
tSysOrder.setAppUserId(dto.getAppUserId());
tSysOrder.setClinicId(crmClinic.getId());
tSysOrder.setInspectionId(dto.getInspectionId());
tSysOrder.setTotalMoney(dto.getTotalMoney());
tSysOrder.setCheckTime(dto.getCheckTime());
tSysOrder.setOrderNumber(System.currentTimeMillis() + "");
this.save(tSysOrder);
for (TSysOrderGoods tSysOrderGood : tSysOrderGoods) {
tSysOrderGood.setOrderId(tSysOrder.getId());
sysOrderGoodsMapper.insert(tSysOrderGood);
}
TErpClinicOutbound tErpClinicOutbound = new TErpClinicOutbound();
tErpClinicOutbound.setClinicId(crmClinic.getId());
tErpClinicOutbound.setOutboundType(7);
tErpClinicOutbound.setOrderNumber(tSysOrder.getOrderNumber());
tErpClinicOutbound.setTotalMoney(dto.getTotalMoney());
tErpClinicOutbound.setOutboundNumber("G"+System.currentTimeMillis());
erpClinicOutboundMapper.insert(tErpClinicOutbound);
for (TErpClinicOutboundGoods erpClinicOutboundGood : erpClinicOutboundGoods) {
erpClinicOutboundGood.setOutboundId(tErpClinicOutbound.getId());
erpClinicOutboundGoodsMapper.insert(erpClinicOutboundGood);
}
}
}