纽威
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.

436 lines
21 KiB

3 years ago
  1. using ICSSoft.Common;
  2. using ICSSoft.Entity;
  3. using Newtonsoft.Json;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Data.SqlClient;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace ICSSoft.DataProject
  12. {
  13. /// <summary>
  14. /// 成品入库单
  15. /// </summary>
  16. public class ManufactureReceiveDoc
  17. {
  18. private static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
  19. private static string connString = System.Configuration.ConfigurationManager.AppSettings["ERPConnStr"];
  20. private static string ERPDB = System.Configuration.ConfigurationManager.AppSettings["ERPDB"];
  21. private static string Type = System.Configuration.ConfigurationManager.AppSettings["Type"];
  22. /// <summary>
  23. /// 获取成品入库单
  24. /// </summary>
  25. /// <param name="infos"></param>
  26. /// <returns></returns>
  27. public string Get(List<ICSManufactureReceiveDoc> infos)
  28. {
  29. List<ICSManufactureReceiveDoc> szJson = new List<ICSManufactureReceiveDoc>();
  30. DataTable dt = null;
  31. string json = "";
  32. if (infos.Count <= 0)
  33. {
  34. throw new Exception("传送数据为空!");
  35. }
  36. string res = string.Empty;
  37. SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString);
  38. conn.Open();
  39. SqlTransaction sqlTran = conn.BeginTransaction();
  40. SqlCommand cmd = new SqlCommand();
  41. cmd.Transaction = sqlTran;
  42. cmd.Connection = conn;
  43. try
  44. {
  45. string sql = string.Empty;
  46. foreach (ICSManufactureReceiveDoc info in infos)
  47. {
  48. if (info.MTime < new DateTime(2000, 01, 01))
  49. throw new Exception("请输入正确的操作时间:" + info.MTime);
  50. sql = @" select a.ID,a.cCode,a.cDepCode,c.cDepName,a.cWhCode,d.cWhName,a.cMPoCode ,a.cMaker ,a.dnmaketime ,a.cHandler ,a.dnverifytime ,
  51. b.AutoID,b.iRSRowNO ,b.cInvCode ,b.iQuantity ,b.iNum ,b.iMPoIds from rdrecord10 a
  52. left join rdrecords10 b on a.ID=b.ID
  53. left join Department c on a.cDepCode=c.cDepCode
  54. left join Warehouse d on a.cWhCode=d.cWhCode WHERE 1=1";
  55. if (!string.IsNullOrWhiteSpace(info.MRCVCode))
  56. {
  57. sql += " and a.cCode='{0}'";
  58. }
  59. if (!string.IsNullOrWhiteSpace(info.MTime.ToString()))
  60. {
  61. sql += " and ISNULL(a.dnmodifytime,ISNULL(a.dnverifytime, ISNULL(a.dnmodifytime, a.dnmaketime)))>='{1}'";
  62. }
  63. if (!string.IsNullOrWhiteSpace(info.User))
  64. {
  65. sql += "and a.CMAKER='{2}'";
  66. }
  67. sql = string.Format(sql, info.MRCVCode, info.MTime, info.User);
  68. dt = DBHelper.SQlReturnData(sql, cmd);
  69. json = JsonConvert.SerializeObject(dt);
  70. if (dt.Rows.Count <= 0 || dt == null)
  71. throw new Exception("成品入库单:" + info.MRCVCode + ",无信息!");
  72. }
  73. cmd.Transaction.Commit();
  74. return json;
  75. }
  76. catch (Exception ex)
  77. {
  78. cmd.Transaction.Rollback();
  79. log.Error(ex.Message);
  80. throw new Exception(ex.Message);
  81. }
  82. finally
  83. {
  84. if (conn.State == ConnectionState.Open)
  85. {
  86. conn.Close();
  87. }
  88. conn.Dispose();
  89. }
  90. }
  91. /// <summary>
  92. /// 创建成品入库单
  93. /// </summary>
  94. /// <param name="Bills"></param>
  95. /// <returns></returns>
  96. public string CreateManufactureReceiveDoc(List<ICSManufactureReceiveDoc> Bills)
  97. {
  98. string msg = "";
  99. DataTable dt = null;
  100. int num = 0;
  101. foreach (ICSManufactureReceiveDoc head in Bills)
  102. {
  103. num = head.ICSMfaReDoc.Count();
  104. }
  105. //取得out库单的默认显示模版
  106. Dictionary<string, int> dic = DBHelper.GetAllCode("" + ERPDB + "", "ReceiveDoc", "" + num + "");
  107. int iFatherId = Convert.ToInt32(dic["iFatherId"].ToString());
  108. int iChildId = Convert.ToInt32(dic["iChildId"].ToString());
  109. DateTime date = DateTime.Now;
  110. string iBaseCodeLen = DBHelper.GetAllRDCode("0411", "" + date + "", "admin");
  111. //取得采购入库单单据 表头ID,表体DID
  112. VouchKey key = new VouchKey();
  113. bool ResultFlag = false;
  114. SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString);
  115. conn.Open();
  116. SqlTransaction sqlTran = conn.BeginTransaction();
  117. SqlCommand cmd = new SqlCommand();
  118. cmd.Transaction = sqlTran;
  119. cmd.Connection = conn;
  120. try
  121. {
  122. if (Bills.Count <= 0)
  123. {
  124. throw new Exception("传送数据为空!");
  125. }
  126. LogInfo(Bills);
  127. //MergeObject(Bills, cmd);
  128. //string ERPName = U8Helper.GetERPName();
  129. foreach (ICSManufactureReceiveDoc head in Bills)
  130. {
  131. string sql = string.Empty;
  132. //Person personEntity = new Person();
  133. //personEntity = U8Helper.GetDepCodeByUserCode(head.UserCode, cmd);
  134. DateTime dvDate = DateTime.Now.Date;
  135. #region 产成品入库单表头
  136. sql = @"INSERT INTO dbo.rdrecord10
  137. ( ID ,bRdFlag ,cVouchType ,cBusType ,cSource ,cWhCode ,dDate ,
  138. cCode ,cRdCode ,cDepCode ,cHandler ,bTransFlag ,cMaker ,
  139. cDefine1 ,cDefine2 ,cDefine3 ,cDefine4 ,cDefine5 ,cDefine6 ,
  140. cDefine7 ,cDefine8 ,cDefine9 ,cDefine10 ,dVeriDate ,bpufirst ,
  141. biafirst ,VT_ID ,bIsSTQc ,cDefine11 ,cDefine12 ,cDefine13 ,
  142. cDefine14 ,cDefine15 ,cDefine16 ,cMPoCode ,iproorderid ,
  143. bFromPreYear ,bIsComplement ,iDiscountTaxType ,ireturncount ,
  144. iverifystate ,iswfcontrolled ,cModifyPerson ,dnmaketime ,
  145. dnverifytime ,bredvouch ,iPrintCount )
  146. SELECT @ID,1,'10','','',@cWhCode,convert(datetime,convert(varchar(10),getdate(),120)),
  147. @cCode,'13',b.MDeptCode,@cHandler,0,@cMaker,
  148. a.Define1,a.Define2,a.Define3,a.Define4,a.Define5,a.Define6,
  149. a.Define7,a.Define8,a.Define9,a.Define10,@dDate,0,
  150. 0,@VT_ID,0,a.Define11,a.Define12,a.Define13,
  151. a.Define14,a.Define15,a.Define16,a.MoCode,a.MoId,
  152. 0,0,0,0,
  153. 0,0,'',@dDate,
  154. @dDate,0,0
  155. FROM dbo.mom_order a
  156. LEFT JOIN dbo.mom_orderdetail b ON a.MoId=b.MoId
  157. WHERE a.MoCode='" + head.MOCode + "'";
  158. cmd.Parameters.Clear();
  159. cmd.Parameters.Add(new SqlParameter("@ID", iFatherId));
  160. cmd.Parameters.Add(new SqlParameter("@cWhCode", head.WHCode));
  161. cmd.Parameters.Add(new SqlParameter("@cCode", iBaseCodeLen));
  162. cmd.Parameters.Add(new SqlParameter("@cDepCode", head.DepCode));
  163. cmd.Parameters.Add(new SqlParameter("@cHandler", head.User));
  164. cmd.Parameters.Add(new SqlParameter("@cMaker", head.User));
  165. cmd.Parameters.Add(new SqlParameter("@VT_ID", iChildId));
  166. cmd.Parameters.Add(new SqlParameter("@dDate", dvDate));
  167. cmd.CommandText = sql;
  168. try
  169. {
  170. int count = cmd.ExecuteNonQuery();
  171. if (count <= 0)
  172. {
  173. log.Error("生成成品入库单表头失败,受影响行数<=0;");
  174. throw new Exception("生成成品入库单表头失败,受影响行数<=0;");
  175. }
  176. }
  177. catch (Exception ex)
  178. {
  179. log.Error("生成成品入库单表头失败!SQL:\r\n" + sql, ex);
  180. throw new Exception("生成成品入库单表头失败!SQL:\r\n" + sql, ex);
  181. }
  182. #endregion
  183. #region 产成品入库单表体
  184. int irowno = 0;
  185. foreach (ICSManufactureReceiveDocs body in head.ICSMfaReDoc)
  186. {
  187. #region 判断工单行是否关闭,关闭不能入库
  188. sql = @"SELECT ISNULL(a.CloseUser,'') as CloseUser,b.MoCode,a.SortSeq FROM dbo.mom_orderdetail a INNER JOIN
  189. dbo.mom_order b ON b.MoId = a.MoId WHERE a.MoDId = '" + body.MODetailID + "'";
  190. DataTable dtCheck = DBHelper.SQlReturnData(sql, cmd);
  191. if (dtCheck != null && dtCheck.Rows.Count > 0)
  192. {
  193. if (!string.IsNullOrEmpty(dtCheck.Rows[0]["CloseUser"].ToString()))
  194. {
  195. throw new Exception("工单号:" + dtCheck.Rows[0]["MoCode"].ToString() + ",行号:" + dtCheck.Rows[0]["SortSeq"].ToString() + ",已关闭,无法入库!");
  196. }
  197. }
  198. #endregion
  199. #region 生成产成品入库单表体
  200. irowno += 1;
  201. iChildId -= 1;
  202. //if (head.IsReturn == "1")
  203. //{
  204. // body.iQuantity = -body.iQuantity;
  205. //}
  206. sql = @"INSERT INTO dbo.rdrecords10
  207. ( AutoID ,ID ,cInvCode ,iQuantity ,cBatch ,iFlag ,
  208. cDefine22 ,cDefine23 ,cDefine24 ,cDefine25 ,cDefine26 ,cDefine27 ,
  209. cItemCode ,cName ,iNQuantity ,cDefine28 ,
  210. cDefine29 ,cDefine30 ,cDefine31 ,cDefine32 ,cDefine33 ,cDefine34 ,
  211. cDefine35 ,cDefine36 ,cDefine37 ,iMPoIds ,bRelated ,bLPUseFree ,
  212. iRSRowNO ,iOriTrackID ,bCosting ,cmocode ,imoseq ,iExpiratDateCalcu ,
  213. iorderdid ,iordertype,iordercode,iorderseq,isodid,isotype,csocode,isoseq,irowno ,iposflag )
  214. SELECT @AutoID,@ID,@cInvCode,@iQuantity,@cBatch,0,
  215. a.Define22,a.Define23,a.Define24,a.Define25,a.Define26,a.Define27,
  216. null,null,a.Qty,a.Define28,
  217. a.Define29,a.Define30,a.Define31,a.Define32,a.Define33,a.Define34,
  218. a.Define35,a.Define36,a.Define37,a.MoDId,0,0,
  219. 0,0,1,b.MoCode,a.SortSeq,0,
  220. a.OrderDid,a.OrderType,a.OrderCode,a.OrderSeq,a.SoDId,a.SoType,a.SoCode,a.SoSeq,@irowno,0
  221. FROM dbo.mom_orderdetail a
  222. INNER JOIN dbo.mom_order b ON a.MoId=b.MoId WHERE a.MoDId='" + body.MODetailID + "'";
  223. cmd.Parameters.Clear();
  224. cmd.Parameters.Add(new SqlParameter("@AutoID", iChildId));
  225. cmd.Parameters.Add(new SqlParameter("@ID", iFatherId));
  226. cmd.Parameters.Add(new SqlParameter("@cInvCode",body.InvCode));
  227. cmd.Parameters.Add(new SqlParameter("@iQuantity", body.Quantity));
  228. cmd.Parameters.Add(new SqlParameter("@cBatch", ""));
  229. cmd.Parameters.Add(new SqlParameter("@irowno", irowno));
  230. cmd.CommandText = sql;
  231. try
  232. {
  233. int count = cmd.ExecuteNonQuery();
  234. if (count <= 0)
  235. {
  236. log.Error("生成材料出库单表头失败,受影响行数<=0;");
  237. throw new Exception("生成材料出库单表头失败,受影响行数<=0;");
  238. }
  239. }
  240. catch (Exception ex)
  241. {
  242. log.Error("生成材料出库单表头失败!SQL:\r\n" + sql, ex);
  243. throw new Exception("生成材料出库单表头失败!SQL:\r\n" + sql, ex);
  244. }
  245. #endregion
  246. #region 更新现存量
  247. key.cBustypeUN = "成品入库";
  248. key.cVouchTypeUN = "10";
  249. key.TableName = "IA_ST_UnAccountVouch10";
  250. DBHelper.UpdateCurrentStock(cmd, body.InvCode, head.WHCode, "", body.Quantity, key);
  251. #endregion
  252. #region 回写生产订单入库数量
  253. sql = @"UPDATE dbo.mom_orderdetail SET QualifiedInQty=ISNULL(QualifiedInQty,0)+" + body.Quantity + " where MoDId='" + body.MODetailID + "'";
  254. DBHelper.CmdExecuteNonQuery(sql, cmd, "回写生产订单入库数量失败!");
  255. #endregion
  256. #region 判断工单行是否全部入库
  257. sql = "SELECT (QualifiedInQty - Qty) as qty,QualifiedInQty FROM dbo.mom_orderdetail WHERE MoDId='" + body.MODetailID + "'";
  258. DataTable dtClose = DBHelper.SQlReturnData(sql, cmd);
  259. foreach (DataRow dr in dtClose.Rows)
  260. {
  261. if (Convert.ToDecimal(dr["qty"]) >= 0)
  262. {
  263. sql = "update mom_orderdetail set CloseTime = GETDATE(),CloseDate= CONVERT(NVARCHAR(15),GETDATE(),23), CloseUser ='" + head.User + "',Status=4 where MODId='" + body.MODetailID + "'";
  264. DBHelper.CmdExecuteNonQuery(sql, cmd, "生产订单行关闭失败!");
  265. }
  266. }
  267. #endregion
  268. }
  269. #endregion
  270. sql = @"
  271. select a.ID,a.cCode,a.cDepCode,c.cDepName,a.cWhCode,d.cWhName,a.cMPoCode ,a.cMaker ,a.dnmaketime ,a.cHandler ,a.dnverifytime ,
  272. b.AutoID,b.iRSRowNO ,b.cInvCode ,b.iQuantity ,b.iNum ,b.iMPoIds from rdrecord10 a
  273. left join rdrecords10 b on a.ID=b.ID
  274. left join Department c on a.cDepCode=c.cDepCode
  275. left join Warehouse d on a.cWhCode=d.cWhCode WHERE A.cHandler IS NOT NULL AND A.ID = '{0}' ";
  276. sql = string.Format(sql, iFatherId);
  277. dt = DBHelper.SQlReturnData(sql, cmd);
  278. }
  279. msg = JsonConvert.SerializeObject(dt);
  280. cmd.Transaction.Commit();
  281. ResultFlag = true;
  282. return msg;
  283. }
  284. catch (Exception ex)
  285. {
  286. cmd.Transaction.Rollback();
  287. log.Error(ex.Message);
  288. throw new Exception(ex.Message);
  289. }
  290. finally
  291. {
  292. if (conn.State == ConnectionState.Open)
  293. {
  294. conn.Close();
  295. }
  296. conn.Dispose();
  297. }
  298. }
  299. /// <summary>
  300. /// 审核成品入库单
  301. /// </summary>
  302. /// <param name="infos"></param>
  303. /// <returns></returns>
  304. public string Approve(List<ICSManufactureReceiveDoc> infos)
  305. {
  306. List<ICSManufactureReceiveDoc> szJson = new List<ICSManufactureReceiveDoc>();
  307. DataTable dt = null;
  308. string json = "";
  309. if (infos.Count <= 0)
  310. {
  311. throw new Exception("传送数据为空!");
  312. }
  313. string res = string.Empty;
  314. SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString);
  315. conn.Open();
  316. SqlTransaction sqlTran = conn.BeginTransaction();
  317. SqlCommand cmd = new SqlCommand();
  318. cmd.Transaction = sqlTran;
  319. cmd.Connection = conn;
  320. try
  321. {
  322. string sql = string.Empty;
  323. foreach (ICSManufactureReceiveDoc info in infos)
  324. {
  325. if (info.MTime < new DateTime(2000, 01, 01))
  326. throw new Exception("请输入正确的操作时间:" + info.MTime);
  327. sql = @"UPDATE rdrecord10 SET cHandler ='" + info.User + @"' ,
  328. dnverifytime=CONVERT(VARCHAR(50),GETDATE(),112),dVeriDate=GETDATE() WHERE ID='{0}'";
  329. sql = string.Format(sql,info.ID);
  330. DBHelper.CmdExecuteNonQuery(sql, cmd, "未查询到对应数据!");
  331. }
  332. cmd.Transaction.Commit();
  333. return json;
  334. }
  335. catch (Exception ex)
  336. {
  337. cmd.Transaction.Rollback();
  338. log.Error(ex.Message);
  339. throw new Exception(ex.Message);
  340. }
  341. finally
  342. {
  343. if (conn.State == ConnectionState.Open)
  344. {
  345. conn.Close();
  346. }
  347. conn.Dispose();
  348. }
  349. }
  350. /// <summary>
  351. /// 删除成品入库单
  352. /// </summary>
  353. /// <param name="infos"></param>
  354. /// <returns></returns>
  355. public string Delete(List<ICSManufactureReceiveDoc> infos)
  356. {
  357. List<ICSManufactureReceiveDoc> szJson = new List<ICSManufactureReceiveDoc>();
  358. if (infos.Count <= 0)
  359. {
  360. throw new Exception("传送数据为空!");
  361. }
  362. string res = string.Empty;
  363. SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString);
  364. conn.Open();
  365. SqlTransaction sqlTran = conn.BeginTransaction();
  366. SqlCommand cmd = new SqlCommand();
  367. cmd.Transaction = sqlTran;
  368. cmd.Connection = conn;
  369. try
  370. {
  371. string sql = string.Empty;
  372. foreach (ICSManufactureReceiveDoc info in infos)
  373. {
  374. if (info.MTime < new DateTime(2000, 01, 01))
  375. throw new Exception("请输入正确的操作时间:" + info.MTime);
  376. sql = @" DELETE rdrecord10 WHERE ID={0}";
  377. sql = string.Format(sql, info.ID);
  378. DBHelper.CmdExecuteNonQuery(sql, cmd, "未查询到对应数据!");
  379. }
  380. cmd.Transaction.Commit();
  381. return res;
  382. ;
  383. }
  384. catch (Exception ex)
  385. {
  386. cmd.Transaction.Rollback();
  387. log.Error(ex.Message);
  388. throw new Exception(ex.Message);
  389. }
  390. finally
  391. {
  392. if (conn.State == ConnectionState.Open)
  393. {
  394. conn.Close();
  395. }
  396. conn.Dispose();
  397. }
  398. }
  399. /// <summary>
  400. ///
  401. /// 记录日志
  402. /// </summary>
  403. /// <param name="Bills"></param>
  404. private void LogInfo(List<ICSManufactureReceiveDoc> Bills)
  405. {
  406. string HeadList = string.Empty;
  407. string BodyList = string.Empty;
  408. foreach (ICSManufactureReceiveDoc head in Bills)
  409. {
  410. HeadList += "\r\n 表头主键ID:" + head.ID + ",仓库:" + head.WHCode + ",用户:" + head.User;
  411. foreach (ICSManufactureReceiveDocs body in head.ICSMfaReDoc)
  412. {
  413. BodyList += "\r\n 表体主键ID: " + body.MODetailID + ",数量:" + body.Quantity;
  414. }
  415. }
  416. log.Info(HeadList);
  417. log.Info(BodyList);
  418. }
  419. }
  420. }