using NewPdaSqlServer.DB;
|
using NewPdaSqlServer.Dto.service;
|
using NewPdaSqlServer.entity;
|
using NewPdaSqlServer.entity.Base;
|
using NewPdaSqlServer.util;
|
using SqlSugar;
|
using System.Data;
|
using System.Data.SqlClient;
|
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
|
|
namespace NewPdaSqlServer.service.Wom;
|
|
public class MesWorkProdManager : Repository<MesWorkProd>
|
{
|
//当前类已经继承了 Repository 增、删、查、改的方法
|
|
/// <summary>
|
/// PDA扫描生产报工
|
/// </summary>
|
/// <param name="request">
|
/// 报工请求参数,包含:
|
/// - StaffNo: 员工工号,必填
|
/// - ItemBarcode: 物料条码,必填
|
/// - UserNo: 操作用户账号,必填
|
/// </param>
|
/// <returns>
|
/// 返回报工结果对象,包含:
|
/// - TaskNo: 工单号
|
/// - ItemNo: 物料编号
|
/// - PlanQty: 计划数量
|
/// - ReportedQty: 已报工数量
|
/// - CurrentQty: 本次报工数量
|
/// - BarcodeQty: 条码数量
|
/// - ItemName: 物料名称
|
/// - ItemModel: 物料型号
|
/// - Message: 处理结果消息
|
/// </returns>
|
/// <exception cref="Exception">
|
/// - 当员工不存在时抛出异常
|
/// - 当条码不存在时抛出异常
|
/// - 当物料不存在时抛出异常
|
/// - 当条码重复扫描时抛出异常
|
/// - 当工单不存在时抛出异常
|
/// - 当报工数量小于等于0时抛出异常
|
/// - 当报工总数量超过计划数量时抛出异常
|
/// </exception>
|
public ScanWorkResult ScanWorkAsync(ScanWorkRequest request)
|
{
|
// // 1. 验证员工信息
|
// var staff = Db.Queryable<MesStaff>()
|
// .Where(x => x.StaffNo == request.StaffNo)
|
// .First();
|
// if (staff == null)
|
// throw new Exception("请先选择人员");
|
|
// // 2. 验证条码信息
|
// var barcode = Db.Queryable<MesInvItemBarcodes>()
|
// .Where(x => x.ItemBarcode == request.ItemBarcode)
|
// .First();
|
// if (barcode == null)
|
// throw new Exception($"无此条码,请核对!{request.ItemBarcode}");
|
|
// // 3. 验证物料信息
|
// var item = Db.Queryable<MesItems>()
|
// .Where(x => x.Id == barcode.ItemId)
|
// .First();
|
// if (item == null)
|
// throw new Exception($"无此物料,请核对!{request.ItemBarcode}");
|
|
// // 4. 根据条码备注确定单据类型和交易号
|
// var billTypeId = 900; // 默认单据类型
|
// var transactionNo = 902; // 默认交易号
|
// switch (barcode.Memo?.Trim() ?? "0")
|
// {
|
// case "丝印":
|
// transactionNo = 901; // 丝印工序
|
// break;
|
// case "半成品":
|
// transactionNo = 902; // 半成品工序
|
// break;
|
// case "包装":
|
// case "成品":
|
// transactionNo = 903; // 成品/包装工序
|
// break;
|
// }
|
|
// // 5. 检查条码是否重复扫描
|
// var exists = Db.Queryable<MesWorkProd, MesWorkProdCDetails>(
|
// (a, b) =>
|
// new JoinQueryInfos(JoinType.Inner,
|
// a.Id == b.MesWorkProdId))
|
// .Where((a, b) => b.ItemBarcode == request.ItemBarcode
|
// && a.BillTypeId == billTypeId
|
// && a.TransactionNo == transactionNo)
|
// .Any();
|
|
// if (exists)
|
// throw new Exception("条码重复扫描,请核对!");
|
|
// // 6. 获取已报工数量
|
// var reportedQty = Db.Queryable<MesWorkProd, MesWorkProdCDetails>(
|
// (a, b) =>
|
// new JoinQueryInfos(JoinType.Inner,
|
// a.BillNo == b.BillNo))
|
// .Where((a, b) => a.BillTypeId == billTypeId
|
// && a.TransactionNo == transactionNo
|
// && a.TaskNo == barcode.BillNo)
|
// .Sum((a, b) => b.Quantity);
|
|
// // 7. 获取工单计划数量和型号
|
// var workOrder = Db.Queryable<Womdaa>()
|
// .Where(x => x.Daa001 == barcode.BillNo)
|
// .First();
|
// if (workOrder == null)
|
// throw new Exception($"无工单明细,请核对!{request.ItemBarcode}");
|
|
// var planQty = workOrder.Daa008;
|
// var itemModel = workOrder.Daa004;
|
|
// // 8. 使用事务处理报工数据
|
// UseTransaction(db =>
|
// {
|
// // 9. 处理有数量条码的自动报工
|
// if (barcode.Quantity > 0)
|
// {
|
// var reportQty = barcode.Quantity;
|
// if (reportQty <= 0)
|
// throw new Exception(
|
// $"报工数量不能小于等于0,请核对!{request.ItemBarcode}");
|
|
// var totalQty = (reportedQty ?? 0) + reportQty;
|
// if (totalQty > workOrder.Daa008)
|
// throw new Exception(
|
// $"本次报工数量:{reportQty} 大于剩余报工数量:{workOrder.Daa008 - reportedQty ?? 0},请核对!");
|
|
// // 10. 更新条码状态
|
// db.Updateable<MesInvItemBarcodes>()
|
// .SetColumns(x => new MesInvItemBarcodes
|
// {
|
// WorkFlg = true
|
// //Quantity = reportQty
|
// })
|
// .Where(x => x.Guid == barcode.Guid)
|
// .ExecuteCommand();
|
|
// // 11. 获取或创建报工单
|
// var workProd = db.Queryable<MesWorkProd>()
|
// .Where(x => x.TaskNo == barcode.BillNo
|
// && x.CreateDate.Value.Date.ToString(
|
// "yyyy-MM-dd") ==
|
// DateTime.Now.Date.ToString("yyyy-MM-dd")
|
// && x.BillTypeId == billTypeId
|
// && x.TransactionNo == transactionNo
|
// && x.ReportBy == request.StaffNo)
|
// .First();
|
|
// var id = Guid.Empty;
|
// var billNo = "";
|
// if (workProd == null)
|
// {
|
// id = Guid.NewGuid();
|
// billNo = BillNo.GetBillNo("BG(报工)");
|
|
// workProd = new MesWorkProd
|
// {
|
// Id = id,
|
// BillNo = billNo,
|
// LineNo = barcode.LineNo,
|
// Company = barcode.Company,
|
// Factory = barcode.Factory,
|
// CreateBy = request.UserNo,
|
// CreateDate = DateTime.Now,
|
// LastupdateBy = request.UserNo,
|
// LastupdateDate = DateTime.Now,
|
// BillTypeId = billTypeId,
|
// TransactionNo = transactionNo,
|
// TaskNo = barcode.BillNo,
|
// ReportBy = request.StaffNo,
|
// ReportDate = DateTime.Now
|
// };
|
|
// db.Insertable(workProd).IgnoreColumns(true)
|
// .ExecuteCommand();
|
// }
|
// else
|
// {
|
// id = workProd.Id;
|
// billNo = workProd.BillNo;
|
// }
|
|
// // 12. 插入报工明细
|
// var detailId = Guid.NewGuid();
|
// db.Insertable(new MesWorkProdCDetails
|
// {
|
// Id = detailId,
|
// MesWorkProdId = id,
|
// BillNo = billNo,
|
// ItemBarcode = request.ItemBarcode,
|
// Quantity = (int)reportQty,
|
// Company = barcode.Company,
|
// Factory = barcode.Factory,
|
// CreateBy = request.UserNo,
|
// CreateDate = DateTime.Now,
|
// LastupdateBy = request.UserNo,
|
// LastupdateDate = DateTime.Now,
|
// ItemNo = item.ItemNo,
|
// WorkLast = barcode.WorkLast,
|
// SilkPqty = barcode.SilkPqty,
|
// SilkId = barcode.SilkId,
|
// Silk = barcode.Silk,
|
// BgYg = request.StaffNo
|
// }).IgnoreColumns(true).ExecuteCommand();
|
|
// // 13. 更新工单已报工数量
|
// db.Updateable<Womdaa>()
|
// .SetColumns(x => new Womdaa
|
// {
|
// Daa011 = (x.Daa011 ?? 0) + (int)barcode.Quantity
|
// })
|
// .Where(x => x.Daa001 == barcode.BillNo)
|
// .ExecuteCommand();
|
|
// // 14. 重新获取最新已报工数量
|
// reportedQty = db.Queryable<MesWorkProd, MesWorkProdCDetails>(
|
// (a, b) =>
|
// new JoinQueryInfos(JoinType.Inner,
|
// a.BillNo == b.BillNo))
|
// .Where((a, b) => a.BillTypeId == billTypeId
|
// && a.TransactionNo == transactionNo
|
// && a.TaskNo == barcode.BillNo)
|
// .Sum((a, b) => b.Quantity);
|
// }
|
|
// return 1;
|
// });
|
|
// // 15. 返回处理结果
|
// return new ScanWorkResult
|
// {
|
// TaskNo = barcode.BillNo,
|
// ItemNo = item.ItemNo,
|
// PlanQty = planQty ?? 0,
|
// ReportedQty = reportedQty ?? 0,
|
// CurrentQty = barcode.Quantity.Value,
|
// BarcodeQty = barcode.Quantity.Value,
|
// ItemName = item.ItemName,
|
// ItemModel = itemModel,
|
// Message = "扫码成功!"
|
// };
|
|
//1.验证员工信息
|
var staff = Db.Queryable<MesStaff>()
|
.Where(x => x.StaffNo == request.StaffNo)
|
.First();
|
if (staff == null)
|
throw new Exception("请先选择人员");
|
|
// 2. 验证条码信息
|
var barcode = Db.Queryable<MesInvItemBarcodes>()
|
.Where(x => x.ItemBarcode == request.ItemBarcode)
|
.First();
|
if (barcode == null)
|
throw new Exception($"无此条码,请核对!{request.ItemBarcode}");
|
|
// 3. 验证物料信息
|
var item = Db.Queryable<MesItems>()
|
.Where(x => x.Id == barcode.ItemId)
|
.First();
|
if (item == null)
|
throw new Exception($"无此物料,请核对!{request.ItemBarcode}");
|
|
// 7. 获取工单计划数量和型号
|
var workOrder = Db.Queryable<Womdaa>()
|
.Where(x => x.Daa001 == barcode.BillNo)
|
.First();
|
if (workOrder == null)
|
throw new Exception($"无工单明细,请核对!{request.ItemBarcode}");
|
|
// 使用存储过程处理生产报工
|
var parameters = new SqlParameter[]
|
{
|
new SqlParameter("@pi_user", request.StaffNo),
|
new SqlParameter("@pi_barcode", request.ItemBarcode),
|
new SqlParameter("@po_outMsg", SqlDbType.NVarChar, 200) { Direction = ParameterDirection.Output },
|
new SqlParameter("@po_outSum", SqlDbType.Int) { Direction = ParameterDirection.Output },
|
new SqlParameter("@po_womInBarSum", SqlDbType.Decimal) { Direction = ParameterDirection.Output }
|
};
|
|
string procedureName = "prc_pda_scbg";
|
int res = DbHelperSQL.RunProcedure_NonQuery(procedureName, parameters);
|
|
// Retrieve output parameters with proper type conversion
|
var po_outMsg = parameters[2].Value?.ToString() ?? string.Empty;
|
var po_outSum = parameters[3].Value != DBNull.Value ? Convert.ToInt32(parameters[3].Value) : -1;
|
var po_womInBarSum = parameters[4].Value != DBNull.Value ? Convert.ToDecimal(parameters[4].Value) : 0m;
|
|
|
// 声明变量在外层,确保在所有分支中都可访问
|
MesInvItemIns rksqOrder = null;
|
List<MesInvItemInRksqDetails> rksqDetails = new List<MesInvItemInRksqDetails>();
|
|
if (po_outSum == 1)
|
{
|
rksqOrder = Db.Queryable<MesInvItemIns>()
|
.Where(x => x.RbillNo == barcode.BillNo && x.TransctionNo == "181" && x.CreateBy == request.StaffNo)
|
.First();
|
|
if (rksqOrder != null)
|
{
|
var sql = string.Format(@"SELECT A.item_barcode ItemBarcode,B.QUANTITY BgQuantity,c.item_no ItemNo,c.item_name ItemName,c.item_model ItemModel
|
FROM MES_INV_ITEM_IN_RKSQ_DETAILS A
|
LEFT JOIN MES_INV_ITEM_BARCODES B ON A.item_barcode = B.ITEM_BARCODE
|
LEFT JOIN MES_ITEMS C ON B.ITEM_ID = C.item_id
|
WHERE A.bill_no= '{0}' ORDER BY A.create_date DESC", rksqOrder.BillNo);
|
|
rksqDetails = Db.Ado.SqlQuery<MesInvItemInRksqDetails>(sql).ToList();
|
}
|
}
|
else if (po_outSum == 2)
|
{
|
rksqOrder = Db.Queryable<MesInvItemIns>()
|
.Where(x => x.RbillNo == barcode.BillNo && x.TransctionNo == "181" && x.CreateBy == request.StaffNo)
|
.First();
|
|
if (rksqOrder != null)
|
{
|
rksqOrder.BillNo = "";
|
}
|
|
rksqDetails = new List<MesInvItemInRksqDetails>();
|
}
|
|
// Check if the procedure failed
|
if (po_outSum == -1)
|
{
|
throw new Exception(po_outMsg);
|
}
|
|
// 处理rksqOrder为null的情况
|
string sjBillNo = rksqOrder?.BillNo ?? "";
|
|
// 15. Return processing result
|
return new ScanWorkResult
|
{
|
TaskNo = barcode.BillNo,
|
ItemNo = item.ItemNo,
|
PlanQty = workOrder.Daa008 ?? 0,
|
ReportedQty = po_womInBarSum,
|
CurrentQty = barcode.Quantity.Value,
|
BarcodeQty = barcode.Quantity.Value,
|
ItemName = item.ItemName,
|
ItemModel = workOrder.Daa004,
|
Message = po_outMsg,
|
sjBillNo = sjBillNo,
|
BarcodesDetail = rksqDetails,
|
};
|
|
}
|
|
|
/// <summary>
|
/// PDA扫描生产报工 prc_rf_pda_scan_work_prod
|
/// </summary>
|
/// <param name="request">
|
/// 报工请求参数,包含:
|
/// - ItemBarcode: 物料条码,必填
|
/// - Quantity: 报工数量,必填且大于0
|
/// - UserNo: 操作用户账号,必填
|
/// </param>
|
/// <returns>返回布尔值,true表示报工成功,false表示报工失败</returns>
|
/// <exception cref="Exception">
|
/// - 当报工数量小于等于0时抛出异常
|
/// - 当条码不存在时抛出异常
|
/// - 当工单不存在时抛出异常
|
/// - 当报工总数量超过计划数量时抛出异常
|
/// </exception>
|
public bool ScanWorkProdAsync(ScanWorkRequest request)
|
{
|
//// 1. 验证报工数量是否大于0
|
//if (request.Quantity <= 0)
|
// throw new Exception("报工数量不能小于等于 0,请核对!");
|
|
//// 2. 查询条码信息,验证条码是否存在
|
//var barcode = Db.Queryable<MesInvItemBarcodes>()
|
// .Where(x => x.ItemBarcode == request.ItemBarcode)
|
// .First();
|
//if (barcode == null)
|
// throw new Exception($"库存中无此条码,请核对!{request.ItemBarcode}");
|
|
//// 3. 查询工单信息,验证工单是否存在
|
//var womdaa = Db.Queryable<Womdaa>()
|
// .Where(x => x.Daa001 == barcode.BillNo)
|
// .First();
|
//if (womdaa == null)
|
// throw new Exception($"条码不是报工条码/无对应工单,请核对!{request.ItemBarcode}");
|
|
//// 4. 根据条码备注确定单据类型和交易号
|
//var billTypeId = 900; // 默认单据类型
|
//var transactionNo = 902; // 默认交易号(半成品工序)
|
//switch (barcode.Memo?.Trim() ?? "0")
|
//{
|
// case "丝印":
|
// transactionNo = 901; // 丝印工序
|
// break;
|
// case "半成品":
|
// transactionNo = 902; // 半成品工序
|
// break;
|
// case "成品":
|
// case "包装":
|
// transactionNo = 903; // 成品/包装工序
|
// break;
|
//}
|
|
//// 5. 汇总已扫条码数量,验证是否超出计划数量
|
//var sumQty = Db.Queryable<MesWorkProd, MesWorkProdCDetails>((a, b) =>
|
// new JoinQueryInfos(JoinType.Inner, a.BillNo == b.BillNo))
|
// .Where((a, b) => a.BillTypeId == billTypeId
|
// && a.TransactionNo == transactionNo
|
// && b.SilkId == barcode.SilkId
|
// && a.TaskNo == barcode.BillNo)
|
// .Sum((a, b) => b.Quantity);
|
|
//sumQty = (sumQty ?? 0) + (int)request.Quantity;
|
|
//if (sumQty > womdaa.Daa008)
|
// throw new Exception(
|
// $"本次报工数量:{request.Quantity} 大于剩余报工数量:{womdaa.Daa008 - (sumQty - request.Quantity)},请核对!");
|
|
//// 6. 开启事务处理报工数据
|
//return UseTransaction(db =>
|
//{
|
// // 6.1 更新条码信息,设置已报工标记和数量
|
// db.Updateable<MesInvItemBarcodes>()
|
// .SetColumns(x => x.WorkFlg == true)
|
// .SetColumns(x => x.Quantity == request.Quantity)
|
// .Where(x => x.Guid == barcode.Guid)
|
// .ExecuteCommand();
|
|
// // 6.2 获取或创建报工单
|
// var workProd = db.Queryable<MesWorkProd>()
|
// .Where(x => x.TaskNo == barcode.BillNo
|
// && x.CreateDate.Value.Date.ToString("yyyy-MM-dd") ==
|
// DateTime.Now.Date.ToString("yyyy-MM-dd")
|
// && x.BillTypeId == billTypeId
|
// && x.TransactionNo == transactionNo
|
// && x.Status == 0)
|
// .First();
|
|
// // 6.3 如果报工单不存在则创建新的报工单
|
// if (workProd == null)
|
// {
|
// var billNo = BillNo.GetBillNo("BG(报工编号)");
|
// workProd = new MesWorkProd
|
// {
|
// Id = Guid.NewGuid(),
|
// BillNo = billNo,
|
// LineNo = barcode.LineNo,
|
// Company = barcode.Company,
|
// Factory = barcode.Factory,
|
// CreateBy = request.UserNo,
|
// CreateDate = DateTime.Now,
|
// LastupdateBy = request.UserNo,
|
// LastupdateDate = DateTime.Now,
|
// PbillNo = barcode.BillNo,
|
// BillTypeId = billTypeId,
|
// TransactionNo = transactionNo,
|
// TaskNo = barcode.BillNo
|
// };
|
|
// db.Insertable(workProd).IgnoreColumns(true).ExecuteCommand();
|
// }
|
|
// // 6.4 插入报工明细记录
|
// var detail = new MesWorkProdCDetails
|
// {
|
// Id = Guid.NewGuid(),
|
// BillNo = workProd.BillNo,
|
// ItemBarcode = request.ItemBarcode,
|
// Quantity = (int)request.Quantity,
|
// Company = barcode.Company,
|
// Factory = barcode.Factory,
|
// CreateBy = request.UserNo,
|
// CreateDate = DateTime.Now,
|
// LastupdateBy = request.UserNo,
|
// LastupdateDate = DateTime.Now,
|
// ItemNo = barcode.ItemNo,
|
// PbillNo = barcode.BillNo,
|
// WorkLast = barcode.WorkLast,
|
// SilkPqty = barcode.SilkPqty,
|
// SilkId = barcode.SilkId,
|
// Silk = barcode.Silk
|
// };
|
|
// db.Insertable(detail).IgnoreColumns(true).ExecuteCommand();
|
|
// return 1;
|
//}) > 0;
|
|
// 调用存储过程处理生产报工审核
|
var parameters = new SqlParameter[]
|
{
|
// 输出参数:返回消息(最大长度2500字符)
|
new SqlParameter("@outMsg", SqlDbType.NVarChar, 2500) { Direction = ParameterDirection.Output },
|
// 输出参数:返回影响行数
|
new SqlParameter("@outSum", SqlDbType.Int) { Direction = ParameterDirection.Output },
|
// 输入参数:操作人工号
|
new SqlParameter("@userno", request.UserNo),
|
// 输入参数:单据编号(这里传入了条码值)
|
new SqlParameter("@inorder", request.sjBillNo),
|
// 输入参数:操作类型(1为审核,0为反审核)
|
new SqlParameter("@inFieldValue", 1)
|
// 注:以下参数在存储过程中有默认值,可根据需要添加
|
// @inFieldName nvarchar(20)=null, // 扩展字段名
|
// @in1 nvarchar(20)=null, // 扩展字段1
|
// @in2 nvarchar(20)=null // 扩展字段2
|
};
|
|
// 存储过程名称
|
string procedureName = "prc_pda_scbg_submit";
|
// 执行存储过程
|
int res = DbHelperSQL.RunProcedure_NonQuery(procedureName, parameters);
|
|
// 获取输出参数值(带类型转换)
|
var outMsg = parameters[0].Value?.ToString() ?? string.Empty; // 返回消息
|
var outSum = parameters[1].Value != DBNull.Value ? Convert.ToInt32(parameters[1].Value) : -1; // 影响行数
|
|
if (outSum == -1)
|
{
|
throw new Exception(outMsg);
|
}
|
else
|
{
|
return true;
|
}
|
}
|
|
public ScanWorkResult GetRksqList(ScanWorkRequest request)
|
{
|
|
//1.验证员工信息
|
var staff = Db.Queryable<MesStaff>()
|
.Where(x => x.StaffNo == request.StaffNo)
|
.First();
|
if (staff == null)
|
throw new Exception("请先选择人员");
|
|
var rksqOrder = Db.Queryable<MesInvItemIns>()
|
.Where(x => x.BillNo == request.sjBillNo && x.Status == 0)
|
.First();
|
if (rksqOrder == null)
|
throw new Exception("该检验单已提交送检");
|
|
var sql = string.Format(@"SELECT A.item_barcode ItemBarcode,B.QUANTITY BgQuantity,c.item_no ItemNo,c.item_name ItemName,c.item_model ItemModel
|
FROM MES_INV_ITEM_IN_RKSQ_DETAILS A
|
LEFT JOIN MES_INV_ITEM_BARCODES B ON A.item_barcode = B.ITEM_BARCODE
|
LEFT JOIN MES_ITEMS C ON B.ITEM_ID = C.item_id
|
WHERE A.bill_no= '{0}'ORDER BY A.create_date DESC", rksqOrder.BillNo);
|
|
var RKSQ = Db.Ado.SqlQuery<MesInvItemInRksqDetails>(sql);
|
|
|
var rksqDetails = RKSQ.ToList();
|
|
|
//var rksqDetails = Db.Queryable<MesInvItemInRksqDetails>()
|
// .Where(x => x.BillNo == )
|
// .ToList();
|
|
// 15. Return processing result
|
return new ScanWorkResult
|
{
|
BarcodesDetail = rksqDetails,
|
};
|
}
|
|
public ScanWorkResult GetRksqSelect(ScanWorkRequest request)
|
{
|
//1.验证员工信息
|
var staff = Db.Queryable<MesStaff>()
|
.Where(x => x.StaffNo == request.StaffNo)
|
.First();
|
if (staff == null)
|
throw new Exception("请先选择人员");
|
|
var rksqOrder = Db.Queryable<MesInvItemIns>()
|
.Where(x => x.TransctionNo=="181"&& x.Status == 0 && x.CreateBy== request.StaffNo)
|
.ToList();
|
|
return new ScanWorkResult
|
{
|
rksqOrderList = rksqOrder,
|
};
|
}
|
|
}
|