This commit is contained in:
FanLian
2023-07-27 14:30:36 +08:00
22 changed files with 729 additions and 126 deletions

View File

@@ -57,6 +57,10 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage
/// </summary>
public int? plan_qty { get; set; }
/// <summary>
/// 已完成数量
/// </summary>
public int? complete_qty { get; set; }
/// <summary>
/// 工序任务量
/// </summary>
public int? process_task_qty { get; set; }

View File

@@ -43,6 +43,17 @@ public partial class PrdMaterialReceiptD : BaseEntity<string>
/// 载具id
/// </summary>
public string carry_id { get; set; } = string.Empty;
/// <summary>
/// 子载具id
/// </summary>
public string? member_carry_id { get; set; }
/// <summary>
/// 子载具编号
/// </summary>
public string? member_carry_code { get; set; }
/// <summary>
/// 是否全部投料

View File

@@ -18,6 +18,10 @@
/// 任务完成
/// </summary>
Compled = 8,
/// <summary>
/// 暂停
/// </summary>
Pause = 16,
}
}

View File

@@ -302,8 +302,8 @@ namespace Tnb.ProductionMgr
// }
}
if(!result2.IsSuccess) throw Oops.Oh(result2.ErrorMessage);
return result2.IsSuccess ? "签收成功" : result2.ErrorMessage;
if(!result.IsSuccess) throw Oops.Bah(result.ErrorMessage);
return result.IsSuccess ? "签收成功" : result.ErrorMessage;
}
[HttpPost]

View File

@@ -57,26 +57,78 @@ namespace Tnb.ProductionMgr
public async Task<dynamic> GetInfoByQrCode(string qrCode)
{
var db = _repository.AsSugarClient();
var result = await db.Queryable<WmsCarryH>()
.Where((a) => a.carry_code == qrCode)
.Select(a => new
{
carry_id = a.id,
carry_name = a.carry_name,
children = SqlFunc.Subqueryable<WmsCarryCode>()
.LeftJoin<BasMaterial>((b,c)=>b.material_id==c.id)
.Where((b,c)=>a.id==b.carry_id).ToList((b,c)=>new CarryCodeDetailOutput()
{
unit_id = c.unit_id,
barcode = b.barcode,
code_batch = b.code_batch,
codeqty = b.codeqty,
material_id = b.material_id,
material_code = c.code,
material_name = c.name
})
}).FirstAsync();
return result;
// var result = await db.Queryable<WmsCarryH>()
// .Where((a) => a.carry_code == qrCode)
// .Select(a => new
// {
// carry_id = a.id,
// carry_name = a.carry_name,
// children = SqlFunc.Subqueryable<WmsCarryCode>()
// .LeftJoin<BasMaterial>((b,c)=>b.material_id==c.id)
// .Where((b,c)=>a.id==b.carry_id).ToList((b,c)=>new CarryCodeDetailOutput()
// {
// unit_id = c.unit_id,
// barcode = b.barcode,
// code_batch = b.code_batch,
// codeqty = b.codeqty,
// material_id = b.material_id,
// material_code = c.code,
// material_name = c.name
// })
// }).FirstAsync();
if (await db.Queryable<PrdMaterialReceiptD>()
.AnyAsync(x => x.member_carry_code == qrCode && x.is_all_feeding == 0))
{
var result = await db.Queryable<PrdMaterialReceiptD>()
.LeftJoin<WmsCarryH>((a, b) => a.carry_id == b.id)
.Where((a) => a.member_carry_code == qrCode && a.is_all_feeding == 0)
.Select((a, b) => new FeedingDetailOutput
{
carry_id = b.id,
carry_name = b.carry_name,
children = SqlFunc.Subqueryable<PrdMaterialReceiptD>()
.LeftJoin<BasMaterial>((c, d) => c.material_id == d.id)
.Where((c, d) => a.member_carry_code == c.member_carry_code && c.is_all_feeding == 0)
.ToList((c, d) => new CarryCodeDetailOutput()
{
unit_id = d.unit_id,
// barcode = c.barcode,
// code_batch = c.code_batch,
code_batch = c.batch,
codeqty = c.num,
material_id = c.material_id,
material_code = d.code,
material_name = d.name
})
}).FirstAsync();
return result;
}
else
{
var result = await db.Queryable<PrdMaterialReceiptH>()
.LeftJoin<WmsCarryH>((a, b) => a.carry_id == b.id)
.Where((a) => a.carry_code == qrCode)
.Select((a, b) => new FeedingDetailOutput
{
carry_id = a.carry_id,
carry_name = b.carry_name,
children = SqlFunc.Subqueryable<PrdMaterialReceiptD>()
.LeftJoin<BasMaterial>((c, d) => c.material_id == d.id)
.Where((c, d) => a.id == c.material_receipt_id && c.is_all_feeding==0).ToList((c, d) => new CarryCodeDetailOutput()
{
unit_id = d.unit_id,
// barcode = c.barcode,
// code_batch = c.code_batch,
code_batch = c.batch,
codeqty = c.num,
material_id = c.material_id,
material_code = d.code,
material_name = d.name
})
}).FirstAsync();
return result;
}
}
[HttpPost]
@@ -90,7 +142,8 @@ namespace Tnb.ProductionMgr
{
var moTask = await db.Queryable<PrdMoTask>().FirstAsync(x => x.id == input.mo_task_id);
var inputMaterials = await db.Queryable<BasMbomInput>()
.Where(x => x.mbom_id == moTask.bom_id && x.mbom_process_id == input.mbom_process_id)
.Where(x => x.mbom_id == moTask.bom_id)
.WhereIF(!string.IsNullOrEmpty(input.mbom_process_id),x=>x.mbom_process_id==input.mbom_process_id)
.Select(x=>x.material_id)
.ToListAsync();
@@ -113,7 +166,6 @@ namespace Tnb.ProductionMgr
org_id = _userManager.GetUserInfo().Result.organizeId
};
List<PrdMaterialReceiptD> list = new List<PrdMaterialReceiptD>();
if (input.details != null && input.details.Count > 0)
{
foreach (var item in input.details)
@@ -130,6 +182,8 @@ namespace Tnb.ProductionMgr
unit_id = item["unit_id"],
carry_id = input.carry_id,
is_all_feeding = 0,
member_carry_id = item["member_carry_id"],
member_carry_code = item["member_carry_code"],
feeding_num = 0,
});
}
@@ -185,9 +239,9 @@ namespace Tnb.ProductionMgr
}
}
if(!result2.IsSuccess) throw Oops.Oh(result2.ErrorMessage);
return result2.IsSuccess ? "签收成功" : result2.ErrorMessage;
if(!result.IsSuccess) throw Oops.Bah(result.ErrorMessage);
if(!result2.IsSuccess) throw Oops.Bah(result2.ErrorMessage);
return "签收成功";
}
}
}

View File

@@ -315,10 +315,10 @@ namespace Tnb.ProductionMgr
eqp_name = e.name,
eqp_type_code = SqlFunc.Subqueryable<EqpEquipType>().Where(it => it.id == e.equip_type_id).Select(it => it.code),
mo_task_qty = SqlFunc.Subqueryable<PrdMoTask>().Where(a => a.mo_id == moId).Count(),
estimated_start_date = a.estimated_start_date.Value.ToString("yyyy-MM-dd HH"),
estimated_end_date = a.estimated_end_date.Value.ToString("yyyy-MM-dd HH"),
estimated_start_date = a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
estimated_end_date = a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
plan_qty = a.scheduled_qty,
complete_qty = a.complete_qty,
complete_qty = SqlFunc.IsNull(a.reported_work_qty,0)+SqlFunc.IsNull(a.scrap_qty,0),
process_code = SqlFunc.Subqueryable<BasProcess>().Where(it => it.id == a.process_id).Select(it => it.process_code),
process_name = SqlFunc.Subqueryable<BasProcess>().Where(it => it.id == a.process_id).Select(it => it.process_name),
})
@@ -346,10 +346,10 @@ namespace Tnb.ProductionMgr
process_code = e.process_code,
process_name = e.process_name,
mo_task_qty = SqlFunc.Subqueryable<PrdMoTask>().Where(a => a.mo_id == moId).Count(),
estimated_start_date = a.estimated_start_date.Value.ToString("yyyy-MM-dd HH"),
estimated_end_date = a.estimated_end_date.Value.ToString("yyyy-MM-dd HH"),
estimated_start_date = a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
estimated_end_date = a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
plan_qty = a.scheduled_qty,
complete_qty = a.complete_qty,
complete_qty = SqlFunc.IsNull(a.reported_work_qty,0)+SqlFunc.IsNull(a.scrap_qty,0),
})
.Mapper(it =>
{
@@ -389,6 +389,7 @@ namespace Tnb.ProductionMgr
// scheduled_qty = SqlFunc.Subqueryable<PrdMoTask>().Where(it => it.mo_id == a.mo_id).Sum(it => it.scheduled_qty),
scheduled_qty = a.scheduled_qty,
plan_qty = SqlFunc.Subqueryable<PrdMo>().Where(it => it.id == a.mo_id).Select(it => it.plan_qty),
complete_qty = a.last_process_complete_qty,
estimated_start_date = a.estimated_start_date==null ? null : a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm"),
estimated_end_date = a.estimated_end_date==null ? null : a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm"),
bom_id = d.id,
@@ -425,6 +426,7 @@ namespace Tnb.ProductionMgr
scheduled_qty = a.scheduled_qty,
plan_qty = d.plan_qty,
process_task_qty = a.process_task_qty,
complete_qty = SqlFunc.IsNull(a.reported_work_qty,0)+SqlFunc.IsNull(a.scrap_qty,0),
estimated_start_date = a.estimated_start_date==null ? null : a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm"),
estimated_end_date = a.estimated_end_date==null ? null : a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm"),
process_name = e.process_name,
@@ -658,32 +660,34 @@ namespace Tnb.ProductionMgr
{
if (input.schedule_type.Value == 1) //注塑、基础排产
{
var mo = await db.Queryable<PrdMo>().FirstAsync(it => it.id == input.mo_id);
var moTask = input.Adapt<PrdMoTask>();
moTask.id = SnowflakeIdHelper.NextId();
moTask.create_id = _userManager.UserId;
moTask.create_time = DateTime.Now;
moTask.mo_task_status = DictConst.ToBeScheduledEncode;
moTask.scheduled_qty = input.scheduled_qty;
var mo = await db.Queryable<PrdMo>().FirstAsync(it => it.id == input.mo_id);
var moCode = mo?.mo_code;
var taskCode = await db.Queryable<PrdMoTask>().Where(it => !string.IsNullOrEmpty(it.mo_task_code) && it.mo_task_code.Contains(moCode)).OrderByDescending(it => it.mo_task_code).Select(it => it.mo_task_code).FirstAsync();
moTask.unit_id = mo.unit_id;
if (taskCode.IsNullOrEmpty())
{
moTask.mo_task_code = $"{moCode}-01";
}
else
{
var pos = taskCode.IndexOf("-", StringComparison.Ordinal);
if (pos > -1)
{
var num = taskCode.AsSpan().Slice(pos + 1).ToString().ParseToInt();
var code = taskCode.AsSpan().Slice(0, pos).ToString();
var n = (num + 1).ToString().PadLeft(2, '0');
moTask.mo_task_code = $"{code}-{n}";
}
}
var moCode = mo?.mo_code;
var taskCode = await _billRuleService.GetBillNumber(Tnb.BasicData.CodeTemplateConst.PRDMOTASK_CODE);
moTask.mo_task_code = taskCode;
// var taskCode = await db.Queryable<PrdMoTask>().Where(it => !string.IsNullOrEmpty(it.mo_task_code) && it.mo_task_code.Contains(moCode)).OrderByDescending(it => it.mo_task_code).Select(it => it.mo_task_code).FirstAsync();
// if (taskCode.IsNullOrEmpty())
// {
// moTask.mo_task_code = $"{moCode}-01";
// }
// else
// {
// var pos = taskCode.IndexOf("-", StringComparison.Ordinal);
// if (pos > -1)
// {
// var num = taskCode.AsSpan().Slice(pos + 1).ToString().ParseToInt();
// var code = taskCode.AsSpan().Slice(0, pos).ToString();
// var n = (num + 1).ToString().PadLeft(2, '0');
// moTask.mo_task_code = $"{code}-{n}";
// }
// }
try
{
await db.Ado.BeginTranAsync();
@@ -702,16 +706,31 @@ namespace Tnb.ProductionMgr
if (mo != null)
{//判断如果当前 工单的已排产数大于工单计划数量则更新工单状态为 已排产
if (schedQty.HasValue && schedQty.Value >= mo.plan_qty)
// if (schedQty.HasValue && schedQty.Value >= mo.plan_qty)
// {
// mo.mo_status = DictConst.AlreadyId;
// }
// else
// {
// if (schedQty.HasValue)
// mo.scheduled_qty = schedQty.Value;
// }
// row = await db.Updateable(mo).ExecuteCommandAsync();
if (mo.scheduled_qty == null)
{
mo.mo_status = DictConst.AlreadyId;
await _db.Updateable<PrdMo>()
.SetColumns(x => x.mo_status == DictConst.AlreadyId)
.SetColumns(x => x.scheduled_qty == input.scheduled_qty)
.Where(x=>x.id==mo.id)
.ExecuteCommandAsync();
}
else
{
if (schedQty.HasValue)
mo.scheduled_qty = schedQty.Value;
await _db.Updateable<PrdMo>().SetColumns(x => x.scheduled_qty == x.scheduled_qty + input.scheduled_qty)
.Where(x=>x.id==mo.id)
.ExecuteCommandAsync();
}
row = await db.Updateable(mo).ExecuteCommandAsync();
}
var material = await db.Queryable<BasMaterial>().FirstAsync(it => it.id == moTask.material_id);
@@ -789,7 +808,7 @@ namespace Tnb.ProductionMgr
moTask.estimated_end_date = input.estimated_end_date;
moTask.scheduled_qty = input.scheduled_qty;
var mo = await _db.Queryable<PrdMo>().FirstAsync(it => it.id == input.mo_id);
moTask.unit_id = mo.unit_id;
// moTask.unit_id = mo.unit_id;
var moCode = mo?.mo_code;
// var taskCode = await _db.Queryable<PrdMoTask>().Where(it => string.IsNullOrEmpty(it.parent_id) && !string.IsNullOrEmpty(it.mo_task_code) && it.mo_task_code.Contains(moCode))
// .OrderByDescending(it => it.mo_task_code)
@@ -1008,6 +1027,7 @@ namespace Tnb.ProductionMgr
PrdTaskBehavior.Start => DictConst.InProgressEnCode,
PrdTaskBehavior.Closed => DictConst.ClosedEnCode,
PrdTaskBehavior.Compled => DictConst.ComplatedEnCode,
PrdTaskBehavior.Pause => DictConst.MoStatusPauseCode,
_ => throw new NotImplementedException(),
};
PrdTaskBehavior behavior = input.Behavior.ToEnum<PrdTaskBehavior>();
@@ -1828,7 +1848,7 @@ namespace Tnb.ProductionMgr
if (processStandardsH == null) throw Oops.Bah("工艺标准成型周期错误");
if (processStandardsH?.moulding_cycle <= 0) throw Oops.Bah("工艺标准成型周期错误");
decimal? addTime = (input.scheduled_qty * toolMolds.mold_cavity - 1) / processStandardsH?.moulding_cycle + 1;
decimal? addTime = (input.scheduled_qty * processStandardsH?.moulding_cycle - 1) / toolMolds.mold_cavity + 1;
return input.estimated_start_date.AddSeconds((double)addTime.Value).ToString("yyyy-MM-dd HH:mm:ss");
}
else

View File

@@ -89,7 +89,7 @@ namespace Tnb.ProductionMgr
process_id = a.process_id,
plan_start_date = a.estimated_start_date,
plan_end_date = a.estimated_end_date,
plan_qty = c.scheduled_qty,
plan_qty = a.scheduled_qty,
// complete_qty = SqlFunc.Subqueryable<PrdReport>().Where(it => it.mo_task_code == a.mo_task_code).Sum(it => it.reported_work_qty),
complete_qty = a.last_process_complete_qty,
mo_task_status = a.mo_task_status,

View File

@@ -152,5 +152,9 @@ public class ModuleConsts
/// 模块标识-任务执行
/// </summary>
public const string MODULE_WMSDISTASK_ID = "26128621455141";
/// <summary>
/// 模块标识-盘点任务
/// </summary>
public const string MODULE_WMSCHECKTASK_ID = "27582377555221";
}

View File

@@ -0,0 +1,12 @@
namespace Tnb.WarehouseMgr.Entities.Dto
{
/// <summary>
/// 扫码投料
/// </summary>
public class FeedingDetailOutput
{
public string carry_id { get; set; }
public string carry_name { get; set; }
public List<CarryCodeDetailOutput> children { get; set; }
}
}

View File

@@ -0,0 +1,102 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities;
/// <summary>
/// 盘点任务明细表
/// </summary>
[SugarTable("wms_checkstock_code")]
public partial class WmsCheckstockCode : BaseEntity<string>
{
public WmsCheckstockCode()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 盘点任务ID
/// </summary>
public string? checkstock_id { get; set; }
/// <summary>
/// 盘点任务物料明细ID
/// </summary>
public string? checkstock_d_id { get; set; }
/// <summary>
/// 载具ID
/// </summary>
public string? carry_id { get; set; }
/// <summary>
/// 载具编号
/// </summary>
public string? carry_code { get; set; }
/// <summary>
/// 物料ID
/// </summary>
public string? material_id { get; set; }
/// <summary>
/// 物料编号
/// </summary>
public string? material_code { get; set; }
/// <summary>
/// 条码编号
/// </summary>
public string? barcode { get; set; }
/// <summary>
/// 批次
/// </summary>
public string? code_batch { get; set; }
/// <summary>
/// 条码数量
/// </summary>
public int? codeqty { get; set; }
/// <summary>
/// 单位ID
/// </summary>
public string? unit_id { get; set; }
/// <summary>
/// 备注
/// </summary>
public string? remark { get; set; }
/// <summary>
/// 扩展
/// </summary>
public string? extras { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public string? timestamp { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
}

View File

@@ -0,0 +1,102 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities;
/// <summary>
/// 盘点任务子表
/// </summary>
[SugarTable("wms_checkstock_d")]
public partial class WmsCheckstockD : BaseEntity<string>
{
public WmsCheckstockD()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 盘点任务ID
/// </summary>
public string? checkstock_id { get; set; }
/// <summary>
/// 物料ID
/// </summary>
public string? material_id { get; set; }
/// <summary>
/// 物料编号
/// </summary>
public string? material_code { get; set; }
/// <summary>
/// 批次
/// </summary>
public string? code_batch { get; set; }
/// <summary>
/// 库位ID
/// </summary>
public string? location_id { get; set; }
/// <summary>
/// 库位编号
/// </summary>
public string? location_code { get; set; }
/// <summary>
/// 载具ID
/// </summary>
public string? carry_id { get; set; }
/// <summary>
/// 载具编号
/// </summary>
public string? carry_code { get; set; }
/// <summary>
/// 理论库存数量
/// </summary>
public decimal? pr_qty { get; set; }
/// <summary>
/// 已盘点数量
/// </summary>
public decimal? qty { get; set; }
/// <summary>
/// 扩展
/// </summary>
public string? extras { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public DateTime? timestamp { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 结算状态
/// </summary>
public string? closing_status { get; set; }
}

View File

@@ -0,0 +1,18 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities;
/// <summary>
/// 盘点任务子表
/// </summary>
public partial class WmsCheckstockD
{
/// <summary>
/// 条码数量
/// </summary>
[SugarColumn(IsIgnore = true)]
public decimal codeqty { get; set; }
}

View File

@@ -0,0 +1,107 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities;
/// <summary>
/// 盘点任务主表
/// </summary>
[SugarTable("wms_checkstock_h")]
public partial class WmsCheckstockH : BaseEntity<string>
{
public WmsCheckstockH()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 所属组织
/// </summary>
public string? org_id { get; set; }
/// <summary>
/// 单号
/// </summary>
public string? checkstock_code { get; set; }
/// <summary>
/// 盘点计划ID
/// </summary>
public string? checkplan_id { get; set; }
/// <summary>
/// 仓库ID
/// </summary>
public string? warehouse_id { get; set; }
/// <summary>
/// 盘点状态
/// </summary>
public string? status { get; set; }
/// <summary>
/// 盘点类型
/// </summary>
public string? checkstock_type { get; set; }
/// <summary>
/// 盘点种类
/// </summary>
public string? handle_kinds { get; set; }
/// <summary>
/// 盘点开始时间
/// </summary>
public DateTime? check_start_date { get; set; }
/// <summary>
/// 盘点结束时间
/// </summary>
public DateTime? check_end_date { get; set; }
/// <summary>
/// 盘点人ID
/// </summary>
public string? checkstock_id { get; set; }
/// <summary>
/// 扩展
/// </summary>
public string? extras { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public DateTime? timestamp { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 流程任务Id
/// </summary>
public string? f_flowtaskid { get; set; }
/// <summary>
/// 流程引擎Id
/// </summary>
public string? f_flowid { get; set; }
}

View File

@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tnb.WarehouseMgr.Entities.Enums
{
public enum EnumCheckType
{
/// <summary>
/// 全库盘点
/// </summary>
= 0,
/// <summary>
/// 物料盘点
/// </summary>
,
/// <summary>
/// 批次盘点
/// </summary>
,
}
}

View File

@@ -13,6 +13,6 @@ namespace Tnb.WarehouseMgr.Interfaces
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<int> UpdateNullCarry(WmsCarryH carryObj, Func<WmsCarryH, Task<int>> updateTask=null, [CallerMemberName] string original = "");
Task<Task<int>> UpdateNullCarry(WmsCarryH carryObj, Func<WmsCarryH, Task<int>> updateTask = null, [CallerMemberName] string original = "");
}
}

View File

@@ -158,8 +158,6 @@ namespace Tnb.WarehouseMgr
var items = new List<BasLocation>();
try
{
//var stauts = (int)EnumCarryStatus.空闲;
items = await _db.Queryable<BasLocation>().Where(it => it.wh_id == input.warehouse_id && it.is_lock == 0 && it.is_type == "0" && it.is_use == ((int)EnumCarryStatus.).ToString()).OrderBy(it => new { it.layers, it.loc_line, it.loc_column }, OrderByType.Asc).ToListAsync();
}
@@ -185,47 +183,6 @@ namespace Tnb.WarehouseMgr
[HttpPost]
public async Task GenTaskExecute()
{
//任务链属性处理内部函数
async Task _taskChainAttrHandle(List<WmsDistaskH> items, List<WmsPretaskH> areaPreTasks, int moveNum)
{
var groupCode = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE);
await Task.Run(() =>
{
if (moveNum == 1 || (moveNum > areaPreTasks.Count && areaPreTasks.Count == 1))
{
items.ForEach(x =>
{
x.is_chain = 0;
});
items[0].groups = groupCode;
items[0].bill_code = $"{groupCode}-1";
}
else if ((moveNum >= areaPreTasks.Count && areaPreTasks.Count > 1) || moveNum < areaPreTasks.Count)
{
items.ForEach(x => x.is_chain = 1);
var itemsCount = items.Count;
var mod = items.Count % moveNum > 0 ? itemsCount / moveNum + 1 : itemsCount / moveNum;
var start = 0;
var end = Math.Min(itemsCount, moveNum);
var arrary = items.ToArray();
for (int i = 1; i <= mod; i++)
{
while (start < itemsCount)
{
var subArray = arrary[start..end];
for (int j = 0, arrLen = subArray.Length; j < arrLen; j++)
{
subArray[j].groups = groupCode;
subArray[j].bill_code = $"{groupCode}-{i}";
}
start = end;
end = Math.Min((end + moveNum), arrary.Length);
}
}
}
});
}
//获取所有未下发的预任务申请
var preTasks = await _db.Queryable<WmsPretaskH>().InnerJoin<WmsCarryH>((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id)
.InnerJoin<WmsAreaH>((a, b, c) => a.area_id == c.id)
@@ -256,7 +213,44 @@ namespace Tnb.WarehouseMgr
if (moveNum >= 1)
{
var areaPreTasks = itGroup.ToList();
await _taskChainAttrHandle(items, areaPreTasks, moveNum);
var groupCode = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE);
if (moveNum == 1 || (moveNum > areaPreTasks.Count && areaPreTasks.Count == 1))
{
items.ForEach(x =>
{
x.is_chain = 0;
});
items[0].groups = groupCode;
items[0].bill_code = $"{groupCode}-1";
}
else if ((moveNum >= areaPreTasks.Count && areaPreTasks.Count > 1) || moveNum < areaPreTasks.Count)
{
items.ForEach(x => x.is_chain = 1);
var itemsCount = items.Count;
var mod = items.Count % moveNum > 0 ? itemsCount / moveNum + 1 : itemsCount / moveNum;
var start = 0;
var end = Math.Min(itemsCount, moveNum);
var arrary = items.ToArray();
var dic = new Dictionary<int, WmsDistaskH[]>();
for (int i = 1; i <= mod; i++)
{
while (start < itemsCount)
{
var subArray = arrary[start..end];
dic[i] = subArray;
start = end;
end = Math.Min((end + moveNum), arrary.Length);
}
}
foreach (var (i, v) in dic)
{
foreach (var it in v)
{
it.groups = groupCode;
it.bill_code = $"{groupCode}-{i}";
}
}
}
}
if (preTaskCodes?.Count > 0)
{
@@ -661,6 +655,7 @@ namespace Tnb.WarehouseMgr
List<WmsPointH> results = new() { startObj };
if (points?.Count > 0)
{
points.Where(it => result.Contains(it.id));
foreach (var i in result)
{
WmsPointH? point = points?.Find(x => x.id == i);

View File

@@ -128,7 +128,7 @@ namespace Tnb.WarehouseMgr
wmsCarryReplaceH.modify_id = null;
wmsCarryReplaceH.modify_time = null;
row = await _db.Insertable(wmsCarryReplaceH).ExecuteCommandAsync();
row = await UpdateNullCarry(oldCarry);
row = await await UpdateNullCarry(oldCarry);
isOk = (row > 0);
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);
}
@@ -156,9 +156,10 @@ namespace Tnb.WarehouseMgr
}
[NonAction]
public async Task<int> UpdateNullCarry(WmsCarryH carryObj, Func<WmsCarryH, Task<int>> updateTask = null, [CallerMemberName] string original = "")
public async Task<Task<int>> UpdateNullCarry(WmsCarryH carryObj, Func<WmsCarryH, Task<int>> updateTask = null, [CallerMemberName] string original = "")
{
var row = 1;
Task<int> resTask = Task.FromResult(row);
try
{
carryObj.status = 0;
@@ -173,16 +174,8 @@ namespace Tnb.WarehouseMgr
carryObj.collocation_scheme_code = null;
carryObj.source_id = null;
carryObj.source_code = null;
if (updateTask != null)
{
updateTask(carryObj);
}
else
{
row = await _db.CopyNew().Updateable(carryObj).ExecuteCommandAsync();
}
//Task<int>.Run(() => _db.CopyNew().Updateable(carryObj).ExecuteCommandAsync());
//删除对应明细表
resTask = updateTask?.Invoke(carryObj) ?? _db.CopyNew().Updateable(carryObj).ExecuteCommandAsync();
//*****删除对应明细表
//删除载具明细
await _db.CopyNew().Deleteable<WmsCarryD>().Where(it => it.carry_id == carryObj.id).ExecuteCommandHasChangeAsync();
//删除载具分拣物料明细
@@ -193,10 +186,11 @@ namespace Tnb.WarehouseMgr
catch (Exception ex)
{
row = 0;
resTask = Task.FromResult(row);
Log.Error("更新空载具出错", ex);
throw;
}
return row;
return resTask;
}

View File

@@ -0,0 +1,151 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Extension;
using JNPF.FriendlyException;
using JNPF.VisualDev;
using JNPF.VisualDev.Entitys;
using JNPF.VisualDev.Interfaces;
using Mapster;
using OBS.Internal;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Enums;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 盘点任务
/// </summary>
[OverideVisualDev(ModuleConsts.MODULE_WMSCHECKTASK_ID)]
public class WmsCheckTaskService : BaseWareHouseService
{
private readonly ISqlSugarClient _db;
private readonly IWareHouseService _warehouseService;
private readonly IUserManager _userManager;
private readonly IVisualDevService _visualDevService;
private readonly IRunService _runService;
public WmsCheckTaskService(
ISqlSugarRepository<WmsCheckstockH> repository,
IWareHouseService wareHouseService,
IVisualDevService visualDevService,
IRunService runService,
IUserManager userManager)
{
_db = repository.AsSugarClient();
_warehouseService = wareHouseService;
_visualDevService = visualDevService;
_runService = runService;
_userManager = userManager;
OverideFuncs.CreateAsync = Create;
}
private async Task<dynamic> Create(VisualDevModelDataCrInput input)
{
if (input == null) throw new ArgumentNullException(nameof(input));
try
{
await _db.Ado.BeginTranAsync();
if (input.data?.Count > 0)
{
var checkType = input.data[nameof(WmsCheckstockH.checkstock_type)]?.ToString();
if (!checkType.IsNullOrEmpty())
{
var billStatus = new List<string>
{
WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID,
WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID,
};
var filter = Expressionable.Create<WmsDistaskH, BasLocation>()
.And((a, b) => b.wh_id == input.data[nameof(WmsCheckstockH.warehouse_id)].ToString())
.And((a, b) => b.is_type == ((int)EnumLocationType.).ToString())
.And((a, b) => !billStatus.Contains(a.status))
.ToExpression();
var queryTasks = new List<Task<List<WmsDistaskH>>>();
queryTasks.Add(Task.Run(() => FetchDisTasks((a, b) => a.startlocation_id == b.id, filter)));
queryTasks.Add(Task.Run(() => FetchDisTasks((a, b) => a.endlocation_id == b.id, filter)));
var disTasks = await Task.WhenAll(queryTasks);
if (disTasks?.Length > 0)
{
throw new AppFriendlyException("该仓库还有未完成的任务,不允许盘点!", 500);
}
VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_WMSCHECKTASK_ID, true);
await _runService.Create(templateEntity, input);
List<WmsCarryCode> carryCodes = new();
List<WmsCheckstockD> details = new();
switch (checkType.ToEnum<EnumCheckType>())
{
case EnumCheckType.:
carryCodes = await _db.Queryable<BasLocation>().InnerJoin<WmsCarryCode>((a, b) => a.id == b.location_id)
.Where(a => a.wh_id == input.data[nameof(WmsCheckstockH.warehouse_id)].ToString() && a.is_type == ((int)EnumLocationType.).ToString())
.Select<WmsCarryCode>()
.ToListAsync();
carryCodes ??= Enumerable.Empty<WmsCarryCode>().ToList();
var checkStockDs = carryCodes.Adapt<List<WmsCheckstockD>>();
var prQtyDic = checkStockDs.GroupBy(g => new { g.carry_id, g.material_id, g.code_batch }).ToDictionary(x => x.Key, x => x.Sum(d => d.codeqty));
foreach (var (k, v) in prQtyDic)
{
WmsCheckstockD? checkstockD = checkStockDs?.Find(x => string.Equals(k, $"{x.carry_id}{x.material_id}{x.code_batch}"));
if (checkstockD != null)
{
checkstockD.pr_qty = v;
details.Add(checkstockD);
}
}
details.ForEach(x =>
{
x.create_id = _userManager.UserId;
x.create_time = DateTime.Now;
});
await _db.Insertable(details).ExecuteCommandAsync();
break;
case EnumCheckType.:
break;
case EnumCheckType.:
break;
}
//生成预任务信息
if (details.Count > 0 && carryCodes.Count > 0)
{
var locTypes = new[] { ((int)EnumLocationType.).ToString(), ((int)EnumLocationType.).ToString() };
var endLocs = _db.Queryable<BasLocation>().Where(it=>it.wh_id == input.data[nameof(WmsCheckstockH.warehouse_id)].ToString() && locTypes.Contains(it.is_type)).ToListAsync();
var curDetails = details.DistinctBy(x => x.carry_id).ToList();
var curCarryCodes = carryCodes.FindAll(x => curDetails.Select(d => d.carry_id).Contains(x.carry_id));
if (curCarryCodes.Count > 0)
{
foreach (var item in curCarryCodes)
{
}
}
}
}
}
await _db.Ado.CommitTranAsync();
}
catch (Exception)
{
await _db.Ado.RollbackTranAsync();
throw;
}
return Task.FromResult(1);
}
private Task<List<WmsDistaskH>> FetchDisTasks(Expression<Func<WmsDistaskH, BasLocation, bool>> joinExp, Expression<Func<WmsDistaskH, BasLocation, bool>> whereExp)
{
return _db.Queryable<WmsDistaskH>().InnerJoin<BasLocation>(joinExp).Where(whereExp).Select<WmsDistaskH>().ToListAsync();
}
}
}

View File

@@ -169,7 +169,7 @@ namespace Tnb.WarehouseMgr
var isOk = await _db.Updateable<WmsOutbale>().SetColumns(it => new WmsOutbale { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }).Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync();
var carryId = input.carryIds[^input.carryIds.Count];
var carry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.id == carryId);
var row = await _wmsCarryService.UpdateNullCarry(carry);
var row = await _wmsCarryService.UpdateNullCarry(carry).Unwrap();
isOk = row > 0;
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);

View File

@@ -622,7 +622,7 @@ namespace Tnb.WarehouseMgr
//如果没有完成,修改为工作中
await _db.Updateable<WmsOutstockH>().SetColumns(it => new WmsOutstockH { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == input.requireId).ExecuteCommandAsync();
}
await _wareCarryService.UpdateNullCarry(carry);
await _wareCarryService.UpdateNullCarry(carry).Unwrap();
}
else if (outStatus == EnumOutStatus.)
{

View File

@@ -91,16 +91,17 @@ namespace Tnb.WarehouseMgr
feedBox.modify_id = _userManager.UserId;
feedBox.modify_time = DateTime.Now;
var row = await _db.Updateable(feedBox)
.UpdateColumns(it => new {
.UpdateColumns(it => new
{
it.material_id,
it.material_code,
it.qty,
it.batch,
it.modify_id,
it.modify_id,
it.modify_time
}).ExecuteCommandAsync();
//更新载具
row = await _carryService.UpdateNullCarry(carry);
row = await _carryService.UpdateNullCarry(carry).Unwrap();
isOk = (row > 0);
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);
}

View File

@@ -306,17 +306,17 @@ namespace Tnb.WarehouseMgr
if (carrys?.Count > 0)
{
await _db.Ado.BeginTranAsync();
var tasks = new List<Task<int>>();
var tasks = new List<Task<Task<int>>>();
foreach (var carryIt in carrys)
{
tasks.Add(_carryService.UpdateNullCarry(carryIt, carryIt => Task.Run(() => _db.CopyNew().Updateable(carryIt).ExecuteCommandAsync())));
}
var all = await Task.WhenAll(tasks);
await _db.Ado.CommitTranAsync();
var all = await Task.WhenAll(tasks.Select(t => t.Unwrap()));
if (all.All(x => x > 0))
{
isOk = all?.Length > 0;
}
await _db.Ado.CommitTranAsync();
}
}
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);