锐腾搅拌上料功能
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1353 lines
60 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ICSSoft.Base.Config.DBHelper;
using System.Data;
using ICSSoft.Frame.Data.Entity;
using System.Data.Linq;
using System.Data.SqlClient;
using ICSSoft.Base.Config.AppConfig;
namespace ICSSoft.Frame.Data.DAL
{
public class ICSLot2LotDAL
{
public static void AddList(string oldLotNo, string ROUTECODE, int OpSeq, string OPCODE, List<ICSITEMLot> list, string FPType, string dsconn)
{
FramDataContext db = new FramDataContext(dsconn);
db.Connection.Open();
db.Transaction = db.Connection.BeginTransaction();
try
{
var lineOldLot = db.ICSITEMLot.SingleOrDefault(a => a.LotNO == oldLotNo);
if (lineOldLot == null)
{
throw new Exception("原条码" + oldLotNo + "不存在");
}
foreach (ICSITEMLot newLot in list)
{
var lineLot = db.ICSITEMLot.SingleOrDefault(a => a.LotNO == newLot.LotNO);
if (lineLot != null)
{
throw new Exception("新条码" + newLot.LotNO + "已生成");
}
//1.ICSITEMLot新条码
lineLot = new ICSITEMLot();
lineLot.ACTIVE = lineOldLot.ACTIVE;
//lineLot.EATTRIBUTE3 = lineOldLot.EATTRIBUTE3;
//lineLot.EATTRIBUTE4 = lineOldLot.EATTRIBUTE4;
//lineLot.EATTRIBUTE5 = lineOldLot.EATTRIBUTE5;
//lineLot.EATTRIBUTE6 = lineOldLot.EATTRIBUTE6;
//lineLot.EATTRIBUTE7 = lineOldLot.EATTRIBUTE7;
lineLot.Exdate = lineOldLot.Exdate;
lineLot.ItemCode = lineOldLot.ItemCode;
lineLot.lastPrintTime = null;
lineLot.lastPrintUSERID = null;
lineLot.PrintTimes = 0;
lineLot.PRODUCTDATE = lineOldLot.PRODUCTDATE;
lineLot.tFileName = lineOldLot.tFileName;
lineLot.TimesPrint = lineOldLot.TimesPrint;
lineLot.TwoMTIME = lineOldLot.TwoMTIME;
lineLot.TwoMUSER = lineOldLot.TwoMUSER;
lineLot.VenBatch = lineOldLot.VenBatch;
lineLot.VenderLotNO = lineOldLot.VenderLotNO;
lineLot.VENDORCODE = lineOldLot.VENDORCODE;
lineLot.VENDORITEMCODE = lineOldLot.VENDORITEMCODE;
lineLot.VoucherNO = lineOldLot.VoucherNO;
lineLot.VoucherRow = lineOldLot.VoucherRow;
lineLot.TransNO = lineOldLot.TransNO;
lineLot.TransLine = lineOldLot.TransLine;
lineLot.WorkPoint = lineOldLot.WorkPoint;
lineLot.ID = AppConfig.GetGuid();
lineLot.LotNO = newLot.LotNO;
lineLot.LOTQTY = newLot.LOTQTY;
lineLot.TYPE = "跟踪单分批";
lineLot.EATTRIBUTE1 = newLot.EATTRIBUTE1;//原条码
lineLot.EATTRIBUTE2 = newLot.EATTRIBUTE2;//原条码数量
lineLot.EATTRIBUTE5 = newLot.EATTRIBUTE5;//原条码分批时工序序号+","+工序
lineLot.EATTRIBUTE6 = "0";//被分批时的,已分出数量
lineLot.EATTRIBUTE7 = FPType;
lineLot.MTIME = DateTime.Now;
lineLot.MUSER = AppConfig.UserCode;
lineLot.MUSERName = AppConfig.UserName;
//2.变更原跟踪单原条码数量
lineOldLot.LOTQTY -= newLot.LOTQTY;
//2.1变更原跟踪单已分批数量
if (string.IsNullOrEmpty(lineOldLot.EATTRIBUTE6))
{
lineOldLot.EATTRIBUTE6 = "0";
}
lineOldLot.EATTRIBUTE6 = (Convert.ToDecimal(lineOldLot.EATTRIBUTE6) + newLot.LOTQTY).ToString();
db.ICSITEMLot.InsertOnSubmit(lineLot);
db.SubmitChanges();
//2.2报工表记录分批数量
var lineOnwip = db.ICSLOTONWIP.SingleOrDefault(a => a.LOTNO == lineOldLot.LotNO && a.ROUTECODE == ROUTECODE && a.OPSEQ == OpSeq && a.OPCODE == OPCODE);
if (lineOnwip != null)
{
if (FPType == "正常")
{
lineOnwip.FPQTY = (lineOnwip.FPQTY == null ? 0 : lineOnwip.FPQTY) + newLot.LOTQTY;
}
else if (FPType == "返工")
{
lineOnwip.RWFPQTY = (lineOnwip.RWFPQTY == null ? 0 : lineOnwip.RWFPQTY) + newLot.LOTQTY;
}
else
{
throw new Exception("分批类型错误!");
}
db.SubmitChanges();
}
//3.ICSITEMROUTE2OPLot
var lineNewOpLot = db.ICSITEMROUTE2OPLot.FirstOrDefault(a => a.LotNo == newLot.LotNO);
if (lineNewOpLot != null)
{
throw new Exception("新条码" + newLot.LotNO + "已生成工序");
}
List<ICSITEMROUTE2OPLot> listOpLot = db.ICSITEMROUTE2OPLot.Where(a => a.LotNo == oldLotNo && a.OPSEQ > OpSeq).ToList();
if (listOpLot.Count == 0)
{
//throw new Exception("原条码" + oldLotNo + "已是最后一道工序,不需要分批.");
int fpopseq = 9999;
ICSITEMROUTE2OPLot v = db.ICSITEMROUTE2OPLot.Single(a => a.LotNo == oldLotNo && a.OPSEQ == OpSeq);
ICSOP fpop = db.ICSOP.SingleOrDefault(a => a.OPCODE == fpopseq.ToString() && a.WorkPoint == lineOldLot.WorkPoint);
if (fpop == null)
{
throw new Exception("跟踪单最后一道工序分批时,需要专用虚拟工序 ,工序代码9999,此工序未维护");
}
ICSITEMROUTE2OPLot opLotInfo = new ICSITEMROUTE2OPLot();
opLotInfo.CtrlType = "串行";
opLotInfo.OPAttr = "自制";
opLotInfo.OPSEQ = fpopseq;
opLotInfo.OPCODE = fpopseq.ToString();
opLotInfo.EATTRIBUTE1 = "0";//如果是分批出的返工跟踪单 0 表示原始状态未进行工序变更,1表示已做了跟踪单工序变更(跟踪单工序变更保存时该值为1)
opLotInfo.IDMERGERULE = v.IDMERGERULE;
opLotInfo.IDMERGETYPE = v.IDMERGETYPE;
opLotInfo.ITEMCODE = v.ITEMCODE;
opLotInfo.OPCONTROL = v.OPCONTROL;
opLotInfo.OPTIONALOP = v.OPTIONALOP;
opLotInfo.ROUTECODE = v.ROUTECODE;
opLotInfo.RouteMGR = v.RouteMGR;
opLotInfo.WorkPoint = v.WorkPoint;
opLotInfo.ID = AppConfig.GetGuid();
opLotInfo.LotNo = newLot.LotNO;
opLotInfo.MTIME = DateTime.Now;
opLotInfo.MUSER = AppConfig.UserCode;
opLotInfo.MUSERName = AppConfig.UserName;
}
foreach (ICSITEMROUTE2OPLot opLot in listOpLot)
{
ICSITEMROUTE2OPLot opLotInfo = new ICSITEMROUTE2OPLot();
opLotInfo.CtrlType = opLot.CtrlType;
opLotInfo.EATTRIBUTE1 = "0";
opLotInfo.IDMERGERULE = opLot.IDMERGERULE;
opLotInfo.IDMERGETYPE = opLot.IDMERGETYPE;
opLotInfo.ITEMCODE = opLot.ITEMCODE;
opLotInfo.OPAttr = opLot.OPAttr;
opLotInfo.OPCODE = opLot.OPCODE;
opLotInfo.OPCONTROL = opLot.OPCONTROL;
opLotInfo.OPSEQ = opLot.OPSEQ;
opLotInfo.OPTIONALOP = opLot.OPTIONALOP;
opLotInfo.ROUTECODE = opLot.ROUTECODE;
opLotInfo.RouteMGR = opLot.RouteMGR;
opLotInfo.WorkPoint = opLot.WorkPoint;
opLotInfo.CtrlType = opLot.CtrlType;
opLotInfo.ID = AppConfig.GetGuid();
opLotInfo.LotNo = newLot.LotNO;
opLotInfo.MTIME = DateTime.Now;
opLotInfo.MUSER = AppConfig.UserCode;
opLotInfo.MUSERName = AppConfig.UserName;
db.ICSITEMROUTE2OPLot.InsertOnSubmit(opLotInfo);
db.SubmitChanges();
var lineMo2User = db.ICSMO2User.SingleOrDefault(a => a.LOTNO == oldLotNo && a.OPCODE == opLot.OPCODE);
if (lineMo2User != null)
{
ICSMO2User MO2USR = new ICSMO2User();
MO2USR.ID = AppConfig.GetGuid();
MO2USR.LOTNO = newLot.LotNO;
MO2USR.MOCODE = lineMo2User.MOCODE;
MO2USR.MOSEQ = lineMo2User.MOSEQ;
MO2USR.SEGCODE = lineMo2User.SEGCODE;
MO2USR.RouteCode = lineMo2User.RouteCode;
MO2USR.OPCODE = lineMo2User.OPCODE;
MO2USR.USERCODE = lineMo2User.USERCODE;
MO2USR.USERName = lineMo2User.USERName;
MO2USR.EQPCode = lineMo2User.EQPCode;
MO2USR.EQPName = lineMo2User.EQPName;
MO2USR.MUSER = lineMo2User.MUSER;
MO2USR.MUSERName = lineMo2User.MUSERName;
MO2USR.MTIME = Convert.ToDateTime(lineMo2User.MTIME);
MO2USR.WorkPoint = lineMo2User.WorkPoint;
MO2USR.EATTRIBUTE1 = lineMo2User.EATTRIBUTE1;
MO2USR.StartPlanDate = lineMo2User.StartPlanDate;
MO2USR.EndPlanDate = lineMo2User.EndPlanDate;
//if (lineMo2User.PRLineID == "False" || lineMo2User.PRLineID == "0" || string.IsNullOrEmpty(lineMo2User.PRLineID))
//{
// MO2USR.PRLineID = null;
//}
//else
//{
// MO2USR.PRLineID = lineMo2User.PRLineID;
//}
MO2USR.PRLineID = null;
db.ICSMO2User.InsertOnSubmit(MO2USR);
List<ICSMO2UserDetail> lineMUDetail = db.ICSMO2UserDetail.Where(a => a.ID == lineMo2User.ID).ToList();
for (int i = 0; i < lineMUDetail.Count; i++)
{
ICSMO2UserDetail info = new ICSMO2UserDetail();
info.ID = MO2USR.ID;
info.DID = AppConfig.GetGuid();
info.EQPID = lineMUDetail[i].EQPID;
info.AVAILABLE = lineMUDetail[i].AVAILABLE;
info.PLANEND = lineMUDetail[i].PLANEND;
info.PLANSTART = lineMUDetail[i].PLANSTART;
info.PLANQTY = lineMUDetail[i].PLANQTY;
info.PLANTIME = lineMUDetail[i].PLANTIME;
db.ICSMO2UserDetail.InsertOnSubmit(info);
db.SubmitChanges();
}
db.SubmitChanges();
}
}
////4.ICSLOTONWIP原条码数量,(开工时取上一道工序/上一组工序GOODQTY,完工时取上一道工序GOODQTY)
//List<ICSLOTONWIP> listOnwip = db.ICSLOTONWIP.Where(a => a.LOTNO == oldLotNo).ToList();
//if (listOnwip.Count == 0)
//{
// //throw new Exception("原条码" + oldLotNo + "报工信息不存在");//第一道工序?
//}
//foreach (ICSLOTONWIP onwip in listOnwip)
//{
// var lineOnwip = db.ICSLOTONWIP.SingleOrDefault(a => a.LOTNO == onwip.LOTNO && a.LOTSEQ == onwip.LOTSEQ && a.OPSEQ == onwip.OPSEQ);
// //lineOnwip.LOTQTY = newLot.LOTQTY;
// lineOnwip.GOODQTY -= newLot.LOTQTY;
// db.SubmitChanges();
//}
}
db.SubmitChanges();
db.Transaction.Commit();
}
catch (Exception ex)
{
db.Transaction.Rollback();
throw new Exception(ex.Message);
}
}
public static void Delete(string LotNo, string FPType, string conn)
{
FramDataContext db = new FramDataContext(conn);
db.Connection.Open();
db.Transaction = db.Connection.BeginTransaction();
try
{
if (!LotNo.Contains("-"))
{
throw new Exception("从工单分批出的条码请到工单维护界面进行删除!");
}
var lineSim = db.ICSLOTSIMULATION.FirstOrDefault(a => a.LOTNO == LotNo);
if (lineSim != null)
{
throw new Exception("跟踪单已开始作业不能删除");
}
//1.恢复原始条码数量ICSITEMLot
//string oldLotNo = "";
var lineNewLotNo = db.ICSITEMLot.SingleOrDefault(a => a.LotNO == LotNo);
if (lineNewLotNo == null)
{
throw new Exception(LotNo + "跟踪单不存在");
}
string oldLotNo = lineNewLotNo.EATTRIBUTE1;
if (string.IsNullOrEmpty(oldLotNo))
{
oldLotNo = LotNo.Substring(0, LotNo.LastIndexOf('-'));
}
int OPSEQ = Convert.ToInt32(lineNewLotNo.EATTRIBUTE5.Split(',')[0]);
string OPCODE = lineNewLotNo.EATTRIBUTE5.Split(',')[1];
if (FPType == "正常")
{
var lineONWIP = db.ICSLOTONWIP.SingleOrDefault(a => a.LOTNO == LotNo && a.OPSEQ > OPSEQ && a.OPCODE == OPCODE);
if (lineONWIP != null)
{
throw new Exception("原跟踪单" + oldLotNo + ",工序" + OPCODE + "后续工序已开工,本跟踪单不可删除!");
}
}
var lineOldLotNo = db.ICSITEMLot.SingleOrDefault(a => a.LotNO == oldLotNo);
if (lineOldLotNo == null)
{
throw new Exception(oldLotNo + "原跟踪单不存在");
}
lineOldLotNo.LOTQTY += lineNewLotNo.LOTQTY;
if (string.IsNullOrEmpty(lineOldLotNo.EATTRIBUTE6))
{
lineOldLotNo.EATTRIBUTE6 = "0";
}
lineOldLotNo.EATTRIBUTE6 = (Convert.ToDecimal(lineOldLotNo.EATTRIBUTE6) - lineNewLotNo.LOTQTY).ToString();
db.SubmitChanges();
//2.恢复原始条码对应工序记录的分批数量ICSLOTONWIP
var lineOldSim = db.ICSLOTSIMULATION.SingleOrDefault(a => a.LOTNO == oldLotNo);
if (lineOldSim == null)
{
throw new Exception(oldLotNo + "原跟踪单Sim表被删除!");
}
ICSLOTONWIP OldOnwip = db.ICSLOTONWIP.SingleOrDefault(a => a.LOTNO == oldLotNo && a.LOTSEQ == lineOldSim.LOTSEQ);
if (OldOnwip == null)
{
throw new Exception("原条码:" + oldLotNo + "工序" + OPCODE + "次序" + OPSEQ.ToString() + "开工记录被删除!");
}
OldOnwip.FPQTY = (OldOnwip.FPQTY == null ? 0 : OldOnwip.FPQTY) - lineNewLotNo.LOTQTY;
if (FPType == "返工")
{
OldOnwip.RWFPQTY = (OldOnwip.RWFPQTY == null ? 0 : OldOnwip.RWFPQTY) - lineNewLotNo.LOTQTY;
}
db.SubmitChanges();
//2.删除派工
List<ICSMO2User> lineMO2User = db.ICSMO2User.Where(a => a.LOTNO == lineNewLotNo.LotNO).ToList();
if (lineMO2User.Count > 0)
{
//2.1删除派工子表(设备)
for (int i = 0; i < lineMO2User.Count; i++)
{
var lineMUDetail = db.ICSMO2UserDetail.Where(a => a.ID == lineMO2User[i].ID);
if (lineMUDetail.Count() > 0)
{
db.ICSMO2UserDetail.DeleteAllOnSubmit(lineMUDetail);
}
}
//2.2删除派工主表
db.ICSMO2User.DeleteAllOnSubmit(lineMO2User);
}
//3.删除工序
List<ICSITEMROUTE2OPLot> listOp = db.ICSITEMROUTE2OPLot.Where(a => a.LotNo == LotNo).ToList();
db.ICSITEMROUTE2OPLot.DeleteAllOnSubmit(listOp);
//4.删除ICSITEMLot新条码
db.ICSITEMLot.DeleteOnSubmit(lineNewLotNo);
db.SubmitChanges();
db.Transaction.Commit();
}
catch (Exception ex)
{
db.Transaction.Rollback();
throw new Exception(ex.Message);
}
}
public static int GetMaxFlow(string like, string notlike, string conn)
{
FramDataContext db = new FramDataContext(conn);
db.Connection.Open();
db.Transaction = db.Connection.BeginTransaction();
try
{
var list = db.ICSITEMLot.Where(a => a.LotNO.Contains(like) && !a.LotNO.Contains(notlike));
if (list.Count() == 0)
{
return 0;
}
return list.Max(a => Convert.ToInt32(a.LotNO.Substring(a.LotNO.LastIndexOf('-') + 1)));
}
catch (Exception ex)
{
db.Transaction.Rollback();
throw new Exception(ex.Message);
}
}
public static int GetMaxFlow0326(string oriLOTNO, string conn)
{
FramDataContext db = new FramDataContext(conn);
db.Connection.Open();
db.Transaction = db.Connection.BeginTransaction();
try
{
var list = db.ICSITEMLot.Where(a => a.EATTRIBUTE1 == oriLOTNO && a.WorkPoint == AppConfig.WorkPointCode);
if (list.Count() == 0)
{
return 0;
}
return list.Max(a => Convert.ToInt32(a.LotNO.Substring(a.LotNO.LastIndexOf('-') + 1)));
}
catch (Exception ex)
{
db.Transaction.Rollback();
throw new Exception(ex.Message);
}
}
/// <summary>
/// 本工序是第一道工序且未开工/本工序已完工且检验结果已出且下道工序未开工
/// </summary>
/// <param name="LOTNO"></param>
/// <param name="ROUTECODE"></param>
/// <param name="OPSEQ"></param>
/// <param name="WorkPiont"></param>
/// <param name="conn"></param>
/// <returns></returns>
public static DataTable BaseQuery(string LOTNO, string ROUTECODE, int OPSEQ, string WorkPiont, string conn)
{
string sql = @"
SELECT
LOT.ITEMCODE,
iLOT.TransNO as MOCODE,
iLOT.TransLine AS MOSEQ,
LOT.LOTNO,
LOT.ROUTECODE,
LOT.OPSEQ,
LOT.OPCODE,
MAX(iLOT.LOTQTY) AS OriLOTQTY,
MAX(ISNULL(WIP.GOODQTY,0)) WIPQTY,
MAX(ISNULL(CHK.Quantity,0)) CHKQTY,
MAX(ISNULL(CHK.OKQuantity,0)) CHKOK,
MAX(ISNULL(CHK.NGQuantity,0)) CHKNG,
SUM(CASE WHEN NCR.Status='让步接受' THEN CONVERT(DECIMAL,ISNULL(CHKDET.SetValue,'0')) ELSE 0 END) NCROK,
MAX(ISNULL(WIP.FPQTY,0)) FPQTY,
WIP.ID AS WIPID
FROM dbo.ICSITEMROUTE2OPLot LOT
INNER JOIN dbo.ICSITEMLot iLOT ON iLOT.LotNO=LOT.LotNo AND iLOT.WorkPoint=LOT.WorkPoint
LEFT JOIN dbo.ICSLOTONWIP WIP ON WIP.LOTNO=LOT.LotNo AND WIP.ROUTECODE=LOT.ROUTECODE AND WIP.OPSEQ=LOT.OPSEQ AND WIP.WorkPoint=LOT.WorkPoint
LEFT JOIN dbo.ICSLOTONWIP B ON B.LOTNO=WIP.LOTNO AND B.ROUTECODE=WIP.ROUTECODE AND B.WorkPoint=WIP.WorkPoint AND B.OPSEQ=(
SELECT MIN(OPSEQ) FROM dbo.ICSITEMROUTE2OPLot WHERE LotNo=WIP.LOTNO AND ROUTECODE=WIP.ROUTECODE AND OPSEQ>WIP.OPSEQ AND WorkPoint=WIP.WorkPoint
)
LEFT JOIN dbo.ICSLOTONWIPCheck CHK ON CHK.FORTRANID=WIP.ID AND CHK.Enable=1
LEFT JOIN dbo.ICSLOTONWIPCheckDetail CHKDET ON CHKDET.FORTRANID=CHK.ID AND CHKDET.Type='不良'
LEFT JOIN dbo.ICSLOTONWIPCheckNCR NCR ON NCR.CheckID=CHKDET.ID AND NCR.DownDateTime IS NOT NULL
WHERE
(
(WIP.ID IS NULL AND LOT.OPSEQ=(SELECT MIN(OPSEQ) FROM dbo.ICSITEMROUTE2OPLot WHERE LotNo=LOT.LOTNO AND ROUTECODE=LOT.ROUTECODE AND WorkPoint=LOT.WorkPoint))
OR (WIP.ACTIONRESULT='COLLECT_END' AND CHK.EndDateTime IS NOT NULL AND B.ID IS NULL)
)
AND 1=1
AND LOT.LotNo=@LOTNO
AND LOT.ROUTECODE=@ROUTECODE
AND LOT.OPSEQ=@OPSEQ
AND LOT.WorkPoint=@WorkPiont
GROUP BY
LOT.ITEMCODE,
iLOT.TransNO,
iLOT.TransLine,
LOT.LOTNO,
LOT.ROUTECODE,
LOT.OPSEQ,
LOT.OPCODE,
WIP.ID
HAVING COUNT(CHKDET.ID)=SUM(CASE WHEN NCR.DownDateTime IS NULL THEN 0 ELSE 1 END)
";
SqlParameter[] pms = new SqlParameter[]{
new SqlParameter("@LOTNO",SqlDbType.NVarChar){ Value = LOTNO },
new SqlParameter("@ROUTECODE",SqlDbType.NVarChar){ Value = ROUTECODE },
new SqlParameter("@OPSEQ",SqlDbType.Int){ Value = OPSEQ },
new SqlParameter("@WorkPiont",SqlDbType.NVarChar){ Value = WorkPiont }
};
return DBHelper.ExecuteDataset(conn, CommandType.Text, sql, pms).Tables[0];
}
public static DataTable BaseQuery4RW(string WIPID, string conn)
{
string sql = @"
SELECT
wip.MOCODE,
wip.MOSEQ,
WIP.ID WIPID,
WIP.LOTNO,
wip.ROUTECODE,
wip.OPSEQ,
wip.OPCODE,
SUM(CASE WHEN NCR.Status='返工' THEN CONVERT(DECIMAL,ISNULL(CHKDET.SetValue,0)) ELSE 0 END)
+ SUM(CASE WHEN NCR2.Status='返工' THEN CONVERT(DECIMAL,ISNULL(CHKDET2.SetValue,0)) ELSE 0 END) NCR_RWQTY,
MAX(ISNULL(wip.RWFPQTY,0)) FP_RWQTY,
MAX(ilot.LOTQTY) AS OriLOTQTY
FROM dbo.ICSLOTONWIP WIP
INNER JOIN dbo.ICSITEMLot ilot ON ilot.LotNO=wip.LOTNO AND ilot.WorkPoint=wip.WorkPoint
LEFT JOIN dbo.ICSLOTONWIPCheck CHK ON CHK.FORTRANID=WIP.ID AND CHK.Enable=1
LEFT JOIN dbo.ICSLOTONWIPCheckDetail CHKDET ON CHKDET.FORTRANID=CHK.ID
LEFT JOIN dbo.ICSLOTONWIPCheckNCR NCR ON NCR.CheckID=CHKDET.ID AND NCR.DownDateTime IS NOT NULL
LEFT JOIN dbo.ICSLOTONWIPDetail wipdet ON wipdet.LOTNO=wip.LOTNO AND wipdet.ROUTECODE=wip.ROUTECODE AND wipdet.OPCODE=wip.OPCODE AND wipdet.WorkPoint=wip.WorkPoint
LEFT JOIN dbo.ICSLOTONWIPInspection ins ON ins.DetailID=wipdet.ID
LEFT JOIN dbo.ICSLOTONWIPCheck CHK2 ON CHK2.FORTRANID=ins.ID AND CHK2.Enable=1
LEFT JOIN dbo.ICSLOTONWIPCheckDetail CHKDET2 ON CHKDET2.FORTRANID=CHK2.ID AND CHKDET2.Type='不良'
LEFT JOIN dbo.ICSLOTONWIPCheckNCR NCR2 ON NCR2.CheckID=CHKDET2.ID AND NCR2.DownDateTime IS NOT NULL
WHERE WIP.ID=@WIPID
GROUP BY
wip.MOCODE,
wip.MOSEQ,
WIP.ID,
WIP.LOTNO,
wip.ROUTECODE,
wip.OPSEQ,
wip.OPCODE
HAVING
SUM(CASE WHEN CHKDET.Type='不良' THEN 1 ELSE 0 END)=SUM(CASE WHEN NCR.DownDateTime IS NULL THEN 0 ELSE 1 END) AND COUNT(CHKDET.ID)>0
AND SUM(CASE WHEN NCR.Status='返工' THEN CONVERT(DECIMAL,ISNULL(CHKDET.SetValue,0)) ELSE 0 END)
+ SUM(CASE WHEN NCR2.Status='返工' THEN CONVERT(DECIMAL,ISNULL(CHKDET2.SetValue,0)) ELSE 0 END) > 0
";
SqlParameter pms = new SqlParameter("@WIPID", SqlDbType.NVarChar) { Value = WIPID };
return DBHelper.ExecuteDataset(conn, CommandType.Text, sql, pms).Tables[0];
}
/// <summary>
/// 自动返工分批时,生成相关单据 , 方法本身没有自动分批的判断,所以必须符合自动分批时才可调用 .
/// </summary>
/// <param name="db"></param>
/// <param name="wipid">oniwp表id</param>
/// <param name="rwQty">过程+完工判定返工总数量</param>
/// <param name="memo">检验不良信息,ncr单号+不良原因+数量 为一组,同组以","隔开. 不同组以"~"隔开</param>
public static void CreateRWLotNo(FramDataContext db, string wipid, decimal rwQty, string memo, string reason, string StopPRProcess)
{
string oldLOTNO, WorkPoint, ROUTECODE, OPCODE = "";
int OPSEQ = -1;
int flow = 1;
string LOTNO = "";
string WWRWPRLineID = "";
string EATTRIBUTE7 = "";
try
{
var lineOldwip = db.ICSLOTONWIP.SingleOrDefault(a => a.ID == wipid);
if (lineOldwip == null)
{
throw new Exception("报工表信息不存在!");
}
oldLOTNO = lineOldwip.LOTNO;
WorkPoint = lineOldwip.WorkPoint;
ROUTECODE = lineOldwip.ROUTECODE;
OPSEQ = lineOldwip.OPSEQ;
OPCODE = lineOldwip.OPCODE;
var lineOldLot = db.ICSITEMLot.SingleOrDefault(a => a.LotNO == oldLOTNO);
if (lineOldLot == null)
{
throw new Exception("原条码" + oldLOTNO + "不存在");
}
var lineMO2User = db.ICSMO2User.SingleOrDefault(a => a.LOTNO == oldLOTNO && a.RouteCode == ROUTECODE && a.OPCODE == OPCODE && a.WorkPoint == WorkPoint);
if (lineMO2User == null)
{
throw new Exception("条码" + oldLOTNO + "工序" + OPCODE + "派工信息不存在");
}
if (lineMO2User.EATTRIBUTE1 == "1")
{
//当前工序是委外,取本工序PRLineID
WWRWPRLineID = lineMO2User.PRLineID;
EATTRIBUTE7 = "委外," + reason;
var lineRouteop = db.ICSITEMROUTE2OPLot.SingleOrDefault(a => a.LotNo == oldLOTNO && a.ROUTECODE == ROUTECODE && a.OPCODE == OPCODE && a.WorkPoint == WorkPoint);
if (lineRouteop == null)
{
throw new Exception("工艺工序被删除!ICSITEMROUTE2OPLot");
}
if (lineRouteop.ISWWRW == true)
{
var lineOP = db.ICSOP.SingleOrDefault(a => a.OPCODE == OPCODE && a.WorkPoint == WorkPoint);
if (lineOP == null)
{
throw new Exception("工艺工序被删除!");
}
if (lineOP.OPDESC.Contains("退镀"))
{
//返工退镀,重新赋值为 继承原单子的PRLineID
WWRWPRLineID = lineOldLot.WWRWPRLineID;
}
}
}
else
{
//否则继承原单子的PRLineID
WWRWPRLineID = lineOldLot.WWRWPRLineID;
}
var listLot = db.ICSITEMLot.Where(a => a.EATTRIBUTE1 == oldLOTNO && a.WorkPoint == WorkPoint).ToList();
if (listLot.Count == 0)
{
flow = 1;
}
else
{
flow = listLot.Max(a => Convert.ToInt32(a.LotNO.Substring(a.LotNO.LastIndexOf('-') + 1))) + 1;
}
LOTNO = oldLOTNO + "-" + flow.ToString();
//1.ICSITEMLot新条码
ICSITEMLot lineNewLot = new ICSITEMLot();
lineNewLot.ACTIVE = lineOldLot.ACTIVE;
lineNewLot.Exdate = lineOldLot.Exdate;
lineNewLot.ItemCode = lineOldLot.ItemCode;
lineNewLot.PRODUCTDATE = lineOldLot.PRODUCTDATE;
lineNewLot.tFileName = lineOldLot.tFileName;
lineNewLot.VenBatch = lineOldLot.VenBatch;
lineNewLot.VenderLotNO = lineOldLot.VenderLotNO;
lineNewLot.VENDORCODE = lineOldLot.VENDORCODE;
lineNewLot.VENDORITEMCODE = lineOldLot.VENDORITEMCODE;
lineNewLot.VoucherNO = lineOldLot.VoucherNO;
lineNewLot.VoucherRow = lineOldLot.VoucherRow;
lineNewLot.TransNO = lineOldLot.TransNO;
lineNewLot.TransLine = lineOldLot.TransLine;
lineNewLot.WorkPoint = lineOldLot.WorkPoint;
lineNewLot.RWOPChanged = false;
lineNewLot.ID = AppConfig.GetGuid();
lineNewLot.LotNO = LOTNO;
lineNewLot.LOTQTY = rwQty;
lineNewLot.TYPE = "跟踪单分批";
lineNewLot.EATTRIBUTE1 = oldLOTNO;//原条码
lineNewLot.EATTRIBUTE2 = lineOldLot.LOTQTY.ToString();//原条码数量
lineNewLot.EATTRIBUTE3 = null;
lineNewLot.EATTRIBUTE4 = null;
lineNewLot.EATTRIBUTE5 = OPSEQ.ToString() + "," + OPCODE;//原条码分批时工序序号+","+工序
lineNewLot.EATTRIBUTE6 = "0";//被分批时的,已分出数量
lineNewLot.EATTRIBUTE7 = reason;
lineNewLot.MTIME = DateTime.Now;
lineNewLot.MUSER = AppConfig.UserCode;
lineNewLot.MUSERName = AppConfig.UserName;
lineNewLot.lastPrintTime = null;
lineNewLot.lastPrintUSERID = null;
lineNewLot.PrintTimes = 0;
lineNewLot.TimesPrint = 0;
lineNewLot.TwoMTIME = null;
lineNewLot.TwoMUSER = null;
lineNewLot.RWMEMO = memo;// EATTRIBUTE7;
lineNewLot.RWOPChanged = false;
lineNewLot.WWRWPRLineID = WWRWPRLineID;
lineNewLot.StopPRProcess = string.IsNullOrEmpty(StopPRProcess) ? lineOldLot.StopPRProcess : StopPRProcess;
db.ICSITEMLot.InsertOnSubmit(lineNewLot);
db.SubmitChanges();
//2.变更原跟踪单原条码数量
lineOldLot.LOTQTY -= rwQty;
//2.1变更原跟踪单已分批数量
lineOldLot.EATTRIBUTE6 = (Convert.ToDecimal(string.IsNullOrEmpty(lineOldLot.EATTRIBUTE6) ? "0" : lineOldLot.EATTRIBUTE6) + rwQty).ToString();
//2.2报工表记录返工分批数量
lineOldwip.RWFPQTY = (lineOldwip.RWFPQTY == null ? 0 : lineOldwip.RWFPQTY) + rwQty;
db.SubmitChanges();
//3.ICSITEMROUTE2OPLot
int cNewOpLot = db.ICSITEMROUTE2OPLot.Where(a => a.LotNo == LOTNO).ToList().Count;
if (cNewOpLot > 0)
{
throw new Exception("新条码" + LOTNO + "已生成工序");
}
List<ICSITEMROUTE2OPLot> listOpLot = db.ICSITEMROUTE2OPLot.Where(a => a.LotNo == oldLOTNO && a.OPSEQ > OPSEQ).ToList();
if (listOpLot.Count == 0)
{
int fpopseq = 9999;
ICSITEMROUTE2OPLot v = db.ICSITEMROUTE2OPLot.Single(a => a.LotNo == oldLOTNO && a.OPSEQ == OPSEQ);
ICSOP fpop = db.ICSOP.SingleOrDefault(a => a.OPCODE == fpopseq.ToString() && a.WorkPoint == lineOldLot.WorkPoint);
if (fpop == null)
{
throw new Exception("跟踪单最后一道工序分批时,需要专用虚拟工序 ,工序代码9999,此工序未维护");
}
ICSITEMROUTE2OPLot opLotInfo = new ICSITEMROUTE2OPLot();
opLotInfo.CtrlType = "串行";
opLotInfo.OPAttr = "自制";
opLotInfo.OPSEQ = fpopseq;
opLotInfo.OPCODE = fpopseq.ToString();
opLotInfo.EATTRIBUTE1 = "0";//如果是分批出的返工跟踪单 0 表示原始状态未进行工序变更,1表示已做了跟踪单工序变更(跟踪单工序变更保存时该值为1)
opLotInfo.IDMERGERULE = v.IDMERGERULE;
opLotInfo.IDMERGETYPE = v.IDMERGETYPE;
opLotInfo.ITEMCODE = v.ITEMCODE;
opLotInfo.OPCONTROL = v.OPCONTROL;
opLotInfo.OPTIONALOP = v.OPTIONALOP;
opLotInfo.ROUTECODE = v.ROUTECODE;
opLotInfo.RouteMGR = v.RouteMGR;
opLotInfo.WorkPoint = v.WorkPoint;
opLotInfo.ID = AppConfig.GetGuid();
opLotInfo.LotNo = LOTNO;
opLotInfo.MTIME = DateTime.Now;
opLotInfo.MUSER = AppConfig.UserCode;
opLotInfo.MUSERName = AppConfig.UserName;
}
foreach (ICSITEMROUTE2OPLot opLot in listOpLot)
{
ICSITEMROUTE2OPLot opLotInfo = new ICSITEMROUTE2OPLot();
opLotInfo.CtrlType = opLot.CtrlType;
opLotInfo.EATTRIBUTE1 = "0";
opLotInfo.IDMERGERULE = opLot.IDMERGERULE;
opLotInfo.IDMERGETYPE = opLot.IDMERGETYPE;
opLotInfo.ITEMCODE = opLot.ITEMCODE;
opLotInfo.OPAttr = opLot.OPAttr;
opLotInfo.OPCODE = opLot.OPCODE;
opLotInfo.OPCONTROL = opLot.OPCONTROL;
opLotInfo.OPSEQ = opLot.OPSEQ;
opLotInfo.OPTIONALOP = opLot.OPTIONALOP;
opLotInfo.ROUTECODE = opLot.ROUTECODE;
opLotInfo.RouteMGR = opLot.RouteMGR;
opLotInfo.WorkPoint = opLot.WorkPoint;
opLotInfo.CtrlType = opLot.CtrlType;
opLotInfo.ID = AppConfig.GetGuid();
opLotInfo.LotNo = LOTNO;
opLotInfo.MTIME = DateTime.Now;
opLotInfo.MUSER = AppConfig.UserCode;
opLotInfo.MUSERName = AppConfig.UserName;
db.ICSITEMROUTE2OPLot.InsertOnSubmit(opLotInfo);
db.SubmitChanges();
var lineMo2User = db.ICSMO2User.SingleOrDefault(a => a.LOTNO == oldLOTNO && a.OPCODE == opLot.OPCODE);
if (lineMo2User != null)
{
ICSMO2User MO2USR = new ICSMO2User();
MO2USR.ID = AppConfig.GetGuid();
MO2USR.LOTNO = LOTNO;
MO2USR.MOCODE = lineMo2User.MOCODE;
MO2USR.MOSEQ = lineMo2User.MOSEQ;
MO2USR.SEGCODE = lineMo2User.SEGCODE;
MO2USR.RouteCode = lineMo2User.RouteCode;
MO2USR.OPCODE = lineMo2User.OPCODE;
MO2USR.USERCODE = lineMo2User.USERCODE;
MO2USR.USERName = lineMo2User.USERName;
MO2USR.EQPCode = lineMo2User.EQPCode;
MO2USR.EQPName = lineMo2User.EQPName;
MO2USR.MUSER = lineMo2User.MUSER;
MO2USR.MUSERName = lineMo2User.MUSERName;
MO2USR.MTIME = Convert.ToDateTime(lineMo2User.MTIME);
MO2USR.WorkPoint = lineMo2User.WorkPoint;
MO2USR.EATTRIBUTE1 = lineMo2User.EATTRIBUTE1;
MO2USR.StartPlanDate = lineMo2User.StartPlanDate;
MO2USR.EndPlanDate = lineMo2User.EndPlanDate;
MO2USR.PRLineID = null;
db.ICSMO2User.InsertOnSubmit(MO2USR);
List<ICSMO2UserDetail> lineMUDetail = db.ICSMO2UserDetail.Where(a => a.ID == lineMo2User.ID).ToList();
for (int i = 0; i < lineMUDetail.Count; i++)
{
ICSMO2UserDetail info = new ICSMO2UserDetail();
info.ID = MO2USR.ID;
info.DID = AppConfig.GetGuid();
info.EQPID = lineMUDetail[i].EQPID;
info.AVAILABLE = lineMUDetail[i].AVAILABLE;
info.PLANEND = lineMUDetail[i].PLANEND;
info.PLANSTART = lineMUDetail[i].PLANSTART;
info.PLANQTY = lineMUDetail[i].PLANQTY;
info.PLANTIME = lineMUDetail[i].PLANTIME;
db.ICSMO2UserDetail.InsertOnSubmit(info);
db.SubmitChanges();
}
db.SubmitChanges();
}
}
db.SubmitChanges();
}
catch (Exception ex)
{
throw new Exception("返工分批(自动)出错: \r\n" + ex.Message);
}
}
public static void CreateRWLotNo(SqlCommand cmd, string wipid, decimal rwQty, string memo, string reason, string StopPRProcess, DateTime timeNow, string UserCode, string UserName)
{
string oldLOTNO, WorkPoint, ROUTECODE, OPCODE = "";
int OPSEQ = -1;
string LOTNO = "";
try
{
string sql = "SELECT * FROM ICSLOTONWIP WHERE ID='" + wipid + "'";
DataTable dtOldwip = U8Helper.ExecuteDataTable(sql, cmd);
if (dtOldwip.Rows.Count == 0)
{
throw new Exception("报工表信息不存在!");
}
oldLOTNO = dtOldwip.Rows[0]["LOTNO"].ToString();
WorkPoint = dtOldwip.Rows[0]["WorkPoint"].ToString();
ROUTECODE = dtOldwip.Rows[0]["ROUTECODE"].ToString();
OPSEQ = Convert.ToInt32(dtOldwip.Rows[0]["OPSEQ"]);
OPCODE = dtOldwip.Rows[0]["OPCODE"].ToString();
//PRLineID 取值
//1.如果是正常委外,返工非退镀委外 取自身
//2.如果是自制,返工退镀委外 继承父跟踪单
string IsWW = "0";
string PRLineID_Current = "";
string PRLineID_Inherit = "";
string WWRWPRLineID = "";
string StopPRProcess_Current = "";
string StopPRProcess_Inherit = "";
sql = "SELECT * FROM ICSITEMLot WHERE LotNO='{0}' AND WorkPoint='{1}'";
sql = string.Format(sql, oldLOTNO, WorkPoint);
DataTable dtOldLot = U8Helper.ExecuteDataTable(sql, cmd);
if (dtOldLot.Rows.Count == 0)
{
throw new Exception("原条码" + oldLOTNO + "不存在");
}
PRLineID_Inherit = dtOldLot.Rows[0]["WWRWPRLineID"].ToString();
StopPRProcess_Inherit = dtOldLot.Rows[0]["StopPRProcess"].ToString();
if (string.IsNullOrEmpty(StopPRProcess))
{
StopPRProcess_Current = StopPRProcess_Inherit;
}
else
{
StopPRProcess_Current = StopPRProcess;
}
sql = "SELECT EATTRIBUTE1,PRLineID FROM dbo.ICSMO2User WHERE LOTNO='{0}' AND RouteCode='{1}' AND OPCODE='{2}' AND WorkPoint='{3}'";
sql = string.Format(sql, LOTNO, ROUTECODE, OPCODE, WorkPoint);
DataTable dtMo2usr = U8Helper.ExecuteDataTable(sql, cmd);
if (dtMo2usr.Rows.Count == 0)
{
throw new Exception("原条码" + oldLOTNO + "派工信息不存在");
}
IsWW = dtMo2usr.Rows[0]["EATTRIBUTE1"].ToString();
PRLineID_Current = dtMo2usr.Rows[0]["PRLineID"].ToString();
if (IsWW == "1")
{
//当前工序是委外,取本工序PRLineID
WWRWPRLineID = PRLineID_Current;
sql = @"
SELECT
ISNULL(A.ISWWRW,0) as ISWWRW,
B.OPDESC
FROM ICSITEMROUTE2OPLot A
INNER JOIN dbo.ICSOP B ON B.OPCODE=A.OPCODE AND B.WorkPoint=A.WorkPoint
WHERE A.LotNo='{0}' AND A.ROUTECODE='{1}' AND A.OPCODE='{2}' AND A.WorkPoint='{3}'
";
sql = string.Format(sql, LOTNO, ROUTECODE, OPCODE, WorkPoint);
DataTable dtRouteOP = U8Helper.ExecuteDataTable(sql, cmd);
if (dtRouteOP.Rows.Count == 0)
{
throw new Exception("原条码" + oldLOTNO + "工艺工序信息不存在," + ROUTECODE + "," + OPCODE);
}
bool ISWWRW = Convert.ToBoolean(dtRouteOP.Rows[0]["ISWWRW"]);
string OPDESC = dtRouteOP.Rows[0]["OPDESC"].ToString();
if (ISWWRW == true)
{
if (OPDESC.Contains("退镀"))
{
//返工退镀,重新赋值为 继承原单子的PRLineID
WWRWPRLineID = PRLineID_Inherit;
}
}
}
else
{
//否则继承原单子的PRLineID
WWRWPRLineID = PRLineID_Inherit;
}
int flow = 1;
sql = "SELECT * FROM ICSITEMLot WHERE EATTRIBUTE1='{0}' AND WorkPoint='{1}''";
sql = string.Format(sql, oldLOTNO, WorkPoint);
DataTable listLot = U8Helper.ExecuteDataTable(sql, cmd);
if (listLot.Rows.Count == 0)
{
flow = 1;
}
else
{
flow = listLot.Select().Max(a => Convert.ToInt32(a.Field<string>("LotNO").Substring(a.Field<string>("LotNO").LastIndexOf('-') + 1))) + 1;
}
LOTNO = oldLOTNO + "-" + flow.ToString();
//1.ICSITEMLot新条码
#region Sql-插入新条码
sql = @"
INSERT INTO [dbo].[ICSITEMLot](
[ID]
,[LotNO]
,[ItemCode]
,[TransNO]
,[TransLine]
,[VENDORITEMCODE]
,[VENDORCODE]
,[VenderLotNO]
,[PRODUCTDATE]
,[LOTQTY]
,[ACTIVE]
,[Exdate]
,[WorkPoint]
,[MUSER]
,[MUSERName]
,[MTIME]
,[EATTRIBUTE1]
,[TYPE]
,[EATTRIBUTE2]
,[EATTRIBUTE3]
,[EATTRIBUTE4]
,[EATTRIBUTE5]
,[PrintTimes]
,[lastPrintUSERID]
,[lastPrintTime]
,[VoucherNO]
,[VoucherRow]
,[TwoMUSER]
,[TwoMTIME]
,[VenBatch]
,[EATTRIBUTE6]
,[EATTRIBUTE7]
,[tFileName]
,[TimesPrint]
,[RWMEMO]
,[RWOPChanged]
,[WWRWPRLineID]
,[StopPRProcess])
SELECT
NEWID()
,@LotNO
,[ItemCode]
,[TransNO]
,[TransLine]
,[VENDORITEMCODE]
,[VENDORCODE]
,[VenderLotNO]
,[PRODUCTDATE]
,@LOTQTY
,'Y'
,[Exdate]
,[WorkPoint]
,@MUSER
,@MUSERName
,@MTIME
,@EATTRIBUTE1
,@TYPE
,@EATTRIBUTE2
,[EATTRIBUTE3]
,[EATTRIBUTE4]
,@EATTRIBUTE5
,0
,null
,null
,[VoucherNO]
,[VoucherRow]
,[TwoMUSER]
,[TwoMTIME]
,[VenBatch]
,@EATTRIBUTE6
,@EATTRIBUTE7
,[tFileName]
,[TimesPrint]
,@RWMEMO
,@RWOPChanged
,@WWRWPRLineID
,@StopPRProcess
FROM dbo.ICSITEMLot WHERE LotNO=@oldLOTNO
";
#endregion
cmd.Parameters.Clear();
SqlParameter[] pms = {
new SqlParameter("@oldLOTNO",DbType.String){ Value=oldLOTNO },
new SqlParameter("@LotNO",DbType.String){ Value=LOTNO },
new SqlParameter("@LOTQTY",DbType.Decimal){ Value=rwQty },
new SqlParameter("@TYPE",DbType.String){ Value="跟踪单分批" },
new SqlParameter("@EATTRIBUTE1",DbType.String){ Value=oldLOTNO },//父(原)跟踪单
new SqlParameter("@EATTRIBUTE2",DbType.String){ Value=dtOldLot.Rows[0]["LOTQTY"].ToString() },//父(原)跟踪单的数量
new SqlParameter("@EATTRIBUTE5",DbType.String){ Value=OPSEQ.ToString() + "," + OPCODE },//在哪个工序进行的分批
new SqlParameter("@EATTRIBUTE6",DbType.String){ Value="0" },//作为父条码时被分出的数量
new SqlParameter("@EATTRIBUTE7",DbType.String){ Value= reason },//类型'返工'
new SqlParameter("@MTIME",DbType.DateTime){ Value=timeNow },
new SqlParameter("@MUSER",DbType.String){ Value=UserCode },
new SqlParameter("@MUSERName",DbType.String){ Value=UserName },
new SqlParameter("@RWMEMO",DbType.String){ Value=memo },//返工备注: 不良
new SqlParameter("@RWOPChanged",DbType.Boolean){ Value=false },//条码生成后,是否变更了 工艺工序
new SqlParameter("@WWRWPRLineID",DbType.String){ Value=string.IsNullOrEmpty(WWRWPRLineID)?"":WWRWPRLineID },
new SqlParameter("@StopPRProcess",DbType.String){ Value=string.IsNullOrEmpty(StopPRProcess_Current)?"":StopPRProcess_Current }
};
cmd.Parameters.AddRange(pms);
U8Helper.ExecuteNonQuery(sql, cmd);
//2.0变更原跟踪单原条码数量,2.1变更原跟踪单已分批数量
sql = @"UPDATE dbo.ICSITEMLot SET LOTQTY-={0}, EATTRIBUTE6=CONVERT(DECIMAL,ISNULL(EATTRIBUTE6,'0'))+{0} WHERE LotNO='{1}'";
sql = string.Format(sql, rwQty, oldLOTNO);
U8Helper.ExecuteNonQuery(sql, cmd);
//2.2报工表记录返工分批数量
sql = "UPDATE ICSLOTONWIP SET RWFPQTY=ISNULL(RWFPQTY,'0')+{0} WHERE ID='{1}'";
sql = string.Format(sql, rwQty, wipid);
U8Helper.ExecuteNonQuery(sql, cmd);
//3.ICSITEMROUTE2OPLot
sql = "SELECT 1 FROM ICSITEMROUTE2OPLot WHERE LotNo='{0}'";
sql = string.Format(sql, rwQty, wipid);
int cNewOpLot = U8Helper.ExecuteDataTable(sql, cmd).Rows.Count;
if (cNewOpLot > 0)
{
throw new Exception("新条码" + LOTNO + "已生成工序");
}
#region Sql- 工艺工序下发
sql = @"
IF NOT EXISTS(SELECT 1 FROM ICSITEMROUTE2OPLot WHERE LotNo=@oldLOTNO AND ROUTECODE=@ROUTECODE AND OPSEQ>@OPSEQ)
BEGIN
INSERT INTO [dbo].[ICSITEMROUTE2OPLot]
([ITEMCODE]
,[ROUTECODE]
,[OPCODE]
,[OPSEQ]
,[OPCONTROL]
,[OPTIONALOP]
,[IDMERGETYPE]
,[IDMERGERULE]
,[MUSER]
,[MUSERName]
,[MTIME]
,[WorkPoint]
,[EATTRIBUTE1]
,[LotNo]
,[ID]
,[OPAttr]
,[CtrlType]
,[RouteMGR]
,[OPLVL]
,[EQPCODE]
,[WTIME]
,[RTIME]
,[STIME])
SELECT
[ITEMCODE]
,[ROUTECODE]
,'9999'
,9999
,[OPCONTROL]
,[OPTIONALOP]
,[IDMERGETYPE]
,[IDMERGERULE]
,@MUSER
,@MUSERName
,@MTIME
,[WorkPoint]
,[EATTRIBUTE1]
,@LOTNO
,NEWID()
,'自制'
,'串行'
,[RouteMGR]
,[OPLVL]
,[EQPCODE]
,[WTIME]
,[RTIME]
,[STIME]
FROM ICSITEMROUTE2OPLot WHERE LotNo=@oldLOTNO AND ROUTECODE=@ROUTECODE AND OPSEQ=@OPSEQ
END
ELSE
BEGIN
INSERT INTO [dbo].[ICSITEMROUTE2OPLot]
([ITEMCODE]
,[ROUTECODE]
,[OPCODE]
,[OPSEQ]
,[OPCONTROL]
,[OPTIONALOP]
,[IDMERGETYPE]
,[IDMERGERULE]
,[MUSER]
,[MUSERName]
,[MTIME]
,[WorkPoint]
,[EATTRIBUTE1]
,[LotNo]
,[ID]
,[OPAttr]
,[CtrlType]
,[RouteMGR]
,[OPLVL]
,[EQPCODE]
,[WTIME]
,[RTIME]
,[STIME])
SELECT
[ITEMCODE]
,[ROUTECODE]
,[OPCODE]
,[OPSEQ]
,[OPCONTROL]
,[OPTIONALOP]
,[IDMERGETYPE]
,[IDMERGERULE]
,@MUSER
,@MUSERName
,@MTIME
,[WorkPoint]
,[EATTRIBUTE1]
,@LOTNO
,NEWID()
,[OPAttr]
,[CtrlType]
,[RouteMGR]
,[OPLVL]
,[EQPCODE]
,[WTIME]
,[RTIME]
,[STIME]
FROM ICSITEMROUTE2OPLot WHERE LotNo=@oldLOTNO AND ROUTECODE=@ROUTECODE AND OPSEQ>@OPSEQ
END
";
#endregion
cmd.Parameters.Clear();
SqlParameter[] pms2 = {
new SqlParameter("@oldLOTNO",DbType.String){ Value=oldLOTNO },
new SqlParameter("@LotNO",DbType.String){ Value=LOTNO },
new SqlParameter("@ROUTECODE",DbType.Decimal){ Value=ROUTECODE },
new SqlParameter("@OPSEQ",DbType.Int32){ Value=OPSEQ },
new SqlParameter("@MTIME",DbType.DateTime){ Value=timeNow },
new SqlParameter("@MUSER",DbType.String){ Value=UserCode },
new SqlParameter("@MUSERName",DbType.String){ Value=UserName }
};
cmd.Parameters.AddRange(pms2);
U8Helper.ExecuteNonQuery(sql, cmd);
#region Sql- 后续工序派工信息继承原跟踪单
sql = @"
INSERT INTO [dbo].[ICSMO2User]
([ID]
,[MOCODE]
,[MOSEQ]
,[LOTNO]
,[SEGCODE]
,[RouteCode]
,[OPCODE]
,[USERCODE]
,[USERName]
,[EQPCode]
,[EQPName]
,[StartPlanDate]
,[EndPlanDate]
,[MUSER]
,[MUSERName]
,[MTIME]
,[WorkPoint]
,[EATTRIBUTE1]
,[PRLineID]
,[PRQTY])
SELECT
NEWID()
,B.[MOCODE]
,B.[MOSEQ]
,@LOTNO
,B.[SEGCODE]
,B.[RouteCode]
,B.[OPCODE]
,B.[USERCODE]
,B.[USERName]
,B.[EQPCode]
,B.[EQPName]
,B.[StartPlanDate]
,B.[EndPlanDate]
,B.[MUSER]
,B.[MUSERName]
,B.[MTIME]
,B.[WorkPoint]
,B.[EATTRIBUTE1]
,B.[PRLineID]
,B.[PRQTY]
FROM [dbo].[ICSITEMROUTE2OPLot] A
INNER JOIN [dbo].[ICSMO2User] B ON B.LotNo=A.LOTNO AND B.OPCODE=A.OPCODE AND B.WorkPoint=A.WorkPoint
WHERE A.LOTNO =@oldLOTNO AND A.ROUTECODE=@ROUTECODE AND A.WorkPoint=@WorkPoint AND A.OPSEQ>@OPSEQ
INSERT INTO [dbo].[ICSMO2UserDetail]
([ID]
,[DID]
,[EQPID]
,[PLANQTY]
,[PLANSTART]
,[PLANEND]
,[PLANTIME]
,[AVAILABLE])
SELECT
B.[ID]
,NEWID()
,C.[EQPID]
,C.[PLANQTY]
,C.[PLANSTART]
,C.[PLANEND]
,C.[PLANTIME]
,C.[AVAILABLE]
FROM [dbo].[ICSITEMROUTE2OPLot] A
INNER JOIN [dbo].[ICSMO2User] B ON A.LotNo=B.LOTNO AND A.OPCODE=B.OPCODE AND A.WorkPoint=B.WorkPoint
INNER JOIN (
SELECT A.LOTNO,A.RouteCode,A.OPCODE,A.WorkPoint,B.PLANQTY,B.EQPID,B.PLANSTART,B.PLANEND,B.PLANTIME,B.AVAILABLE
FROM [dbo].[ICSMO2User] A
INNER JOIN [dbo].[ICSMO2UserDetail] B ON B.ID=A.ID
WHERE A.LOTNO=@oldLOTNO AND A.RouteCode=@ROUTECODE AND A.OPCODE=@OPCODE AND A.WorkPoint=@WorkPoint
) C ON C.RouteCode=B.RouteCode AND C.OPCODE=B.OPCODE AND C.WorkPoint=B.WorkPoint
WHERE A.LOTNO =@LOTNO AND A.ROUTECODE=@ROUTECODE AND A.WorkPoint=@WorkPoint AND A.OPSEQ>@OPSEQ
";
#endregion
cmd.Parameters.Clear();
SqlParameter[] pms3 = {
new SqlParameter("@oldLOTNO",DbType.String){ Value=oldLOTNO },
new SqlParameter("@LotNO",DbType.String){ Value=LOTNO },
new SqlParameter("@ROUTECODE",DbType.Decimal){ Value=ROUTECODE },
new SqlParameter("@OPSEQ",DbType.Int32){ Value=OPSEQ },
new SqlParameter("@OPCODE",DbType.Int32){ Value=OPCODE }
};
cmd.Parameters.AddRange(pms3);
U8Helper.ExecuteNonQuery(sql, cmd);
}
catch (Exception ex)
{
throw new Exception("返工分批(自动)出错: \r\n" + ex.Message);
}
}
/// <summary>
/// 对于委外工序批量退货
/// </summary>
/// <param name="cmd"></param>
/// <param name="WIPID"></param>
public static void ResetWW(SqlCommand cmd, string WIPID)
{
cmd.Parameters.Clear();
string WorkPoint = "";
string ITEMCODE = "";
string LOTNO = "";
string LOTSEQ = "";
string ROUTECODE = "";
string OPCODE = "";
int OPSEQ = -1;
string PRLineID = "";
int BKSEQ = 1;
//
string sql = @"
SELECT
A.ITEMCODE,A.LOTNO,A.LOTSEQ,A.ROUTECODE,A.OPSEQ,A.OPCODE,A.WorkPoint,
B.PRLineID
FROM dbo.ICSLOTONWIP A
LEFT JOIN dbo.ICSMO2User B ON B.LOTNO=A.LOTNO AND B.RouteCode=A.ROUTECODE AND B.OPCODE=A.OPCODE
WHERE A.ID='{0}'";
sql = string.Format(sql, WIPID);
DataTable dtOnwip = U8Helper.ExecuteDataTable(sql, cmd);
if (dtOnwip.Rows.Count == 0)
{
throw new Exception("报工主表数据不存在" + WIPID);
}
WorkPoint = dtOnwip.Rows[0]["WorkPoint"].ToString();
ITEMCODE = dtOnwip.Rows[0]["ITEMCODE"].ToString();
LOTNO = dtOnwip.Rows[0]["LOTNO"].ToString();
LOTSEQ = dtOnwip.Rows[0]["LOTSEQ"].ToString();
OPCODE = dtOnwip.Rows[0]["OPCODE"].ToString();
OPSEQ = Convert.ToInt32(dtOnwip.Rows[0]["OPSEQ"]);
PRLineID = dtOnwip.Rows[0]["PRLineID"].ToString();
//0.获取序号
sql = @"SELECT ISNULL(MAX(BKSEQ),0)+1 FROM [dbo].[ICSLOTONWIP_BK] WHERE ID='{0}'";
sql = string.Format(sql, WIPID);
BKSEQ = Convert.ToInt32(U8Helper.ExecuteDataTable(sql, cmd).Rows[0][0]);
//1.删除排序表,不备份
sql = @"DELETE FROM dbo.ICSLOTONWIPCheckTop WHERE FORTRANID='{0}'";
sql = string.Format(sql, WIPID);
U8Helper.ExecuteNonQuery(sql, cmd);
//2.获取检验相关表id
sql = @"
SELECT DISTINCT
WIP.ID AS WIPID,
CHK.ID AS CHKID,
CHKDET.ID AS DETID,
NCR.ID AS NCRID
FROM dbo.ICSLOTONWIP WIP
LEFT JOIN dbo.ICSLOTONWIPCheck CHK ON CHK.FORTRANID=WIP.ID
LEFT JOIN dbo.ICSLOTONWIPCheckDetail CHKDET ON CHKDET.FORTRANID=CHK.ID
LEFT JOIN dbo.ICSLOTONWIPCheckNCR NCR ON NCR.CheckID=CHKDET.ID
WHERE WIP.ID='{0}'";
sql = string.Format(sql, WIPID);
DataTable dt = U8Helper.ExecuteDataTable(sql, cmd);
string CHKID = dt.Rows[0]["CHKID"].ToString();
foreach (DataRow dr in dt.Rows)
{
string NCRID = dr["NCRID"].ToString();
string DETID = dr["DETID"].ToString();
//备份.删除ICSLOTONWIPCheckNCR
sql = @"
INSERT INTO [dbo].[ICSLOTONWIPCheckNCR_BK] SELECT {0},* FROM [dbo].[ICSLOTONWIPCheckNCR] WHERE ID='{1}'
DELETE FROM [dbo].[ICSLOTONWIPCheckNCR] WHERE ID='{1}'
";
sql = string.Format(sql, BKSEQ, NCRID);
U8Helper.ExecuteNonQuery(sql, cmd);
//备份.删除ICSLOTONWIPCheckDetail
sql = @"
INSERT INTO [dbo].[ICSLOTONWIPCheckDetail_BK] SELECT {0},* FROM [dbo].[ICSLOTONWIPCheckDetail] WHERE ID='{1}'
DELETE FROM [dbo].[ICSLOTONWIPCheckDetail] WHERE ID='{1}'
";
sql = string.Format(sql, BKSEQ, DETID);
U8Helper.ExecuteNonQuery(sql, cmd);
}
//删除ICSLOTONWIPCheckPause,不备份
sql = @"DELETE FROM ICSLOTONWIPCheckPause WHERE CheckID='{0}'";
sql = string.Format(sql, CHKID);
U8Helper.ExecuteNonQuery(sql, cmd);
//备份.删除ICSLOTONWIPCheck
sql = @"
INSERT INTO [dbo].[ICSLOTONWIPCheck_BK] SELECT {0},* FROM [dbo].[ICSLOTONWIPCheck] WHERE ID='{1}'
DELETE FROM [dbo].[ICSLOTONWIPCheck] WHERE ID='{1}'
";
sql = string.Format(sql, BKSEQ, CHKID);
U8Helper.ExecuteNonQuery(sql, cmd);
//恢复ICSPO_PoMain数量INQty
sql = @"
DECLARE @POCode NVARCHAR(50),@PORow NVARCHAR(50),@TransQTY DECIMAL(18,6)
SELECT TOP 1 @POCode=TransNO,@PORow=TransLine, @TransQTY=ISNULL(TransQTY,0) FROM dbo.ICSWareHouseLotInfoLog WHERE LotNO='{0}' AND ITEMCODE='{1}' AND BusinessCode='委外发料' AND EATTRIBUTE1='{2}' AND WorkPoint='{3}'
UPDATE ICSPO_PoMain SET INQty=INQty-@TransQTY WHERE POCode=@POCode AND PORow=@PORow AND Free1='{2}' AND WorkPoint='{3}'
";
sql = string.Format(sql, LOTNO, ITEMCODE + "_" + OPCODE, PRLineID, WorkPoint);
U8Helper.ExecuteNonQuery(sql, cmd);
//删除ICSWareHouseLotInfoLog,不备份
sql = @"DELETE FROM dbo.ICSWareHouseLotInfoLog WHERE LotNO='{0}' AND ITEMCODE='{1}' AND (BusinessCode='委外发料' OR BusinessCode='委外收料' ) AND EATTRIBUTE1='{2}' AND WorkPoint='{3}'";
sql = string.Format(sql, LOTNO, ITEMCODE + "_" + OPCODE, PRLineID, WorkPoint);
U8Helper.ExecuteNonQuery(sql, cmd);
//备份.删除ICSLOTONWIP
sql = @"
INSERT INTO [dbo].[ICSLOTONWIP_BK] SELECT {0},* FROM [dbo].[ICSLOTONWIP] WHERE ID='{1}'
DELETE FROM [dbo].[ICSLOTONWIP] WHERE ID='{1}'
";
sql = string.Format(sql, BKSEQ, WIPID);
U8Helper.ExecuteNonQuery(sql, cmd);
//删除ICSLOTSIMULATION(如果此委外工序是第一道工序)
//跟踪单取消结束状态,ICSLOTSIMULATION (如果此委外工序是最后一道工序)
sql = @"SELECT MIN(OPSEQ),MAX(OPSEQ) FROM dbo.ICSITEMROUTE2OPLot WHERE LotNo='{0}' AND ROUTECODE='{1}' AND WorkPoint='{2}' ";
sql = string.Format(sql, LOTNO, ROUTECODE, WorkPoint);
DataTable dtOPSEQ = U8Helper.ExecuteDataTable(sql, cmd);
int minOPSEQ = Convert.ToInt32(dtOPSEQ.Rows[0][0]);
int maxOPSEQ = Convert.ToInt32(dtOPSEQ.Rows[0][1]);
if (maxOPSEQ == OPSEQ)
{
sql = @"UPDATE dbo.ICSLOTSIMULATION SET ISCOM='0' WHERE LOTNO='{0}' AND LOTSEQ='{1}' AND WorkPoint='{2}'";
sql = string.Format(sql, LOTNO, LOTSEQ, WorkPoint);
U8Helper.ExecuteNonQuery(sql, cmd);
}
if (minOPSEQ == OPSEQ)
{
sql = @"DELETE FROM dbo.ICSLOTSIMULATION WHERE LOTNO='{0}' AND LOTSEQ='{1}' AND WorkPoint='{2}'";
sql = string.Format(sql, LOTNO, LOTSEQ, WorkPoint);
U8Helper.ExecuteNonQuery(sql, cmd);
}
}
private static class U8Helper
{
public static DataTable ExecuteDataTable(string sql, SqlCommand cmd)
{
DataTable dt = new DataTable();
SqlDataAdapter dr = new System.Data.SqlClient.SqlDataAdapter();
cmd.CommandText = sql;
dr.SelectCommand = cmd;
dr.Fill(dt);
return dt;
}
public static bool ExecuteNonQuery(string sql, SqlCommand cmd)
{
try
{
cmd.CommandText = sql;
int result = cmd.ExecuteNonQuery();
if (result > 0)
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{
string Params = string.Empty;
foreach (SqlParameter parameter in cmd.Parameters)
{
Params += parameter.SqlValue + "||";
}
throw new Exception("程序异常!");
}
}
}
}
}