立即调用erp接口 任务单批次生成修改

This commit is contained in:
2024-09-23 15:07:00 +08:00
parent 1c04f0449f
commit 1dc51107f5
16 changed files with 452 additions and 346 deletions

View File

@@ -109,6 +109,11 @@ public partial class PrdMoTask : BaseEntity<string>
/// </summary>
public DateTime? plan_end_date { get; set; }
/// <summary>
/// 第一次开工日期
/// </summary>
public DateTime? first_start_date { get; set; }
/// <summary>
/// 实际开工日期
/// </summary>
@@ -245,4 +250,14 @@ public partial class PrdMoTask : BaseEntity<string>
/// 定时任务key
/// </summary>
public string timer_key { get; set; }
/// <summary>
/// 按时间更换批次次数
/// </summary>
public int change_batch_count_by_day { get; set; } = -1;
/// <summary>
/// 按产量更换批次次数
/// </summary>
public int change_batch_count_by_qty { get; set; } = -1;
}

View File

@@ -50,6 +50,7 @@ using Tnb.WarehouseMgr;
using Tnb.WarehouseMgr.Entities.Enums;
using Tnb.ProductionMgr.Entities.Entity;
using Tnb.ProductionMgr.Helpers;
using Tnb.BasicData.Interfaces;
// using Tnb.PerMgr.Entities;
@@ -83,6 +84,7 @@ namespace Tnb.ProductionMgr
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
private readonly RedisData _redisData;
private static SemaphoreSlim prdreportSemaphore = new(1);
private readonly IThirdApiRecordService _thirdApiRecordService;
public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc();
public PrdMoTaskService(
@@ -96,6 +98,7 @@ namespace Tnb.ProductionMgr
IOrganizeService organizeService,
WmsPrdInstockHService wmsPrdInstockHService,
IVisualDevService visualDevService,
IThirdApiRecordService thirdApiRecordService,
IQcCheckPlanService qcCheckPlanService
)
{
@@ -112,6 +115,7 @@ namespace Tnb.ProductionMgr
_prdInstockService = prdInstockService;
_qcCheckPlanService = qcCheckPlanService;
_wmsCarryService = wmsCarryService;
_thirdApiRecordService = thirdApiRecordService;
_wmsPrdInstockHService = wmsPrdInstockHService;
}
@@ -1288,6 +1292,11 @@ namespace Tnb.ProductionMgr
{
throw Oops.Bah("状态错误无法开始");
}
if (item.first_start_date == null)
{
item.first_start_date = DateTime.Now;
}
break;
case PrdTaskBehavior.Pause:
if (item.mo_task_status == status)
@@ -2032,19 +2041,82 @@ namespace Tnb.ProductionMgr
string batch = "";
PrdMo mo = await _db.Queryable<PrdMo>().SingleAsync(x => x.id == prdMoTask.mo_id);
bool changeBatchFlag = false;
int changeCountNumByDay = 0;
int changeCountNumByQty = 0;
if (mo.mo_type == DictConst.PrdMoTypeZS || mo.mo_type == DictConst.PrdMoTypeJC)
{
BasFactoryConfig changeBatchNum = await _db.Queryable<BasFactoryConfig>().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.CHANGEBATCHNUM);
BasFactoryConfig changeBatchDay = await _db.Queryable<BasFactoryConfig>().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.CHANGEBATCHDAY);
DateTime date1 = new DateTime(prdMoTask.first_start_date.Value.Year,prdMoTask.first_start_date.Value.Month,prdMoTask.first_start_date.Value.Day);
DateTime date2 = new DateTime(DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day);
TimeSpan diff = date2.Subtract(date1);
int diffDays = diff.Days + 1;
changeCountNumByDay = (diffDays + 1) / int.Parse(changeBatchDay.value) - 1;
changeCountNumByQty = ((int)(prdMoTask.reported_work_qty ?? 0 + prdMoTask.scrap_qty ?? 0) + 1) / int.Parse(changeBatchNum.value) - 1;
if (changeCountNumByDay > prdMoTask.change_batch_count_by_day )
{
changeBatchFlag = true;
}
if (changeCountNumByQty > prdMoTask.change_batch_count_by_qty)
{
changeBatchFlag = true;
}
}
if (mo.mo_type == DictConst.PrdMoTypeZS)
{
EqpEquipment equipment = await _db.Queryable<EqpEquipment>().SingleAsync(x => x.id == prdMoTask.eqp_id);
batch = $"{equipment.code.Substring(equipment.code.Length - 2, 2)}{DateTime.Now.ToString("yyMMdd")}";
if (changeBatchFlag)
{
EqpEquipment equipment = await _db.Queryable<EqpEquipment>().SingleAsync(x => x.id == prdMoTask.eqp_id);
batch = $"{equipment.code.Substring(equipment.code.Length - 2, 2)}{DateTime.Now.ToString("yyMMdd")}";
await db.Updateable<PrdMoTask>()
.SetColumns(x => x.batch == batch)
.SetColumns(x=>x.change_batch_count_by_day==changeCountNumByDay)
.SetColumns(x=>x.change_batch_count_by_qty==changeCountNumByQty)
.Where(x => x.id == prdMoTask.id)
.ExecuteCommandAsync();
}
else
{
batch = prdMoTask.batch;
}
}else if (mo.mo_type == DictConst.PrdMoTypeJC)
{
EqpEquipment equipment = await _db.Queryable<EqpEquipment>().SingleAsync(x => x.id == prdMoTask.eqp_id);
ToolMolds toolMolds = await _db.Queryable<ToolMolds>().SingleAsync(x => x.id == prdMoTask.mold_id);
batch = $"{toolMolds.mold_code.Substring(toolMolds.mold_code.Length - 2, 2)}{equipment.code.Substring(equipment.code.Length - 2, 2)}{DateTime.Now.ToString("yyMMdd")}";
if (changeBatchFlag)
{
EqpEquipment equipment = await _db.Queryable<EqpEquipment>().SingleAsync(x => x.id == prdMoTask.eqp_id);
ToolMolds toolMolds = await _db.Queryable<ToolMolds>().SingleAsync(x => x.id == prdMoTask.mold_id);
batch = $"{toolMolds.mold_code.Substring(toolMolds.mold_code.Length - 2, 2)}{equipment.code.Substring(equipment.code.Length - 2, 2)}{DateTime.Now.ToString("yyMMdd")}";
await db.Updateable<PrdMoTask>()
.SetColumns(x => x.batch == batch)
.SetColumns(x=>x.change_batch_count_by_day==changeCountNumByDay)
.SetColumns(x=>x.change_batch_count_by_qty==changeCountNumByQty)
.Where(x => x.id == prdMoTask.id)
.ExecuteCommandAsync();
}
else
{
batch = prdMoTask.batch;
}
}else
{
OrganizeEntity organizeEntity = await _db.Queryable<OrganizeEntity>().SingleAsync(x => x.Id == prdMoTask.workline_id);
batch = $"{organizeEntity.EnCode.Substring(organizeEntity.EnCode.Length - 2, 2)}{DateTime.Now.ToString("yyMMdd")}";
// OrganizeEntity organizeEntity = await _db.Queryable<OrganizeEntity>().SingleAsync(x => x.Id == prdMoTask.workline_id);
// batch = $"{organizeEntity.EnCode.Substring(organizeEntity.EnCode.Length - 2, 2)}{DateTime.Now.ToString("yyMMdd")}";
batch = prdMoTask.batch;
}
if (string.IsNullOrEmpty(batch))
{
throw Oops.Bah($"任务单{prdMoTask.mo_task_code}批次号为空,无法提报");
}
if (prdMoTask.has_last_check == 0)
@@ -2568,8 +2640,8 @@ namespace Tnb.ProductionMgr
erpRequestData.Add("AggWrDtl", erpRequestDataDetails);
requestData.Add(erpRequestData);
BasFactoryConfig config = await _db.Queryable<BasFactoryConfig>()
.FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.BIPURL);
BasFactoryConfig config = await _db.Queryable<BasFactoryConfig>().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.BIPURL);
BasFactoryConfig callErp = await _db.Queryable<BasFactoryConfig>().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.CALLERP);
ThirdWebapiRecord thirdWebapiRecord = new ThirdWebapiRecord();
thirdWebapiRecord.id = SnowflakeIdHelper.NextId();
thirdWebapiRecord.third_name = WmsWareHouseConst.BIP;
@@ -2581,6 +2653,10 @@ namespace Tnb.ProductionMgr
thirdWebapiRecord.create_time = DateTime.Now;
thirdWebapiRecord.remark = $"载具编号:{report?.material_box_code ?? ""}";
await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync();
if(callErp.value=="1"){
await _thirdApiRecordService.Send(new List<ThirdWebapiRecord> { thirdWebapiRecord }, "自动", _db);
}
}
@@ -4083,6 +4159,24 @@ namespace Tnb.ProductionMgr
return row>0 ? "分配成功" : "分配失败";
}
/// <summary>
/// 设置批号
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<string> SetBatch(Dictionary<String,String> input)
{
string ids = input.GetOrDefault("ids");
string[] idList = ids.Split(",");
string batch = input.GetOrDefault("batch");
int row = await _db.Updateable<PrdMoTask>()
.SetColumns(x => x.batch == batch)
.Where(x => idList.Contains(x.id))
.ExecuteCommandAsync();
return row>0 ? "设置成功" : "设置失败";
}
/// <summary>
/// 末检
/// </summary>

View File

@@ -43,6 +43,7 @@ using Tnb.ProductionMgr.Entities.Entity;
using Tnb.ProductionMgr.Entities.Entity.ErpEntity;
using Tnb.BasicData.Entities.Dto;
using Tnb.BasicData;
using Tnb.BasicData.Interfaces;
using Tnb.PerMgr.Entities;
namespace Tnb.ProductionMgr
@@ -59,6 +60,7 @@ namespace Tnb.ProductionMgr
private readonly IWmsEmptyOutstockService _wmsEmptyOutstockService;
private readonly IWareHouseService _wareHouseService;
private readonly IPrdMoTaskService _prdMoTaskService;
private readonly IThirdApiRecordService _thirdApiRecordService;
public TimeWorkService(
RedisData redisData,
@@ -67,6 +69,7 @@ namespace Tnb.ProductionMgr
IOrganizeService organizeService,
IWmsEmptyOutstockService wmsEmptyOutstockService,
IPrdMoTaskService prdMoTaskService,
IThirdApiRecordService thirdApiRecordService,
IWareHouseService wareHouseService
)
{
@@ -77,6 +80,7 @@ namespace Tnb.ProductionMgr
_billRullService = billRullService;
_wmsEmptyOutstockService = wmsEmptyOutstockService;
_wareHouseService = wareHouseService;
_thirdApiRecordService = thirdApiRecordService;
_prdMoTaskService = prdMoTaskService;
}
@@ -718,178 +722,12 @@ namespace Tnb.ProductionMgr
List<ThirdWebapiRecord> records = await _db.Queryable<ThirdWebapiRecord>().Where(x => thirdNameArr.Contains(x.third_name) && x.status == "0" && x.is_send == 1 && x.error_count<10).ToListAsync();
if (records.IsEmpty())
{
records = await _db.Queryable<ThirdWebapiRecord>().Where(x => thirdNameArr.Contains(x.third_name) && x.status == "0" && x.is_send == 1).ToListAsync();
records = await _db.Queryable<ThirdWebapiRecord>().Where(x => thirdNameArr.Contains(x.third_name) && x.status == "0" && x.is_send == 1 && x.error_count<100).ToListAsync();
}
if (records.IsEmpty()) return "";
DateTime now = DateTime.Now;
Stopwatch stopwatch = null;
string response = "";
var elapsedMilliseconds = 0l;
ThirdResult thirdResult = new ThirdResult();
try
{
await _db.Ado.BeginTranAsync();
foreach (var record in records)
{
now = DateTime.Now;
stopwatch = Stopwatch.StartNew();
switch (record.method.ToUpper())
{
case "GET":
response = HttpUtils.RequestGet(record.url);
break;
case "POST":
response = HttpUtils.RequestPost(record.url, record.request_data);
break;
}
stopwatch.Stop();
elapsedMilliseconds = stopwatch.ElapsedMilliseconds;
try
{
if (response != null && !response.IsEmpty())
{
thirdResult = JsonConvert.DeserializeObject<ThirdResult>(response);
}
else
{
thirdResult.Code = 500;
}
}
catch (Exception e)
{
thirdResult.Code = 500;
thirdResult.msgResult = response;
}
if (thirdResult.Code == 200)
{
await _db.Updateable<ThirdWebapiRecord>()
.SetColumns(x => x.response_data == response)
.SetColumns(x => x.response_code == thirdResult.Code)
.SetColumns(x => x.last_send_time == now)
.SetColumns(x => x.response_time == elapsedMilliseconds)
.SetColumns(x => x.send_type == "自动")
.SetColumns(x => x.status == "1")
.Where(x=>x.id==record.id)
.ExecuteCommandAsync();
}
else
{
await _db.Updateable<ThirdWebapiRecord>()
.SetColumns(x => x.response_data == response)
.SetColumns(x => x.response_code == thirdResult.Code)
.SetColumns(x => x.last_send_time == now)
.SetColumns(x => x.response_time == elapsedMilliseconds)
.SetColumns(x => x.error_count == x.error_count + 1)
.Where(x=>x.id==record.id)
.ExecuteCommandAsync();
}
if (thirdResult.Code == 200 && record.third_name == "BIP" && record.name == "采购到货")
{
Dictionary<string,object> requestData = JsonConvert.DeserializeObject<Dictionary<string,object>>(record.request_data);
//((JObject)requestData[0]["dtls"]).SelectTokens("csourcebid")
string billCode = requestData.ContainsKey("vbillcode") ? requestData["vbillcode"].ToString() : "";
if (string.IsNullOrEmpty(billCode))
{
Log.Error($"请求记录id{record.id}采购到货单号为空");
}
var requestDtos = ((JArray)requestData["dtls"]).Select(x => new ErpPurchaseDto()
{
csourcebid = x["csourcebid"]?.ToString(),
mes_detail_id = x["mes_detail_id"]?.ToString(),
}).ToList();
JObject data = (JObject)thirdResult.msg;
JToken children = data.SelectToken("children")[0];
var responsetDtos = children.Select(x => new ErpPurchaseDto()
{
pk_arriveorder = x["valueIndex"]["pk_arriveorder"].ToString(),
pk_arriveorder_b = x["valueIndex"]["pk_arriveorder_b"].ToString(),
csourcebid = x["valueIndex"]["csourcebid"].ToString()
}).ToList();
string pk_arriveorder = responsetDtos[0]?.pk_arriveorder ?? "";
int updateDRow = 0;
bool flag = !string.IsNullOrEmpty(pk_arriveorder);
foreach (var item in requestDtos)
{
string pk_arriveorder_b = responsetDtos.Find(x => x.csourcebid == item.csourcebid)?.pk_arriveorder_b;
if (string.IsNullOrEmpty(pk_arriveorder_b))
{
flag = true;
break;
}
updateDRow += await _db.Updateable<WmsPurchaseD>()
.SetColumns(x => x.erp_arriveorder_b_pk == pk_arriveorder_b)
.Where(x => x.id == item.mes_detail_id)
.ExecuteCommandAsync();
}
int updateRow = await _db.Updateable<WmsPurchaseH>()
.SetColumns(x => x.erp_arriveorder_pk == pk_arriveorder)
.Where(x => x.bill_code == billCode)
.ExecuteCommandAsync();
if (flag || updateRow <= 0 || updateDRow <= 0)
{
Log.Error($"更新失败,requestDtos:{JsonConvert.SerializeObject(requestDtos)},responsetDtos:{JsonConvert.SerializeObject(responsetDtos)}");
}
}
if (thirdResult.Code == 200 && record.third_name == "BIP" && record.name == "生产报告")
{
Dictionary<string,object> requestData = JsonConvert.DeserializeObject<Dictionary<string,object>>(record.request_data);
string reportId = requestData.ContainsKey("report_id") ? requestData["report_id"].ToString() : "";
if (string.IsNullOrEmpty(reportId))
{
Log.Error($"请求记录id{record.id}生产报告提报id为空");
}
JObject data = (JObject)thirdResult.msg;
JToken children = data.SelectToken("children")[0];
var responsetDtos = children.Select(x => new ErpReportDto()
{
// pk_wr_product = x["valueIndex"]["pk_wr_product"].ToString(),
pk_wr_product = x["qualityvos"][0]["valueIndex"]["pk_wr_quality"].ToString(),
pk_wr = x["valueIndex"]["pk_wr"].ToString(),
report_id = reportId
}).ToList();
int updateRow = 0;
foreach (var item in responsetDtos)
{
if (!string.IsNullOrEmpty(item.pk_wr) && !string.IsNullOrEmpty(item.pk_wr_product))
{
updateRow += await _db.Updateable<PrdReport>()
.SetColumns(x => x.erp_pk_wr == item.pk_wr)
.SetColumns(x => x.erp_pk_wr_product == item.pk_wr_product)
.Where(x => x.id == item.report_id)
.ExecuteCommandAsync();
}
}
if (updateRow <= 0)
{
Log.Error($"请求记录{record.id}更新失败");
}
}
}
await _db.Ado.CommitTranAsync();
}
catch (Exception e)
{
Log.Error(e.Message,e);
await _db.Ado.RollbackTranAsync();
}
await _thirdApiRecordService.Send(records, "自动");
return "true";
}