|
|
@@ -86,16 +86,16 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
p.`Usage` AS `Usage`,
|
|
|
p.Curr AS Curr,
|
|
|
p.Remark AS Remark,
|
|
|
- (CASE WHEN EXISTS(SELECT 1 FROM PurOrdDetail pd WHERE pd.PurOrd=p.PurOrd AND IFNULL(pd.QtyReceived,0)>0) THEN 1 ELSE 0 END) AS HasReceived
|
|
|
+ (CASE WHEN EXISTS(SELECT 1 FROM PurOrdDetail pd WHERE pd.PurOrd=p.PurOrd AND IFNULL(pd.QtyReceived,0)>0 AND pd.tenant_id=@TenantId) THEN 1 ELSE 0 END) AS HasReceived
|
|
|
FROM PurOrdMaster p
|
|
|
- LEFT JOIN SuppMaster s ON p.Supp=s.Supp
|
|
|
- LEFT JOIN DepartmentMaster d ON p.Department=d.Department
|
|
|
- LEFT JOIN EmployeeMaster e ON p.Buyer=e.Employee
|
|
|
- LEFT JOIN PurOrdDetail f ON p.PurOrd=f.PurOrd
|
|
|
- LEFT JOIN RoutingOpDetail r ON f.Op=r.Op AND f.ItemNum=r.RoutingCode
|
|
|
- LEFT JOIN ItemMaster i ON f.ItemNum=i.ItemNum
|
|
|
- LEFT JOIN PurOrdRctMaster o ON o.OrdNbr=p.PurOrd
|
|
|
- LEFT JOIN NbrMaster n ON p.WorkOrd=n.WorkOrd AND n.Type='CA'
|
|
|
+ LEFT JOIN SuppMaster s ON p.Supp=s.Supp AND s.tenant_id=@TenantId
|
|
|
+ LEFT JOIN DepartmentMaster d ON p.Department=d.Department AND d.tenant_id=@TenantId
|
|
|
+ LEFT JOIN EmployeeMaster e ON p.Buyer=e.Employee AND e.tenant_id=@TenantId
|
|
|
+ LEFT JOIN PurOrdDetail f ON p.PurOrd=f.PurOrd AND f.tenant_id=@TenantId
|
|
|
+ LEFT JOIN RoutingOpDetail r ON f.Op=r.Op AND f.ItemNum=r.RoutingCode AND r.tenant_id=@TenantId
|
|
|
+ LEFT JOIN ItemMaster i ON f.ItemNum=i.ItemNum AND i.tenant_id=@TenantId
|
|
|
+ LEFT JOIN PurOrdRctMaster o ON o.OrdNbr=p.PurOrd AND o.tenant_id=@TenantId
|
|
|
+ LEFT JOIN NbrMaster n ON p.WorkOrd=n.WorkOrd AND n.Type='CA' AND n.tenant_id=@TenantId
|
|
|
WHERE {string.Join(" AND ", where)}
|
|
|
""";
|
|
|
|
|
|
@@ -152,11 +152,12 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
d.PurOrd AS PurOrd,
|
|
|
d.PurOrdRecID AS PurOrdRecID
|
|
|
FROM PurOrdDetail d
|
|
|
- LEFT JOIN ItemMaster i ON d.ItemNum=i.ItemNum
|
|
|
- WHERE d.PurOrdRecID=@PurOrdRecID
|
|
|
+ LEFT JOIN ItemMaster i ON d.ItemNum=i.ItemNum AND i.tenant_id=@TenantId
|
|
|
+ WHERE d.PurOrdRecID=@PurOrdRecID AND d.tenant_id=@TenantId
|
|
|
ORDER BY d.Line,d.RecID
|
|
|
""",
|
|
|
- new SugarParameter("@PurOrdRecID", id));
|
|
|
+ new SugarParameter("@PurOrdRecID", id),
|
|
|
+ new SugarParameter("@TenantId", ResolveTenantOrThrow()));
|
|
|
|
|
|
return new { master, details };
|
|
|
}
|
|
|
@@ -167,6 +168,7 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
{
|
|
|
if (string.IsNullOrWhiteSpace(input.WorkOrd)) throw Oops.Oh("请选择工单");
|
|
|
var workOrd = input.WorkOrd.Trim();
|
|
|
+ var tenantId = ResolveTenantOrThrow();
|
|
|
|
|
|
// 先筛出“当前工单且未生成采购单”的外协供应商清单(等价于存储过程内 @v_temp_supp)。
|
|
|
var suppliers = await _db.Ado.SqlQueryAsync<SuppRow>(
|
|
|
@@ -175,14 +177,16 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
FROM WorkOrdMaster m
|
|
|
LEFT JOIN WorkOrdRouting r ON m.WorkOrd=r.WorkOrd
|
|
|
LEFT JOIN RoutingOpDetail d ON r.Op=d.Op AND r.ItemNum=d.RoutingCode
|
|
|
- LEFT JOIN PurOrdMaster p ON m.WorkOrd=p.WorkOrd AND d.SupplierCode=p.Supp
|
|
|
+ LEFT JOIN PurOrdMaster p ON m.WorkOrd=p.WorkOrd AND d.SupplierCode=p.Supp AND p.tenant_id=@TenantId
|
|
|
WHERE r.ProcessOut=1
|
|
|
AND m.WorkOrd=@WorkOrd
|
|
|
+ AND m.tenant_id=@TenantId
|
|
|
AND p.RecID IS NULL
|
|
|
AND IFNULL(TRIM(d.SupplierCode),'')<>''
|
|
|
ORDER BY d.SupplierCode
|
|
|
""",
|
|
|
- new SugarParameter("@WorkOrd", workOrd));
|
|
|
+ new SugarParameter("@WorkOrd", workOrd),
|
|
|
+ new SugarParameter("@TenantId", tenantId));
|
|
|
if (suppliers.Count == 0)
|
|
|
throw Oops.Oh("当前工单无需生成外协采购订单。");
|
|
|
|
|
|
@@ -190,10 +194,11 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
"""
|
|
|
SELECT IFNULL(TRIM(Domain),'')
|
|
|
FROM WorkOrdMaster
|
|
|
- WHERE WorkOrd=@WorkOrd
|
|
|
+ WHERE WorkOrd=@WorkOrd AND tenant_id=@TenantId
|
|
|
LIMIT 1
|
|
|
""",
|
|
|
- new SugarParameter("@WorkOrd", workOrd)) ?? string.Empty;
|
|
|
+ new SugarParameter("@WorkOrd", workOrd),
|
|
|
+ new SugarParameter("@TenantId", tenantId)) ?? string.Empty;
|
|
|
|
|
|
var created = new List<IdPurOrdRow>();
|
|
|
try
|
|
|
@@ -242,7 +247,7 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
m.WorkOrd,
|
|
|
@TenantId
|
|
|
FROM WorkOrdMaster m
|
|
|
- WHERE m.WorkOrd=@WorkOrd
|
|
|
+ WHERE m.WorkOrd=@WorkOrd AND m.tenant_id=@TenantId
|
|
|
LIMIT 1
|
|
|
""",
|
|
|
new SugarParameter("@Buyer", _userManager.Account),
|
|
|
@@ -254,8 +259,9 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
new SugarParameter("@TenantId", ResolveTenantOrThrow()));
|
|
|
|
|
|
var masterId = await _db.Ado.GetIntAsync(
|
|
|
- "SELECT IFNULL(MAX(RecID),0) FROM PurOrdMaster WHERE PurOrd=@PurOrd",
|
|
|
- new SugarParameter("@PurOrd", purOrd));
|
|
|
+ "SELECT IFNULL(MAX(RecID),0) FROM PurOrdMaster WHERE PurOrd=@PurOrd AND tenant_id=@TenantId",
|
|
|
+ new SugarParameter("@PurOrd", purOrd),
|
|
|
+ new SugarParameter("@TenantId", tenantId));
|
|
|
if (masterId <= 0)
|
|
|
throw Oops.Oh("采购订单生成失败。");
|
|
|
|
|
|
@@ -274,16 +280,18 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
IFNULL(m.RecID,0) AS WorkOrdID,
|
|
|
IFNULL(d.OutsourcedLeadTime,0) AS ProcessOutDay
|
|
|
FROM WorkOrdMaster m
|
|
|
- LEFT JOIN WorkOrdRouting r ON m.WorkOrd=r.WorkOrd
|
|
|
- LEFT JOIN RoutingOpDetail d ON r.Op=d.Op AND r.ItemNum=d.RoutingCode
|
|
|
- LEFT JOIN ItemMaster i ON r.ItemNum=i.ItemNum
|
|
|
+ LEFT JOIN WorkOrdRouting r ON m.WorkOrd=r.WorkOrd AND r.tenant_id=@TenantId
|
|
|
+ LEFT JOIN RoutingOpDetail d ON r.Op=d.Op AND r.ItemNum=d.RoutingCode AND d.tenant_id=@TenantId
|
|
|
+ LEFT JOIN ItemMaster i ON r.ItemNum=i.ItemNum AND i.tenant_id=@TenantId
|
|
|
WHERE r.ProcessOut=1
|
|
|
AND m.WorkOrd=@WorkOrd
|
|
|
+ AND m.tenant_id=@TenantId
|
|
|
AND d.SupplierCode=@Supp
|
|
|
ORDER BY r.RecID
|
|
|
""",
|
|
|
new SugarParameter("@WorkOrd", workOrd),
|
|
|
- new SugarParameter("@Supp", supp));
|
|
|
+ new SugarParameter("@Supp", supp),
|
|
|
+ new SugarParameter("@TenantId", tenantId));
|
|
|
|
|
|
for (var lineIndex = 0; lineIndex < lines.Count; lineIndex++)
|
|
|
{
|
|
|
@@ -332,10 +340,10 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
new SugarParameter("@WorkOrd", row.WorkOrd),
|
|
|
new SugarParameter("@Drawing", row.Drawing),
|
|
|
new SugarParameter("@PurOrdRecID", masterId),
|
|
|
- new SugarParameter("@TenantId", ResolveTenantOrThrow()));
|
|
|
+ new SugarParameter("@TenantId", tenantId));
|
|
|
}
|
|
|
|
|
|
- await UpsertProcessOutsourceMdpAsync(purOrd, now);
|
|
|
+ await UpsertProcessOutsourceMdpAsync(purOrd, tenantId, now);
|
|
|
created.Add(new IdPurOrdRow { Id = masterId, PurOrd = purOrd });
|
|
|
}
|
|
|
|
|
|
@@ -352,7 +360,7 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
return new { id = latest.Id, purOrd = latest.PurOrd, message = "采购订单生成成功。" };
|
|
|
}
|
|
|
|
|
|
- private async Task UpsertProcessOutsourceMdpAsync(string purOrd, DateTime now)
|
|
|
+ private async Task UpsertProcessOutsourceMdpAsync(string purOrd, long tenantId, DateTime now)
|
|
|
{
|
|
|
var batchId = $"S3_OUTSOURCE_{now:yyyyMMddHHmmss}";
|
|
|
// S8-RULE01-AUTHORITY-SINGLE-WRITER:已移除对 mdp_std_purchase_order 的直写。
|
|
|
@@ -385,6 +393,7 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
FROM PurOrdMaster m
|
|
|
JOIN PurOrdDetail d ON m.RecID = d.PurOrdRecID
|
|
|
WHERE m.PurOrd = @PurOrd
|
|
|
+ AND m.tenant_id = @TenantId
|
|
|
AND m.Potype = 'PW'
|
|
|
AND IFNULL(m.WorkOrd, '') <> ''
|
|
|
AND IFNULL(d.ItemNum, '') <> ''
|
|
|
@@ -402,6 +411,7 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
update_time=CURRENT_TIMESTAMP
|
|
|
""",
|
|
|
new SugarParameter("@PurOrd", purOrd),
|
|
|
+ new SugarParameter("@TenantId", tenantId),
|
|
|
new SugarParameter("@BatchId", batchId),
|
|
|
new SugarParameter("@Now", now));
|
|
|
|
|
|
@@ -442,7 +452,7 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
"""
|
|
|
UPDATE PurOrdMaster
|
|
|
SET OrdDate=@OrdDate,Supp=@Supp,ReqBy=@ReqBy,WorkOrd=@WorkOrd,Buyer=@Buyer,Department=@Department,`Usage`=@Usage,Curr=@Curr,Remark=@Remark,UpdateUser=@UpdateUser,UpdateTime=@UpdateTime
|
|
|
- WHERE RecID=@Id
|
|
|
+ WHERE RecID=@Id AND tenant_id=@TenantId
|
|
|
""",
|
|
|
new SugarParameter("@Id", input.Id),
|
|
|
new SugarParameter("@OrdDate", ParseDate(input.OrdDate)),
|
|
|
@@ -455,7 +465,8 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
new SugarParameter("@Curr", input.Curr?.Trim()),
|
|
|
new SugarParameter("@Remark", input.Remark?.Trim()),
|
|
|
new SugarParameter("@UpdateUser", _userManager.Account),
|
|
|
- new SugarParameter("@UpdateTime", DateTime.Now)
|
|
|
+ new SugarParameter("@UpdateTime", DateTime.Now),
|
|
|
+ new SugarParameter("@TenantId", ResolveTenantOrThrow())
|
|
|
);
|
|
|
|
|
|
await SaveDetailsAsync(input.Id, input.PurOrd!.Trim(), input.WorkOrd, input.Details);
|
|
|
@@ -479,13 +490,15 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
/// </summary>
|
|
|
private async Task SaveDetailsAsync(int masterId, string purOrd, string? workOrd, List<ProcessOutsourceOrderDetailInput> details)
|
|
|
{
|
|
|
+ var tenantId = ResolveTenantOrThrow();
|
|
|
var dbDetails = await _db.Ado.SqlQueryAsync<DbDetailRow>(
|
|
|
- "SELECT RecID AS Id FROM PurOrdDetail WHERE PurOrdRecID=@PurOrdRecID",
|
|
|
- new SugarParameter("@PurOrdRecID", masterId));
|
|
|
+ "SELECT RecID AS Id FROM PurOrdDetail WHERE PurOrdRecID=@PurOrdRecID AND tenant_id=@TenantId",
|
|
|
+ new SugarParameter("@PurOrdRecID", masterId),
|
|
|
+ new SugarParameter("@TenantId", tenantId));
|
|
|
var dbById = dbDetails.ToDictionary(x => x.Id);
|
|
|
var inputIds = new HashSet<int>(details.Where(x => x.Id.HasValue && x.Id.Value > 0).Select(x => x.Id!.Value));
|
|
|
|
|
|
- var maxLine = await _db.Ado.GetIntAsync("SELECT IFNULL(MAX(Line),0) FROM PurOrdDetail WHERE PurOrdRecID=@PurOrdRecID", new SugarParameter("@PurOrdRecID", masterId));
|
|
|
+ var maxLine = await _db.Ado.GetIntAsync("SELECT IFNULL(MAX(Line),0) FROM PurOrdDetail WHERE PurOrdRecID=@PurOrdRecID AND tenant_id=@TenantId", new SugarParameter("@PurOrdRecID", masterId), new SugarParameter("@TenantId", tenantId));
|
|
|
var lineSeed = maxLine;
|
|
|
|
|
|
for (var i = 0; i < details.Count; i++)
|
|
|
@@ -515,7 +528,7 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
"""
|
|
|
UPDATE PurOrdDetail
|
|
|
SET Line=@Line,ItemNum=@ItemNum,Descr=@Descr,Op=@Op,UM=@UM,Location=@Location,QtyOrded=@QtyOrded,QtyReceived=@QtyReceived,ReceiptQty=@ReceiptQty,DueDate=@DueDate,LotSerial=@LotSerial,Potype='PW',PurOrd=@PurOrd,PurOrdRecID=@PurOrdRecID,WorkOrd=@WorkOrd,UpdateUser=@UpdateUser,UpdateTime=@UpdateTime
|
|
|
- WHERE RecID=@Id
|
|
|
+ WHERE RecID=@Id AND tenant_id=@TenantId
|
|
|
""",
|
|
|
new SugarParameter("@Id", item.Id.Value),
|
|
|
new SugarParameter("@Line", line),
|
|
|
@@ -533,7 +546,8 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
new SugarParameter("@PurOrdRecID", masterId),
|
|
|
new SugarParameter("@WorkOrd", workOrd?.Trim()),
|
|
|
new SugarParameter("@UpdateUser", _userManager.Account),
|
|
|
- new SugarParameter("@UpdateTime", DateTime.Now)
|
|
|
+ new SugarParameter("@UpdateTime", DateTime.Now),
|
|
|
+ new SugarParameter("@TenantId", tenantId)
|
|
|
);
|
|
|
}
|
|
|
else
|
|
|
@@ -570,7 +584,7 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
|
|
|
foreach (var toDelete in dbDetails.Where(x => !inputIds.Contains(x.Id)))
|
|
|
{
|
|
|
- await _db.Ado.ExecuteCommandAsync("DELETE FROM PurOrdDetail WHERE RecID=@Id", new SugarParameter("@Id", toDelete.Id));
|
|
|
+ await _db.Ado.ExecuteCommandAsync("DELETE FROM PurOrdDetail WHERE RecID=@Id AND tenant_id=@TenantId", new SugarParameter("@Id", toDelete.Id), new SugarParameter("@TenantId", tenantId));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -580,22 +594,25 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
{
|
|
|
if (string.IsNullOrWhiteSpace(purOrd)) throw Oops.Oh("缺少采购单号");
|
|
|
var ordNo = purOrd.Trim();
|
|
|
+ var tenantId = ResolveTenantOrThrow();
|
|
|
|
|
|
var hasReceipt = await _db.Ado.GetIntAsync(
|
|
|
"SELECT COUNT(1) FROM PurOrdRctDetail WHERE OrdNbr=@PurOrd AND IFNULL(QtyReceived,0)>0 AND tenant_id=@TenantId",
|
|
|
- new[] { new SugarParameter("@PurOrd", ordNo), new SugarParameter("@TenantId", ResolveTenantOrThrow()) });
|
|
|
+ new[] { new SugarParameter("@PurOrd", ordNo), new SugarParameter("@TenantId", tenantId) });
|
|
|
if (hasReceipt > 0) throw Oops.Oh("存在收货数量,不允许删除");
|
|
|
|
|
|
var hasShip = await _db.Ado.GetIntAsync(
|
|
|
"SELECT COUNT(1) FROM scm_shdzb WHERE po_bill=@PurOrd AND tenant_id=@TenantId",
|
|
|
- new[] { new SugarParameter("@PurOrd", ordNo), new SugarParameter("@TenantId", ResolveTenantOrThrow()) });
|
|
|
+ new[] { new SugarParameter("@PurOrd", ordNo), new SugarParameter("@TenantId", tenantId) });
|
|
|
if (hasShip > 0) throw Oops.Oh("存在发货单,不允许删除");
|
|
|
|
|
|
try
|
|
|
{
|
|
|
_db.Ado.BeginTran();
|
|
|
- await _db.Ado.ExecuteCommandAsync("DELETE FROM PurOrdDetail WHERE PurOrd=@PurOrd", new SugarParameter("@PurOrd", ordNo));
|
|
|
- await _db.Ado.ExecuteCommandAsync("DELETE FROM PurOrdMaster WHERE RecID=@Id AND PurOrd=@PurOrd", new SugarParameter("@Id", id), new SugarParameter("@PurOrd", ordNo));
|
|
|
+ await _db.Ado.ExecuteCommandAsync("DELETE FROM PurOrdDetail WHERE PurOrd=@PurOrd AND tenant_id=@TenantId",
|
|
|
+ new SugarParameter("@PurOrd", ordNo), new SugarParameter("@TenantId", tenantId));
|
|
|
+ await _db.Ado.ExecuteCommandAsync("DELETE FROM PurOrdMaster WHERE RecID=@Id AND PurOrd=@PurOrd AND tenant_id=@TenantId",
|
|
|
+ new SugarParameter("@Id", id), new SugarParameter("@PurOrd", ordNo), new SugarParameter("@TenantId", tenantId));
|
|
|
_db.Ado.CommitTran();
|
|
|
}
|
|
|
catch
|
|
|
@@ -684,10 +701,12 @@ public class ProcessOutsourceOrderService : IDynamicApiController, ITransient
|
|
|
SELECT DISTINCT CAST(Op AS CHAR(50)) AS Value, CONCAT(TRIM(CAST(Op AS CHAR(50))),' ',TRIM(IFNULL(Descr,''))) AS Label
|
|
|
FROM RoutingOpDetail
|
|
|
WHERE UDeci5!=0
|
|
|
- AND RoutingCode IN (SELECT ItemNum FROM PurOrdDetail WHERE PurOrdRecID=@PurOrdRecID)
|
|
|
+ AND tenant_id=@TenantId
|
|
|
+ AND RoutingCode IN (SELECT ItemNum FROM PurOrdDetail WHERE PurOrdRecID=@PurOrdRecID AND tenant_id=@TenantId)
|
|
|
ORDER BY Value
|
|
|
""",
|
|
|
- new SugarParameter("@PurOrdRecID", purOrdRecId));
|
|
|
+ new SugarParameter("@PurOrdRecID", purOrdRecId),
|
|
|
+ new SugarParameter("@TenantId", ResolveTenantOrThrow()));
|
|
|
return new { list };
|
|
|
}
|
|
|
|