From 092a98a583c4fe822a3eb4c4dac086f84b16189c Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期五, 26 九月 2025 17:58:32 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TErpClinicWarehousingServiceImpl.java |  345 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 343 insertions(+), 2 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TErpClinicWarehousingServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TErpClinicWarehousingServiceImpl.java
index 65a8f92..aafd7f6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TErpClinicWarehousingServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TErpClinicWarehousingServiceImpl.java
@@ -1,10 +1,30 @@
 package com.ruoyi.system.service.impl;
 
-import com.ruoyi.system.model.TErpClinicWarehousing;
-import com.ruoyi.system.mapper.TErpClinicWarehousingMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.system.dto.ClinicOutboundGoodsDto;
+import com.ruoyi.system.dto.OutboundGoodsNextDto;
+import com.ruoyi.system.dto.clinicWarehouseGoodsDto;
+import com.ruoyi.system.mapper.*;
+import com.ruoyi.system.model.*;
+import com.ruoyi.system.query.*;
 import com.ruoyi.system.service.TErpClinicWarehousingService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.vo.*;
 import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -17,4 +37,325 @@
 @Service
 public class TErpClinicWarehousingServiceImpl extends ServiceImpl<TErpClinicWarehousingMapper, TErpClinicWarehousing> implements TErpClinicWarehousingService {
 
+
+    @Resource
+    private TCrmClinicMapper crmClinicMapper;
+
+    @Resource
+    private TErpClinicInventoryGoodsMapper erpClinicInventoryGoodsMapper;
+
+    @Resource
+    private TErpGoodsMapper erpGoodsMapper;
+
+    @Resource
+    private TErpClinicWarehousingMapper erpClinicWarehousingMapper;
+
+    @Resource
+    private TErpClinicWarehousingBatchMapper erpClinicWarehousingBatchMapper;
+
+    @Resource
+    private TErpClinicOutboundGoodsMapper erpClinicOutboundGoodsMapper;
+
+
+    @Resource
+    private TErpClinicOutboundMapper erpClinicOutboundMapper;
+
+    @Resource
+    private TErpGoodsUnitMapper erpGoodsUnitMapper;
+
+
+    @Resource
+    private TErpGoodsTypeMapper erpGoodsTypeMapper;
+
+
+
+    @Override
+    public PageInfo<PageInventoryListVo> pageInventoryList(TErpInventoryQuery query, SysUser user) {
+        Integer roleType = user.getRoleType();
+        String supplierClinicId = null;
+        if(roleType == 5){
+            // 诊所
+            TCrmClinic crmClinic = crmClinicMapper.selectOne(Wrappers.lambdaQuery(TCrmClinic.class)
+                    .eq(TCrmClinic::getUserId, user.getUserId())
+                    .last("LIMIT 1"));
+            supplierClinicId =crmClinic.getId();
+        }
+        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";
+        }
+        PageInfo<PageInventoryListVo> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<PageInventoryListVo> list = this.baseMapper.pageInventoryList(pageInfo,query,user,sTime,eTime,supplierClinicId);
+        if(list.isEmpty()){
+            return pageInfo;
+        }
+
+
+
+        List<String> collect = list.stream().map(PageInventoryListVo::getId).collect(Collectors.toList());
+        List<TErpClinicInventoryGoods> tErpSupplierInventoryGoods = erpClinicInventoryGoodsMapper.selectList(new LambdaQueryWrapper<TErpClinicInventoryGoods>().in(TErpClinicInventoryGoods::getInventoryId,collect));
+        for (PageInventoryListVo pageInventoryListVo : list) {
+            // 盘盈
+            BigDecimal add = BigDecimal.ZERO;
+
+            // 盘亏
+            BigDecimal subtract = BigDecimal.ZERO;
+            List<TErpClinicInventoryGoods> tErpSupplierInventoryGoodsList = tErpSupplierInventoryGoods.stream().filter(t -> t.getInventoryId().equals(pageInventoryListVo.getId())).collect(Collectors.toList());
+            for (TErpClinicInventoryGoods tErpSupplierInventoryGoods1 : tErpSupplierInventoryGoodsList) {
+
+
+                if(tErpSupplierInventoryGoods1!=null){
+                    // 盘盈 查入库
+                    if(tErpSupplierInventoryGoods1.getInventoryType()==1){
+                        TErpClinicWarehousing tErpSupplierWarehousing = erpClinicWarehousingMapper.selectById(tErpSupplierInventoryGoods1.getWarehousingId());
+//                        List<TErpSupplierWarehousingBatch> tErpSupplierWarehousingBatches = erpSupplierWarehousingBatchMapper.selectList(new LambdaQueryWrapper<TErpSupplierWarehousingBatch>().eq(TErpSupplierWarehousingBatch::getWarehousingId, tErpSupplierWarehousing.getId()));
+//                        int sum = tErpSupplierWarehousingBatches.stream().mapToInt(TErpSupplierWarehousingBatch::getWarehousingNumber).sum();
+                        String goodsId = tErpSupplierInventoryGoods1.getGoodsId();
+                        TErpGoods goods = erpGoodsMapper.selectById(goodsId);
+                        int count = tErpSupplierInventoryGoods1.getInventoryCount() - tErpSupplierInventoryGoods1.getDamagedCount();
+                        BigDecimal multiply = goods.getSalesAmount().multiply(new BigDecimal(count));
+                        add = add.add(multiply);
+                    }else {
+                        // 盘亏 查出库
+                        TErpClinicOutbound tErpSupplierOutbound = erpClinicOutboundMapper.selectById(tErpSupplierInventoryGoods1.getWarehousingId());
+
+                        List<TErpClinicOutboundGoods> tErpSupplierOutboundGoods = erpClinicOutboundGoodsMapper.selectList(new LambdaQueryWrapper<TErpClinicOutboundGoods>().eq(TErpClinicOutboundGoods::getOutboundId, tErpSupplierOutbound.getId()));
+                        for (TErpClinicOutboundGoods tErpSupplierOutboundGood : tErpSupplierOutboundGoods) {
+                            TErpClinicWarehousing tErpSupplierWarehousing = erpClinicWarehousingMapper.selectById(tErpSupplierOutboundGood.getWarehousingId());
+                            String goodsId = tErpSupplierInventoryGoods1.getGoodsId();
+                            TErpGoods goods = erpGoodsMapper.selectById(goodsId);
+                            int count = tErpSupplierInventoryGoods1.getInventoryCount() - tErpSupplierInventoryGoods1.getDamagedCount();
+                            BigDecimal multiply = goods.getSalesAmount().multiply(new BigDecimal(count));
+                            add = add.add(multiply);
+                        }
+//                        int sum = tErpSupplierOutboundGoods.stream().mapToInt(TErpSupplierOutboundGoods::getOutboundCount).sum();
+//                        String goodsId = tErpSupplierOutbound.getGoodsId();
+//                        TErpGoods goods = erpGoodsMapper.selectById(goodsId);
+//                        BigDecimal multiply = goods.getSalesAmount().multiply(new BigDecimal(sum));
+//                        subtract = subtract.add(multiply);
+                    }
+                }
+            }
+            int size = tErpSupplierInventoryGoodsList.stream().map(TErpClinicInventoryGoods::getGoodsId).collect(Collectors.toSet()).size();
+            pageInventoryListVo.setNum(size);
+            pageInventoryListVo.setTotalPrice(add);
+
+        }
+
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
+
+    @Override
+    public List<InventoryDetailVo> detailInventory(String id, SysUser user) {
+        ArrayList<InventoryDetailVo> inventoryDetailVos = new ArrayList<>();
+
+        List<TErpClinicInventoryGoods> tErpSupplierInventoryGoods = erpClinicInventoryGoodsMapper.selectList(new LambdaQueryWrapper<TErpClinicInventoryGoods>().eq(TErpClinicInventoryGoods::getInventoryId, id));
+        if(tErpSupplierInventoryGoods!=null && !tErpSupplierInventoryGoods.isEmpty()){
+            for (TErpClinicInventoryGoods tErpSupplierInventoryGood : tErpSupplierInventoryGoods) {
+                InventoryDetailVo inventoryDetailVo = new InventoryDetailVo();
+                if(tErpSupplierInventoryGood.getInventoryType()==1){
+                    TErpClinicWarehousing tErpSupplierWarehousing = erpClinicWarehousingMapper.selectById(tErpSupplierInventoryGood.getWarehousingId());
+                    String goodsId = tErpSupplierInventoryGood.getGoodsId();
+                    TErpGoods goods = erpGoodsMapper.selectById(goodsId);
+                    inventoryDetailVo.setGoodsName(goods.getGoodsName());
+                    TErpGoodsUnit tErpGoodsUnit = erpGoodsUnitMapper.selectById(goods.getPackingUnitId());
+                    inventoryDetailVo.setUnitName(tErpGoodsUnit.getUnitName());
+                    inventoryDetailVo.setWarehouseNo(tErpSupplierWarehousing.getWarehouseNo());
+                    TErpClinicWarehousingBatch tErpSupplierWarehousingBatch = erpClinicWarehousingBatchMapper.selectById(tErpSupplierInventoryGood.getWarehousingBatchId());
+                    inventoryDetailVo.setBatchNumber(tErpSupplierWarehousingBatch.getBatchNumber());
+
+                    List<TErpClinicWarehousingBatch> tErpSupplierWarehousingBatches = erpClinicWarehousingBatchMapper.selectList(new LambdaQueryWrapper<TErpClinicWarehousingBatch>().eq(TErpClinicWarehousingBatch::getBatchNumber, tErpSupplierWarehousingBatch.getBatchNumber()));
+                    int sum = tErpSupplierWarehousingBatches.stream().mapToInt(TErpClinicWarehousingBatch::getWarehousingNumber).sum();
+                    List<String> collect = tErpSupplierWarehousingBatches.stream().map(TErpClinicWarehousingBatch::getId).collect(Collectors.toList());
+                    if(!collect.isEmpty()){
+                        List<TErpClinicOutboundGoods> tErpSupplierOutboundGoods = erpClinicOutboundGoodsMapper.selectList(new LambdaQueryWrapper<TErpClinicOutboundGoods>().eq(TErpClinicOutboundGoods::getWarehousingBatchId, collect));
+                        int sum1 = tErpSupplierOutboundGoods.stream().mapToInt(TErpClinicOutboundGoods::getOutboundCount).sum();
+                        sum = sum-sum1;
+                    }
+
+                    // sum = 剩余库存
+                    inventoryDetailVo.setNowCount(sum);
+                    inventoryDetailVo.setInventoryCount(tErpSupplierInventoryGood.getInventoryCount());
+                    inventoryDetailVo.setInventoryType(tErpSupplierInventoryGood.getInventoryType());
+                    inventoryDetailVo.setDamagedCount(tErpSupplierInventoryGood.getDamagedCount());
+                }
+                inventoryDetailVos.add(inventoryDetailVo);
+
+            }
+
+            return inventoryDetailVos;
+
+        }
+
+
+        return Collections.emptyList();
+    }
+
+
+
+    @Override
+    public PageInfo<ValidityPeriodWarningVo> validityPeriodWarning(ValidityPeriodWarningQuery query, SysUser user) {
+        Integer roleType = user.getRoleType();
+        String supplierClinicId = null;
+        if(roleType == 5){
+            // 诊所
+            TCrmClinic crmClinic = crmClinicMapper.selectOne(Wrappers.lambdaQuery(TCrmClinic.class)
+                    .eq(TCrmClinic::getUserId, user.getUserId())
+                    .last("LIMIT 1"));
+            supplierClinicId =crmClinic.getId();
+        }
+        // 获取当前时间后9个月的时间
+        LocalDateTime nineMonthLater = LocalDateTime.now().plusMonths(9);
+
+        PageInfo<ValidityPeriodWarningVo> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+
+
+
+        return this.baseMapper.validityPeriodWarning(pageInfo,query,user,nineMonthLater,supplierClinicId);
+    }
+
+    @Override
+    public PageInfo<TErpGoodsVO> pageList(TErpGoodsQuery query, SysUser user) {
+        PageInfo<TErpGoodsVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<TErpGoodsVO> list = this.baseMapper.pageList(query,pageInfo,user);
+        if(list.isEmpty()){
+            return pageInfo;
+        }
+
+
+        List<String> typeIds = list.stream().map(TErpGoods::getTypeId).collect(Collectors.toList());
+        if(!typeIds.isEmpty()){
+            List<TErpGoodsType> typeList = erpGoodsTypeMapper.selectBatchIds(typeIds);
+            for (TErpGoodsVO tErpGoodsVO : list) {
+                typeList.stream().filter(t -> t.getId().equals(tErpGoodsVO.getTypeId())).findFirst().ifPresent(t -> tErpGoodsVO.setTypeName(t.getTypeName()));
+                tErpGoodsVO.setTypeName(tErpGoodsVO.getTypeName());
+            }
+        }
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
+
+    @Override
+    public PageInfo<TErpClinicWarehousePageListVO> warehousePageList(TClinicWarehouseQuery query, SysUser user, String supplierClinicId) {
+        String time = query.getTime();
+        String sTime =null;
+        String eTime = null;
+        if(time!=null && !time.isEmpty()){
+            String[] split = time.split(" - ");
+            sTime = split[0] + " 00:00:00";
+            eTime = split[1] + " 23:59:59";
+        }
+        PageInfo<TErpClinicWarehousePageListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<TErpClinicWarehousePageListVO> list = this.baseMapper.warehousePageList(query,pageInfo,user,supplierClinicId,sTime,eTime);
+        if(list.isEmpty()){
+            return pageInfo;
+        }
+        List<String> collect = list.stream().map(TErpClinicWarehousePageListVO::getId).collect(Collectors.toList());
+        List<TErpClinicWarehousingBatch> tErpClinicWarehousingBatches = erpClinicWarehousingBatchMapper.selectList(new LambdaQueryWrapper<TErpClinicWarehousingBatch>().in(TErpClinicWarehousingBatch::getWarehousingId, collect));
+
+        for (TErpClinicWarehousePageListVO tErpClinicWarehousePageListVO : list) {
+            int size = tErpClinicWarehousingBatches.stream().filter(e -> e.getWarehousingId().equals(tErpClinicWarehousePageListVO.getId())).map(TErpClinicWarehousingBatch::getGoodsId).collect(Collectors.toSet()).size();
+            tErpClinicWarehousePageListVO.setTypeNum(size);
+        }
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
+
+    @Override
+    public PageInfo<TErpClinicOutboundPageListVO> outboundPageList(TClinicOutboundQuery query, SysUser user, String supplierClinicId) {
+        String time = query.getTime();
+        String sTime =null;
+        String eTime = null;
+        if(time!=null && !time.isEmpty()){
+            String[] split = time.split(" - ");
+            sTime = split[0] + " 00:00:00";
+            eTime = split[1] + " 23:59:59";
+        }
+        PageInfo<TErpClinicOutboundPageListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<TErpClinicOutboundPageListVO> list = this.baseMapper.outboundPageList(query,pageInfo,user,supplierClinicId,sTime,eTime);
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
+
+    @Override
+    public void warehouseGoods(List<clinicWarehouseGoodsDto> dtos, SysUser user, String supplierClinicId) {
+
+        // dtos根据供应商分组
+        Map<String, List<clinicWarehouseGoodsDto>> collect = dtos.stream().collect(Collectors.groupingBy(clinicWarehouseGoodsDto::getSupplierId));
+
+        for (Map.Entry<String, List<clinicWarehouseGoodsDto>> stringListEntry : collect.entrySet()) {
+            String key = stringListEntry.getKey();
+            List<clinicWarehouseGoodsDto> value = stringListEntry.getValue();
+            TErpClinicWarehousing tErpClinicWarehousing = new TErpClinicWarehousing();
+            tErpClinicWarehousing.setClinicId(supplierClinicId);
+            tErpClinicWarehousing.setCreateId(user.getUserId().toString());
+            tErpClinicWarehousing.setWarehouseNo("G"+ DateUtils.dateTimeNow());
+            tErpClinicWarehousing.setCreateTime(LocalDateTime.now());
+            tErpClinicWarehousing.setSupplierId(key);
+            tErpClinicWarehousing.setType(3);
+            this.save(tErpClinicWarehousing);
+
+            BigDecimal totalPrice = new BigDecimal(0);
+            for (clinicWarehouseGoodsDto dto : value) {
+                TErpClinicWarehousingBatch tErpClinicWarehousingBatch = new TErpClinicWarehousingBatch();
+                tErpClinicWarehousingBatch.setWarehousingId(tErpClinicWarehousing.getId());
+                tErpClinicWarehousingBatch.setWarehousingNumber(dto.getPurchaseCount());
+                tErpClinicWarehousingBatch.setBatchNumber(dto.getBatchNumber());
+                tErpClinicWarehousingBatch.setProductionDate(dto.getProductionDate());
+                tErpClinicWarehousingBatch.setExpiryDate(dto.getExpiryDate());
+                tErpClinicWarehousingBatch.setGoodsId(dto.getId());
+                TErpGoods goods = erpGoodsMapper.selectById(dto.getId());
+                tErpClinicWarehousingBatch.setGoodsName(goods.getGoodsName());
+                tErpClinicWarehousingBatch.setQuasiNumber(goods.getQuasiNumber());
+                tErpClinicWarehousingBatch.setUnitAmount(dto.getUnitAmount());
+                tErpClinicWarehousingBatch.setSalesAmount(dto.getSalesAmount());
+                if(dto.getSalesAmount()==null){
+                    tErpClinicWarehousingBatch.setSalesAmount(goods.getClinicPurchasePrice());
+                }
+                tErpClinicWarehousingBatch.setPurchaseCount(dto.getPurchaseCount());
+                erpClinicWarehousingBatchMapper.insert(tErpClinicWarehousingBatch);
+
+                totalPrice = totalPrice.add(dto.getSalesAmount().multiply(new BigDecimal(dto.getPurchaseCount())));
+            }
+            tErpClinicWarehousing.setTotalPrice(totalPrice);
+            this.updateById(tErpClinicWarehousing);
+
+        }
+
+    }
+
+    @Override
+    public void outboundGoods(ClinicOutboundGoodsDto dto, SysUser user, String supplierClinicId) {
+        TErpClinicOutbound tErpClinicOutbound = new TErpClinicOutbound();
+        tErpClinicOutbound.setClinicId(supplierClinicId);
+        tErpClinicOutbound.setCreateId(user.getUserId().toString());
+        tErpClinicOutbound.setOutboundNumber("G"+ DateUtils.dateTimeNow());
+        tErpClinicOutbound.setCreateTime(LocalDateTime.now());
+        tErpClinicOutbound.setOutboundType(dto.getOutboundType());
+        tErpClinicOutbound.setTotalMoney(dto.getTotalPrice());
+        tErpClinicOutbound.setOutboundReason(dto.getOutboundReason());
+        tErpClinicOutbound.setTypeNum(dto.getTypeNum());
+        erpClinicOutboundMapper.insert(tErpClinicOutbound);
+
+        List<TErpClinicOutboundGoods> tErpClinicOutboundGoods = new ArrayList<>();
+        for (OutboundGoodsNextDto outboundGoodsNextDto : dto.getOutboundGoodsNextDtos()) {
+            TErpClinicOutboundGoods tErpClinicOutboundGoods1 = new TErpClinicOutboundGoods();
+            tErpClinicOutboundGoods1.setOutboundId(tErpClinicOutbound.getId());
+            String batchId = outboundGoodsNextDto.getBatchId();
+            TErpClinicWarehousingBatch tErpClinicWarehousingBatch = erpClinicWarehousingBatchMapper.selectById(batchId);
+            tErpClinicOutboundGoods1.setWarehousingId(tErpClinicWarehousingBatch.getWarehousingId());
+            tErpClinicOutboundGoods1.setWarehousingBatchId(batchId);
+            tErpClinicOutboundGoods1.setOutboundCount(outboundGoodsNextDto.getNum());
+            tErpClinicOutboundGoods1.setTotalPrice(tErpClinicWarehousingBatch.getUnitAmount().multiply(BigDecimal.valueOf(outboundGoodsNextDto.getNum())));
+            tErpClinicOutboundGoods1.setGoodsId(tErpClinicWarehousingBatch.getGoodsId());
+            tErpClinicOutboundGoods.add(tErpClinicOutboundGoods1);
+            erpClinicOutboundGoodsMapper.insert(tErpClinicOutboundGoods1);
+        }
+
+    }
 }
+

--
Gitblit v1.7.1