| | |
| | | |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.ruoyi.common.constant.Constants; |
| | | import com.ruoyi.common.core.domain.BaseModel; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | import com.ruoyi.common.core.redis.RedisCache; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.ruoyi.common.utils.http.HttpUtils; |
| | | import com.ruoyi.system.mapper.TErpSupplierOutboundGoodsMapper; |
| | | import com.ruoyi.system.mapper.TErpSupplierOutboundMapper; |
| | | import com.ruoyi.system.mapper.TErpSupplierWarehousingBatchMapper; |
| | | import com.ruoyi.system.mapper.TErpSupplierWarehousingMapper; |
| | | import com.ruoyi.system.model.*; |
| | | import com.ruoyi.system.service.*; |
| | | import com.ruoyi.system.utils.util.AIUtil; |
| | |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | private TSysOtherConfigService sysOtherConfigService; |
| | | @Autowired |
| | | private TSysCloudConfigService sysCloudConfigService; |
| | | @Autowired |
| | | private TErpProcurementGoodsService erpProcurementGoodsService; |
| | | @Resource |
| | | private TErpSupplierOutboundMapper erpSupplierOutboundMapper; |
| | | @Resource |
| | | private TErpSupplierOutboundGoodsMapper erpSupplierOutboundGoodsMapper; |
| | | @Resource |
| | | private TErpSupplierWarehousingMapper erpSupplierWarehousingMapper; |
| | | @Resource |
| | | private TErpSupplierWarehousingBatchMapper erpSupplierWarehousingBatchMapper; |
| | | |
| | | // @Scheduled(fixedRate = 86460000) |
| | | // @Scheduled(cron = "10 0 0 * * ?") |
| | |
| | | for (TErpProcurement procurement : procurements) { |
| | | procurement.setLogisticsNo(map.get(procurement.getProcurementCode())); |
| | | procurement.setStatus(4); |
| | | procurement.setSendTime(LocalDateTime.now()); |
| | | } |
| | | erpProcurementService.updateBatchById(procurements); |
| | | } |
| | |
| | | JSONObject logisticsSyncAck = LogisticsSyncAck.logisticsSyncAck(sysCloudConfig.getSid(), sysCloudConfig.getAppKey(), |
| | | sysCloudConfig.getAppSecret(), sysCloudConfig.getUrl(), logistics_list); |
| | | log.info("物流同步成功"); |
| | | if(!CollectionUtils.isEmpty(procurements)){ |
| | | List<String> supplierIds = procurements.stream().map(TErpProcurement::getSupplierId).collect(Collectors.toList()); |
| | | List<String> ids = procurements.stream().map(TErpProcurement::getId).collect(Collectors.toList()); |
| | | // 处理发货流程 |
| | | detailProcurementSend(supplierIds,ids); |
| | | } |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | public void detailProcurementSend(List<String> clinicSupplierId, List<String> ids) { |
| | | // 查出这个采购的下级商品 |
| | | List<TErpProcurementGoods> list = erpProcurementGoodsService.list(Wrappers.lambdaQuery(TErpProcurementGoods.class) |
| | | .in(TErpProcurementGoods::getProcurementId, ids)); |
| | | List<TErpSupplierWarehousing> tErpSupplierWarehousings = erpSupplierWarehousingMapper.selectList(new LambdaQueryWrapper<TErpSupplierWarehousing>() |
| | | .in(TErpSupplierWarehousing::getSupplierId, clinicSupplierId).in(TErpSupplierWarehousing::getGoodsId, list.stream().map(TErpProcurementGoods::getGoodsId).collect(Collectors.toList())) |
| | | .orderByAsc(BaseModel::getCreateTime)); |
| | | |
| | | if(tErpSupplierWarehousings.isEmpty()){ |
| | | throw new RuntimeException("商品供应商未入库,请先入库"); |
| | | } |
| | | |
| | | List<TErpSupplierWarehousingBatch> tErpSupplierWarehousingBatches = erpSupplierWarehousingBatchMapper.selectList(new LambdaQueryWrapper<TErpSupplierWarehousingBatch>().in(TErpSupplierWarehousingBatch::getWarehousingId, tErpSupplierWarehousings.stream().map(TErpSupplierWarehousing::getId).collect(Collectors.toList()))); |
| | | // 获取所有的出库记录 |
| | | List<TErpSupplierOutboundGoods> tErpSupplierOutboundGoodsLists = erpSupplierOutboundGoodsMapper.selectList(new LambdaQueryWrapper<TErpSupplierOutboundGoods>().in(TErpSupplierOutboundGoods::getWarehousingBatchId, tErpSupplierWarehousingBatches.stream().map(TErpSupplierWarehousingBatch::getId).collect(Collectors.toList()))); |
| | | |
| | | |
| | | outer:for (TErpProcurementGoods tErpProcurementGoods : list) { |
| | | // 分别入库 |
| | | String goodsId = tErpProcurementGoods.getGoodsId(); |
| | | // 查询这个供应商的 该商品是否入过库 未入库提示 出库判断库存 先找先入库的 |
| | | List<TErpSupplierWarehousing> collect = tErpSupplierWarehousings.stream().filter(e -> e.getGoodsId().equals(goodsId)).collect(Collectors.toList()); |
| | | if(collect.isEmpty()){ |
| | | throw new RuntimeException("商品供应商未入库,请先入库"); |
| | | } |
| | | // 需要出库的数量 |
| | | Integer purchaseCount = tErpProcurementGoods.getPurchaseCount(); |
| | | |
| | | |
| | | if(purchaseCount==0){ |
| | | continue; |
| | | } |
| | | |
| | | for (TErpSupplierWarehousing tErpSupplierWarehousing : collect) { |
| | | List<TErpSupplierWarehousingBatch> warehousingBatches = tErpSupplierWarehousingBatches.stream().filter(e -> e.getWarehousingId().equals(tErpSupplierWarehousing.getId())).collect(Collectors.toList()); |
| | | for (TErpSupplierWarehousingBatch warehousingBatch : warehousingBatches) { |
| | | // 已出库数量 |
| | | int sum = tErpSupplierOutboundGoodsLists.stream().filter(e -> e.getWarehousingBatchId().equals(warehousingBatch.getId())).mapToInt(TErpSupplierOutboundGoods::getOutboundCount).sum(); |
| | | // 该批次剩余的数量 |
| | | int count = warehousingBatch.getWarehousingNumber() - sum; |
| | | |
| | | // 该批次没有数量 找下个批次 |
| | | if(count==0 ){ |
| | | continue; |
| | | } |
| | | // 如果大于这个数量 则使用这个批次 |
| | | if(count>=purchaseCount){ |
| | | // 添加出库记录 |
| | | TErpSupplierOutbound tErpSupplierOutbound= new TErpSupplierOutbound(); |
| | | tErpSupplierOutbound.setGoodsId(tErpSupplierWarehousing.getGoodsId()); |
| | | tErpSupplierOutbound.setSupplierId(tErpSupplierWarehousing.getSupplierId()); |
| | | tErpSupplierOutbound.setWarehouseId(tErpSupplierWarehousing.getWarehouseId()); |
| | | tErpSupplierOutbound.setOutboundType(7); |
| | | //TODO 确定这个是采购价还是销售价格 |
| | | tErpSupplierOutbound.setTotalMoney(tErpProcurementGoods.getPurchasePrice().multiply(new BigDecimal(purchaseCount))); |
| | | |
| | | TErpSupplierOutbound last = erpSupplierOutboundMapper.selectOne(new LambdaQueryWrapper<TErpSupplierOutbound>().orderByDesc(BaseModel::getCreateTime).orderByDesc(TErpSupplierOutbound::getOutboundNumber).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"); |
| | | } |
| | | } |
| | | try { |
| | | erpSupplierOutboundMapper.insert(tErpSupplierOutbound); |
| | | }catch (Exception e){ |
| | | throw new RuntimeException("网络繁忙,请重试"); |
| | | } |
| | | |
| | | TErpSupplierOutboundGoods tErpSupplierOutboundGoods = new TErpSupplierOutboundGoods(); |
| | | tErpSupplierOutboundGoods.setOutboundId(tErpSupplierOutbound.getId()); |
| | | tErpSupplierOutboundGoods.setWarehousingId(tErpSupplierWarehousing.getId()); |
| | | tErpSupplierOutboundGoods.setWarehousingBatchId(warehousingBatch.getId()); |
| | | tErpSupplierOutboundGoods.setOutboundCount(purchaseCount); |
| | | tErpSupplierOutboundGoods.setTotalPrice(tErpProcurementGoods.getPurchasePrice().multiply(new BigDecimal(purchaseCount))); |
| | | tErpSupplierOutboundGoods.setProcurementGoodsId(tErpProcurementGoods.getId()); |
| | | erpSupplierOutboundGoodsMapper.insert(tErpSupplierOutboundGoods); |
| | | continue outer; |
| | | } |
| | | |
| | | if(count<purchaseCount){ |
| | | purchaseCount = purchaseCount - count; |
| | | // 添加出库记录 |
| | | TErpSupplierOutbound tErpSupplierOutbound= new TErpSupplierOutbound(); |
| | | tErpSupplierOutbound.setGoodsId(tErpSupplierWarehousing.getGoodsId()); |
| | | tErpSupplierOutbound.setSupplierId(tErpSupplierWarehousing.getSupplierId()); |
| | | tErpSupplierOutbound.setWarehouseId(tErpSupplierWarehousing.getWarehouseId()); |
| | | tErpSupplierOutbound.setOutboundType(7); |
| | | //TODO 确定这个是采购价还是销售价格 |
| | | tErpSupplierOutbound.setTotalMoney(tErpProcurementGoods.getPurchasePrice().multiply(new BigDecimal(purchaseCount))); |
| | | TErpSupplierOutbound last = erpSupplierOutboundMapper.selectOne(new LambdaQueryWrapper<TErpSupplierOutbound>().orderByDesc(BaseModel::getCreateTime).orderByDesc(TErpSupplierOutbound::getOutboundNumber).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"); |
| | | } |
| | | } |
| | | |
| | | try { |
| | | |
| | | erpSupplierOutboundMapper.insert(tErpSupplierOutbound); |
| | | }catch (Exception e){ |
| | | throw new RuntimeException("网络繁忙,请重试"); |
| | | } |
| | | |
| | | TErpSupplierOutboundGoods tErpSupplierOutboundGoods = new TErpSupplierOutboundGoods(); |
| | | tErpSupplierOutboundGoods.setOutboundId(tErpSupplierOutbound.getId()); |
| | | tErpSupplierOutboundGoods.setWarehousingId(tErpSupplierWarehousing.getId()); |
| | | tErpSupplierOutboundGoods.setWarehousingBatchId(warehousingBatch.getId()); |
| | | tErpSupplierOutboundGoods.setOutboundCount(purchaseCount); |
| | | tErpSupplierOutboundGoods.setTotalPrice(tErpProcurementGoods.getPurchasePrice().multiply(new BigDecimal(purchaseCount))); |
| | | tErpSupplierOutboundGoods.setProcurementGoodsId(tErpProcurementGoods.getId()); |
| | | erpSupplierOutboundGoodsMapper.insert(tErpSupplierOutboundGoods); |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | if(purchaseCount>0){ |
| | | throw new RuntimeException("商品供应商库存不足,请先入库"); |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 供应商周期核查 |