锐腾搅拌上料功能
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

5 months ago
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using ICSSoft.Base.Config.DBHelper;
  6. using System.Data;
  7. using ICSSoft.Frame.Data.Entity;
  8. using System.Data.Linq;
  9. using System.Data.SqlClient;
  10. using ICSSoft.Base.Config.AppConfig;
  11. namespace ICSSoft.Frame.Data.DAL
  12. {
  13. public class ICSLot2LotDAL
  14. {
  15. public static void AddList(string oldLotNo, string ROUTECODE, int OpSeq, string OPCODE, List<ICSITEMLot> list, string FPType, string dsconn)
  16. {
  17. FramDataContext db = new FramDataContext(dsconn);
  18. db.Connection.Open();
  19. db.Transaction = db.Connection.BeginTransaction();
  20. try
  21. {
  22. var lineOldLot = db.ICSITEMLot.SingleOrDefault(a => a.LotNO == oldLotNo);
  23. if (lineOldLot == null)
  24. {
  25. throw new Exception("原条码" + oldLotNo + "不存在");
  26. }
  27. foreach (ICSITEMLot newLot in list)
  28. {
  29. var lineLot = db.ICSITEMLot.SingleOrDefault(a => a.LotNO == newLot.LotNO);
  30. if (lineLot != null)
  31. {
  32. throw new Exception("新条码" + newLot.LotNO + "已生成");
  33. }
  34. //1.ICSITEMLot新条码
  35. lineLot = new ICSITEMLot();
  36. lineLot.ACTIVE = lineOldLot.ACTIVE;
  37. //lineLot.EATTRIBUTE3 = lineOldLot.EATTRIBUTE3;
  38. //lineLot.EATTRIBUTE4 = lineOldLot.EATTRIBUTE4;
  39. //lineLot.EATTRIBUTE5 = lineOldLot.EATTRIBUTE5;
  40. //lineLot.EATTRIBUTE6 = lineOldLot.EATTRIBUTE6;
  41. //lineLot.EATTRIBUTE7 = lineOldLot.EATTRIBUTE7;
  42. lineLot.Exdate = lineOldLot.Exdate;
  43. lineLot.ItemCode = lineOldLot.ItemCode;
  44. lineLot.lastPrintTime = null;
  45. lineLot.lastPrintUSERID = null;
  46. lineLot.PrintTimes = 0;
  47. lineLot.PRODUCTDATE = lineOldLot.PRODUCTDATE;
  48. lineLot.tFileName = lineOldLot.tFileName;
  49. lineLot.TimesPrint = lineOldLot.TimesPrint;
  50. lineLot.TwoMTIME = lineOldLot.TwoMTIME;
  51. lineLot.TwoMUSER = lineOldLot.TwoMUSER;
  52. lineLot.VenBatch = lineOldLot.VenBatch;
  53. lineLot.VenderLotNO = lineOldLot.VenderLotNO;
  54. lineLot.VENDORCODE = lineOldLot.VENDORCODE;
  55. lineLot.VENDORITEMCODE = lineOldLot.VENDORITEMCODE;
  56. lineLot.VoucherNO = lineOldLot.VoucherNO;
  57. lineLot.VoucherRow = lineOldLot.VoucherRow;
  58. lineLot.TransNO = lineOldLot.TransNO;
  59. lineLot.TransLine = lineOldLot.TransLine;
  60. lineLot.WorkPoint = lineOldLot.WorkPoint;
  61. lineLot.ID = AppConfig.GetGuid();
  62. lineLot.LotNO = newLot.LotNO;
  63. lineLot.LOTQTY = newLot.LOTQTY;
  64. lineLot.TYPE = "跟踪单分批";
  65. lineLot.EATTRIBUTE1 = newLot.EATTRIBUTE1;//原条码
  66. lineLot.EATTRIBUTE2 = newLot.EATTRIBUTE2;//原条码数量
  67. lineLot.EATTRIBUTE5 = newLot.EATTRIBUTE5;//原条码分批时工序序号+","+工序
  68. lineLot.EATTRIBUTE6 = "0";//被分批时的,已分出数量
  69. lineLot.EATTRIBUTE7 = FPType;
  70. lineLot.MTIME = DateTime.Now;
  71. lineLot.MUSER = AppConfig.UserCode;
  72. lineLot.MUSERName = AppConfig.UserName;
  73. //2.变更原跟踪单原条码数量
  74. lineOldLot.LOTQTY -= newLot.LOTQTY;
  75. //2.1变更原跟踪单已分批数量
  76. if (string.IsNullOrEmpty(lineOldLot.EATTRIBUTE6))
  77. {
  78. lineOldLot.EATTRIBUTE6 = "0";
  79. }
  80. lineOldLot.EATTRIBUTE6 = (Convert.ToDecimal(lineOldLot.EATTRIBUTE6) + newLot.LOTQTY).ToString();
  81. db.ICSITEMLot.InsertOnSubmit(lineLot);
  82. db.SubmitChanges();
  83. //2.2报工表记录分批数量
  84. var lineOnwip = db.ICSLOTONWIP.SingleOrDefault(a => a.LOTNO == lineOldLot.LotNO && a.ROUTECODE == ROUTECODE && a.OPSEQ == OpSeq && a.OPCODE == OPCODE);
  85. if (lineOnwip != null)
  86. {
  87. if (FPType == "正常")
  88. {
  89. lineOnwip.FPQTY = (lineOnwip.FPQTY == null ? 0 : lineOnwip.FPQTY) + newLot.LOTQTY;
  90. }
  91. else if (FPType == "返工")
  92. {
  93. lineOnwip.RWFPQTY = (lineOnwip.RWFPQTY == null ? 0 : lineOnwip.RWFPQTY) + newLot.LOTQTY;
  94. }
  95. else
  96. {
  97. throw new Exception("分批类型错误!");
  98. }
  99. db.SubmitChanges();
  100. }
  101. //3.ICSITEMROUTE2OPLot
  102. var lineNewOpLot = db.ICSITEMROUTE2OPLot.FirstOrDefault(a => a.LotNo == newLot.LotNO);
  103. if (lineNewOpLot != null)
  104. {
  105. throw new Exception("新条码" + newLot.LotNO + "已生成工序");
  106. }
  107. List<ICSITEMROUTE2OPLot> listOpLot = db.ICSITEMROUTE2OPLot.Where(a => a.LotNo == oldLotNo && a.OPSEQ > OpSeq).ToList();
  108. if (listOpLot.Count == 0)
  109. {
  110. //throw new Exception("原条码" + oldLotNo + "已是最后一道工序,不需要分批.");
  111. int fpopseq = 9999;
  112. ICSITEMROUTE2OPLot v = db.ICSITEMROUTE2OPLot.Single(a => a.LotNo == oldLotNo && a.OPSEQ == OpSeq);
  113. ICSOP fpop = db.ICSOP.SingleOrDefault(a => a.OPCODE == fpopseq.ToString() && a.WorkPoint == lineOldLot.WorkPoint);
  114. if (fpop == null)
  115. {
  116. throw new Exception("跟踪单最后一道工序分批时,需要专用虚拟工序 ,工序代码9999,此工序未维护");
  117. }
  118. ICSITEMROUTE2OPLot opLotInfo = new ICSITEMROUTE2OPLot();
  119. opLotInfo.CtrlType = "串行";
  120. opLotInfo.OPAttr = "自制";
  121. opLotInfo.OPSEQ = fpopseq;
  122. opLotInfo.OPCODE = fpopseq.ToString();
  123. opLotInfo.EATTRIBUTE1 = "0";//如果是分批出的返工跟踪单 0 表示原始状态未进行工序变更,1表示已做了跟踪单工序变更(跟踪单工序变更保存时该值为1)
  124. opLotInfo.IDMERGERULE = v.IDMERGERULE;
  125. opLotInfo.IDMERGETYPE = v.IDMERGETYPE;
  126. opLotInfo.ITEMCODE = v.ITEMCODE;
  127. opLotInfo.OPCONTROL = v.OPCONTROL;
  128. opLotInfo.OPTIONALOP = v.OPTIONALOP;
  129. opLotInfo.ROUTECODE = v.ROUTECODE;
  130. opLotInfo.RouteMGR = v.RouteMGR;
  131. opLotInfo.WorkPoint = v.WorkPoint;
  132. opLotInfo.ID = AppConfig.GetGuid();
  133. opLotInfo.LotNo = newLot.LotNO;
  134. opLotInfo.MTIME = DateTime.Now;
  135. opLotInfo.MUSER = AppConfig.UserCode;
  136. opLotInfo.MUSERName = AppConfig.UserName;
  137. }
  138. foreach (ICSITEMROUTE2OPLot opLot in listOpLot)
  139. {
  140. ICSITEMROUTE2OPLot opLotInfo = new ICSITEMROUTE2OPLot();
  141. opLotInfo.CtrlType = opLot.CtrlType;
  142. opLotInfo.EATTRIBUTE1 = "0";
  143. opLotInfo.IDMERGERULE = opLot.IDMERGERULE;
  144. opLotInfo.IDMERGETYPE = opLot.IDMERGETYPE;
  145. opLotInfo.ITEMCODE = opLot.ITEMCODE;
  146. opLotInfo.OPAttr = opLot.OPAttr;
  147. opLotInfo.OPCODE = opLot.OPCODE;
  148. opLotInfo.OPCONTROL = opLot.OPCONTROL;
  149. opLotInfo.OPSEQ = opLot.OPSEQ;
  150. opLotInfo.OPTIONALOP = opLot.OPTIONALOP;
  151. opLotInfo.ROUTECODE = opLot.ROUTECODE;
  152. opLotInfo.RouteMGR = opLot.RouteMGR;
  153. opLotInfo.WorkPoint = opLot.WorkPoint;
  154. opLotInfo.CtrlType = opLot.CtrlType;
  155. opLotInfo.ID = AppConfig.GetGuid();
  156. opLotInfo.LotNo = newLot.LotNO;
  157. opLotInfo.MTIME = DateTime.Now;
  158. opLotInfo.MUSER = AppConfig.UserCode;
  159. opLotInfo.MUSERName = AppConfig.UserName;
  160. db.ICSITEMROUTE2OPLot.InsertOnSubmit(opLotInfo);
  161. db.SubmitChanges();
  162. var lineMo2User = db.ICSMO2User.SingleOrDefault(a => a.LOTNO == oldLotNo && a.OPCODE == opLot.OPCODE);
  163. if (lineMo2User != null)
  164. {
  165. ICSMO2User MO2USR = new ICSMO2User();
  166. MO2USR.ID = AppConfig.GetGuid();
  167. MO2USR.LOTNO = newLot.LotNO;
  168. MO2USR.MOCODE = lineMo2User.MOCODE;
  169. MO2USR.MOSEQ = lineMo2User.MOSEQ;
  170. MO2USR.SEGCODE = lineMo2User.SEGCODE;
  171. MO2USR.RouteCode = lineMo2User.RouteCode;
  172. MO2USR.OPCODE = lineMo2User.OPCODE;
  173. MO2USR.USERCODE = lineMo2User.USERCODE;
  174. MO2USR.USERName = lineMo2User.USERName;
  175. MO2USR.EQPCode = lineMo2User.EQPCode;
  176. MO2USR.EQPName = lineMo2User.EQPName;
  177. MO2USR.MUSER = lineMo2User.MUSER;
  178. MO2USR.MUSERName = lineMo2User.MUSERName;
  179. MO2USR.MTIME = Convert.ToDateTime(lineMo2User.MTIME);
  180. MO2USR.WorkPoint = lineMo2User.WorkPoint;
  181. MO2USR.EATTRIBUTE1 = lineMo2User.EATTRIBUTE1;
  182. MO2USR.StartPlanDate = lineMo2User.StartPlanDate;
  183. MO2USR.EndPlanDate = lineMo2User.EndPlanDate;
  184. //if (lineMo2User.PRLineID == "False" || lineMo2User.PRLineID == "0" || string.IsNullOrEmpty(lineMo2User.PRLineID))
  185. //{
  186. // MO2USR.PRLineID = null;
  187. //}
  188. //else
  189. //{
  190. // MO2USR.PRLineID = lineMo2User.PRLineID;
  191. //}
  192. MO2USR.PRLineID = null;
  193. db.ICSMO2User.InsertOnSubmit(MO2USR);
  194. List<ICSMO2UserDetail> lineMUDetail = db.ICSMO2UserDetail.Where(a => a.ID == lineMo2User.ID).ToList();
  195. for (int i = 0; i < lineMUDetail.Count; i++)
  196. {
  197. ICSMO2UserDetail info = new ICSMO2UserDetail();
  198. info.ID = MO2USR.ID;
  199. info.DID = AppConfig.GetGuid();
  200. info.EQPID = lineMUDetail[i].EQPID;
  201. info.AVAILABLE = lineMUDetail[i].AVAILABLE;
  202. info.PLANEND = lineMUDetail[i].PLANEND;
  203. info.PLANSTART = lineMUDetail[i].PLANSTART;
  204. info.PLANQTY = lineMUDetail[i].PLANQTY;
  205. info.PLANTIME = lineMUDetail[i].PLANTIME;
  206. db.ICSMO2UserDetail.InsertOnSubmit(info);
  207. db.SubmitChanges();
  208. }
  209. db.SubmitChanges();
  210. }
  211. }
  212. ////4.ICSLOTONWIP原条码数量,(开工时取上一道工序/上一组工序GOODQTY,完工时取上一道工序GOODQTY)
  213. //List<ICSLOTONWIP> listOnwip = db.ICSLOTONWIP.Where(a => a.LOTNO == oldLotNo).ToList();
  214. //if (listOnwip.Count == 0)
  215. //{
  216. // //throw new Exception("原条码" + oldLotNo + "报工信息不存在");//第一道工序?
  217. //}
  218. //foreach (ICSLOTONWIP onwip in listOnwip)
  219. //{
  220. // var lineOnwip = db.ICSLOTONWIP.SingleOrDefault(a => a.LOTNO == onwip.LOTNO && a.LOTSEQ == onwip.LOTSEQ && a.OPSEQ == onwip.OPSEQ);
  221. // //lineOnwip.LOTQTY = newLot.LOTQTY;
  222. // lineOnwip.GOODQTY -= newLot.LOTQTY;
  223. // db.SubmitChanges();
  224. //}
  225. }
  226. db.SubmitChanges();
  227. db.Transaction.Commit();
  228. }
  229. catch (Exception ex)
  230. {
  231. db.Transaction.Rollback();
  232. throw new Exception(ex.Message);
  233. }
  234. }
  235. public static void Delete(string LotNo, string FPType, string conn)
  236. {
  237. FramDataContext db = new FramDataContext(conn);
  238. db.Connection.Open();
  239. db.Transaction = db.Connection.BeginTransaction();
  240. try
  241. {
  242. if (!LotNo.Contains("-"))
  243. {
  244. throw new Exception("从工单分批出的条码请到工单维护界面进行删除!");
  245. }
  246. var lineSim = db.ICSLOTSIMULATION.FirstOrDefault(a => a.LOTNO == LotNo);
  247. if (lineSim != null)
  248. {
  249. throw new Exception("跟踪单已开始作业不能删除");
  250. }
  251. //1.恢复原始条码数量ICSITEMLot
  252. //string oldLotNo = "";
  253. var lineNewLotNo = db.ICSITEMLot.SingleOrDefault(a => a.LotNO == LotNo);
  254. if (lineNewLotNo == null)
  255. {
  256. throw new Exception(LotNo + "跟踪单不存在");
  257. }
  258. string oldLotNo = lineNewLotNo.EATTRIBUTE1;
  259. if (string.IsNullOrEmpty(oldLotNo))
  260. {
  261. oldLotNo = LotNo.Substring(0, LotNo.LastIndexOf('-'));
  262. }
  263. int OPSEQ = Convert.ToInt32(lineNewLotNo.EATTRIBUTE5.Split(',')[0]);
  264. string OPCODE = lineNewLotNo.EATTRIBUTE5.Split(',')[1];
  265. if (FPType == "正常")
  266. {
  267. var lineONWIP = db.ICSLOTONWIP.SingleOrDefault(a => a.LOTNO == LotNo && a.OPSEQ > OPSEQ && a.OPCODE == OPCODE);
  268. if (lineONWIP != null)
  269. {
  270. throw new Exception("原跟踪单" + oldLotNo + ",工序" + OPCODE + "后续工序已开工,本跟踪单不可删除!");
  271. }
  272. }
  273. var lineOldLotNo = db.ICSITEMLot.SingleOrDefault(a => a.LotNO == oldLotNo);
  274. if (lineOldLotNo == null)
  275. {
  276. throw new Exception(oldLotNo + "原跟踪单不存在");
  277. }
  278. lineOldLotNo.LOTQTY += lineNewLotNo.LOTQTY;
  279. if (string.IsNullOrEmpty(lineOldLotNo.EATTRIBUTE6))
  280. {
  281. lineOldLotNo.EATTRIBUTE6 = "0";
  282. }
  283. lineOldLotNo.EATTRIBUTE6 = (Convert.ToDecimal(lineOldLotNo.EATTRIBUTE6) - lineNewLotNo.LOTQTY).ToString();
  284. db.SubmitChanges();
  285. //2.恢复原始条码对应工序记录的分批数量ICSLOTONWIP
  286. var lineOldSim = db.ICSLOTSIMULATION.SingleOrDefault(a => a.LOTNO == oldLotNo);
  287. if (lineOldSim == null)
  288. {
  289. throw new Exception(oldLotNo + "原跟踪单Sim表被删除!");
  290. }
  291. ICSLOTONWIP OldOnwip = db.ICSLOTONWIP.SingleOrDefault(a => a.LOTNO == oldLotNo && a.LOTSEQ == lineOldSim.LOTSEQ);
  292. if (OldOnwip == null)
  293. {
  294. throw new Exception("原条码:" + oldLotNo + "工序" + OPCODE + "次序" + OPSEQ.ToString() + "开工记录被删除!");
  295. }
  296. OldOnwip.FPQTY = (OldOnwip.FPQTY == null ? 0 : OldOnwip.FPQTY) - lineNewLotNo.LOTQTY;
  297. if (FPType == "返工")
  298. {
  299. OldOnwip.RWFPQTY = (OldOnwip.RWFPQTY == null ? 0 : OldOnwip.RWFPQTY) - lineNewLotNo.LOTQTY;
  300. }
  301. db.SubmitChanges();
  302. //2.删除派工
  303. List<ICSMO2User> lineMO2User = db.ICSMO2User.Where(a => a.LOTNO == lineNewLotNo.LotNO).ToList();
  304. if (lineMO2User.Count > 0)
  305. {
  306. //2.1删除派工子表(设备)
  307. for (int i = 0; i < lineMO2User.Count; i++)
  308. {
  309. var lineMUDetail = db.ICSMO2UserDetail.Where(a => a.ID == lineMO2User[i].ID);
  310. if (lineMUDetail.Count() > 0)
  311. {
  312. db.ICSMO2UserDetail.DeleteAllOnSubmit(lineMUDetail);
  313. }
  314. }
  315. //2.2删除派工主表
  316. db.ICSMO2User.DeleteAllOnSubmit(lineMO2User);
  317. }
  318. //3.删除工序
  319. List<ICSITEMROUTE2OPLot> listOp = db.ICSITEMROUTE2OPLot.Where(a => a.LotNo == LotNo).ToList();
  320. db.ICSITEMROUTE2OPLot.DeleteAllOnSubmit(listOp);
  321. //4.删除ICSITEMLot新条码
  322. db.ICSITEMLot.DeleteOnSubmit(lineNewLotNo);
  323. db.SubmitChanges();
  324. db.Transaction.Commit();
  325. }
  326. catch (Exception ex)
  327. {
  328. db.Transaction.Rollback();
  329. throw new Exception(ex.Message);
  330. }
  331. }
  332. public static int GetMaxFlow(string like, string notlike, string conn)
  333. {
  334. FramDataContext db = new FramDataContext(conn);
  335. db.Connection.Open();
  336. db.Transaction = db.Connection.BeginTransaction();
  337. try
  338. {
  339. var list = db.ICSITEMLot.Where(a => a.LotNO.Contains(like) && !a.LotNO.Contains(notlike));
  340. if (list.Count() == 0)
  341. {
  342. return 0;
  343. }
  344. return list.Max(a => Convert.ToInt32(a.LotNO.Substring(a.LotNO.LastIndexOf('-') + 1)));
  345. }
  346. catch (Exception ex)
  347. {
  348. db.Transaction.Rollback();
  349. throw new Exception(ex.Message);
  350. }
  351. }
  352. public static int GetMaxFlow0326(string oriLOTNO, string conn)
  353. {
  354. FramDataContext db = new FramDataContext(conn);
  355. db.Connection.Open();
  356. db.Transaction = db.Connection.BeginTransaction();
  357. try
  358. {
  359. var list = db.ICSITEMLot.Where(a => a.EATTRIBUTE1 == oriLOTNO && a.WorkPoint == AppConfig.WorkPointCode);
  360. if (list.Count() == 0)
  361. {
  362. return 0;
  363. }
  364. return list.Max(a => Convert.ToInt32(a.LotNO.Substring(a.LotNO.LastIndexOf('-') + 1)));
  365. }
  366. catch (Exception ex)
  367. {
  368. db.Transaction.Rollback();
  369. throw new Exception(ex.Message);
  370. }
  371. }
  372. /// <summary>
  373. /// 本工序是第一道工序且未开工/本工序已完工且检验结果已出且下道工序未开工
  374. /// </summary>
  375. /// <param name="LOTNO"></param>
  376. /// <param name="ROUTECODE"></param>
  377. /// <param name="OPSEQ"></param>
  378. /// <param name="WorkPiont"></param>
  379. /// <param name="conn"></param>
  380. /// <returns></returns>
  381. public static DataTable BaseQuery(string LOTNO, string ROUTECODE, int OPSEQ, string WorkPiont, string conn)
  382. {
  383. string sql = @"
  384. SELECT
  385. LOT.ITEMCODE,
  386. iLOT.TransNO as MOCODE,
  387. iLOT.TransLine AS MOSEQ,
  388. LOT.LOTNO,
  389. LOT.ROUTECODE,
  390. LOT.OPSEQ,
  391. LOT.OPCODE,
  392. MAX(iLOT.LOTQTY) AS OriLOTQTY,
  393. MAX(ISNULL(WIP.GOODQTY,0)) WIPQTY,
  394. MAX(ISNULL(CHK.Quantity,0)) CHKQTY,
  395. MAX(ISNULL(CHK.OKQuantity,0)) CHKOK,
  396. MAX(ISNULL(CHK.NGQuantity,0)) CHKNG,
  397. SUM(CASE WHEN NCR.Status='' THEN CONVERT(DECIMAL,ISNULL(CHKDET.SetValue,'0')) ELSE 0 END) NCROK,
  398. MAX(ISNULL(WIP.FPQTY,0)) FPQTY,
  399. WIP.ID AS WIPID
  400. FROM dbo.ICSITEMROUTE2OPLot LOT
  401. INNER JOIN dbo.ICSITEMLot iLOT ON iLOT.LotNO=LOT.LotNo AND iLOT.WorkPoint=LOT.WorkPoint
  402. 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
  403. LEFT JOIN dbo.ICSLOTONWIP B ON B.LOTNO=WIP.LOTNO AND B.ROUTECODE=WIP.ROUTECODE AND B.WorkPoint=WIP.WorkPoint AND B.OPSEQ=(
  404. SELECT MIN(OPSEQ) FROM dbo.ICSITEMROUTE2OPLot WHERE LotNo=WIP.LOTNO AND ROUTECODE=WIP.ROUTECODE AND OPSEQ>WIP.OPSEQ AND WorkPoint=WIP.WorkPoint
  405. )
  406. LEFT JOIN dbo.ICSLOTONWIPCheck CHK ON CHK.FORTRANID=WIP.ID AND CHK.Enable=1
  407. LEFT JOIN dbo.ICSLOTONWIPCheckDetail CHKDET ON CHKDET.FORTRANID=CHK.ID AND CHKDET.Type=''
  408. LEFT JOIN dbo.ICSLOTONWIPCheckNCR NCR ON NCR.CheckID=CHKDET.ID AND NCR.DownDateTime IS NOT NULL
  409. WHERE
  410. (
  411. (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))
  412. OR (WIP.ACTIONRESULT='COLLECT_END' AND CHK.EndDateTime IS NOT NULL AND B.ID IS NULL)
  413. )
  414. AND 1=1
  415. AND LOT.LotNo=@LOTNO
  416. AND LOT.ROUTECODE=@ROUTECODE
  417. AND LOT.OPSEQ=@OPSEQ
  418. AND LOT.WorkPoint=@WorkPiont
  419. GROUP BY
  420. LOT.ITEMCODE,
  421. iLOT.TransNO,
  422. iLOT.TransLine,
  423. LOT.LOTNO,
  424. LOT.ROUTECODE,
  425. LOT.OPSEQ,
  426. LOT.OPCODE,
  427. WIP.ID
  428. HAVING COUNT(CHKDET.ID)=SUM(CASE WHEN NCR.DownDateTime IS NULL THEN 0 ELSE 1 END)
  429. ";
  430. SqlParameter[] pms = new SqlParameter[]{
  431. new SqlParameter("@LOTNO",SqlDbType.NVarChar){ Value = LOTNO },
  432. new SqlParameter("@ROUTECODE",SqlDbType.NVarChar){ Value = ROUTECODE },
  433. new SqlParameter("@OPSEQ",SqlDbType.Int){ Value = OPSEQ },
  434. new SqlParameter("@WorkPiont",SqlDbType.NVarChar){ Value = WorkPiont }
  435. };
  436. return DBHelper.ExecuteDataset(conn, CommandType.Text, sql, pms).Tables[0];
  437. }
  438. public static DataTable BaseQuery4RW(string WIPID, string conn)
  439. {
  440. string sql = @"
  441. SELECT
  442. wip.MOCODE,
  443. wip.MOSEQ,
  444. WIP.ID WIPID,
  445. WIP.LOTNO,
  446. wip.ROUTECODE,
  447. wip.OPSEQ,
  448. wip.OPCODE,
  449. SUM(CASE WHEN NCR.Status='' THEN CONVERT(DECIMAL,ISNULL(CHKDET.SetValue,0)) ELSE 0 END)
  450. + SUM(CASE WHEN NCR2.Status='' THEN CONVERT(DECIMAL,ISNULL(CHKDET2.SetValue,0)) ELSE 0 END) NCR_RWQTY,
  451. MAX(ISNULL(wip.RWFPQTY,0)) FP_RWQTY,
  452. MAX(ilot.LOTQTY) AS OriLOTQTY
  453. FROM dbo.ICSLOTONWIP WIP
  454. INNER JOIN dbo.ICSITEMLot ilot ON ilot.LotNO=wip.LOTNO AND ilot.WorkPoint=wip.WorkPoint
  455. LEFT JOIN dbo.ICSLOTONWIPCheck CHK ON CHK.FORTRANID=WIP.ID AND CHK.Enable=1
  456. LEFT JOIN dbo.ICSLOTONWIPCheckDetail CHKDET ON CHKDET.FORTRANID=CHK.ID
  457. LEFT JOIN dbo.ICSLOTONWIPCheckNCR NCR ON NCR.CheckID=CHKDET.ID AND NCR.DownDateTime IS NOT NULL
  458. 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
  459. LEFT JOIN dbo.ICSLOTONWIPInspection ins ON ins.DetailID=wipdet.ID
  460. LEFT JOIN dbo.ICSLOTONWIPCheck CHK2 ON CHK2.FORTRANID=ins.ID AND CHK2.Enable=1
  461. LEFT JOIN dbo.ICSLOTONWIPCheckDetail CHKDET2 ON CHKDET2.FORTRANID=CHK2.ID AND CHKDET2.Type=''
  462. LEFT JOIN dbo.ICSLOTONWIPCheckNCR NCR2 ON NCR2.CheckID=CHKDET2.ID AND NCR2.DownDateTime IS NOT NULL
  463. WHERE WIP.ID=@WIPID
  464. GROUP BY
  465. wip.MOCODE,
  466. wip.MOSEQ,
  467. WIP.ID,
  468. WIP.LOTNO,
  469. wip.ROUTECODE,
  470. wip.OPSEQ,
  471. wip.OPCODE
  472. HAVING
  473. 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
  474. AND SUM(CASE WHEN NCR.Status='' THEN CONVERT(DECIMAL,ISNULL(CHKDET.SetValue,0)) ELSE 0 END)
  475. + SUM(CASE WHEN NCR2.Status='' THEN CONVERT(DECIMAL,ISNULL(CHKDET2.SetValue,0)) ELSE 0 END) > 0
  476. ";
  477. SqlParameter pms = new SqlParameter("@WIPID", SqlDbType.NVarChar) { Value = WIPID };
  478. return DBHelper.ExecuteDataset(conn, CommandType.Text, sql, pms).Tables[0];
  479. }
  480. /// <summary>
  481. /// 自动返工分批时,生成相关单据 , 方法本身没有自动分批的判断,所以必须符合自动分批时才可调用 .
  482. /// </summary>
  483. /// <param name="db"></param>
  484. /// <param name="wipid">oniwp表id</param>
  485. /// <param name="rwQty">过程+完工判定返工总数量</param>
  486. /// <param name="memo">检验不良信息,ncr单号+不良原因+数量 为一组,同组以","隔开. 不同组以"~"隔开</param>
  487. public static void CreateRWLotNo(FramDataContext db, string wipid, decimal rwQty, string memo, string reason, string StopPRProcess)
  488. {
  489. string oldLOTNO, WorkPoint, ROUTECODE, OPCODE = "";
  490. int OPSEQ = -1;
  491. int flow = 1;
  492. string LOTNO = "";
  493. string WWRWPRLineID = "";
  494. string EATTRIBUTE7 = "";
  495. try
  496. {
  497. var lineOldwip = db.ICSLOTONWIP.SingleOrDefault(a => a.ID == wipid);
  498. if (lineOldwip == null)
  499. {
  500. throw new Exception("报工表信息不存在!");
  501. }
  502. oldLOTNO = lineOldwip.LOTNO;
  503. WorkPoint = lineOldwip.WorkPoint;
  504. ROUTECODE = lineOldwip.ROUTECODE;
  505. OPSEQ = lineOldwip.OPSEQ;
  506. OPCODE = lineOldwip.OPCODE;
  507. var lineOldLot = db.ICSITEMLot.SingleOrDefault(a => a.LotNO == oldLOTNO);
  508. if (lineOldLot == null)
  509. {
  510. throw new Exception("原条码" + oldLOTNO + "不存在");
  511. }
  512. var lineMO2User = db.ICSMO2User.SingleOrDefault(a => a.LOTNO == oldLOTNO && a.RouteCode == ROUTECODE && a.OPCODE == OPCODE && a.WorkPoint == WorkPoint);
  513. if (lineMO2User == null)
  514. {
  515. throw new Exception("条码" + oldLOTNO + "工序" + OPCODE + "派工信息不存在");
  516. }
  517. if (lineMO2User.EATTRIBUTE1 == "1")
  518. {
  519. //当前工序是委外,取本工序PRLineID
  520. WWRWPRLineID = lineMO2User.PRLineID;
  521. EATTRIBUTE7 = "委外," + reason;
  522. var lineRouteop = db.ICSITEMROUTE2OPLot.SingleOrDefault(a => a.LotNo == oldLOTNO && a.ROUTECODE == ROUTECODE && a.OPCODE == OPCODE && a.WorkPoint == WorkPoint);
  523. if (lineRouteop == null)
  524. {
  525. throw new Exception("工艺工序被删除!ICSITEMROUTE2OPLot");
  526. }
  527. if (lineRouteop.ISWWRW == true)
  528. {
  529. var lineOP = db.ICSOP.SingleOrDefault(a => a.OPCODE == OPCODE && a.WorkPoint == WorkPoint);
  530. if (lineOP == null)
  531. {
  532. throw new Exception("工艺工序被删除!");
  533. }
  534. if (lineOP.OPDESC.Contains("退镀"))
  535. {
  536. //返工退镀,重新赋值为 继承原单子的PRLineID
  537. WWRWPRLineID = lineOldLot.WWRWPRLineID;
  538. }
  539. }
  540. }
  541. else
  542. {
  543. //否则继承原单子的PRLineID
  544. WWRWPRLineID = lineOldLot.WWRWPRLineID;
  545. }
  546. var listLot = db.ICSITEMLot.Where(a => a.EATTRIBUTE1 == oldLOTNO && a.WorkPoint == WorkPoint).ToList();
  547. if (listLot.Count == 0)
  548. {
  549. flow = 1;
  550. }
  551. else
  552. {
  553. flow = listLot.Max(a => Convert.ToInt32(a.LotNO.Substring(a.LotNO.LastIndexOf('-') + 1))) + 1;
  554. }
  555. LOTNO = oldLOTNO + "-" + flow.ToString();
  556. //1.ICSITEMLot新条码
  557. ICSITEMLot lineNewLot = new ICSITEMLot();
  558. lineNewLot.ACTIVE = lineOldLot.ACTIVE;
  559. lineNewLot.Exdate = lineOldLot.Exdate;
  560. lineNewLot.ItemCode = lineOldLot.ItemCode;
  561. lineNewLot.PRODUCTDATE = lineOldLot.PRODUCTDATE;
  562. lineNewLot.tFileName = lineOldLot.tFileName;
  563. lineNewLot.VenBatch = lineOldLot.VenBatch;
  564. lineNewLot.VenderLotNO = lineOldLot.VenderLotNO;
  565. lineNewLot.VENDORCODE = lineOldLot.VENDORCODE;
  566. lineNewLot.VENDORITEMCODE = lineOldLot.VENDORITEMCODE;
  567. lineNewLot.VoucherNO = lineOldLot.VoucherNO;
  568. lineNewLot.VoucherRow = lineOldLot.VoucherRow;
  569. lineNewLot.TransNO = lineOldLot.TransNO;
  570. lineNewLot.TransLine = lineOldLot.TransLine;
  571. lineNewLot.WorkPoint = lineOldLot.WorkPoint;
  572. lineNewLot.RWOPChanged = false;
  573. lineNewLot.ID = AppConfig.GetGuid();
  574. lineNewLot.LotNO = LOTNO;
  575. lineNewLot.LOTQTY = rwQty;
  576. lineNewLot.TYPE = "跟踪单分批";
  577. lineNewLot.EATTRIBUTE1 = oldLOTNO;//原条码
  578. lineNewLot.EATTRIBUTE2 = lineOldLot.LOTQTY.ToString();//原条码数量
  579. lineNewLot.EATTRIBUTE3 = null;
  580. lineNewLot.EATTRIBUTE4 = null;
  581. lineNewLot.EATTRIBUTE5 = OPSEQ.ToString() + "," + OPCODE;//原条码分批时工序序号+","+工序
  582. lineNewLot.EATTRIBUTE6 = "0";//被分批时的,已分出数量
  583. lineNewLot.EATTRIBUTE7 = reason;
  584. lineNewLot.MTIME = DateTime.Now;
  585. lineNewLot.MUSER = AppConfig.UserCode;
  586. lineNewLot.MUSERName = AppConfig.UserName;
  587. lineNewLot.lastPrintTime = null;
  588. lineNewLot.lastPrintUSERID = null;
  589. lineNewLot.PrintTimes = 0;
  590. lineNewLot.TimesPrint = 0;
  591. lineNewLot.TwoMTIME = null;
  592. lineNewLot.TwoMUSER = null;
  593. lineNewLot.RWMEMO = memo;// EATTRIBUTE7;
  594. lineNewLot.RWOPChanged = false;
  595. lineNewLot.WWRWPRLineID = WWRWPRLineID;
  596. lineNewLot.StopPRProcess = string.IsNullOrEmpty(StopPRProcess) ? lineOldLot.StopPRProcess : StopPRProcess;
  597. db.ICSITEMLot.InsertOnSubmit(lineNewLot);
  598. db.SubmitChanges();
  599. //2.变更原跟踪单原条码数量
  600. lineOldLot.LOTQTY -= rwQty;
  601. //2.1变更原跟踪单已分批数量
  602. lineOldLot.EATTRIBUTE6 = (Convert.ToDecimal(string.IsNullOrEmpty(lineOldLot.EATTRIBUTE6) ? "0" : lineOldLot.EATTRIBUTE6) + rwQty).ToString();
  603. //2.2报工表记录返工分批数量
  604. lineOldwip.RWFPQTY = (lineOldwip.RWFPQTY == null ? 0 : lineOldwip.RWFPQTY) + rwQty;
  605. db.SubmitChanges();
  606. //3.ICSITEMROUTE2OPLot
  607. int cNewOpLot = db.ICSITEMROUTE2OPLot.Where(a => a.LotNo == LOTNO).ToList().Count;
  608. if (cNewOpLot > 0)
  609. {
  610. throw new Exception("新条码" + LOTNO + "已生成工序");
  611. }
  612. List<ICSITEMROUTE2OPLot> listOpLot = db.ICSITEMROUTE2OPLot.Where(a => a.LotNo == oldLOTNO && a.OPSEQ > OPSEQ).ToList();
  613. if (listOpLot.Count == 0)
  614. {
  615. int fpopseq = 9999;
  616. ICSITEMROUTE2OPLot v = db.ICSITEMROUTE2OPLot.Single(a => a.LotNo == oldLOTNO && a.OPSEQ == OPSEQ);
  617. ICSOP fpop = db.ICSOP.SingleOrDefault(a => a.OPCODE == fpopseq.ToString() && a.WorkPoint == lineOldLot.WorkPoint);
  618. if (fpop == null)
  619. {
  620. throw new Exception("跟踪单最后一道工序分批时,需要专用虚拟工序 ,工序代码9999,此工序未维护");
  621. }
  622. ICSITEMROUTE2OPLot opLotInfo = new ICSITEMROUTE2OPLot();
  623. opLotInfo.CtrlType = "串行";
  624. opLotInfo.OPAttr = "自制";
  625. opLotInfo.OPSEQ = fpopseq;
  626. opLotInfo.OPCODE = fpopseq.ToString();
  627. opLotInfo.EATTRIBUTE1 = "0";//如果是分批出的返工跟踪单 0 表示原始状态未进行工序变更,1表示已做了跟踪单工序变更(跟踪单工序变更保存时该值为1)
  628. opLotInfo.IDMERGERULE = v.IDMERGERULE;
  629. opLotInfo.IDMERGETYPE = v.IDMERGETYPE;
  630. opLotInfo.ITEMCODE = v.ITEMCODE;
  631. opLotInfo.OPCONTROL = v.OPCONTROL;
  632. opLotInfo.OPTIONALOP = v.OPTIONALOP;
  633. opLotInfo.ROUTECODE = v.ROUTECODE;
  634. opLotInfo.RouteMGR = v.RouteMGR;
  635. opLotInfo.WorkPoint = v.WorkPoint;
  636. opLotInfo.ID = AppConfig.GetGuid();
  637. opLotInfo.LotNo = LOTNO;
  638. opLotInfo.MTIME = DateTime.Now;
  639. opLotInfo.MUSER = AppConfig.UserCode;
  640. opLotInfo.MUSERName = AppConfig.UserName;
  641. }
  642. foreach (ICSITEMROUTE2OPLot opLot in listOpLot)
  643. {
  644. ICSITEMROUTE2OPLot opLotInfo = new ICSITEMROUTE2OPLot();
  645. opLotInfo.CtrlType = opLot.CtrlType;
  646. opLotInfo.EATTRIBUTE1 = "0";
  647. opLotInfo.IDMERGERULE = opLot.IDMERGERULE;
  648. opLotInfo.IDMERGETYPE = opLot.IDMERGETYPE;
  649. opLotInfo.ITEMCODE = opLot.ITEMCODE;
  650. opLotInfo.OPAttr = opLot.OPAttr;
  651. opLotInfo.OPCODE = opLot.OPCODE;
  652. opLotInfo.OPCONTROL = opLot.OPCONTROL;
  653. opLotInfo.OPSEQ = opLot.OPSEQ;
  654. opLotInfo.OPTIONALOP = opLot.OPTIONALOP;
  655. opLotInfo.ROUTECODE = opLot.ROUTECODE;
  656. opLotInfo.RouteMGR = opLot.RouteMGR;
  657. opLotInfo.WorkPoint = opLot.WorkPoint;
  658. opLotInfo.CtrlType = opLot.CtrlType;
  659. opLotInfo.ID = AppConfig.GetGuid();
  660. opLotInfo.LotNo = LOTNO;
  661. opLotInfo.MTIME = DateTime.Now;
  662. opLotInfo.MUSER = AppConfig.UserCode;
  663. opLotInfo.MUSERName = AppConfig.UserName;
  664. db.ICSITEMROUTE2OPLot.InsertOnSubmit(opLotInfo);
  665. db.SubmitChanges();
  666. var lineMo2User = db.ICSMO2User.SingleOrDefault(a => a.LOTNO == oldLOTNO && a.OPCODE == opLot.OPCODE);
  667. if (lineMo2User != null)
  668. {
  669. ICSMO2User MO2USR = new ICSMO2User();
  670. MO2USR.ID = AppConfig.GetGuid();
  671. MO2USR.LOTNO = LOTNO;
  672. MO2USR.MOCODE = lineMo2User.MOCODE;
  673. MO2USR.MOSEQ = lineMo2User.MOSEQ;
  674. MO2USR.SEGCODE = lineMo2User.SEGCODE;
  675. MO2USR.RouteCode = lineMo2User.RouteCode;
  676. MO2USR.OPCODE = lineMo2User.OPCODE;
  677. MO2USR.USERCODE = lineMo2User.USERCODE;
  678. MO2USR.USERName = lineMo2User.USERName;
  679. MO2USR.EQPCode = lineMo2User.EQPCode;
  680. MO2USR.EQPName = lineMo2User.EQPName;
  681. MO2USR.MUSER = lineMo2User.MUSER;
  682. MO2USR.MUSERName = lineMo2User.MUSERName;
  683. MO2USR.MTIME = Convert.ToDateTime(lineMo2User.MTIME);
  684. MO2USR.WorkPoint = lineMo2User.WorkPoint;
  685. MO2USR.EATTRIBUTE1 = lineMo2User.EATTRIBUTE1;
  686. MO2USR.StartPlanDate = lineMo2User.StartPlanDate;
  687. MO2USR.EndPlanDate = lineMo2User.EndPlanDate;
  688. MO2USR.PRLineID = null;
  689. db.ICSMO2User.InsertOnSubmit(MO2USR);
  690. List<ICSMO2UserDetail> lineMUDetail = db.ICSMO2UserDetail.Where(a => a.ID == lineMo2User.ID).ToList();
  691. for (int i = 0; i < lineMUDetail.Count; i++)
  692. {
  693. ICSMO2UserDetail info = new ICSMO2UserDetail();
  694. info.ID = MO2USR.ID;
  695. info.DID = AppConfig.GetGuid();
  696. info.EQPID = lineMUDetail[i].EQPID;
  697. info.AVAILABLE = lineMUDetail[i].AVAILABLE;
  698. info.PLANEND = lineMUDetail[i].PLANEND;
  699. info.PLANSTART = lineMUDetail[i].PLANSTART;
  700. info.PLANQTY = lineMUDetail[i].PLANQTY;
  701. info.PLANTIME = lineMUDetail[i].PLANTIME;
  702. db.ICSMO2UserDetail.InsertOnSubmit(info);
  703. db.SubmitChanges();
  704. }
  705. db.SubmitChanges();
  706. }
  707. }
  708. db.SubmitChanges();
  709. }
  710. catch (Exception ex)
  711. {
  712. throw new Exception("返工分批(自动)出错: \r\n" + ex.Message);
  713. }
  714. }
  715. public static void CreateRWLotNo(SqlCommand cmd, string wipid, decimal rwQty, string memo, string reason, string StopPRProcess, DateTime timeNow, string UserCode, string UserName)
  716. {
  717. string oldLOTNO, WorkPoint, ROUTECODE, OPCODE = "";
  718. int OPSEQ = -1;
  719. string LOTNO = "";
  720. try
  721. {
  722. string sql = "SELECT * FROM ICSLOTONWIP WHERE ID='" + wipid + "'";
  723. DataTable dtOldwip = U8Helper.ExecuteDataTable(sql, cmd);
  724. if (dtOldwip.Rows.Count == 0)
  725. {
  726. throw new Exception("报工表信息不存在!");
  727. }
  728. oldLOTNO = dtOldwip.Rows[0]["LOTNO"].ToString();
  729. WorkPoint = dtOldwip.Rows[0]["WorkPoint"].ToString();
  730. ROUTECODE = dtOldwip.Rows[0]["ROUTECODE"].ToString();
  731. OPSEQ = Convert.ToInt32(dtOldwip.Rows[0]["OPSEQ"]);
  732. OPCODE = dtOldwip.Rows[0]["OPCODE"].ToString();
  733. //PRLineID 取值
  734. //1.如果是正常委外,返工非退镀委外 取自身
  735. //2.如果是自制,返工退镀委外 继承父跟踪单
  736. string IsWW = "0";
  737. string PRLineID_Current = "";
  738. string PRLineID_Inherit = "";
  739. string WWRWPRLineID = "";
  740. string StopPRProcess_Current = "";
  741. string StopPRProcess_Inherit = "";
  742. sql = "SELECT * FROM ICSITEMLot WHERE LotNO='{0}' AND WorkPoint='{1}'";
  743. sql = string.Format(sql, oldLOTNO, WorkPoint);
  744. DataTable dtOldLot = U8Helper.ExecuteDataTable(sql, cmd);
  745. if (dtOldLot.Rows.Count == 0)
  746. {
  747. throw new Exception("原条码" + oldLOTNO + "不存在");
  748. }
  749. PRLineID_Inherit = dtOldLot.Rows[0]["WWRWPRLineID"].ToString();
  750. StopPRProcess_Inherit = dtOldLot.Rows[0]["StopPRProcess"].ToString();
  751. if (string.IsNullOrEmpty(StopPRProcess))
  752. {
  753. StopPRProcess_Current = StopPRProcess_Inherit;
  754. }
  755. else
  756. {
  757. StopPRProcess_Current = StopPRProcess;
  758. }
  759. sql = "SELECT EATTRIBUTE1,PRLineID FROM dbo.ICSMO2User WHERE LOTNO='{0}' AND RouteCode='{1}' AND OPCODE='{2}' AND WorkPoint='{3}'";
  760. sql = string.Format(sql, LOTNO, ROUTECODE, OPCODE, WorkPoint);
  761. DataTable dtMo2usr = U8Helper.ExecuteDataTable(sql, cmd);
  762. if (dtMo2usr.Rows.Count == 0)
  763. {
  764. throw new Exception("原条码" + oldLOTNO + "派工信息不存在");
  765. }
  766. IsWW = dtMo2usr.Rows[0]["EATTRIBUTE1"].ToString();
  767. PRLineID_Current = dtMo2usr.Rows[0]["PRLineID"].ToString();
  768. if (IsWW == "1")
  769. {
  770. //当前工序是委外,取本工序PRLineID
  771. WWRWPRLineID = PRLineID_Current;
  772. sql = @"
  773. SELECT
  774. ISNULL(A.ISWWRW,0) as ISWWRW,
  775. B.OPDESC
  776. FROM ICSITEMROUTE2OPLot A
  777. INNER JOIN dbo.ICSOP B ON B.OPCODE=A.OPCODE AND B.WorkPoint=A.WorkPoint
  778. WHERE A.LotNo='{0}' AND A.ROUTECODE='{1}' AND A.OPCODE='{2}' AND A.WorkPoint='{3}'
  779. ";
  780. sql = string.Format(sql, LOTNO, ROUTECODE, OPCODE, WorkPoint);
  781. DataTable dtRouteOP = U8Helper.ExecuteDataTable(sql, cmd);
  782. if (dtRouteOP.Rows.Count == 0)
  783. {
  784. throw new Exception("原条码" + oldLOTNO + "工艺工序信息不存在," + ROUTECODE + "," + OPCODE);
  785. }
  786. bool ISWWRW = Convert.ToBoolean(dtRouteOP.Rows[0]["ISWWRW"]);
  787. string OPDESC = dtRouteOP.Rows[0]["OPDESC"].ToString();
  788. if (ISWWRW == true)
  789. {
  790. if (OPDESC.Contains("退镀"))
  791. {
  792. //返工退镀,重新赋值为 继承原单子的PRLineID
  793. WWRWPRLineID = PRLineID_Inherit;
  794. }
  795. }
  796. }
  797. else
  798. {
  799. //否则继承原单子的PRLineID
  800. WWRWPRLineID = PRLineID_Inherit;
  801. }
  802. int flow = 1;
  803. sql = "SELECT * FROM ICSITEMLot WHERE EATTRIBUTE1='{0}' AND WorkPoint='{1}''";
  804. sql = string.Format(sql, oldLOTNO, WorkPoint);
  805. DataTable listLot = U8Helper.ExecuteDataTable(sql, cmd);
  806. if (listLot.Rows.Count == 0)
  807. {
  808. flow = 1;
  809. }
  810. else
  811. {
  812. flow = listLot.Select().Max(a => Convert.ToInt32(a.Field<string>("LotNO").Substring(a.Field<string>("LotNO").LastIndexOf('-') + 1))) + 1;
  813. }
  814. LOTNO = oldLOTNO + "-" + flow.ToString();
  815. //1.ICSITEMLot新条码
  816. #region Sql-插入新条码
  817. sql = @"
  818. INSERT INTO [dbo].[ICSITEMLot](
  819. [ID]
  820. ,[LotNO]
  821. ,[ItemCode]
  822. ,[TransNO]
  823. ,[TransLine]
  824. ,[VENDORITEMCODE]
  825. ,[VENDORCODE]
  826. ,[VenderLotNO]
  827. ,[PRODUCTDATE]
  828. ,[LOTQTY]
  829. ,[ACTIVE]
  830. ,[Exdate]
  831. ,[WorkPoint]
  832. ,[MUSER]
  833. ,[MUSERName]
  834. ,[MTIME]
  835. ,[EATTRIBUTE1]
  836. ,[TYPE]
  837. ,[EATTRIBUTE2]
  838. ,[EATTRIBUTE3]
  839. ,[EATTRIBUTE4]
  840. ,[EATTRIBUTE5]
  841. ,[PrintTimes]
  842. ,[lastPrintUSERID]
  843. ,[lastPrintTime]
  844. ,[VoucherNO]
  845. ,[VoucherRow]
  846. ,[TwoMUSER]
  847. ,[TwoMTIME]
  848. ,[VenBatch]
  849. ,[EATTRIBUTE6]
  850. ,[EATTRIBUTE7]
  851. ,[tFileName]
  852. ,[TimesPrint]
  853. ,[RWMEMO]
  854. ,[RWOPChanged]
  855. ,[WWRWPRLineID]
  856. ,[StopPRProcess])
  857. SELECT
  858. NEWID()
  859. ,@LotNO
  860. ,[ItemCode]
  861. ,[TransNO]
  862. ,[TransLine]
  863. ,[VENDORITEMCODE]
  864. ,[VENDORCODE]
  865. ,[VenderLotNO]
  866. ,[PRODUCTDATE]
  867. ,@LOTQTY
  868. ,'Y'
  869. ,[Exdate]
  870. ,[WorkPoint]
  871. ,@MUSER
  872. ,@MUSERName
  873. ,@MTIME
  874. ,@EATTRIBUTE1
  875. ,@TYPE
  876. ,@EATTRIBUTE2
  877. ,[EATTRIBUTE3]
  878. ,[EATTRIBUTE4]
  879. ,@EATTRIBUTE5
  880. ,0
  881. ,null
  882. ,null
  883. ,[VoucherNO]
  884. ,[VoucherRow]
  885. ,[TwoMUSER]
  886. ,[TwoMTIME]
  887. ,[VenBatch]
  888. ,@EATTRIBUTE6
  889. ,@EATTRIBUTE7
  890. ,[tFileName]
  891. ,[TimesPrint]
  892. ,@RWMEMO
  893. ,@RWOPChanged
  894. ,@WWRWPRLineID
  895. ,@StopPRProcess
  896. FROM dbo.ICSITEMLot WHERE LotNO=@oldLOTNO
  897. ";
  898. #endregion
  899. cmd.Parameters.Clear();
  900. SqlParameter[] pms = {
  901. new SqlParameter("@oldLOTNO",DbType.String){ Value=oldLOTNO },
  902. new SqlParameter("@LotNO",DbType.String){ Value=LOTNO },
  903. new SqlParameter("@LOTQTY",DbType.Decimal){ Value=rwQty },
  904. new SqlParameter("@TYPE",DbType.String){ Value="跟踪单分批" },
  905. new SqlParameter("@EATTRIBUTE1",DbType.String){ Value=oldLOTNO },//父(原)跟踪单
  906. new SqlParameter("@EATTRIBUTE2",DbType.String){ Value=dtOldLot.Rows[0]["LOTQTY"].ToString() },//父(原)跟踪单的数量
  907. new SqlParameter("@EATTRIBUTE5",DbType.String){ Value=OPSEQ.ToString() + "," + OPCODE },//在哪个工序进行的分批
  908. new SqlParameter("@EATTRIBUTE6",DbType.String){ Value="0" },//作为父条码时被分出的数量
  909. new SqlParameter("@EATTRIBUTE7",DbType.String){ Value= reason },//类型'返工'
  910. new SqlParameter("@MTIME",DbType.DateTime){ Value=timeNow },
  911. new SqlParameter("@MUSER",DbType.String){ Value=UserCode },
  912. new SqlParameter("@MUSERName",DbType.String){ Value=UserName },
  913. new SqlParameter("@RWMEMO",DbType.String){ Value=memo },//返工备注: 不良
  914. new SqlParameter("@RWOPChanged",DbType.Boolean){ Value=false },//条码生成后,是否变更了 工艺工序
  915. new SqlParameter("@WWRWPRLineID",DbType.String){ Value=string.IsNullOrEmpty(WWRWPRLineID)?"":WWRWPRLineID },
  916. new SqlParameter("@StopPRProcess",DbType.String){ Value=string.IsNullOrEmpty(StopPRProcess_Current)?"":StopPRProcess_Current }
  917. };
  918. cmd.Parameters.AddRange(pms);
  919. U8Helper.ExecuteNonQuery(sql, cmd);
  920. //2.0变更原跟踪单原条码数量,2.1变更原跟踪单已分批数量
  921. sql = @"UPDATE dbo.ICSITEMLot SET LOTQTY-={0}, EATTRIBUTE6=CONVERT(DECIMAL,ISNULL(EATTRIBUTE6,'0'))+{0} WHERE LotNO='{1}'";
  922. sql = string.Format(sql, rwQty, oldLOTNO);
  923. U8Helper.ExecuteNonQuery(sql, cmd);
  924. //2.2报工表记录返工分批数量
  925. sql = "UPDATE ICSLOTONWIP SET RWFPQTY=ISNULL(RWFPQTY,'0')+{0} WHERE ID='{1}'";
  926. sql = string.Format(sql, rwQty, wipid);
  927. U8Helper.ExecuteNonQuery(sql, cmd);
  928. //3.ICSITEMROUTE2OPLot
  929. sql = "SELECT 1 FROM ICSITEMROUTE2OPLot WHERE LotNo='{0}'";
  930. sql = string.Format(sql, rwQty, wipid);
  931. int cNewOpLot = U8Helper.ExecuteDataTable(sql, cmd).Rows.Count;
  932. if (cNewOpLot > 0)
  933. {
  934. throw new Exception("新条码" + LOTNO + "已生成工序");
  935. }
  936. #region Sql- 工艺工序下发
  937. sql = @"
  938. IF NOT EXISTS(SELECT 1 FROM ICSITEMROUTE2OPLot WHERE LotNo=@oldLOTNO AND ROUTECODE=@ROUTECODE AND OPSEQ>@OPSEQ)
  939. BEGIN
  940. INSERT INTO [dbo].[ICSITEMROUTE2OPLot]
  941. ([ITEMCODE]
  942. ,[ROUTECODE]
  943. ,[OPCODE]
  944. ,[OPSEQ]
  945. ,[OPCONTROL]
  946. ,[OPTIONALOP]
  947. ,[IDMERGETYPE]
  948. ,[IDMERGERULE]
  949. ,[MUSER]
  950. ,[MUSERName]
  951. ,[MTIME]
  952. ,[WorkPoint]
  953. ,[EATTRIBUTE1]
  954. ,[LotNo]
  955. ,[ID]
  956. ,[OPAttr]
  957. ,[CtrlType]
  958. ,[RouteMGR]
  959. ,[OPLVL]
  960. ,[EQPCODE]
  961. ,[WTIME]
  962. ,[RTIME]
  963. ,[STIME])
  964. SELECT
  965. [ITEMCODE]
  966. ,[ROUTECODE]
  967. ,'9999'
  968. ,9999
  969. ,[OPCONTROL]
  970. ,[OPTIONALOP]
  971. ,[IDMERGETYPE]
  972. ,[IDMERGERULE]
  973. ,@MUSER
  974. ,@MUSERName
  975. ,@MTIME
  976. ,[WorkPoint]
  977. ,[EATTRIBUTE1]
  978. ,@LOTNO
  979. ,NEWID()
  980. ,''
  981. ,''
  982. ,[RouteMGR]
  983. ,[OPLVL]
  984. ,[EQPCODE]
  985. ,[WTIME]
  986. ,[RTIME]
  987. ,[STIME]
  988. FROM ICSITEMROUTE2OPLot WHERE LotNo=@oldLOTNO AND ROUTECODE=@ROUTECODE AND OPSEQ=@OPSEQ
  989. END
  990. ELSE
  991. BEGIN
  992. INSERT INTO [dbo].[ICSITEMROUTE2OPLot]
  993. ([ITEMCODE]
  994. ,[ROUTECODE]
  995. ,[OPCODE]
  996. ,[OPSEQ]
  997. ,[OPCONTROL]
  998. ,[OPTIONALOP]
  999. ,[IDMERGETYPE]
  1000. ,[IDMERGERULE]
  1001. ,[MUSER]
  1002. ,[MUSERName]
  1003. ,[MTIME]
  1004. ,[WorkPoint]
  1005. ,[EATTRIBUTE1]
  1006. ,[LotNo]
  1007. ,[ID]
  1008. ,[OPAttr]
  1009. ,[CtrlType]
  1010. ,[RouteMGR]
  1011. ,[OPLVL]
  1012. ,[EQPCODE]
  1013. ,[WTIME]
  1014. ,[RTIME]
  1015. ,[STIME])
  1016. SELECT
  1017. [ITEMCODE]
  1018. ,[ROUTECODE]
  1019. ,[OPCODE]
  1020. ,[OPSEQ]
  1021. ,[OPCONTROL]
  1022. ,[OPTIONALOP]
  1023. ,[IDMERGETYPE]
  1024. ,[IDMERGERULE]
  1025. ,@MUSER
  1026. ,@MUSERName
  1027. ,@MTIME
  1028. ,[WorkPoint]
  1029. ,[EATTRIBUTE1]
  1030. ,@LOTNO
  1031. ,NEWID()
  1032. ,[OPAttr]
  1033. ,[CtrlType]
  1034. ,[RouteMGR]
  1035. ,[OPLVL]
  1036. ,[EQPCODE]
  1037. ,[WTIME]
  1038. ,[RTIME]
  1039. ,[STIME]
  1040. FROM ICSITEMROUTE2OPLot WHERE LotNo=@oldLOTNO AND ROUTECODE=@ROUTECODE AND OPSEQ>@OPSEQ
  1041. END
  1042. ";
  1043. #endregion
  1044. cmd.Parameters.Clear();
  1045. SqlParameter[] pms2 = {
  1046. new SqlParameter("@oldLOTNO",DbType.String){ Value=oldLOTNO },
  1047. new SqlParameter("@LotNO",DbType.String){ Value=LOTNO },
  1048. new SqlParameter("@ROUTECODE",DbType.Decimal){ Value=ROUTECODE },
  1049. new SqlParameter("@OPSEQ",DbType.Int32){ Value=OPSEQ },
  1050. new SqlParameter("@MTIME",DbType.DateTime){ Value=timeNow },
  1051. new SqlParameter("@MUSER",DbType.String){ Value=UserCode },
  1052. new SqlParameter("@MUSERName",DbType.String){ Value=UserName }
  1053. };
  1054. cmd.Parameters.AddRange(pms2);
  1055. U8Helper.ExecuteNonQuery(sql, cmd);
  1056. #region Sql- 后续工序派工信息继承原跟踪单
  1057. sql = @"
  1058. INSERT INTO [dbo].[ICSMO2User]
  1059. ([ID]
  1060. ,[MOCODE]
  1061. ,[MOSEQ]
  1062. ,[LOTNO]
  1063. ,[SEGCODE]
  1064. ,[RouteCode]
  1065. ,[OPCODE]
  1066. ,[USERCODE]
  1067. ,[USERName]
  1068. ,[EQPCode]
  1069. ,[EQPName]
  1070. ,[StartPlanDate]
  1071. ,[EndPlanDate]
  1072. ,[MUSER]
  1073. ,[MUSERName]
  1074. ,[MTIME]
  1075. ,[WorkPoint]
  1076. ,[EATTRIBUTE1]
  1077. ,[PRLineID]
  1078. ,[PRQTY])
  1079. SELECT
  1080. NEWID()
  1081. ,B.[MOCODE]
  1082. ,B.[MOSEQ]
  1083. ,@LOTNO
  1084. ,B.[SEGCODE]
  1085. ,B.[RouteCode]
  1086. ,B.[OPCODE]
  1087. ,B.[USERCODE]
  1088. ,B.[USERName]
  1089. ,B.[EQPCode]
  1090. ,B.[EQPName]
  1091. ,B.[StartPlanDate]
  1092. ,B.[EndPlanDate]
  1093. ,B.[MUSER]
  1094. ,B.[MUSERName]
  1095. ,B.[MTIME]
  1096. ,B.[WorkPoint]
  1097. ,B.[EATTRIBUTE1]
  1098. ,B.[PRLineID]
  1099. ,B.[PRQTY]
  1100. FROM [dbo].[ICSITEMROUTE2OPLot] A
  1101. INNER JOIN [dbo].[ICSMO2User] B ON B.LotNo=A.LOTNO AND B.OPCODE=A.OPCODE AND B.WorkPoint=A.WorkPoint
  1102. WHERE A.LOTNO =@oldLOTNO AND A.ROUTECODE=@ROUTECODE AND A.WorkPoint=@WorkPoint AND A.OPSEQ>@OPSEQ
  1103. INSERT INTO [dbo].[ICSMO2UserDetail]
  1104. ([ID]
  1105. ,[DID]
  1106. ,[EQPID]
  1107. ,[PLANQTY]
  1108. ,[PLANSTART]
  1109. ,[PLANEND]
  1110. ,[PLANTIME]
  1111. ,[AVAILABLE])
  1112. SELECT
  1113. B.[ID]
  1114. ,NEWID()
  1115. ,C.[EQPID]
  1116. ,C.[PLANQTY]
  1117. ,C.[PLANSTART]
  1118. ,C.[PLANEND]
  1119. ,C.[PLANTIME]
  1120. ,C.[AVAILABLE]
  1121. FROM [dbo].[ICSITEMROUTE2OPLot] A
  1122. INNER JOIN [dbo].[ICSMO2User] B ON A.LotNo=B.LOTNO AND A.OPCODE=B.OPCODE AND A.WorkPoint=B.WorkPoint
  1123. INNER JOIN (
  1124. SELECT A.LOTNO,A.RouteCode,A.OPCODE,A.WorkPoint,B.PLANQTY,B.EQPID,B.PLANSTART,B.PLANEND,B.PLANTIME,B.AVAILABLE
  1125. FROM [dbo].[ICSMO2User] A
  1126. INNER JOIN [dbo].[ICSMO2UserDetail] B ON B.ID=A.ID
  1127. WHERE A.LOTNO=@oldLOTNO AND A.RouteCode=@ROUTECODE AND A.OPCODE=@OPCODE AND A.WorkPoint=@WorkPoint
  1128. ) C ON C.RouteCode=B.RouteCode AND C.OPCODE=B.OPCODE AND C.WorkPoint=B.WorkPoint
  1129. WHERE A.LOTNO =@LOTNO AND A.ROUTECODE=@ROUTECODE AND A.WorkPoint=@WorkPoint AND A.OPSEQ>@OPSEQ
  1130. ";
  1131. #endregion
  1132. cmd.Parameters.Clear();
  1133. SqlParameter[] pms3 = {
  1134. new SqlParameter("@oldLOTNO",DbType.String){ Value=oldLOTNO },
  1135. new SqlParameter("@LotNO",DbType.String){ Value=LOTNO },
  1136. new SqlParameter("@ROUTECODE",DbType.Decimal){ Value=ROUTECODE },
  1137. new SqlParameter("@OPSEQ",DbType.Int32){ Value=OPSEQ },
  1138. new SqlParameter("@OPCODE",DbType.Int32){ Value=OPCODE }
  1139. };
  1140. cmd.Parameters.AddRange(pms3);
  1141. U8Helper.ExecuteNonQuery(sql, cmd);
  1142. }
  1143. catch (Exception ex)
  1144. {
  1145. throw new Exception("返工分批(自动)出错: \r\n" + ex.Message);
  1146. }
  1147. }
  1148. /// <summary>
  1149. /// 对于委外工序批量退货
  1150. /// </summary>
  1151. /// <param name="cmd"></param>
  1152. /// <param name="WIPID"></param>
  1153. public static void ResetWW(SqlCommand cmd, string WIPID)
  1154. {
  1155. cmd.Parameters.Clear();
  1156. string WorkPoint = "";
  1157. string ITEMCODE = "";
  1158. string LOTNO = "";
  1159. string LOTSEQ = "";
  1160. string ROUTECODE = "";
  1161. string OPCODE = "";
  1162. int OPSEQ = -1;
  1163. string PRLineID = "";
  1164. int BKSEQ = 1;
  1165. //
  1166. string sql = @"
  1167. SELECT
  1168. A.ITEMCODE,A.LOTNO,A.LOTSEQ,A.ROUTECODE,A.OPSEQ,A.OPCODE,A.WorkPoint,
  1169. B.PRLineID
  1170. FROM dbo.ICSLOTONWIP A
  1171. LEFT JOIN dbo.ICSMO2User B ON B.LOTNO=A.LOTNO AND B.RouteCode=A.ROUTECODE AND B.OPCODE=A.OPCODE
  1172. WHERE A.ID='{0}'";
  1173. sql = string.Format(sql, WIPID);
  1174. DataTable dtOnwip = U8Helper.ExecuteDataTable(sql, cmd);
  1175. if (dtOnwip.Rows.Count == 0)
  1176. {
  1177. throw new Exception("报工主表数据不存在" + WIPID);
  1178. }
  1179. WorkPoint = dtOnwip.Rows[0]["WorkPoint"].ToString();
  1180. ITEMCODE = dtOnwip.Rows[0]["ITEMCODE"].ToString();
  1181. LOTNO = dtOnwip.Rows[0]["LOTNO"].ToString();
  1182. LOTSEQ = dtOnwip.Rows[0]["LOTSEQ"].ToString();
  1183. OPCODE = dtOnwip.Rows[0]["OPCODE"].ToString();
  1184. OPSEQ = Convert.ToInt32(dtOnwip.Rows[0]["OPSEQ"]);
  1185. PRLineID = dtOnwip.Rows[0]["PRLineID"].ToString();
  1186. //0.获取序号
  1187. sql = @"SELECT ISNULL(MAX(BKSEQ),0)+1 FROM [dbo].[ICSLOTONWIP_BK] WHERE ID='{0}'";
  1188. sql = string.Format(sql, WIPID);
  1189. BKSEQ = Convert.ToInt32(U8Helper.ExecuteDataTable(sql, cmd).Rows[0][0]);
  1190. //1.删除排序表,不备份
  1191. sql = @"DELETE FROM dbo.ICSLOTONWIPCheckTop WHERE FORTRANID='{0}'";
  1192. sql = string.Format(sql, WIPID);
  1193. U8Helper.ExecuteNonQuery(sql, cmd);
  1194. //2.获取检验相关表id
  1195. sql = @"
  1196. SELECT DISTINCT
  1197. WIP.ID AS WIPID,
  1198. CHK.ID AS CHKID,
  1199. CHKDET.ID AS DETID,
  1200. NCR.ID AS NCRID
  1201. FROM dbo.ICSLOTONWIP WIP
  1202. LEFT JOIN dbo.ICSLOTONWIPCheck CHK ON CHK.FORTRANID=WIP.ID
  1203. LEFT JOIN dbo.ICSLOTONWIPCheckDetail CHKDET ON CHKDET.FORTRANID=CHK.ID
  1204. LEFT JOIN dbo.ICSLOTONWIPCheckNCR NCR ON NCR.CheckID=CHKDET.ID
  1205. WHERE WIP.ID='{0}'";
  1206. sql = string.Format(sql, WIPID);
  1207. DataTable dt = U8Helper.ExecuteDataTable(sql, cmd);
  1208. string CHKID = dt.Rows[0]["CHKID"].ToString();
  1209. foreach (DataRow dr in dt.Rows)
  1210. {
  1211. string NCRID = dr["NCRID"].ToString();
  1212. string DETID = dr["DETID"].ToString();
  1213. //备份.删除ICSLOTONWIPCheckNCR
  1214. sql = @"
  1215. INSERT INTO [dbo].[ICSLOTONWIPCheckNCR_BK] SELECT {0},* FROM [dbo].[ICSLOTONWIPCheckNCR] WHERE ID='{1}'
  1216. DELETE FROM [dbo].[ICSLOTONWIPCheckNCR] WHERE ID='{1}'
  1217. ";
  1218. sql = string.Format(sql, BKSEQ, NCRID);
  1219. U8Helper.ExecuteNonQuery(sql, cmd);
  1220. //备份.删除ICSLOTONWIPCheckDetail
  1221. sql = @"
  1222. INSERT INTO [dbo].[ICSLOTONWIPCheckDetail_BK] SELECT {0},* FROM [dbo].[ICSLOTONWIPCheckDetail] WHERE ID='{1}'
  1223. DELETE FROM [dbo].[ICSLOTONWIPCheckDetail] WHERE ID='{1}'
  1224. ";
  1225. sql = string.Format(sql, BKSEQ, DETID);
  1226. U8Helper.ExecuteNonQuery(sql, cmd);
  1227. }
  1228. //删除ICSLOTONWIPCheckPause,不备份
  1229. sql = @"DELETE FROM ICSLOTONWIPCheckPause WHERE CheckID='{0}'";
  1230. sql = string.Format(sql, CHKID);
  1231. U8Helper.ExecuteNonQuery(sql, cmd);
  1232. //备份.删除ICSLOTONWIPCheck
  1233. sql = @"
  1234. INSERT INTO [dbo].[ICSLOTONWIPCheck_BK] SELECT {0},* FROM [dbo].[ICSLOTONWIPCheck] WHERE ID='{1}'
  1235. DELETE FROM [dbo].[ICSLOTONWIPCheck] WHERE ID='{1}'
  1236. ";
  1237. sql = string.Format(sql, BKSEQ, CHKID);
  1238. U8Helper.ExecuteNonQuery(sql, cmd);
  1239. //恢复ICSPO_PoMain数量INQty
  1240. sql = @"
  1241. DECLARE @POCode NVARCHAR(50),@PORow NVARCHAR(50),@TransQTY DECIMAL(18,6)
  1242. 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}'
  1243. UPDATE ICSPO_PoMain SET INQty=INQty-@TransQTY WHERE POCode=@POCode AND PORow=@PORow AND Free1='{2}' AND WorkPoint='{3}'
  1244. ";
  1245. sql = string.Format(sql, LOTNO, ITEMCODE + "_" + OPCODE, PRLineID, WorkPoint);
  1246. U8Helper.ExecuteNonQuery(sql, cmd);
  1247. //删除ICSWareHouseLotInfoLog,不备份
  1248. sql = @"DELETE FROM dbo.ICSWareHouseLotInfoLog WHERE LotNO='{0}' AND ITEMCODE='{1}' AND (BusinessCode='委外发料' OR BusinessCode='委外收料' ) AND EATTRIBUTE1='{2}' AND WorkPoint='{3}'";
  1249. sql = string.Format(sql, LOTNO, ITEMCODE + "_" + OPCODE, PRLineID, WorkPoint);
  1250. U8Helper.ExecuteNonQuery(sql, cmd);
  1251. //备份.删除ICSLOTONWIP
  1252. sql = @"
  1253. INSERT INTO [dbo].[ICSLOTONWIP_BK] SELECT {0},* FROM [dbo].[ICSLOTONWIP] WHERE ID='{1}'
  1254. DELETE FROM [dbo].[ICSLOTONWIP] WHERE ID='{1}'
  1255. ";
  1256. sql = string.Format(sql, BKSEQ, WIPID);
  1257. U8Helper.ExecuteNonQuery(sql, cmd);
  1258. //删除ICSLOTSIMULATION(如果此委外工序是第一道工序)
  1259. //跟踪单取消结束状态,ICSLOTSIMULATION (如果此委外工序是最后一道工序)
  1260. sql = @"SELECT MIN(OPSEQ),MAX(OPSEQ) FROM dbo.ICSITEMROUTE2OPLot WHERE LotNo='{0}' AND ROUTECODE='{1}' AND WorkPoint='{2}' ";
  1261. sql = string.Format(sql, LOTNO, ROUTECODE, WorkPoint);
  1262. DataTable dtOPSEQ = U8Helper.ExecuteDataTable(sql, cmd);
  1263. int minOPSEQ = Convert.ToInt32(dtOPSEQ.Rows[0][0]);
  1264. int maxOPSEQ = Convert.ToInt32(dtOPSEQ.Rows[0][1]);
  1265. if (maxOPSEQ == OPSEQ)
  1266. {
  1267. sql = @"UPDATE dbo.ICSLOTSIMULATION SET ISCOM='0' WHERE LOTNO='{0}' AND LOTSEQ='{1}' AND WorkPoint='{2}'";
  1268. sql = string.Format(sql, LOTNO, LOTSEQ, WorkPoint);
  1269. U8Helper.ExecuteNonQuery(sql, cmd);
  1270. }
  1271. if (minOPSEQ == OPSEQ)
  1272. {
  1273. sql = @"DELETE FROM dbo.ICSLOTSIMULATION WHERE LOTNO='{0}' AND LOTSEQ='{1}' AND WorkPoint='{2}'";
  1274. sql = string.Format(sql, LOTNO, LOTSEQ, WorkPoint);
  1275. U8Helper.ExecuteNonQuery(sql, cmd);
  1276. }
  1277. }
  1278. private static class U8Helper
  1279. {
  1280. public static DataTable ExecuteDataTable(string sql, SqlCommand cmd)
  1281. {
  1282. DataTable dt = new DataTable();
  1283. SqlDataAdapter dr = new System.Data.SqlClient.SqlDataAdapter();
  1284. cmd.CommandText = sql;
  1285. dr.SelectCommand = cmd;
  1286. dr.Fill(dt);
  1287. return dt;
  1288. }
  1289. public static bool ExecuteNonQuery(string sql, SqlCommand cmd)
  1290. {
  1291. try
  1292. {
  1293. cmd.CommandText = sql;
  1294. int result = cmd.ExecuteNonQuery();
  1295. if (result > 0)
  1296. {
  1297. return true;
  1298. }
  1299. else
  1300. {
  1301. return false;
  1302. }
  1303. }
  1304. catch (Exception ex)
  1305. {
  1306. string Params = string.Empty;
  1307. foreach (SqlParameter parameter in cmd.Parameters)
  1308. {
  1309. Params += parameter.SqlValue + "||";
  1310. }
  1311. throw new Exception("程序异常!");
  1312. }
  1313. }
  1314. }
  1315. }
  1316. }