|  |  |  | 
|---|
|  |  |  | package com.ruoyi.system.service.impl; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
|---|
|  |  |  | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | 
|---|
|  |  |  | import com.ruoyi.common.basic.PageInfo; | 
|---|
|  |  |  | import com.ruoyi.common.core.domain.BaseModel; | 
|---|
|  |  |  | import com.ruoyi.common.core.domain.entity.SysUser; | 
|---|
|  |  |  | import com.ruoyi.common.core.exception.ServiceException; | 
|---|
|  |  |  | import com.ruoyi.common.utils.DateUtils; | 
|---|
|  |  |  | import com.ruoyi.common.utils.uuid.IdUtils; | 
|---|
|  |  |  | import com.ruoyi.system.dto.OutboundGoodsDto; | 
|---|
|  |  |  | import com.ruoyi.system.dto.OutboundGoodsNextDto; | 
|---|
|  |  |  | import com.ruoyi.system.dto.WarehousingGoodsDto; | 
|---|
|  |  |  | import com.ruoyi.system.dto.WarehousingGoodsNextDto; | 
|---|
|  |  |  | import com.ruoyi.system.mapper.*; | 
|---|
|  |  |  | import com.ruoyi.system.model.*; | 
|---|
|  |  |  | import com.ruoyi.system.query.TErpGoodsQuery; | 
|---|
|  |  |  | import com.ruoyi.system.query.TErpGoodsWarehouseQuery; | 
|---|
|  |  |  | import com.ruoyi.system.query.TErpInventoryQuery; | 
|---|
|  |  |  | import com.ruoyi.system.query.ValidityPeriodWarningQuery; | 
|---|
|  |  |  | import com.ruoyi.system.service.TCrmClinicService; | 
|---|
|  |  |  | import com.ruoyi.system.service.TCrmSupplierService; | 
|---|
|  |  |  | import com.ruoyi.system.service.TErpSupplierWarehousingService; | 
|---|
|  |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
|---|
|  |  |  | import com.ruoyi.system.vo.TErpGoodsVO; | 
|---|
|  |  |  | import com.ruoyi.system.vo.TErpGoodsWarehouseLastVO; | 
|---|
|  |  |  | import com.ruoyi.system.vo.TErpGoodsWarehouseRecordLastVO; | 
|---|
|  |  |  | import com.ruoyi.system.vo.TErpGoodsWarehouseVO; | 
|---|
|  |  |  | import com.ruoyi.system.vo.*; | 
|---|
|  |  |  | import org.apache.poi.ss.formula.functions.T; | 
|---|
|  |  |  | import org.springframework.stereotype.Service; | 
|---|
|  |  |  | import org.springframework.transaction.annotation.Propagation; | 
|---|
|  |  |  | import org.springframework.transaction.annotation.Transactional; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import javax.annotation.Resource; | 
|---|
|  |  |  | import java.math.BigDecimal; | 
|---|
|  |  |  | import java.math.RoundingMode; | 
|---|
|  |  |  | import java.time.LocalDateTime; | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  | import java.util.Collections; | 
|---|
|  |  |  | import java.util.List; | 
|---|
|  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private TCrmWarehouseMapper crmWarehouseMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private TErpMaintenanceReminderMapper tErpMaintenanceReminderMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private TErpSupplierInventoryGoodsMapper erpSupplierInventoryGoodsMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private TErpSupplierOutboundMapper erpSupplierOutboundMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private TErpGoodsUnitMapper erpGoodsUnitMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private  TCrmClinicMapper crmClinicMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private  TCrmSupplierMapper crmSupplierMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public PageInfo<TErpGoodsVO> pageList(TErpGoodsQuery query, SysUser 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); | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<TErpGoodsWarehouseLastVO> detail(String id, String warehouseName, SysUser user) { | 
|---|
|  |  |  | Integer roleType = user.getRoleType(); | 
|---|
|  |  |  | String supplierClinicId = null; | 
|---|
|  |  |  | if(roleType == 4){ | 
|---|
|  |  |  | // 供应商 | 
|---|
|  |  |  | TCrmSupplier crmSupplier = crmSupplierMapper.selectOne(Wrappers.lambdaQuery(TCrmSupplier.class) | 
|---|
|  |  |  | .eq(TCrmSupplier::getUserId, user.getUserId()) | 
|---|
|  |  |  | .last("LIMIT 1")); | 
|---|
|  |  |  | supplierClinicId =crmSupplier.getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(roleType == 5){ | 
|---|
|  |  |  | // 诊所 | 
|---|
|  |  |  | TCrmClinic crmClinic = crmClinicMapper.selectOne(Wrappers.lambdaQuery(TCrmClinic.class) | 
|---|
|  |  |  | .eq(TCrmClinic::getUserId, user.getUserId()) | 
|---|
|  |  |  | .last("LIMIT 1")); | 
|---|
|  |  |  | supplierClinicId =crmClinic.getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TErpGoods goods = erpGoodsMapper.selectById(id); | 
|---|
|  |  |  | 
|---|
|  |  |  | if(tCrmWarehouses.isEmpty()){ | 
|---|
|  |  |  | return Collections.emptyList(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<TErpSupplierWarehousing> tErpSupplierWarehousings = erpSupplierWarehousingMapper.selectList(new LambdaQueryWrapper<TErpSupplierWarehousing>().in(TErpSupplierWarehousing::getWarehouseId, tCrmWarehouses.stream().map(TCrmWarehouse::getId).collect(Collectors.toList())).eq(TErpSupplierWarehousing::getSupplierId, user.getUserId()).eq(TErpSupplierWarehousing::getGoodsId, id)); | 
|---|
|  |  |  | List<TErpSupplierWarehousing> tErpSupplierWarehousings = erpSupplierWarehousingMapper.selectList(new LambdaQueryWrapper<TErpSupplierWarehousing>().in(TErpSupplierWarehousing::getWarehouseId, tCrmWarehouses.stream().map(TCrmWarehouse::getId).collect(Collectors.toList())).eq(TErpSupplierWarehousing::getSupplierId, supplierClinicId).eq(TErpSupplierWarehousing::getGoodsId, id)); | 
|---|
|  |  |  | if(tErpSupplierWarehousings.isEmpty()){ | 
|---|
|  |  |  | return Collections.emptyList(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | tErpGoodsWarehouseLastVO.setAllNum(tErpGoodsWarehouseVOS.stream().mapToInt(TErpGoodsWarehouseVO::getNowNum).sum()); | 
|---|
|  |  |  | tErpGoodsWarehouseLastVO.setAllTotalPrice(tErpGoodsWarehouseVOS.stream().mapToDouble(TErpGoodsWarehouseVO::getUnitAmount).sum()); | 
|---|
|  |  |  | tErpGoodsWarehouseLastVO.setAllTotalPrice(BigDecimal.valueOf(tErpGoodsWarehouseLastVO.getAllTotalPrice()).setScale(2,RoundingMode.HALF_UP).doubleValue()); | 
|---|
|  |  |  | tErpGoodsWarehouseLastVO.setList(tErpGoodsWarehouseVOS); | 
|---|
|  |  |  | tErpGoodsWarehouseLastVO.setWarningInventory(goods.getWarningInventory()); | 
|---|
|  |  |  | tErpGoodsWarehouseLastVOS.add(tErpGoodsWarehouseLastVO); | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public PageInfo<TErpGoodsWarehouseRecordLastVO> pageWarehouseList(TErpGoodsWarehouseQuery query, SysUser user) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Integer roleType = user.getRoleType(); | 
|---|
|  |  |  | String supplierClinicId = null; | 
|---|
|  |  |  | if(roleType == 4){ | 
|---|
|  |  |  | // 供应商 | 
|---|
|  |  |  | TCrmSupplier crmSupplier = crmSupplierMapper.selectOne(Wrappers.lambdaQuery(TCrmSupplier.class) | 
|---|
|  |  |  | .eq(TCrmSupplier::getUserId, user.getUserId()) | 
|---|
|  |  |  | .last("LIMIT 1")); | 
|---|
|  |  |  | supplierClinicId =crmSupplier.getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(roleType == 5){ | 
|---|
|  |  |  | // 诊所 | 
|---|
|  |  |  | TCrmClinic crmClinic = crmClinicMapper.selectOne(Wrappers.lambdaQuery(TCrmClinic.class) | 
|---|
|  |  |  | .eq(TCrmClinic::getUserId, user.getUserId()) | 
|---|
|  |  |  | .last("LIMIT 1")); | 
|---|
|  |  |  | supplierClinicId =crmClinic.getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | query.setSupplierClinicId(supplierClinicId); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TErpGoods goods = erpGoodsMapper.selectById(query.getGoodsId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | PageInfo<TErpGoodsWarehouseRecordLastVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); | 
|---|
|  |  |  | 
|---|
|  |  |  | pageInfo.setRecords( list); | 
|---|
|  |  |  | return pageInfo; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public void warehousingGoods(List<WarehousingGoodsDto> dtos, SysUser user) { | 
|---|
|  |  |  | Integer roleType = user.getRoleType(); | 
|---|
|  |  |  | String supplierClinicId = null; | 
|---|
|  |  |  | if(roleType == 4){ | 
|---|
|  |  |  | // 供应商 | 
|---|
|  |  |  | TCrmSupplier crmSupplier = crmSupplierMapper.selectOne(Wrappers.lambdaQuery(TCrmSupplier.class) | 
|---|
|  |  |  | .eq(TCrmSupplier::getUserId, user.getUserId()) | 
|---|
|  |  |  | .last("LIMIT 1")); | 
|---|
|  |  |  | supplierClinicId =crmSupplier.getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(roleType == 5){ | 
|---|
|  |  |  | // 诊所 | 
|---|
|  |  |  | TCrmClinic crmClinic = crmClinicMapper.selectOne(Wrappers.lambdaQuery(TCrmClinic.class) | 
|---|
|  |  |  | .eq(TCrmClinic::getUserId, user.getUserId()) | 
|---|
|  |  |  | .last("LIMIT 1")); | 
|---|
|  |  |  | supplierClinicId =crmClinic.getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (WarehousingGoodsDto dto : dtos) { | 
|---|
|  |  |  | TErpSupplierWarehousing tErpSupplierWarehousing = new TErpSupplierWarehousing(); | 
|---|
|  |  |  | // 当前年月日时分秒 | 
|---|
|  |  |  | // 查询上一个入库单 | 
|---|
|  |  |  | TErpSupplierWarehousing last = erpSupplierWarehousingMapper.selectOne(new LambdaQueryWrapper<TErpSupplierWarehousing>().orderByDesc(TErpSupplierWarehousing::getCreateTime).last("LIMIT 1")); | 
|---|
|  |  |  | if(last==null){ | 
|---|
|  |  |  | tErpSupplierWarehousing.setWarehouseNo("G"+DateUtils.dateTimeNow()+"00001"); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | String lastProcurementCode = last.getWarehouseNo(); | 
|---|
|  |  |  | String datePart = "G" + DateUtils.dateTimeNow(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 直接获取后五位数字并+1,不考虑是否同一天 | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | String numberPart = lastProcurementCode.substring(Math.max(0, lastProcurementCode.length() - 5)); | 
|---|
|  |  |  | int number = Integer.parseInt(numberPart); | 
|---|
|  |  |  | if (number < 99999) { | 
|---|
|  |  |  | number++; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | number = 2; // 达到99999后重置为00002 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | tErpSupplierWarehousing.setWarehouseNo(datePart + String.format("%05d", number)); | 
|---|
|  |  |  | } catch (NumberFormatException e) { | 
|---|
|  |  |  | // 如果解析失败,默认从00001开始 | 
|---|
|  |  |  | tErpSupplierWarehousing.setWarehouseNo(datePart + "00001"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | tErpSupplierWarehousing.setSupplierId(supplierClinicId); | 
|---|
|  |  |  | tErpSupplierWarehousing.setWarehouseId(dto.getWarehouseId()); | 
|---|
|  |  |  | tErpSupplierWarehousing.setGoodsId(dto.getGoodsId()); | 
|---|
|  |  |  | TErpGoods goods = erpGoodsMapper.selectById(dto.getGoodsId()); | 
|---|
|  |  |  | tErpSupplierWarehousing.setGoodsName(goods.getGoodsName()); | 
|---|
|  |  |  | tErpSupplierWarehousing.setGoodsCount(dto.getWarehousingNum()); | 
|---|
|  |  |  | tErpSupplierWarehousing.setUnitAmount(dto.getPrice()); | 
|---|
|  |  |  | tErpSupplierWarehousing.setTotalPrice(dto.getTotalPrice()); | 
|---|
|  |  |  | List<WarehousingGoodsNextDto> warehousingGoodsNextDtos = dto.getWarehousingGoodsNextDtos(); | 
|---|
|  |  |  | int sum = warehousingGoodsNextDtos.stream().mapToInt(WarehousingGoodsNextDto::getWarehousingNum).sum(); | 
|---|
|  |  |  | tErpSupplierWarehousing.setGoodsCount(sum); | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | erpSupplierWarehousingMapper.insert(tErpSupplierWarehousing); | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | throw new RuntimeException("网络繁忙,请重试"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (WarehousingGoodsNextDto warehousingGoodsNextDto : warehousingGoodsNextDtos) { | 
|---|
|  |  |  | TErpSupplierWarehousingBatch tErpSupplierWarehousingBatch = new TErpSupplierWarehousingBatch(); | 
|---|
|  |  |  | tErpSupplierWarehousingBatch.setWarehousingId(tErpSupplierWarehousing.getId()); | 
|---|
|  |  |  | tErpSupplierWarehousingBatch.setWarehousingNumber(warehousingGoodsNextDto.getWarehousingNum()); | 
|---|
|  |  |  | tErpSupplierWarehousingBatch.setBatchNumber(warehousingGoodsNextDto.getBatchNumber()); | 
|---|
|  |  |  | tErpSupplierWarehousingBatch.setProductionDate(warehousingGoodsNextDto.getProductionDate().atStartOfDay()); | 
|---|
|  |  |  | tErpSupplierWarehousingBatch.setExpiryDate(warehousingGoodsNextDto.getExpiryDate().atStartOfDay()); | 
|---|
|  |  |  | erpSupplierWarehousingBatchMapper.insert(tErpSupplierWarehousingBatch); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(goods.getMaintenanceInterval()!=null && !goods.getMaintenanceInterval().isEmpty()){ | 
|---|
|  |  |  | TErpMaintenanceReminder tErpMaintenanceReminder = new TErpMaintenanceReminder(); | 
|---|
|  |  |  | tErpMaintenanceReminder.setClinicSupplierId(supplierClinicId); | 
|---|
|  |  |  | tErpMaintenanceReminder.setMaintenanceType(1); | 
|---|
|  |  |  | tErpMaintenanceReminder.setWarehousingBatchId(tErpSupplierWarehousingBatch.getId()); | 
|---|
|  |  |  | Integer day = Integer.valueOf(goods.getMaintenanceInterval()); | 
|---|
|  |  |  | // 当前时间+day天 | 
|---|
|  |  |  | LocalDateTime time1 = LocalDateTime.now().plusDays(day); | 
|---|
|  |  |  | tErpMaintenanceReminder.setMaintenanceTime(time1); | 
|---|
|  |  |  | tErpMaintenanceReminderMapper.insert(tErpMaintenanceReminder); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public PageInfo<ValidityPeriodWarningVo> validityPeriodWarning(ValidityPeriodWarningQuery query, SysUser user) { | 
|---|
|  |  |  | Integer roleType = user.getRoleType(); | 
|---|
|  |  |  | String supplierClinicId = null; | 
|---|
|  |  |  | if(roleType == 4){ | 
|---|
|  |  |  | // 供应商 | 
|---|
|  |  |  | TCrmSupplier crmSupplier = crmSupplierMapper.selectOne(Wrappers.lambdaQuery(TCrmSupplier.class) | 
|---|
|  |  |  | .eq(TCrmSupplier::getUserId, user.getUserId()) | 
|---|
|  |  |  | .last("LIMIT 1")); | 
|---|
|  |  |  | supplierClinicId =crmSupplier.getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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<PageInventoryListVo> pageInventoryList(TErpInventoryQuery query, SysUser user) { | 
|---|
|  |  |  | Integer roleType = user.getRoleType(); | 
|---|
|  |  |  | String supplierClinicId = null; | 
|---|
|  |  |  | if(roleType == 4){ | 
|---|
|  |  |  | // 供应商 | 
|---|
|  |  |  | TCrmSupplier crmSupplier = crmSupplierMapper.selectOne(Wrappers.lambdaQuery(TCrmSupplier.class) | 
|---|
|  |  |  | .eq(TCrmSupplier::getUserId, user.getUserId()) | 
|---|
|  |  |  | .last("LIMIT 1")); | 
|---|
|  |  |  | supplierClinicId =crmSupplier.getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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<TErpSupplierInventoryGoods> tErpSupplierInventoryGoods = erpSupplierInventoryGoodsMapper.selectList(new LambdaQueryWrapper<TErpSupplierInventoryGoods>().in(TErpSupplierInventoryGoods::getInventoryId,collect)); | 
|---|
|  |  |  | for (PageInventoryListVo pageInventoryListVo : list) { | 
|---|
|  |  |  | // 盘盈 | 
|---|
|  |  |  | BigDecimal add = BigDecimal.ZERO; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 盘亏 | 
|---|
|  |  |  | BigDecimal subtract = BigDecimal.ZERO; | 
|---|
|  |  |  | List<TErpSupplierInventoryGoods> tErpSupplierInventoryGoodsList = tErpSupplierInventoryGoods.stream().filter(t -> t.getInventoryId().equals(pageInventoryListVo.getId())).collect(Collectors.toList()); | 
|---|
|  |  |  | for (TErpSupplierInventoryGoods tErpSupplierInventoryGoods1 : tErpSupplierInventoryGoodsList) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(tErpSupplierInventoryGoods1!=null){ | 
|---|
|  |  |  | // 盘盈 查入库 | 
|---|
|  |  |  | if(tErpSupplierInventoryGoods1.getInventoryType()==1){ | 
|---|
|  |  |  | TErpSupplierWarehousing tErpSupplierWarehousing = erpSupplierWarehousingMapper.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 = tErpSupplierWarehousing.getGoodsId(); | 
|---|
|  |  |  | //                        TErpGoods goods = erpGoodsMapper.selectById(goodsId); | 
|---|
|  |  |  | int count = tErpSupplierInventoryGoods1.getInventoryCount() - tErpSupplierInventoryGoods1.getDamagedCount(); | 
|---|
|  |  |  | BigDecimal multiply = tErpSupplierWarehousing.getUnitAmount().multiply(new BigDecimal(count)); | 
|---|
|  |  |  | add = add.add(multiply); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | // 盘亏 查出库 | 
|---|
|  |  |  | TErpSupplierOutbound tErpSupplierOutbound = erpSupplierOutboundMapper.selectById(tErpSupplierInventoryGoods1.getWarehousingId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<TErpSupplierOutboundGoods> tErpSupplierOutboundGoods = erpSupplierOutboundGoodsMapper.selectList(new LambdaQueryWrapper<TErpSupplierOutboundGoods>().eq(TErpSupplierOutboundGoods::getOutboundId, tErpSupplierOutbound.getId())); | 
|---|
|  |  |  | for (TErpSupplierOutboundGoods tErpSupplierOutboundGood : tErpSupplierOutboundGoods) { | 
|---|
|  |  |  | TErpSupplierWarehousing tErpSupplierWarehousing = erpSupplierWarehousingMapper.selectById(tErpSupplierOutboundGood.getWarehousingId()); | 
|---|
|  |  |  | String goodsId = tErpSupplierWarehousing.getGoodsId(); | 
|---|
|  |  |  | //                            TErpGoods goods = erpGoodsMapper.selectById(goodsId); | 
|---|
|  |  |  | int count = tErpSupplierInventoryGoods1.getInventoryCount() - tErpSupplierInventoryGoods1.getDamagedCount(); | 
|---|
|  |  |  | BigDecimal multiply = tErpSupplierWarehousing.getUnitAmount().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(TErpSupplierInventoryGoods::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<TErpSupplierInventoryGoods> tErpSupplierInventoryGoods = erpSupplierInventoryGoodsMapper.selectList(new LambdaQueryWrapper<TErpSupplierInventoryGoods>().eq(TErpSupplierInventoryGoods::getInventoryId, id)); | 
|---|
|  |  |  | if(tErpSupplierInventoryGoods!=null && !tErpSupplierInventoryGoods.isEmpty()){ | 
|---|
|  |  |  | for (TErpSupplierInventoryGoods tErpSupplierInventoryGood : tErpSupplierInventoryGoods) { | 
|---|
|  |  |  | InventoryDetailVo inventoryDetailVo = new InventoryDetailVo(); | 
|---|
|  |  |  | if(tErpSupplierInventoryGood.getInventoryType()==1){ | 
|---|
|  |  |  | TErpSupplierWarehousing tErpSupplierWarehousing = erpSupplierWarehousingMapper.selectById(tErpSupplierInventoryGood.getWarehousingId()); | 
|---|
|  |  |  | String goodsId = tErpSupplierWarehousing.getGoodsId(); | 
|---|
|  |  |  | TErpGoods goods = erpGoodsMapper.selectById(goodsId); | 
|---|
|  |  |  | inventoryDetailVo.setGoodsName(goods.getGoodsName()); | 
|---|
|  |  |  | TErpGoodsUnit tErpGoodsUnit = erpGoodsUnitMapper.selectById(goods.getPackingUnitId()); | 
|---|
|  |  |  | inventoryDetailVo.setUnitName(tErpGoodsUnit.getUnitName()); | 
|---|
|  |  |  | inventoryDetailVo.setWarehouseNo(tErpSupplierWarehousing.getWarehouseNo()); | 
|---|
|  |  |  | TErpSupplierWarehousingBatch tErpSupplierWarehousingBatch = erpSupplierWarehousingBatchMapper.selectById(tErpSupplierInventoryGood.getWarehousingBatchId()); | 
|---|
|  |  |  | inventoryDetailVo.setBatchNumber(tErpSupplierWarehousingBatch.getBatchNumber()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<TErpSupplierWarehousingBatch> tErpSupplierWarehousingBatches = erpSupplierWarehousingBatchMapper.selectList(new LambdaQueryWrapper<TErpSupplierWarehousingBatch>().eq(TErpSupplierWarehousingBatch::getBatchNumber, tErpSupplierWarehousingBatch.getBatchNumber())); | 
|---|
|  |  |  | int sum = tErpSupplierWarehousingBatches.stream().mapToInt(TErpSupplierWarehousingBatch::getWarehousingNumber).sum(); | 
|---|
|  |  |  | List<String> collect = tErpSupplierWarehousingBatches.stream().map(TErpSupplierWarehousingBatch::getId).collect(Collectors.toList()); | 
|---|
|  |  |  | if(!collect.isEmpty()){ | 
|---|
|  |  |  | List<TErpSupplierOutboundGoods> tErpSupplierOutboundGoods = erpSupplierOutboundGoodsMapper.selectList(new LambdaQueryWrapper<TErpSupplierOutboundGoods>().eq(TErpSupplierOutboundGoods::getWarehousingBatchId, collect)); | 
|---|
|  |  |  | int sum1 = tErpSupplierOutboundGoods.stream().mapToInt(TErpSupplierOutboundGoods::getOutboundCount).sum(); | 
|---|
|  |  |  | sum = sum-sum1; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // sum = 剩余库存 | 
|---|
|  |  |  | inventoryDetailVo.setNowCount(sum); | 
|---|
|  |  |  | inventoryDetailVo.setInventoryCount(tErpSupplierInventoryGood.getInventoryCount()); | 
|---|
|  |  |  | inventoryDetailVo.setInventoryType(tErpSupplierInventoryGood.getInventoryType()); | 
|---|
|  |  |  | inventoryDetailVo.setDamagedCount(tErpSupplierInventoryGood.getDamagedCount()); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | TErpSupplierOutbound tErpSupplierOutbound = erpSupplierOutboundMapper.selectById(tErpSupplierInventoryGood.getWarehousingId()); | 
|---|
|  |  |  | List<TErpSupplierOutboundGoods> tErpSupplierOutboundGoods = erpSupplierOutboundGoodsMapper.selectList(new LambdaQueryWrapper<TErpSupplierOutboundGoods>().eq(TErpSupplierOutboundGoods::getOutboundId, tErpSupplierOutbound.getId())); | 
|---|
|  |  |  | for (TErpSupplierOutboundGoods tErpSupplierOutboundGood : tErpSupplierOutboundGoods) { | 
|---|
|  |  |  | String warehousingId = tErpSupplierOutboundGood.getWarehousingId(); | 
|---|
|  |  |  | TErpSupplierWarehousing tErpSupplierWarehousing = erpSupplierWarehousingMapper.selectById(warehousingId); | 
|---|
|  |  |  | String goodsId = tErpSupplierWarehousing.getGoodsId(); | 
|---|
|  |  |  | TErpGoods goods = erpGoodsMapper.selectById(goodsId); | 
|---|
|  |  |  | inventoryDetailVo.setGoodsName(goods.getGoodsName()); | 
|---|
|  |  |  | TErpGoodsUnit tErpGoodsUnit = erpGoodsUnitMapper.selectById(goods.getPackingUnitId()); | 
|---|
|  |  |  | inventoryDetailVo.setUnitName(tErpGoodsUnit.getUnitName()); | 
|---|
|  |  |  | inventoryDetailVo.setWarehouseNo(tErpSupplierWarehousing.getWarehouseNo()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TErpSupplierOutboundGoods tErpSupplierOutboundGoods2 = erpSupplierOutboundGoodsMapper.selectById(tErpSupplierInventoryGood.getWarehousingBatchId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TErpSupplierWarehousingBatch tErpSupplierWarehousingBatch = erpSupplierWarehousingBatchMapper.selectById(tErpSupplierOutboundGoods2.getWarehousingBatchId()); | 
|---|
|  |  |  | inventoryDetailVo.setBatchNumber(tErpSupplierWarehousingBatch.getBatchNumber()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<TErpSupplierWarehousingBatch> tErpSupplierWarehousingBatches = erpSupplierWarehousingBatchMapper.selectList(new LambdaQueryWrapper<TErpSupplierWarehousingBatch>().eq(TErpSupplierWarehousingBatch::getId, tErpSupplierOutboundGoods2.getWarehousingBatchId())); | 
|---|
|  |  |  | int sum = tErpSupplierWarehousingBatches.stream().mapToInt(TErpSupplierWarehousingBatch::getWarehousingNumber).sum(); | 
|---|
|  |  |  | List<String> collect = tErpSupplierWarehousingBatches.stream().map(TErpSupplierWarehousingBatch::getId).collect(Collectors.toList()); | 
|---|
|  |  |  | if(!collect.isEmpty()){ | 
|---|
|  |  |  | List<TErpSupplierOutboundGoods> tErpSupplierOutboundGoods1 = erpSupplierOutboundGoodsMapper.selectList(new LambdaQueryWrapper<TErpSupplierOutboundGoods>().in(TErpSupplierOutboundGoods::getWarehousingBatchId, collect)); | 
|---|
|  |  |  | int sum1 = tErpSupplierOutboundGoods1.stream().mapToInt(TErpSupplierOutboundGoods::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 | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) | 
|---|
|  |  |  | public void outbountGoods(OutboundGoodsDto dto, SysUser user) { | 
|---|
|  |  |  | Integer roleType = user.getRoleType(); | 
|---|
|  |  |  | String supplierClinicId = null; | 
|---|
|  |  |  | if(roleType == 4){ | 
|---|
|  |  |  | // 供应商 | 
|---|
|  |  |  | TCrmSupplier crmSupplier = crmSupplierMapper.selectOne(Wrappers.lambdaQuery(TCrmSupplier.class) | 
|---|
|  |  |  | .eq(TCrmSupplier::getUserId, user.getUserId()) | 
|---|
|  |  |  | .last("LIMIT 1")); | 
|---|
|  |  |  | supplierClinicId =crmSupplier.getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(roleType == 5){ | 
|---|
|  |  |  | // 诊所 | 
|---|
|  |  |  | TCrmClinic crmClinic = crmClinicMapper.selectOne(Wrappers.lambdaQuery(TCrmClinic.class) | 
|---|
|  |  |  | .eq(TCrmClinic::getUserId, user.getUserId()) | 
|---|
|  |  |  | .last("LIMIT 1")); | 
|---|
|  |  |  | supplierClinicId =crmClinic.getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BigDecimal add = new BigDecimal(0); | 
|---|
|  |  |  | ArrayList<TErpSupplierOutboundGoods> arrayList = new ArrayList<>(); | 
|---|
|  |  |  | // 1 判断库存是否足够  2添加出库记录 3添加出库子记录 | 
|---|
|  |  |  | List<OutboundGoodsNextDto> outboundGoodsNextDtos = dto.getOutboundGoodsNextDtos(); | 
|---|
|  |  |  | for (OutboundGoodsNextDto outboundGoodsNextDto : outboundGoodsNextDtos) { | 
|---|
|  |  |  | TErpSupplierWarehousingBatch tErpSupplierWarehousingBatch = erpSupplierWarehousingBatchMapper.selectById(outboundGoodsNextDto.getBatchId()); | 
|---|
|  |  |  | List<TErpSupplierOutboundGoods> tErpSupplierOutboundGoods = erpSupplierOutboundGoodsMapper.selectList(new LambdaQueryWrapper<TErpSupplierOutboundGoods>().eq(TErpSupplierOutboundGoods::getWarehousingBatchId, outboundGoodsNextDto.getBatchId())); | 
|---|
|  |  |  | int sum = tErpSupplierOutboundGoods.stream().mapToInt(TErpSupplierOutboundGoods::getOutboundCount).sum(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int count = tErpSupplierWarehousingBatch.getWarehousingNumber() - sum; | 
|---|
|  |  |  | if(count<outboundGoodsNextDto.getNum()){ | 
|---|
|  |  |  | throw new ServiceException("批次号:"+tErpSupplierWarehousingBatch.getBatchNumber()+"库存不足"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | TErpSupplierWarehousing tErpSupplierWarehousing = erpSupplierWarehousingMapper.selectById(tErpSupplierWarehousingBatch.getWarehousingId()); | 
|---|
|  |  |  | //            TErpGoods goods = erpGoodsMapper.selectById(tErpSupplierWarehousing.getGoodsId()); | 
|---|
|  |  |  | BigDecimal multiply = tErpSupplierWarehousing.getUnitAmount().multiply(BigDecimal.valueOf(outboundGoodsNextDto.getNum())); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TErpSupplierOutboundGoods tErpSupplierOutboundGoods1 = new TErpSupplierOutboundGoods(); | 
|---|
|  |  |  | tErpSupplierOutboundGoods1.setWarehousingId(tErpSupplierWarehousing.getId()); | 
|---|
|  |  |  | tErpSupplierOutboundGoods1.setWarehousingBatchId(outboundGoodsNextDto.getBatchId()); | 
|---|
|  |  |  | tErpSupplierOutboundGoods1.setOutboundCount(outboundGoodsNextDto.getNum()); | 
|---|
|  |  |  | tErpSupplierOutboundGoods1.setTotalPrice(multiply); | 
|---|
|  |  |  | arrayList.add(tErpSupplierOutboundGoods1); | 
|---|
|  |  |  | add  = add.add(multiply); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TErpSupplierOutbound tErpSupplierOutbound = new TErpSupplierOutbound(); | 
|---|
|  |  |  | tErpSupplierOutbound.setOutboundType(dto.getOutboundType()); | 
|---|
|  |  |  | tErpSupplierOutbound.setOutboundReason(dto.getOutboundReason()); | 
|---|
|  |  |  | tErpSupplierOutbound.setWarehouseId(dto.getWarehouseId()); | 
|---|
|  |  |  | tErpSupplierOutbound.setSupplierId(supplierClinicId); | 
|---|
|  |  |  | tErpSupplierOutbound.setTotalMoney(add); | 
|---|
|  |  |  | TErpSupplierOutbound last = erpSupplierOutboundMapper.selectOne(new LambdaQueryWrapper<TErpSupplierOutbound>().orderByDesc(BaseModel::getCreateTime).last("LIMIT 1")); | 
|---|
|  |  |  | if(last==null){ | 
|---|
|  |  |  | tErpSupplierOutbound.setOutboundNumber("G" +  DateUtils.dateTimeNow()+ "00001"); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | String lastProcurementCode = last.getOutboundNumber(); | 
|---|
|  |  |  | String datePart = "G" + DateUtils.dateTimeNow(); | 
|---|
|  |  |  | // 直接获取后五位数字并+1,不考虑是否同一天 | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | String numberPart = lastProcurementCode.substring(Math.max(0, lastProcurementCode.length() - 5)); | 
|---|
|  |  |  | int number = Integer.parseInt(numberPart); | 
|---|
|  |  |  | if (number < 99999) { | 
|---|
|  |  |  | number++; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | number = 2; // 达到99999后重置为00002 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | tErpSupplierOutbound.setOutboundNumber(datePart + String.format("%05d", number)); | 
|---|
|  |  |  | } catch (NumberFormatException e) { | 
|---|
|  |  |  | // 如果解析失败,默认从00001开始 | 
|---|
|  |  |  | tErpSupplierOutbound.setOutboundNumber(datePart + "00001"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | tErpSupplierOutbound.setGoodsId(tErpSupplierWarehousing.getGoodsId()); | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | erpSupplierOutboundMapper.insert(tErpSupplierOutbound); | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | throw new RuntimeException("网络繁忙,请重试"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (TErpSupplierOutboundGoods tErpSupplierOutboundGoods2 : arrayList) { | 
|---|
|  |  |  | tErpSupplierOutboundGoods2.setOutboundId(tErpSupplierOutbound.getId()); | 
|---|
|  |  |  | erpSupplierOutboundGoodsMapper.insert(tErpSupplierOutboundGoods2); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|