Browse Source

Merge branch 'Agv分支2024-11-19' of http://dev.ccwin-in.com:3000/BoXu.Zheng/WZC2 into Agv分支2024-11-19

Agv分支2024-11-19
郑勃旭 5 months ago
parent
commit
e2e6644638
  1. 7
      InterFaceContorl/Dy_Exchange/src/Dy_Exchange.Application/Dy_ExchangeApplicationModule.cs
  2. 30
      InterFaceContorl/Dy_Exchange/src/Dy_Exchange.Application/Z_Business/DataExchangeInterfaceConfigAppService.cs
  3. 24
      InterFaceContorl/Dy_Exchange/src/Dy_Exchange.Application/Z_Business/DataExchangeInterfaceOptions.cs
  4. 2
      InterFaceContorl/Dy_Exchange/src/Dy_Exchange.HttpApi.Host/Dy_ExchangeHttpApiHostModule.cs
  5. 60
      InterFaceContorl/Dy_Exchange/src/Dy_Exchange.HttpApi.Host/appsettings.json
  6. 1
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationAutoMapperProfile.cs
  7. 41
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PostionLocations/PostionLocationAppService.cs
  8. 50
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PostionLocations/PostionLocationAutoMapperProfile.cs
  9. 2
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ProductionLineItems/ProductionLineItemAppService.cs
  10. 134
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/test/TestAppService.cs
  11. 1
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContextModelCreatingExtensions.cs
  12. 2
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/PostionLocations/PostionLocationDbContextModelCreatingExtensions.cs
  13. 129
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AgvJobs/DTOS/AgvDto.cs
  14. 16
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AgvJobs/IAgvJobAccountService.cs
  15. 12
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AgvJobs/IAgvJobOutputService.cs
  16. 98
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AgvJobs/AgvJobAccountService.cs
  17. 155
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AgvJobs/AgvJobOutputService.cs
  18. 40
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs
  19. 25
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs
  20. 21
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs
  21. 26
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs
  22. 23
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/SparePartIssueJobs/SparePartIssueJobAppService.cs
  23. 407
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/proxy/AgvJobClient.cs
  24. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/StoreApplicationModule.cs
  25. 25
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Options/RestoOptions.cs
  26. 40
      build/src/docker/publish/conf/settings/appsettings.Development.json

7
InterFaceContorl/Dy_Exchange/src/Dy_Exchange.Application/Dy_ExchangeApplicationModule.cs

@ -1,4 +1,6 @@
using Volo.Abp.Account;
using Dy_Exchange.Z_Business;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Account;
using Volo.Abp.AutoMapper;
using Volo.Abp.FeatureManagement;
using Volo.Abp.Identity;
@ -23,9 +25,12 @@ public class Dy_ExchangeApplicationModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<Dy_ExchangeApplicationModule>();
});
Configure<DataExchangeInterfaceOptions>(configuration.GetSection("DataExchangeInterfaceOptions"));
}
}

30
InterFaceContorl/Dy_Exchange/src/Dy_Exchange.Application/Z_Business/DataExchangeInterfaceConfigAppService.cs

@ -6,6 +6,7 @@ using System.Net.Http;
using System.Net.NetworkInformation;
using System.Security.Policy;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Dy_Exchange.Enums;
@ -13,6 +14,8 @@ using Dy_Exchange.Permissions;
using Dy_Exchange.Z_Business.Dtos;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using NPOI.SS.Formula.Functions;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
@ -33,6 +36,7 @@ public class DataExchangeInterfaceConfigAppService : ZbxBase<DataExchangeInterfa
protected override string UpdatePolicyName { get; set; } = Dy_ExchangePermissions.DataExchangeInterfaceConfig.Update;
protected override string DeletePolicyName { get; set; } = Dy_ExchangePermissions.DataExchangeInterfaceConfig.Delete;
public string wmsCode = "WMS";
public string cmdStartPath = @"D:\Proc_DyNevWms\publish\start.cmd";
public string cmdClosePath1 = @"D:\Proc_DyNevWms\publish\stop.cmd";
@ -40,10 +44,17 @@ public class DataExchangeInterfaceConfigAppService : ZbxBase<DataExchangeInterfa
public string wmsUrl = "http://10.164.233.5:60085/swagger/AbpTenant/swagger.json";
private readonly IDataExchangeInterfaceConfigRepository _repository;
private readonly IOptions<DataExchangeInterfaceOptions> _options;
public DataExchangeInterfaceConfigAppService(IDataExchangeInterfaceConfigRepository repository) : base(repository)
public DataExchangeInterfaceConfigAppService(IDataExchangeInterfaceConfigRepository repository, IOptions<DataExchangeInterfaceOptions> options) : base(repository)
{
_repository = repository;
_options = options;
}
[HttpPost("CheckWmsStatusAsync")]
@ -55,6 +66,7 @@ public class DataExchangeInterfaceConfigAppService : ZbxBase<DataExchangeInterfa
public static bool IsPortInUse(int port)
{
bool inUse = false;
IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
@ -117,7 +129,7 @@ public class DataExchangeInterfaceConfigAppService : ZbxBase<DataExchangeInterfa
public async Task<bool> CloseWmsAsync()
{
var list=await _repository.GetListAsync().ConfigureAwait(false);
var removeWmsCodeList=list.Where(p => p.Code != wmsCode).ToList();
var removeWmsCodeList=list.Where(p => p.Code != _options.Value.WmsCode).ToList();
if (removeWmsCodeList.Any(p => p.Status == EnumStatus.Running||p.Active==true))
{
throw new UserFriendlyException($"有未关闭的接口程序{removeWmsCodeList.First().Code}无法关闭WMS");
@ -131,15 +143,15 @@ public class DataExchangeInterfaceConfigAppService : ZbxBase<DataExchangeInterfa
throw new UserFriendlyException($"接口刚刚关闭,请5分钟后再关闭WMS。最后一次关闭时间相差{Math.Abs((int)difference.TotalMinutes)}分钟");
}
var wmsConfig=await _repository.FindAsync(p => p.Code == wmsCode).ConfigureAwait(false);
var wmsConfig=await _repository.FindAsync(p => p.Code == _options.Value.WmsCode).ConfigureAwait(false);
if (wmsConfig == null)
{
throw new UserFriendlyException("未找到WMS配置项目");
}
var stop1= ExecuteBatFile(cmdClosePath1);
var stop1= ExecuteBatFile(_options.Value.CmdClosePath1);
Thread.Sleep(2000); // 休眠2秒
var stop2 = ExecuteBatFile(cmdClosePath2);
var stop2 = ExecuteBatFile(_options.Value.CmdClosePath2);
return true;
}
@ -157,9 +169,9 @@ public class DataExchangeInterfaceConfigAppService : ZbxBase<DataExchangeInterfa
[HttpPut("Base/Update")]
public override async Task<DataExchangeInterfaceConfigDto> UpdateAsync(Guid id, CreateUpdateDataExchangeInterfaceConfigDto input)
{
if (input.Code != wmsCode&&input.Active==true)
if (input.Code != _options.Value.WmsCode&&input.Active==true)
{
bool isPageLoaded = await IsPageLoadedSuccessfullyAsync(wmsUrl).ConfigureAwait(false);
bool isPageLoaded = await IsPageLoadedSuccessfullyAsync(_options.Value.WmsUrl).ConfigureAwait(false);
if (!isPageLoaded)
{
throw new UserFriendlyException("WMS未启动成功,请稍后再启动接口");
@ -167,12 +179,12 @@ public class DataExchangeInterfaceConfigAppService : ZbxBase<DataExchangeInterfa
}
//开启wms
if (input.Code == wmsCode&&input.Active==true)
if (input.Code == _options.Value.WmsCode&&input.Active==true)
{
input.Status = EnumStatus.Running;
await StartWmsAsync().ConfigureAwait(false);
}
if(input.Code == wmsCode && input.Active == false)
if(input.Code == _options.Value.WmsCode && input.Active == false)
{
input.Status = EnumStatus.Closed;
await CloseWmsAsync().ConfigureAwait(false);

24
InterFaceContorl/Dy_Exchange/src/Dy_Exchange.Application/Z_Business/DataExchangeInterfaceOptions.cs

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dy_Exchange.Z_Business
{
public class DataExchangeInterfaceOptions
{
//public string wmsCode = "WMS";
//public string cmdStartPath = @"D:\Proc_DyNevWms\publish\start.cmd";
//public string cmdClosePath1 = @"D:\Proc_DyNevWms\publish\stop.cmd";
//public string cmdClosePath2 = @"D:\Proc_DyNevWms\publish\TaskKill.exe";
//public string wmsUrl = "http://10.164.233.5:60085/swagger/AbpTenant/swagger.json";
public string WmsCode { get; set; }
public string CmdStartPath { get; set; }
public string CmdClosePath1 { get; set; }
public string CmdClosePath2 { get; set; }
public string WmsUrl { get; set; }
}
}

2
InterFaceContorl/Dy_Exchange/src/Dy_Exchange.HttpApi.Host/Dy_ExchangeHttpApiHostModule.cs

@ -57,6 +57,8 @@ public class Dy_ExchangeHttpApiHostModule : AbpModule
ConfigureDistributedLocking(context, configuration);
ConfigureCors(context, configuration);
ConfigureSwaggerServices(context, configuration);
}
private void ConfigureCache(IConfiguration configuration)

60
InterFaceContorl/Dy_Exchange/src/Dy_Exchange.HttpApi.Host/appsettings.json

@ -1,26 +1,38 @@
{
"App": {
"CorsOrigins": "http://192.168.0.146:20033",
"Audit": {
"IsEnabled": false //
//
}
},
"ConnectionStrings": {
"Default": "Server=.;Database=Dy_FasterZ_Exchange;uid=sa;pwd=sasa;timeout=6000;Encrypt=False;",
"Dy_Exchange": "Server=dev.ccwin-in.com,13319;Database=WMS_DongYang_DataExchange_CC;uid=ccwin-in;pwd=Microsoft@2022;timeout=60000;Encrypt=False;"
},
"Redis": {
"Configuration": "127.0.0.1"
},
"AuthServer": {
"Authority": "http://192.168.1.75:60080",
"RequireHttpsMetadata": "false",
"SwaggerClientId": "Dy_Exchange_Swagger"
},
"StringEncryption": {
"DefaultPassPhrase": "ybgU8NieQZNjguXe"
},
"AlwaysAllowAuthorization": "true",
"urls": "http://192.168.1.75:60081"
"App": {
"CorsOrigins": "http://192.168.0.146:20033",
"Audit": {
"IsEnabled": false //
//
}
},
"ConnectionStrings": {
"Default": "Server=.;Database=Dy_FasterZ_Exchange;uid=sa;pwd=sasa;timeout=6000;Encrypt=False;",
"Dy_Exchange": "Server=dev.ccwin-in.com,13319;Database=WMS_DongYang_DataExchange_CC;uid=ccwin-in;pwd=Microsoft@2022;timeout=60000;Encrypt=False;"
},
"Redis": {
"Configuration": "127.0.0.1"
},
"AuthServer": {
"Authority": "http://192.168.1.75:60080",
"RequireHttpsMetadata": "false",
"SwaggerClientId": "Dy_Exchange_Swagger"
},
"StringEncryption": {
"DefaultPassPhrase": "ybgU8NieQZNjguXe"
},
"AlwaysAllowAuthorization": "true",
"urls": "http://192.168.1.75:60081",
"DataExchangeInterfaceOptions": {
"WmsCode": "WMS",
"CmdStartPath": "D:\\Proc_DyNevWms\\publish\\start.cmd",
"CmdClosePath1": "D:\\Proc_DyNevWms\\publish\\stop.cmd",
"CmdClosePath2": "D:\\Proc_DyNevWms\\publish\\TaskKill.exe",
"WmsUrl": "http://10.164.233.5:60085/swagger/AbpTenant/swagger.json"
}
}

1
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationAutoMapperProfile.cs

@ -57,6 +57,7 @@ public partial class BasedataApplicationAutoMapperProfile : Profile
EquipmentLocAutoMapperProfile();
EquipmentPartCodeAutoMapperProfile();
EquipmentLocCapAutoMapperProfile();
PostionLocationAutoMapperProfile();
}

41
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PostionLocations/PostionLocationAppService.cs

@ -19,10 +19,12 @@ using Win_in.Sfs.Shared.Domain;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Shared.Application.Contracts;
using Volo.Abp;
using Microsoft.EntityFrameworkCore;
using System.Linq;
namespace Win_in.Sfs.Basedata.Application;
[Authorize]
[AllowAnonymous]
[Route($"{BasedataConsts.RootPath}PostionLocation")]
public class PostionLocationAppService
@ -86,7 +88,41 @@ public class PostionLocationAppService
return pageResult;
}
protected override async Task ValidateImportModelAsync(PostionLocationImportInput importInput,
List<ValidationResult> validationRresult)
{
await base.ValidateImportModelAsync(importInput, validationRresult).ConfigureAwait(false);
await CheckLocationCodeAsync(importInput.LocationCode, validationRresult).ConfigureAwait(false);
await CheckSameItem(importInput.Code,importInput.LocationCode,validationRresult).ConfigureAwait(false);
//CheckProductionLineProdLineCodeJsonAsync(importInput.RawLocationCodeListJson, validationRresult);
//CheckProductionLineProdLineCodeJsonAsync(importInput.ProductLocationCodeListJson, validationRresult);
//CheckProductionLineProdLineCodeJsonAsync(importInput.WipLocationCodeListJson, validationRresult);
}
private async Task CheckLocationCodeAsync(string locationCode, List<ValidationResult> validationRresult)
{
var list = await _locationAppService.GetByCodeAsync(locationCode).ConfigureAwait(false);
if (list == null)
{
validationRresult.Add(new ValidationResult($"{locationCode}库位编码不存在,请查看库位信息!"));
}
}
private async Task CheckSameItem(string code, string locationCode, List<ValidationResult> validationRresult)
{
var item = await _repository.FirstOrDefaultAsync(r => r.Code == code && r.LocationCode == locationCode).ConfigureAwait(false);
if (item != null)
{
validationRresult.Add(new ValidationResult($"工作站编码{code}库位编码{locationCode}已存在", new string[] { "工作站编码", "库位编码" }));
}
}
[HttpPost("get-or-add")]
public virtual async Task<PostionLocationDTO> GetOrAddAsync(PostionLocationEditInput input)
{
@ -94,6 +130,7 @@ public class PostionLocationAppService
var result = await _repository.FirstOrDefaultAsync(p => p.Code == input.Code).ConfigureAwait(false);
if (result == null)
{
var entity = ObjectMapper.Map<PostionLocationEditInput, PostionLocation>(input);
result = await _repository.InsertAsync(entity, true).ConfigureAwait(false);
}

50
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PostionLocations/PostionLocationAutoMapperProfile.cs

@ -12,33 +12,45 @@ public partial class BasedataApplicationAutoMapperProfile : Profile
CreateMap<PostionLocation, PostionLocationDTO>()
.ReverseMap();
CreateMap<PostionLocationImportInput, PostionLocation>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.TenantId)
.Ignore(x => x.ExtraProperties)
.Ignore(x => x.ConcurrencyStamp)
//.Ignore(x => x.EnableMixItem)
//.Ignore(x => x.EnableMixLot)
//.Ignore(x => x.EnableMixStatus)
//.Ignore(x => x.EnableNegative)
//.Ignore(x => x.EnableKeepZero)
//.Ignore(x => x.EnableOpportunityCount)
//.Ignore(x => x.EnablePick)
//.Ignore(x => x.EnableOverPick)
//.Ignore(x => x.EnableWholeStore)
//.Ignore(x => x.EnableBreakStore)
//.Ignore(x => x.EnableShip)
//.Ignore(x => x.EnableReceive)
//.Ignore(x => x.EnableReturnToSupplier)
//.Ignore(x => x.EnableReturnFromCustomer)
//.Ignore(x => x.EnableSplitPallet)
//.Ignore(x => x.EnableSplitBox)
;
.Ignore(x => x.Id)
.Ignore(x => x.Remark);
//.Ignore(x => x.EnableMixItem)
//.Ignore(x => x.EnableMixLot)
//.Ignore(x => x.EnableMixStatus)
//.Ignore(x => x.EnableNegative)
//.Ignore(x => x.EnableKeepZero)
//.Ignore(x => x.EnableOpportunityCount)
//.Ignore(x => x.EnablePick)
//.Ignore(x => x.EnableOverPick)
//.Ignore(x => x.EnableWholeStore)
//.Ignore(x => x.EnableBreakStore)
//.Ignore(x => x.EnableShip)
//.Ignore(x => x.EnableReceive)
//.Ignore(x => x.EnableReturnToSupplier)
//.Ignore(x => x.EnableReturnFromCustomer)
//.Ignore(x => x.EnableSplitPallet)
//.Ignore(x => x.EnableSplitBox)
;
CreateMap<PostionLocation, PostionLocationImportInput>()
.Ignore(x => x.ReportStatus)
.Ignore(x => x.ReportStatus)
.Ignore(x => x.ReportReason);
CreateMap<PostionLocationEditInput, PostionLocation>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.TenantId)
.Ignore(x => x.ExtraProperties)
.Ignore(x => x.ConcurrencyStamp)
.Ignore(x => x.Id)
.Ignore(x => x.Remark);
}
}

2
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ProductionLineItems/ProductionLineItemAppService.cs

@ -106,7 +106,7 @@ public class ProductionLineItemAppService :
}
private void CheckProductionLineProdLineCodeJsonAsync(string locationCodeList, List<ValidationResult> validationRresult)
{
if (!string.IsNullOrEmpty(locationCodeList))
if (string.IsNullOrEmpty(locationCodeList))
{
validationRresult.Add(new ValidationResult($"请维护生产线和库位关系"));
}

134
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/test/TestAppService.cs

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Office2010.Drawing;
@ -25,7 +26,7 @@ namespace Win_in.Sfs.Basedata.Application;
/// 接口模拟测试
/// </summary>
[AllowAnonymous]
[Route($"CargoState")]
public class TestService:ApplicationService
{
private readonly IServiceProvider _serviceProvider;
@ -35,7 +36,7 @@ public class TestService:ApplicationService
_serviceProvider = serviceProvider;
_options = options;
}
/*
/// <summary>
/// 生命周期操作
/// </summary>
@ -76,6 +77,7 @@ public class TestService:ApplicationService
return t;
}
*/
//[HttpPost("SyncIssueJobStereo")]
//public virtual async Task<ReusltObject> SyncIssueJobStereoAsync(IssueJobToRestoDTO input)
@ -92,21 +94,51 @@ public class TestService:ApplicationService
//}
[HttpPost("GetCargoStatic1")]
/// <summary>
/// 异步开始生命周期操作不能堵塞
/// </summary>
public async Task<ResponCargos> GetCargoStatic1(ResponCargos p_cas)
//[HttpPost("GetCargoStatic1")]
///// <summary>
///// 异步开始生命周期操作不能堵塞
///// </summary>
//public async Task<ResponCargos> GetCargoStatic1(ResponCargos p_cas)
//{
// return p_cas;
//}
[HttpPost("pushOutTask4FW")]
public async Task<AgvResultObject> pushOutTask4FW(AgvRequest request)
{
AgvResultObject reusltObject = new AgvResultObject();
reusltObject.Code = "0";
reusltObject.Message = "OK";
reusltObject.ReqCode = "T6000001970";
return reusltObject;
return p_cas;
}
//List<ResponCargoItem> result = new List<ResponCargoItem>();
//result.Add(new ResponCargoItem() { AreaID = "1", CargoID = "PTXB1", PartCode = "TMDLYA0A071AB", Flag = 0 });
//result.Add(new ResponCargoItem() { AreaID = "1", CargoID = "PTXB2", PartCode = "TMDLYA0A061AB", Flag = 0 });
//result.Add(new ResponCargoItem() { AreaID = "2", CargoID = "ZSXB2", PartCode = "TMDLYD0ABM5A", Flag = 0 });
//result = result.Where(p => p.AreaID == AreaID).ToList();
//var t = new ResponCargos();
//t.Code = 200;
//t.Msg = "Success";
//t.Datalist = result;
//return t;
}
@ -145,6 +177,90 @@ public class ReusltObject
public string Message { set; get; }
public string OperateTime { set; get; }
}
public class AgvResultObject
{
public string Code { set; get; }
public string Message { set; get; }
public string ReqCode { set; get; }
}
#region AGV
public class AgvRequestHK
{
[Display(Name ="请求编号")]
public string ReqCode { set; get; }
[Display(Name ="明细")]
public List<AgvRequestHKDetail> Data { set; get; }
}
public class AgvRequestInputHK
{
//[Display(Name = "请求编号")]
//public string ReqCode { set; get; }
[Display(Name = "明细")]
public List<AgvRequestHKDetail> Data { set; get; }
}
public class AgvRequestHKDetail
{
[Display(Name = "任务类型")]
public string OrderType { set; get; }
[Display(Name = "任务编号")]
public string OrderNum { set; get; }
[Display(Name = "物料编号")]
public string MatCode { set; get; }
[Display(Name = "物料数量")]
public decimal MatQty { set; get; }
[Display(Name = "起始点")]
public string BeginPosition { set; get; }
[Display(Name = "终点")]
public string EndPosition { set; get; }
[Display(Name = "批次属性07")]
public string BatchAttr07 { set; get; }
[Display(Name = "批次属性08")]
public string BatchAttr08 { set; get; }
[Display(Name = "批次属性09")]
public string BatchAttr09 { set; get; }
[Display(Name = "批次属性10")]
public string BatchAttr10 { set; get; }
[Display(Name = "批次属性11")]
public string BatchAttr11 { set; get; }
[Display(Name = "批次属性12")]
public string BatchAttr12 { set; get; }
[Display(Name = "批次属性13")]
public string BatchAttr13 { set; get; }
[Display(Name = "批次属性14")]
public string BatchAttr14 { set; get; }
[Display(Name = "批次属性15")]
public string BatchAttr15 { set; get; }
}
/// <summary>
/// 闻荫调海康入参
/// </summary>
public class AgvRequest
{
[Display(Name = "任务类型")]
public string OrderType { set; get; }
[Display(Name = "任务编号")]
public string OrderNum { set; get; }
[Display(Name = "物料编号")]
public string MatCode { set; get; }
[Display(Name = "物料数量")]
public string MatQty { set; get; }
[Display(Name = "目标工位")]
public string EndPosition { set; get; }
}
#endregion

1
be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContextModelCreatingExtensions.cs

@ -73,6 +73,7 @@ public static class BasedataDbContextModelCreatingExtensions
builder.ConfigureKitting(options);
builder.ConfigureEquipmentLoc(options);
builder.ConfigureEquipmentPartCode(options);
builder.ConfigurePostionLocation(options);
}

2
be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/PostionLocations/PostionLocationDbContextModelCreatingExtensions.cs

@ -13,7 +13,7 @@ public static class PostionLocationDbContextModelCreatingExtensions
builder.Entity<PostionLocation>(b =>
{
//Configure table & schema name
b.ToTable(options.TablePrefix + nameof(Location), options.Schema);
b.ToTable(options.TablePrefix + nameof(PostionLocation), options.Schema);
//Configure ABP properties
b.ConfigureByConvention();
//Configure Sfs base properties

129
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AgvJobs/DTOS/AgvDto.cs

@ -0,0 +1,129 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
/// <summary>
/// 海康调闻荫入参数
/// </summary>
public class AgvRequestHK
{
[Display(Name = "请求编号")]
public string ReqCode { set; get; }
[Display(Name = "明细")]
public List<AgvRequestHKDetail> Data { set; get; }
}
/// <summary>
/// 海康调闻荫入参数
/// </summary>
public class AgvRequestOnlyJobHK
{
//[Display(Name = "请求编号")]
//public string ReqCode { set; get; }
[Display(Name = "明细")]
public List<AgvRequestHKDetail> Data { set; get; }
}
/// <summary>
/// 海康调闻荫入参明细
/// </summary>
public class AgvRequestHKDetail
{
[Display(Name = "任务类型")]
public string OrderType { set; get; }
[Display(Name = "任务编号")]
public string OrderNum { set; get; }
[Display(Name = "物料编号")]
public string MatCode { set; get; }
[Display(Name = "物料数量")]
public decimal MatQty { set; get; }
[Display(Name = "起始点")]
public string BeginPosition { set; get; }
[Display(Name = "终点")]
public string EndPosition { set; get; }
[Display(Name = "批次属性07")]
public string BatchAttr07 { set; get; }
[Display(Name = "批次属性08")]
public string BatchAttr08 { set; get; }
[Display(Name = "批次属性09")]
public string BatchAttr09 { set; get; }
[Display(Name = "批次属性10")]
public string BatchAttr10 { set; get; }
[Display(Name = "批次属性11")]
public string BatchAttr11 { set; get; }
[Display(Name = "批次属性12")]
public string BatchAttr12 { set; get; }
[Display(Name = "批次属性13")]
public string BatchAttr13 { set; get; }
[Display(Name = "批次属性14")]
public string BatchAttr14 { set; get; }
[Display(Name = "批次属性15")]
public string BatchAttr15 { set; get; }
}
/// <summary>
/// 闻荫调海康入参
/// </summary>
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
public partial class AgvRequest
{
/// <summary>
/// 任务类型
/// </summary>
[System.Text.Json.Serialization.JsonPropertyName("orderType")]
public string OrderType { get; set; }
/// <summary>
/// 任务编号
/// </summary>
[System.Text.Json.Serialization.JsonPropertyName("orderNum")]
public string OrderNum { get; set; }
/// <summary>
/// 物料编号
/// </summary>
[System.Text.Json.Serialization.JsonPropertyName("matCode")]
public string MatCode { get; set; }
/// <summary>
/// 物料数量
/// </summary>
[System.Text.Json.Serialization.JsonPropertyName("matQty")]
public decimal MatQty { get; set; }
/// <summary>
/// 目标工位
/// </summary>
[System.Text.Json.Serialization.JsonPropertyName("endPosition")]
public string EndPosition { get; set; }
}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
public partial class AgvResultObject
{
[System.Text.Json.Serialization.JsonPropertyName("code")]
public string Code { get; set; }
[System.Text.Json.Serialization.JsonPropertyName("message")]
public string Message { get; set; }
[System.Text.Json.Serialization.JsonPropertyName("reqCode")]
public string ReqCode { get; set; }
}

16
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AgvJobs/IAgvJobAccountService.cs

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Services;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface IAgvJobAccountService: IApplicationService
{
Task<AgvResultObject> AccountOutOrderAsync(AgvRequestOnlyJobHK request);
}

12
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AgvJobs/IAgvJobOutputService.cs

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface IAgvJobOutputService:IApplicationService
{
Task<AgvResultObject> OutPutTaskAsync(AgvRequest request);
}

98
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AgvJobs/AgvJobAccountService.cs

@ -0,0 +1,98 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
using Volo.Abp.Application.Services;
using Volo.Abp.Uow;
using Volo.Abp.Users;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Basedata.Domain;
using Win_in.Sfs.Basedata.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs.AgvServices;
[AllowAnonymous]
[Route($"{StoreConsts.RootPath}agv-job-Account")]
public class AgvJobAccountService : ApplicationService, IAgvJobAccountService
{
private IAssembleIssueJobAppService _assembleIssueJobAppService;
private ICoatingIssueJobAppService _coatingIssueJobAppService;
private IInjectionIssueJobAppService _injectionIssueJobAppService;
private IKittingIssueJobAppService _kittingIssueJobAppService;
private ISparePartIssueJobAppService _sparePartIssueJobAppService;
public AgvJobAccountService(
IAssembleIssueJobAppService assembleIssueJobAppService,
ICoatingIssueJobAppService coatingIssueJobAppService,
IInjectionIssueJobAppService injectionIssueJobAppService,
IKittingIssueJobAppService kittingIssueJobAppService,
ISparePartIssueJobAppService sparePartIssueJobAppService
)
{
_assembleIssueJobAppService = assembleIssueJobAppService;
_coatingIssueJobAppService= coatingIssueJobAppService;
_injectionIssueJobAppService= injectionIssueJobAppService;
_kittingIssueJobAppService = kittingIssueJobAppService;
_sparePartIssueJobAppService= sparePartIssueJobAppService;
}
public async Task<AgvResultObject> AccountOutOrderAsync(AgvRequestOnlyJobHK request)
{
var res=new AgvResultObject();
res.Code = "0";
foreach (var itm in request.Data)
{
switch (itm.OrderType)
{
case "1":
var assemblejob= new AssembleIssueJobDTO();
foreach (var detail in request.Data)
{
}
var assemb=await _assembleIssueJobAppService.GetByNumberAsync(itm.OrderNum).ConfigureAwait(false);
await _assembleIssueJobAppService.CompleteAsync(assemb.Id).ConfigureAwait(false);
res.ReqCode = assemb.AssembleRequestNumber;
res.Message = "OK";
break;
case "2":
var coating = await _coatingIssueJobAppService.GetByNumberAsync(itm.OrderNum).ConfigureAwait(false);
await _coatingIssueJobAppService.CompleteAsync(coating.Id).ConfigureAwait(false);
break;
case "3":
var injection = await _injectionIssueJobAppService.GetByNumberAsync(itm.OrderNum).ConfigureAwait(false);
await _injectionIssueJobAppService.CompleteAsync(injection.Id).ConfigureAwait(false);
break;
case "4":
var kitting = await _kittingIssueJobAppService.GetByNumberAsync(itm.OrderNum).ConfigureAwait(false);
await _kittingIssueJobAppService.CompleteAsync(kitting.Id).ConfigureAwait(false);
break;
case "5":
var sparePart = await _sparePartIssueJobAppService.GetByNumberAsync(itm.OrderNum).ConfigureAwait(false);
await _sparePartIssueJobAppService.CompleteAsync(sparePart.Id).ConfigureAwait(false);
break;
}
}
}
}

155
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AgvJobs/AgvJobOutputService.cs

@ -0,0 +1,155 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using MyNamespace;
using Volo.Abp;
using Volo.Abp.Application.Services;
using Volo.Abp.Uow;
using Volo.Abp.Users;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Basedata.Domain;
using Win_in.Sfs.Basedata.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain.Shared;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs.proxy;
using Microsoft.Extensions.Options;
using Win_in.Sfs.Wms.Store.Options;
using Microsoft.Extensions.Logging;
using Win_in.Sfs.Shared.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs.AgvServices;
[AllowAnonymous]
[Route($"{StoreConsts.RootPath}agv-job-in")]
public class AgvJobOutputService : ApplicationService, IAgvJobOutputService
{
private readonly UnitOfWorkManager _unitOfWorkManager;
private readonly IHttpClientFactory _httpClientFactory;
private readonly IOptions<AgvOptions> _options;
private readonly ILogger<AgvJobOutputService> _logger;
public AgvJobOutputService(
UnitOfWorkManager unitOfWorkManager,
IHttpClientFactory httpClientFactory,
IOptions<AgvOptions> options,
ILogger<AgvJobOutputService> logger
)
{
_logger = logger;
_unitOfWorkManager = unitOfWorkManager;
_httpClientFactory = httpClientFactory;
_options = options;
}
//public async Task<AgvResultObject> OutPutTaskAsync<T, TDetail>(T entity) where T : SfsJobDTOBase<TDetail>
// where TDetail : SfsDetailDTOBase
//{
// if (entity is CoatingIssueJobDTO)
// {
// var coating = entity as CoatingIssueJobDTO;
// var first = coating.Details.FirstOrDefault();
// var requst = new AgvRequest();
// requst.MatCode = first.ItemCode;
// requst.MatQty = first.HandledToQty;
// requst.OrderNum = entity.Number;
// requst.OrderType = "1";
// await OutPutTaskAsync(requst).ConfigureAwait(false);
// }
// else if (entity is AssembleIssueJobDTO)
// {
// var assemble = entity as AssembleIssueJobDTO;
// var first = assemble.Details.FirstOrDefault();
// var requst = new AgvRequest();
// requst.MatCode = first.ItemCode;
// requst.MatQty = first.HandledToQty;
// requst.OrderNum = entity.Number;
// requst.OrderType = "2";
// return await OutPutTaskAsync(requst).ConfigureAwait(false);
// }
// else if (entity is InjectionIssueJobDTO)
// {
// var injection = entity as InjectionIssueJobDTO;
// var first = injection.Details.FirstOrDefault();
// var requst = new AgvRequest();
// requst.MatCode = first.ItemCode;
// requst.MatQty = first.HandledToQty;
// requst.OrderNum = entity.Number;
// requst.OrderType = "3";
// return await OutPutTaskAsync(requst).ConfigureAwait(false);
// }
// else if (entity is KittingIssueJobDTO)
// {
// var kitting = entity as KittingIssueJobDTO;
// var first = kitting.Details.FirstOrDefault();
// var requst = new AgvRequest();
// requst.MatCode = first.ItemCode;
// requst.MatQty = first.HandledToQty;
// requst.OrderNum = entity.Number;
// requst.OrderType = "4";
// return await OutPutTaskAsync(requst).ConfigureAwait(false);
// }
// else if (entity is SparePartIssueJobDTO)
// {
// var sparePart = entity as SparePartIssueJobDTO;
// var first = sparePart.Details.FirstOrDefault();
// var requst = new AgvRequest();
// requst.MatCode = first.ItemCode;
// requst.MatQty = first.HandledToQty;
// requst.OrderNum = entity.Number;
// requst.OrderType = "1";
// await OutPutTaskAsync(requst).ConfigureAwait(false);
// }
//}
[HttpPost("out-put-task")]
public async Task<AgvResultObject> OutPutTaskAsync(AgvRequest request)
{
var httpclient = _httpClientFactory.CreateClient();
_options.Value.Address = string.IsNullOrEmpty(_options.Value.Address)
? "http://7e42682n64.goho.co:21171/"
: _options.Value.Address; //测试地址
_options.Value.Token =
string.IsNullOrEmpty(_options.Value.Token) ? string.Empty : _options.Value.Token; //测试token
_options.Value.UserName =
string.IsNullOrEmpty(_options.Value.UserName) ? "" : _options.Value.UserName; //测试用户名
_options.Value.Password =
string.IsNullOrEmpty(_options.Value.Password) ? "" : _options.Value.Password; //测试密码
_options.Value.Path = string.IsNullOrEmpty(_options.Value.Path)
? "zozocnApi/custom/receiveProductionPlan"
: _options.Value.Path; //测试密码
var flag = DateTime.Now.ToString("yyyyMMddHHmmss");
// _logger.LogInformation($"标志{flag}开始调用高通WMS:传递值{JsonSerializer.Serialize(main)}");
if (!string.IsNullOrEmpty(_options.Value.Token))
{
var token = _options.Value.Token;
httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
}
if (!string.IsNullOrEmpty(_options.Value.UserName) && !string.IsNullOrEmpty(_options.Value.Password))
{
var username = _options.Value.UserName;
var password = _options.Value.Password;
httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}")));
}
var client = new AgvJobClient(_options.Value.Address, httpclient, _options.Value.Path);
var ret = await client.PushOutTask4FWAsync(request).ConfigureAwait(false);
return ret;
}
}

40
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs

@ -14,6 +14,7 @@ using Microsoft.Extensions.Options;
using MyNamespace;
using Omu.ValueInjecter;
using Volo.Abp;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Uow;
using Volo.Abp.Users;
using Win_in.Sfs.Basedata.Application.Contracts;
@ -50,15 +51,22 @@ public class AssembleIssueJobAppService
private readonly ICurrentUser _currentUser;
private readonly UnitOfWorkManager _unitOfWorkManager;
private readonly IAgvJobOutputService _agvOutJob;
public AssembleIssueJobAppService(
ILogger<AssembleIssueJobAppService> logger,
IAgvJobOutputService agvOutJob,
IAssembleIssueJobRepository repository, IAssembleIssueJobManager assembleIssueJobManager,
ILocationAppService locationAppService,
IAssembleIssueNoteAppService assembleIssueNoteAppService, IExpectOutAppService expectOutAppService
, IHttpClientFactory httpClientFactory
, IOptions<RestoOptions> options, ITransferLibRequestAppService transferLibRequestAppService,
,IHttpClientFactory httpClientFactory
,IOptions<RestoOptions> options, ITransferLibRequestAppService transferLibRequestAppService,
ICurrentUser currentUser, UnitOfWorkManager unitOfWorkManager) : base(
repository, assembleIssueJobManager)
repository, assembleIssueJobManager
)
{
_assembleIssueJobManager = assembleIssueJobManager;
_locationAppService = locationAppService;
@ -70,6 +78,8 @@ public class AssembleIssueJobAppService
_currentUser = currentUser;
_unitOfWorkManager = unitOfWorkManager;
_logger = logger;
_agvOutJob = agvOutJob;
}
[HttpPost("get-by-number-2")]
@ -136,6 +146,10 @@ public class AssembleIssueJobAppService
return assembleIssueJobDto;
}
[HttpPost("invalid")]
public override async Task CancelAsync(Guid id)
@ -961,6 +975,26 @@ public class AssembleIssueJobAppService
assembleIssueJobDetailDto.Status, assembleIssueJobDetailDto.HandledToLot,
handledToQty).ConfigureAwait(false);
}
/// <summary>
/// 调用AgvOutPut出库
/// </summary>
/// <param name="job"></param>
/// <returns></returns>
private async Task<AgvResultObject> InvokeAgvOutput(AssembleIssueJobDTO job)
{
var first = job.Details.FirstOrDefault();
var requst = new AgvRequest();
requst.MatCode = first.ItemCode;
requst.MatQty = first.HandledToQty;
requst.OrderNum = job.Number;
requst.OrderType = "2";
return await _agvOutJob.OutPutTaskAsync(requst).ConfigureAwait(false);
}
#endregion
}

25
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs

@ -47,13 +47,14 @@ public class CoatingIssueJobAppService
private readonly IOptions<RestoOptions> _options;
private readonly ILogger<CoatingIssueJobAppService> _logger;
private readonly ICurrentUser _currentUser;
private readonly IAgvJobOutputService _agvOutJob;
protected ICoatingIssueRequestAppService CoatingIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<ICoatingIssueRequestAppService>();
public CoatingIssueJobAppService(
ILogger<CoatingIssueJobAppService> logger,
IAgvJobOutputService agvOutJob,
ILogger<CoatingIssueJobAppService> logger,
ICoatingIssueJobRepository repository, ICoatingIssueJobManager coatingIssueJobManager,
ILocationAppService locationAppService,
ICoatingIssueNoteAppService coatingIssueNoteAppService, IExpectOutAppService expectOutAppService
@ -70,6 +71,7 @@ public class CoatingIssueJobAppService
_transferLibRequestAppService = transferLibRequestAppService;
_currentUser = currentUser;
_logger = logger;
_agvOutJob = agvOutJob;
}
[HttpPost("get-by-number-2")]
@ -722,6 +724,25 @@ public class CoatingIssueJobAppService
coatingIssueJobDetailDto.Status, coatingIssueJobDetailDto.HandledToLot,
handledToQty).ConfigureAwait(false);
}
/// <summary>
/// 调用AgvOutPut出库
/// </summary>
/// <param name="job"></param>
/// <returns></returns>
private async Task<AgvResultObject> InvokeAgvOutput(CoatingIssueJob job)
{
var first = job.Details.FirstOrDefault();
var requst = new AgvRequest();
requst.MatCode = first.ItemCode;
requst.MatQty = first.HandledToQty;
requst.OrderNum = job.Number;
requst.OrderType = "2";
return await _agvOutJob.OutPutTaskAsync(requst).ConfigureAwait(false);
}
#endregion
}

21
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs

@ -43,12 +43,14 @@ public class InjectionIssueJobAppService
private readonly ITransferLibRequestAppService _transferLibRequestAppService;
private readonly IOptions<RestoOptions> _options;
private readonly ICurrentUser _currentUser;
private readonly IAgvJobOutputService _agvOutJob;
protected IInjectionIssueRequestAppService InjectionIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<IInjectionIssueRequestAppService>();
public InjectionIssueJobAppService(
IInjectionIssueJobRepository repository, IInjectionIssueJobManager injectionIssueJobManager,
IAgvJobOutputService agvOutJob,
IInjectionIssueJobRepository repository, IInjectionIssueJobManager injectionIssueJobManager,
ILocationAppService locationAppService,
IInjectionIssueNoteAppService injectionIssueNoteAppService, IExpectOutAppService expectOutAppService
, IHttpClientFactory httpClientFactory
@ -63,6 +65,7 @@ public class InjectionIssueJobAppService
_options = options;
_transferLibRequestAppService = transferLibRequestAppService;
_currentUser = currentUser;
_agvOutJob = agvOutJob;
}
[HttpPost("get-by-number-2")]
public async Task<InjectionIssueJobDTO> GetByNumber2Async(string number)
@ -670,6 +673,22 @@ public class InjectionIssueJobAppService
injectionIssueJobDetailDto.Status, injectionIssueJobDetailDto.HandledToLot,
handledToQty).ConfigureAwait(false);
}
/// <summary>
/// 调用AgvOutPut出库
/// </summary>
/// <param name="job"></param>
/// <returns></returns>
private async Task<AgvResultObject> InvokeAgvOutput(InjectionIssueJob job)
{
var first = job.Details.FirstOrDefault();
var requst = new AgvRequest();
requst.MatCode = first.ItemCode;
requst.MatQty = first.HandledToQty;
requst.OrderNum = job.Number;
requst.OrderType = "2";
return await _agvOutJob.OutPutTaskAsync(requst).ConfigureAwait(false);
}
#endregion
}

26
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs

@ -43,18 +43,21 @@ public class KittingIssueJobAppService
private readonly ITransferLibRequestAppService _transferLibRequestAppService;
private readonly IOptions<RestoOptions> _options;
private readonly ICurrentUser _currentUser;
private readonly IAgvJobOutputService _agvOutJob;
protected IKittingIssueRequestAppService KittingIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<IKittingIssueRequestAppService>();
public KittingIssueJobAppService(
IKittingIssueJobRepository repository, IKittingIssueJobManager kittingIssueJobManager,
IAgvJobOutputService agvOutJob,
IKittingIssueJobRepository repository, IKittingIssueJobManager kittingIssueJobManager,
ILocationAppService locationAppService,
IKittingIssueNoteAppService kittingIssueNoteAppService, IExpectOutAppService expectOutAppService
, IHttpClientFactory httpClientFactory
, IOptions<RestoOptions> options, ITransferLibRequestAppService transferLibRequestAppService, ICurrentUser currentUser) : base(
repository, kittingIssueJobManager)
{
_agvOutJob = agvOutJob;
_kittingIssueJobManager = kittingIssueJobManager;
_locationAppService = locationAppService;
_kittingIssueNoteAppService = kittingIssueNoteAppService;
@ -63,6 +66,7 @@ public class KittingIssueJobAppService
_options = options;
_transferLibRequestAppService = transferLibRequestAppService;
_currentUser = currentUser;
_agvOutJob = agvOutJob;
}
[HttpPost("get-by-number-2")]
@ -680,7 +684,23 @@ public class KittingIssueJobAppService
kittingIssueJobDetailDto.Status, kittingIssueJobDetailDto.HandledToLot,
handledToQty).ConfigureAwait(false);
}
/// <summary>
/// 调用AgvOutPut出库
/// </summary>
/// <param name="job"></param>
/// <returns></returns>
private async Task<AgvResultObject> InvokeAgvOutput(KittingIssueJobDTO job)
{
var first = job.Details.FirstOrDefault();
var requst = new AgvRequest();
requst.MatCode = first.ItemCode;
requst.MatQty = first.HandledToQty;
requst.OrderNum = job.Number;
requst.OrderType = "2";
return await _agvOutJob.OutPutTaskAsync(requst).ConfigureAwait(false);
}
#endregion
}

23
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/SparePartIssueJobs/SparePartIssueJobAppService.cs

@ -43,12 +43,14 @@ public class SparePartIssueJobAppService
private readonly ITransferLibRequestAppService _transferLibRequestAppService;
private readonly IOptions<RestoOptions> _options;
private readonly ICurrentUser _currentUser;
private readonly IAgvJobOutputService _agvOutJob;
protected ISparePartIssueRequestAppService SparePartIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<ISparePartIssueRequestAppService>();
public SparePartIssueJobAppService(
ISparePartIssueJobRepository repository, ISparePartIssueJobManager sparePartIssueJobManager,
IAgvJobOutputService agvOutJob,
ISparePartIssueJobRepository repository, ISparePartIssueJobManager sparePartIssueJobManager,
ILocationAppService locationAppService,
ISparePartIssueNoteAppService sparePartIssueNoteAppService, IExpectOutAppService expectOutAppService
, IHttpClientFactory httpClientFactory
@ -63,6 +65,7 @@ public class SparePartIssueJobAppService
_options = options;
_transferLibRequestAppService = transferLibRequestAppService;
_currentUser = currentUser;
_agvOutJob = agvOutJob;
}
[HttpPost("get-by-number-2")]
@ -662,5 +665,23 @@ public class SparePartIssueJobAppService
handledToQty).ConfigureAwait(false);
}
/// <summary>
/// 调用AgvOutPut出库
/// </summary>
/// <param name="job"></param>
/// <returns></returns>
private async Task<AgvResultObject> InvokeAgvOutput(SparePartIssueJobDTO job)
{
var first = job.Details.FirstOrDefault();
var requst = new AgvRequest();
requst.MatCode = first.ItemCode;
requst.MatQty = first.HandledToQty;
requst.OrderNum = job.Number;
requst.OrderType = "2";
return await _agvOutJob.OutPutTaskAsync(requst).ConfigureAwait(false);
}
#endregion
}

407
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/proxy/AgvJobClient.cs

@ -0,0 +1,407 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs.proxy;
[System.CodeDom.Compiler.GeneratedCode("NSwag", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
public partial class AgvJobClient
{
#pragma warning disable 8618
private string _baseUrl;
#pragma warning restore 8618
private System.Net.Http.HttpClient _httpClient;
private static System.Lazy<System.Text.Json.JsonSerializerOptions> _settings = new System.Lazy<System.Text.Json.JsonSerializerOptions>(CreateSerializerSettings, true);
private System.Text.Json.JsonSerializerOptions _instanceSettings;
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
public AgvJobClient(string baseUrl, System.Net.Http.HttpClient httpClient,string path)
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
{
BaseUrl = baseUrl;
_httpClient = httpClient;
_path = path;
Initialize();
}
private static System.Text.Json.JsonSerializerOptions CreateSerializerSettings()
{
var settings = new System.Text.Json.JsonSerializerOptions();
UpdateJsonSerializerSettings(settings);
return settings;
}
public string BaseUrl
{
get { return _baseUrl; }
set
{
_baseUrl = value;
if (!string.IsNullOrEmpty(_baseUrl) && !_baseUrl.EndsWith("/"))
_baseUrl += '/';
}
}
private string _path;
public string Path
{
get { return _path; }
set
{
_path = value;
}
}
protected System.Text.Json.JsonSerializerOptions JsonSerializerSettings { get { return _instanceSettings ?? _settings.Value; } }
static partial void UpdateJsonSerializerSettings(System.Text.Json.JsonSerializerOptions settings);
partial void Initialize();
partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url);
partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder);
partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response);
/// <returns>Success</returns>
/// <exception cref="ApiException">A server side error occurred.</exception>
public virtual System.Threading.Tasks.Task<AgvResultObject> PushOutTask4FWAsync(AgvRequest body)
{
return PushOutTask4FWAsync(body, System.Threading.CancellationToken.None);
}
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
/// <returns>Success</returns>
/// <exception cref="ApiException">A server side error occurred.</exception>
public virtual async System.Threading.Tasks.Task<AgvResultObject> PushOutTask4FWAsync(AgvRequest body, System.Threading.CancellationToken cancellationToken)
{
var client_ = _httpClient;
var disposeClient_ = false;
try
{
using (var request_ = new System.Net.Http.HttpRequestMessage())
{
var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings);
var content_ = new System.Net.Http.ByteArrayContent(json_);
content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json");
request_.Content = content_;
request_.Method = new System.Net.Http.HttpMethod("POST");
request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/plain"));
var urlBuilder_ = new System.Text.StringBuilder();
if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl);
// Operation Path: "pushOutTask4FW"
urlBuilder_.Append(_path);
PrepareRequest(client_, request_, urlBuilder_);
var url_ = urlBuilder_.ToString();
request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);
PrepareRequest(client_, request_, url_);
var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
var disposeResponse_ = true;
try
{
var headers_ = new System.Collections.Generic.Dictionary<string, System.Collections.Generic.IEnumerable<string>>();
foreach (var item_ in response_.Headers)
headers_[item_.Key] = item_.Value;
if (response_.Content != null && response_.Content.Headers != null)
{
foreach (var item_ in response_.Content.Headers)
headers_[item_.Key] = item_.Value;
}
ProcessResponse(client_, response_);
var status_ = (int)response_.StatusCode;
if (status_ == 200)
{
var objectResponse_ = await ReadObjectResponseAsync<AgvResultObject>(response_, headers_, cancellationToken).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
return objectResponse_.Object;
}
else
if (status_ == 403)
{
var objectResponse_ = await ReadObjectResponseAsync<RemoteServiceErrorResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
throw new ApiException<RemoteServiceErrorResponse>("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
}
else
if (status_ == 401)
{
var objectResponse_ = await ReadObjectResponseAsync<RemoteServiceErrorResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
throw new ApiException<RemoteServiceErrorResponse>("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
}
else
if (status_ == 400)
{
var objectResponse_ = await ReadObjectResponseAsync<RemoteServiceErrorResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
throw new ApiException<RemoteServiceErrorResponse>("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
}
else
if (status_ == 404)
{
var objectResponse_ = await ReadObjectResponseAsync<RemoteServiceErrorResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
throw new ApiException<RemoteServiceErrorResponse>("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
}
else
if (status_ == 501)
{
var objectResponse_ = await ReadObjectResponseAsync<RemoteServiceErrorResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
throw new ApiException<RemoteServiceErrorResponse>("Server Error", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
}
else
if (status_ == 500)
{
var objectResponse_ = await ReadObjectResponseAsync<RemoteServiceErrorResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
throw new ApiException<RemoteServiceErrorResponse>("Server Error", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
}
else
{
var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null);
}
}
finally
{
if (disposeResponse_)
response_.Dispose();
}
}
}
finally
{
if (disposeClient_)
client_.Dispose();
}
}
protected struct ObjectResponseResult<T>
{
public ObjectResponseResult(T responseObject, string responseText)
{
this.Object = responseObject;
this.Text = responseText;
}
public T Object { get; }
public string Text { get; }
}
public bool ReadResponseAsString { get; set; }
protected virtual async System.Threading.Tasks.Task<ObjectResponseResult<T>> ReadObjectResponseAsync<T>(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.Threading.CancellationToken cancellationToken)
{
if (response == null || response.Content == null)
{
return new ObjectResponseResult<T>(default(T), string.Empty);
}
if (ReadResponseAsString)
{
var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
try
{
var typedBody = System.Text.Json.JsonSerializer.Deserialize<T>(responseText, JsonSerializerSettings);
return new ObjectResponseResult<T>(typedBody, responseText);
}
catch (System.Text.Json.JsonException exception)
{
var message = "Could not deserialize the response body string as " + typeof(T).FullName + ".";
throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception);
}
}
else
{
try
{
using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
{
var typedBody = await System.Text.Json.JsonSerializer.DeserializeAsync<T>(responseStream, JsonSerializerSettings, cancellationToken).ConfigureAwait(false);
return new ObjectResponseResult<T>(typedBody, string.Empty);
}
}
catch (System.Text.Json.JsonException exception)
{
var message = "Could not deserialize the response body stream as " + typeof(T).FullName + ".";
throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception);
}
}
}
private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null)
{
return "";
}
if (value is System.Enum)
{
var name = System.Enum.GetName(value.GetType(), value);
if (name != null)
{
var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name);
if (field != null)
{
var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute))
as System.Runtime.Serialization.EnumMemberAttribute;
if (attribute != null)
{
return attribute.Value != null ? attribute.Value : name;
}
}
var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo));
return converted == null ? string.Empty : converted;
}
}
else if (value is bool)
{
return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant();
}
else if (value is byte[])
{
return System.Convert.ToBase64String((byte[])value);
}
else if (value is string[])
{
return string.Join(",", (string[])value);
}
else if (value.GetType().IsArray)
{
var valueArray = (System.Array)value;
var valueTextArray = new string[valueArray.Length];
for (var i = 0; i < valueArray.Length; i++)
{
valueTextArray[i] = ConvertToString(valueArray.GetValue(i), cultureInfo);
}
return string.Join(",", valueTextArray);
}
var result = System.Convert.ToString(value, cultureInfo);
return result == null ? "" : result;
}
}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
public partial class RemoteServiceErrorInfo
{
[System.Text.Json.Serialization.JsonPropertyName("code")]
public string Code { get; set; }
[System.Text.Json.Serialization.JsonPropertyName("message")]
public string Message { get; set; }
[System.Text.Json.Serialization.JsonPropertyName("details")]
public string Details { get; set; }
[System.Text.Json.Serialization.JsonPropertyName("data")]
public System.Collections.Generic.IDictionary<string, object> Data { get; set; }
[System.Text.Json.Serialization.JsonPropertyName("validationErrors")]
public System.Collections.Generic.ICollection<RemoteServiceValidationErrorInfo> ValidationErrors { get; set; }
}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
public partial class RemoteServiceErrorResponse
{
[System.Text.Json.Serialization.JsonPropertyName("error")]
public RemoteServiceErrorInfo Error { get; set; }
}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
public partial class RemoteServiceValidationErrorInfo
{
[System.Text.Json.Serialization.JsonPropertyName("message")]
public string Message { get; set; }
[System.Text.Json.Serialization.JsonPropertyName("members")]
public System.Collections.Generic.ICollection<string> Members { get; set; }
}
[System.CodeDom.Compiler.GeneratedCode("NSwag", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
public partial class ApiException : System.Exception
{
public int StatusCode { get; private set; }
public string Response { get; private set; }
public System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> Headers { get; private set; }
public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.Exception innerException)
: base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException)
{
StatusCode = statusCode;
Response = response;
Headers = headers;
}
public override string ToString()
{
return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString());
}
}
[System.CodeDom.Compiler.GeneratedCode("NSwag", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
public partial class ApiException<TResult> : ApiException
{
public TResult Result { get; private set; }
public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, TResult result, System.Exception innerException)
: base(message, statusCode, response, headers, innerException)
{
Result = result;
}
}

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/StoreApplicationModule.cs

@ -29,6 +29,7 @@ public class StoreApplicationModule : AbpModule
Configure<RestoOptions>(configuration.GetSection("RestoOptions"));
Configure<AgvOptions>(configuration.GetSection("AgvOptions"));
//context.Services.Replace(ServiceDescriptor.Transient<IPurchaseReturnRequestAppService, PurchaseReturnRequestAppService>());
//context.Services.Replace(ServiceDescriptor.Transient<IPurchaseReturnJobAppService, PurchaseReturnJobAppService>());

25
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Options/RestoOptions.cs

@ -27,3 +27,28 @@ public class RestoOptions
}
public class AgvOptions
{
// IP 地址
public string Address { set; get; }
// 用户名
public string UserName { set; get; }
// 密码
public string Password { set; get; }
// 令牌
public string Token { set; get; }
// 路径
public string Path { set; get; }
//立体库用户名
public string StereosUser { set; get; }
//立体库密码
public string StereosPassword { set; get; }
}

40
build/src/docker/publish/conf/settings/appsettings.Development.json

@ -1,18 +1,32 @@
{
"AlwaysAllowAuthorization": "true",
"RestoOptions":
{
"RestoOptions": {
"Address": "http://7e42682n64.goho.co:21171/",
//
"UserName": "",
//
"Password": "",
//
"Token": "",
"Path": "zozocnApi/custom/receiveProductionPlan"
},
"AgvOptions": {
"Address": "http://dev.ccwin-in.com:60084/",
//
"UserName": "",
//
"Password": "",
//
"Token": "",
"Path": "Cargostate/pushOutTask4FW"
},
"Address" :"http://7e42682n64.goho.co:21171/",
//
"UserName" :"",
//
"Password" :"",
//
"Token" :"",
"Path" :"zozocnApi/custom/receiveProductionPlan"
},
@ -151,11 +165,11 @@
"BaseUrl": "http://localhost:59095/"
},
"Label": {
"BaseUrl": "http://dev.ccwin-in.com:60082/"
"BaseUrl": "http://dev.ccwin-in.com:60082/"
//"BaseUrl": "http://localhost:59092/"
},
"Message": {
"BaseUrl": "http://dev.ccwin-in.com:60082/"
"BaseUrl": "http://dev.ccwin-in.com:60082/"
//"BaseUrl": "http://localhost:59092/"
},
"Store": {

Loading…
Cancel
Save