|
|
@@ -1,5 +1,8 @@
|
|
|
namespace Admin.NET.Plugin.AiDOP.Order;
|
|
|
|
|
|
+using Admin.NET.Plugin.AiDOP.Entity.S0.Warehouse;
|
|
|
+using Admin.NET.Plugin.AiDOP.Universal;
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 订单发货服务 🚚
|
|
|
/// 路由前缀:/api/Order/asnshipper/...
|
|
|
@@ -77,7 +80,7 @@ public class AsnShipperService : IDynamicApiController, ITransient
|
|
|
a.Remark
|
|
|
FROM ASNBOLShipperMaster a
|
|
|
LEFT JOIN DepartmentMaster b
|
|
|
- ON a.Department = b.Department AND a.Domain = b.Domain
|
|
|
+ ON a.Department = b.Department
|
|
|
{whereClause}
|
|
|
""";
|
|
|
|
|
|
@@ -102,6 +105,26 @@ public class AsnShipperService : IDynamicApiController, ITransient
|
|
|
var master = await _masterRep.GetFirstAsync(u => u.RecID == id)
|
|
|
?? throw Oops.Oh("发货单不存在");
|
|
|
|
|
|
+ // 查询客户名称,用于前端下拉回显"编号+名称"
|
|
|
+ var soldToName = (await _db.Queryable<CustMaster>()
|
|
|
+ .Where(u => u.Cust == master.SoldTo)
|
|
|
+ .Select(u => u.SortName)
|
|
|
+ .FirstAsync()) ?? string.Empty;
|
|
|
+
|
|
|
+ // 查询销售单客户名称,用于前端下拉回显"编号_客户名称"
|
|
|
+ var ordNbrName = string.IsNullOrWhiteSpace(master.OrdNbr) ? string.Empty
|
|
|
+ : ((await _db.Queryable<SeOrder>()
|
|
|
+ .Where(u => u.BillNo == master.OrdNbr)
|
|
|
+ .Select(u => u.CustomName)
|
|
|
+ .FirstAsync()) ?? string.Empty);
|
|
|
+
|
|
|
+ // 查询部门描述,用于前端下拉回显"编号+描述"
|
|
|
+ var deptName = string.IsNullOrWhiteSpace(master.Department) ? string.Empty
|
|
|
+ : ((await _db.Queryable<AdoS0DepartmentMaster>()
|
|
|
+ .Where(u => u.Department == master.Department)
|
|
|
+ .Select(u => u.Descr)
|
|
|
+ .FirstAsync()) ?? string.Empty);
|
|
|
+
|
|
|
// 主键关联:ASNBOLShipperDetail.ASNBOLShipperRecID = 主表 RecID
|
|
|
var details = await _detailRep.GetListAsync(u => u.AsnShipperRecID == id);
|
|
|
// 兼容历史数据:若外键未写入或曾用错误方式取 RecID,则按业务单号 Id + 销售单号 OrdNbr 兜底
|
|
|
@@ -116,10 +139,13 @@ public class AsnShipperService : IDynamicApiController, ITransient
|
|
|
recID = master.RecID,
|
|
|
id = master.Id,
|
|
|
ordNbr = master.OrdNbr,
|
|
|
+ ordNbrName = ordNbrName,
|
|
|
soldTo = master.SoldTo,
|
|
|
+ soldToName = soldToName,
|
|
|
department = master.Department,
|
|
|
+ departmentName = deptName,
|
|
|
shipDate = master.ShipDate?.ToString("yyyy-MM-dd"),
|
|
|
- status = master.Status,
|
|
|
+ status = master.Status ?? string.Empty,
|
|
|
remark = master.Remark,
|
|
|
details = details.OrderBy(d => d.Line).Select(d => new
|
|
|
{
|
|
|
@@ -155,9 +181,16 @@ public class AsnShipperService : IDynamicApiController, ITransient
|
|
|
if (input.RecID is null or 0)
|
|
|
{
|
|
|
// ── 新增:参照 SysJobService.AddJobDetail ──
|
|
|
+ // 若发货单号为空则自动生成 SH+当前日期+四位流水号
|
|
|
+ var shipId = input.Id;
|
|
|
+ if (string.IsNullOrWhiteSpace(shipId))
|
|
|
+ {
|
|
|
+ shipId = await GenerateShipIdAsync(_userManager.TenantId);
|
|
|
+ }
|
|
|
+
|
|
|
var entity = new AsnShipperMaster
|
|
|
{
|
|
|
- Id = input.Id,
|
|
|
+ Id = shipId,
|
|
|
OrdNbr = input.OrdNbr,
|
|
|
SoldTo = input.SoldTo,
|
|
|
Department = input.Department,
|
|
|
@@ -383,6 +416,34 @@ public class AsnShipperService : IDynamicApiController, ITransient
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
+ // ──────────────── 号生成 ────────────────
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 生成发货单号:SH + yyyyMMdd + 4位流水号,例如 SH202605210001
|
|
|
+ /// </summary>
|
|
|
+ private async Task<string> GenerateShipIdAsync(long tenantId)
|
|
|
+ {
|
|
|
+ var today = DateTime.Now.ToString("yyyyMMdd");
|
|
|
+ var prefix = $"SH{today}";
|
|
|
+
|
|
|
+ // 查询当天已有的最大发货单号
|
|
|
+ var maxId = await _db.Queryable<AsnShipperMaster>()
|
|
|
+ .Where(u => u.Id!.StartsWith(prefix) && u.IsActive == 1 && u.TenantId == tenantId)
|
|
|
+ .OrderBy(u => u.Id, OrderByType.Desc)
|
|
|
+ .Select(u => u.Id)
|
|
|
+ .FirstAsync();
|
|
|
+
|
|
|
+ if (string.IsNullOrEmpty(maxId))
|
|
|
+ return $"{prefix}0001";
|
|
|
+
|
|
|
+ // 取后4位转为数字并加1,不足4位补零
|
|
|
+ var last4 = maxId.Length >= 4 ? maxId[^4..] : maxId;
|
|
|
+ if (int.TryParse(last4, out var serial))
|
|
|
+ return $"{prefix}{(serial + 1).ToString().PadLeft(4, '0')}";
|
|
|
+
|
|
|
+ return $"{prefix}0001";
|
|
|
+ }
|
|
|
+
|
|
|
// ──────────────── 内部查询结果映射类 ────────────────
|
|
|
|
|
|
private sealed class AsnShipperListRow
|