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); } } }