You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

465 lines
16 KiB

namespace Win_in.Sfs.Wms.Pda.Controllers.Inventories;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Pda.Controllers.BaseDatas.Dtos;
using Win_in.Sfs.Wms.Pda.Models;
using JsonSerializer = System.Text.Json.JsonSerializer;
/// <summary>
///
/// </summary>
[ApiController]
[Route($"{PdaHostConst.ROOT_ROUTE}inventory/balances")]
public class BalanceController : AbpController
{
private readonly IBalanceAppService _balanceAppService;
private readonly IItemBasicAppService _itemBasicAppService;
private readonly ILocationAppService _locationAppService;
/// <summary>
///
/// </summary>
/// <param name="balanceAppService"></param>
/// <param name="itemBasicAppService"></param>
/// <param name="locationAppService"></param>
public BalanceController(
IBalanceAppService balanceAppService,
IItemBasicAppService itemBasicAppService,
ILocationAppService locationAppService)
{
this._balanceAppService = balanceAppService;
this._locationAppService = locationAppService;
this._itemBasicAppService = itemBasicAppService;
}
/// <summary>
/// 根据库位获取零件信息
/// </summary>
/// <param name="locationCode"></param>
/// <returns></returns>
[HttpGet("get-item-by-location")]
public virtual async Task<List<ItemBasicDTO>> GetItemBasicListByLocationCodeAsync(string locationCode)
{
var input = new SfsInventoryRequestInputBase { Condition = new Condition { Filters = new List<Filter>() } };
if (!string.IsNullOrWhiteSpace(locationCode))
{
input.Condition.Filters.Add(new Filter("LocationCode", locationCode));
}
var list = await _balanceAppService.GetAllListByFilterAsync(input).ConfigureAwait(false);
var partCodes = list.Select(p => p.ItemCode).Distinct().ToList();
var itemInput = new SfsBaseDataRequestInputBase();
if (partCodes.Count > 0)
{
var partCodesStr = JsonSerializer.Serialize(partCodes);
itemInput.Condition.Filters.Add(
new Filter
{
Action = EnumFilterAction.In.ToString(),
Column = "Code",
Logic = EnumFilterLogic.And.ToString(),
Value = partCodesStr
});
}
var itemBaseList = await _itemBasicAppService.GetAllListByFilterAsync(itemInput).ConfigureAwait(false);
return new List<ItemBasicDTO>(itemBaseList);
}
/// <summary>
/// 获取【库存】根据【库位】和【物品】
/// </summary>
/// <param name="locationCode"></param>
/// <param name="itemCode"></param>
/// <returns></returns>
[HttpGet("get-by-location-and-item")]
public virtual async Task<List<BalanceDTO>> GetListByLocationCodeAndItemCodeAsync(string locationCode, string itemCode)
{
return await _balanceAppService.GetListByLocationCodeAndItemCodeAsync(locationCode, itemCode).ConfigureAwait(false);
}
/// <summary>
/// 【获取】【库存余额】根据【箱码】
/// </summary>
/// <returns></returns>
[HttpGet("get-by-packing-code")]
public virtual async Task<BalanceDTO> GetByPackingCode(string packingCode)
{
return await _balanceAppService.GetByPackingCodeAsync(packingCode).ConfigureAwait(false);
}
/// <summary>
/// 库存列表
/// </summary>
/// <param name="itemCode"></param>
/// <param name="locationCode"></param>
/// <param name="packingCode"></param>
/// <param name="containerCode"></param>
/// <param name="inventoryStatus"></param>
/// <param name="locationType"></param>
/// <param name="isEnablePick"></param>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <param name="sortBy"></param>
/// <returns></returns>
[HttpGet("")]
public virtual async Task<PagedResultDto<BalanceDTO>> GetListAsync(
string itemCode,
string locationCode,
string packingCode,
string containerCode,
EnumInventoryStatus? inventoryStatus,
EnumLocationType? locationType,
bool? isEnablePick,
int pageSize,
int pageIndex,
string sortBy)
{
var input = new SfsInventoryRequestInputBase
{
MaxResultCount = pageSize,
SkipCount = (pageIndex - 1) * pageSize,
Sorting = sortBy,
Condition = new Condition { Filters = new List<Filter>() }
};
if (!string.IsNullOrWhiteSpace(itemCode))
{
input.Condition.Filters.Add(new Filter("ItemCode", itemCode));
}
if (!string.IsNullOrWhiteSpace(locationCode))
{
input.Condition.Filters.Add(new Filter("LocationCode", locationCode));
}
if (!string.IsNullOrWhiteSpace(packingCode))
{
input.Condition.Filters.Add(new Filter("PackingCode", packingCode));
}
if (!string.IsNullOrWhiteSpace(containerCode))
{
input.Condition.Filters.Add(new Filter("ContainerCode", containerCode));
}
if (!string.IsNullOrWhiteSpace(inventoryStatus.ToString()))
{
input.Condition.Filters.Add(new Filter("Status", inventoryStatus.ToString()));
}
var balanceDTOs = await _balanceAppService.GetPagedListByFilterAsync(input, false).ConfigureAwait(false);
return balanceDTOs;
}
/// <summary>
/// 条件筛选获取列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("filter")]
public virtual async Task<PagedResultDto<BalanceDTO>> GetListOnFilterAsync(SfsInventoryRequestInputBase input)
{
return await _balanceAppService.GetPagedListByFilterAsync(input, false).ConfigureAwait(false);
}
/// <summary>
/// 发料执行时查询
/// </summary>
/// <param name="listInput"></param>
/// <returns></returns>
[HttpPost("by-issue")]
public async Task<PagedResultDto<BalanceDTO>> GetListForIssueAsync(BalanceListByIssueInput listInput)
{
var input = new BalanceByIssueRequestInput
{
MaxResultCount = listInput.pageSize,
SkipCount = (listInput.pageIndex - 1) * listInput.pageSize,
Sorting = listInput.sortBy,
Condition = new Condition { Filters = new List<Filter>() }
};
if (!string.IsNullOrWhiteSpace(listInput.itemCode))
{
input.Condition.Filters.Add(new Filter("ItemCode", listInput.itemCode));
}
if (!string.IsNullOrWhiteSpace(listInput.locationCode))
{
input.Condition.Filters.Add(new Filter("LocationCode", listInput.locationCode));
}
if (!string.IsNullOrWhiteSpace(listInput.packingCode))
{
input.Condition.Filters.Add(new Filter("PackingCode", listInput.packingCode));
}
if (!string.IsNullOrWhiteSpace(listInput.containerCode))
{
input.Condition.Filters.Add(new Filter("ContainerCode", listInput.containerCode));
}
if (!string.IsNullOrWhiteSpace(listInput.inventoryStatus.ToString()))
{
input.Condition.Filters.Add(new Filter("Status", listInput.inventoryStatus.ToString()));
}
input.IsEnablePick = listInput.isEnablePick;
input.LocationTypes = listInput.locationTypes;
var balanceDTOs = await _balanceAppService.GetListByLocationTypeAsync(input).ConfigureAwait(false);
return balanceDTOs;
}
/// <summary>
/// 查询库存余额 根据 物品 库位 库位类型 库存状态 批次
/// </summary>
/// <param name="listInput"></param>
/// <returns></returns>
[HttpPost("by-balances-request-many-parameter")]
public async Task<PagedResultDto<BalanceDTO>> GetListByLocationTypeAndInventoryStatusAsync(
BalanceListByIssueInputByInventoryStatusAndLocationType listInput)
{
var input = new SfsInventoryRequestInputBase
{
MaxResultCount = listInput.pageSize,
SkipCount = (listInput.pageIndex - 1) * listInput.pageSize,
Sorting = listInput.sortBy,
Condition = new Condition { Filters = new List<Filter>() }
};
if (!string.IsNullOrWhiteSpace(listInput.itemCode))
{
input.Condition.Filters.Add(new Filter("ItemCode", listInput.itemCode));
}
if (!string.IsNullOrWhiteSpace(listInput.locationCode))
{
input.Condition.Filters.Add(new Filter("LocationCode", listInput.locationCode));
}
if (!string.IsNullOrWhiteSpace(listInput.lot))
{
input.Condition.Filters.Add(new Filter("Lot", listInput.lot));
}
if (!string.IsNullOrWhiteSpace(listInput.packingCode))
{
input.Condition.Filters.Add(new Filter("PackingCode", listInput.packingCode));
}
if (!string.IsNullOrWhiteSpace(listInput.containerCode))
{
input.Condition.Filters.Add(new Filter("ContainerCode", listInput.containerCode));
}
if (listInput.locationTypes != null && listInput.locationTypes.Any())
{
var locationCodes = (await _locationAppService.GetListByTypesAsync(listInput.locationTypes).ConfigureAwait(false))
.Select(t => t.Code).ToList();
if (locationCodes.Any())
{
input.Condition.Filters.Add(
new Filter("LocationCode", JsonSerializer.Serialize(locationCodes), "In"));
}
}
if (listInput.inventoryStatuses != null && listInput.inventoryStatuses.Any())
{
input.Condition.Filters.Add(
new Filter("Status", JsonSerializer.Serialize(listInput.inventoryStatuses), "In"));
}
var balanceDTOs = await _balanceAppService.GetPagedListByFilterAsync(input, false).ConfigureAwait(false);
return balanceDTOs;
}
/// <summary>
/// 根据零件获取库位信息
/// </summary>
/// <param name="itemCode"></param>
/// <returns></returns>
[HttpGet("get-location-by-item")]
public virtual async Task<List<LocationDTO>> GetLocationsOfItemAsync(string itemCode)
{
var input = new SfsInventoryRequestInputBase { Condition = new Condition { Filters = new List<Filter>() } };
if (!string.IsNullOrWhiteSpace(itemCode))
{
input.Condition.Filters.Add(new Filter("ItemCode", itemCode));
}
var list = await _balanceAppService.GetAllListByFilterAsync(input).ConfigureAwait(false);
var locationCodes = list.Select(p => p.LocationCode).Distinct().ToList();
var locInput = new SfsBaseDataRequestInputBase();
if (locationCodes.Count > 0)
{
var locationCodesStr = JsonSerializer.Serialize(locationCodes);
locInput.Condition.Filters.Add(
new Filter
{
Action = EnumFilterAction.In.ToString(),
Column = "Code",
Logic = EnumFilterLogic.And.ToString(),
Value = locationCodesStr
});
}
var locationList = await _locationAppService.GetAllListByFilterAsync(locInput).ConfigureAwait(false);
return new List<LocationDTO>(locationList);
}
/// <summary>
/// 条件筛选获取统计
/// </summary>
/// <param name="itemCode"></param>
/// <param name="locationCode"></param>
/// <param name="packingCode"></param>
/// <param name="containerCode"></param>
/// <returns></returns>
[HttpGet("summary")]
public virtual async Task<ListResultDto<BalanceSummaryDTO>> GetSummaryAsync(
string itemCode,
string locationCode,
string packingCode,
string containerCode)
{
var input = new SfsInventoryRequestInputBase { Condition = new Condition { Filters = new List<Filter>() } };
if (!string.IsNullOrWhiteSpace(itemCode))
{
input.Condition.Filters.Add(new Filter("ItemCode", itemCode));
}
if (!string.IsNullOrWhiteSpace(locationCode))
{
input.Condition.Filters.Add(new Filter("LocationCode", locationCode));
}
if (!string.IsNullOrWhiteSpace(packingCode))
{
input.Condition.Filters.Add(new Filter("PackingCode", packingCode));
}
if (!string.IsNullOrWhiteSpace(containerCode))
{
input.Condition.Filters.Add(new Filter("ContainerCode", containerCode));
}
var list = await _balanceAppService.GetSummaryAsync(input).ConfigureAwait(false);
return new ListResultDto<BalanceSummaryDTO>(list);
}
/// <summary>
/// 修改批次
/// </summary>
/// <param name="id"></param>
/// <param name="batchInput"></param>
/// <returns></returns>
[HttpPost("update-batch")]
public virtual async Task UpdateBatchAsync(Guid id, [FromBody] BatchInput batchInput)
{
await _balanceAppService.UpdateBatchAsync(
id,
batchInput.Lot,
batchInput.SupplierBatch,
batchInput.ArriveDate,
batchInput.ProduceDate,
batchInput.ExpireDate).ConfigureAwait(false);
}
/// <summary>
/// 修改库存状态
/// </summary>
/// <param name="id"></param>
/// <param name="newStatus"></param>
/// <returns></returns>
[HttpPost("update-status")]
public virtual async Task UpdateStatusAsync(Guid id, [FromBody] EnumInventoryStatus newStatus)
{
await _balanceAppService.UpdateStatusAsync(id, newStatus).ConfigureAwait(false);
}
/// <summary>
/// 获取线边库库存(箱码为空)
/// </summary>
/// <param name="itemCode"></param>
/// <param name="locationCode"></param>
/// <returns></returns>
[HttpGet("get-wip-list")]
public virtual async Task<PagedResultDto<BalanceDTO>> GetWIPListAsync(
string itemCode,
string locationCode)
{
var input = new SfsInventoryRequestInputBase { Condition = new Condition { Filters = new List<Filter>() } };
if (!string.IsNullOrWhiteSpace(itemCode))
{
input.Condition.Filters.Add(new Filter("ItemCode", itemCode));
}
if (!string.IsNullOrWhiteSpace(locationCode))
{
input.Condition.Filters.Add(new Filter("LocationCode", locationCode));
}
input.Condition.Filters.Add(new Filter("PackingCode", ""));
input.Condition.Filters.Add(new Filter("Lot", ""));
var balanceDTOs = await _balanceAppService.GetPagedListByFilterAsync(input, false).ConfigureAwait(false);
return balanceDTOs;
}
/*
/// <summary>
/// 查询库余额
/// </summary>
/// <param name="listInput"></param>
/// <returns></returns>
[HttpPost("get-list-balance-by-input")]
public async Task<PagedResultDto<BalanceDTO>> GetListBalanceByInputAsync(List<EnumLocationType> enumLocationTypes)
{
var sfsInventoryRequestInputBase= new BalanceRequestInput
{
MaxResultCount =list.pageSize,
SkipCount = (listInput.pageIndex - 1) * listInput.pageSize,
Sorting = listInput.sortBy,
Condition = new Condition()
{
Filters = new List<Filter>()
}
}
var balanceDTOs = await _balanceAppService.GetListAsync();
return balanceDTOs;
}
/// <summary>
/// 获取可以上架的库存状态
/// </summary>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
[HttpGet("allow-putaway-inventory-status")]
public virtual async Task<List<EnumInventoryStatus>> GetAllowPutawayInventoryStatusAsync()
{
return await _balanceAppService .GetAllowPutawayInventoryStatusAsync();
}
*/
}