| 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.ClinicSalesStatisticsGoodsCountVO; | 
| import com.ruoyi.system.vo.ClinicSalesStatisticsGoodsTypeVO; | 
| 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; | 
|   | 
| /** | 
|  * <p> | 
|  * 订单管理 服务实现类 | 
|  * </p> | 
|  * | 
|  * @author xiaochen | 
|  * @since 2025-08-20 | 
|  */ | 
| @Service | 
| public class TSysOrderServiceImpl extends ServiceImpl<TSysOrderMapper, TSysOrder> 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<TSysOrderVO> queryListByAppUserId(String id) { | 
|         List<TSysOrderVO> sysOrderVOS = this.baseMapper.queryListByAppUserId(id); | 
|         if(CollectionUtils.isEmpty(sysOrderVOS)){ | 
|             return sysOrderVOS; | 
|         } | 
|         List<String> orderIds = sysOrderVOS.stream().map(TSysOrderVO::getId).collect(Collectors.toList()); | 
|         List<TSysOrderGoods> 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 sysOrderVOS; | 
|     } | 
|   | 
|     @Override | 
|     public PageInfo<TSysOrderPageVo> pageList(TSysOrderQuery query) { | 
|         PageInfo<TSysOrderPageVo> 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<TSysOrderPageVo> 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<TSysOrderNextDto> dtoList = dto.getDtoList(); | 
|         ArrayList<TSysOrderGoods> tSysOrderGoods = new ArrayList<>(); | 
|         ArrayList<TErpClinicOutboundGoods> erpClinicOutboundGoods = new ArrayList<>(); | 
|   | 
|         for (TSysOrderNextDto sysOrderNextDto : dtoList) { | 
|             TErpClinicWarehousingBatch tErpClinicWarehousingBatch = erpClinicWarehousingBatchMapper.selectById(sysOrderNextDto.getBatchId()); | 
|             // 找出这个批次出库多少 | 
|             List<TErpClinicOutboundGoods> tErpClinicOutboundGoods = erpClinicOutboundGoodsMapper.selectList(new LambdaQueryWrapper<TErpClinicOutboundGoods>().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()); | 
|             tSysOrderGoods1.setGoodsId(goods.getId()); | 
|             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); | 
|         } | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public Integer clinicSalesStatisticsCount(List<String> clinicIds) { | 
|         return this.baseMapper.clinicSalesStatisticsCount(clinicIds); | 
|     } | 
|   | 
|     @Override | 
|     public Integer clinicSalesStatisticsTypeCount(List<String> clinicIds) { | 
|         return this.baseMapper.clinicSalesStatisticsTypeCount(clinicIds); | 
|     } | 
|   | 
|     @Override | 
|     public BigDecimal clinicSalesStatisticsMoney(String clinicId, String startTime, String endTime) { | 
|         return this.baseMapper.clinicSalesStatisticsMoney(clinicId,startTime,endTime); | 
|     } | 
|   | 
|     @Override | 
|     public List<ClinicSalesStatisticsGoodsTypeVO> supplierSalesStatisticsGoodsType(String clinicId, String startTime, String endTime) { | 
|         return this.baseMapper.supplierSalesStatisticsGoodsType(clinicId,startTime,endTime); | 
|     } | 
|   | 
|     @Override | 
|     public List<ClinicSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCount(String clinicId, String startTime, String endTime, String goodsName) { | 
|         return this.baseMapper.supplierSalesStatisticsGoodsCount(clinicId,startTime,endTime,goodsName); | 
|     } | 
|   | 
|     @Override | 
|     public List<ClinicSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCountMonth(String clinicId, String startTime, String endTime, String goodsName) { | 
|         return this.baseMapper.supplierSalesStatisticsGoodsCountMonth(clinicId,startTime,endTime,goodsName); | 
|     } | 
| } |