MesController.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. using LocalhostMES.Core;
  2. using LocalhostMES.DataBase;
  3. using LocalhostMES.Enums;
  4. using LocalhostMES.Helpers;
  5. using LocalhostMES.Models;
  6. using Newtonsoft.Json;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. using System.Web.Http;
  13. namespace LocalhostMES.Api.Controllers
  14. {
  15. [RoutePrefix("api/mes")]
  16. public class MesController : ApiController
  17. {
  18. private static int _snCounter = 1;
  19. private Management management;
  20. public MesController()
  21. {
  22. management = Management.GetManagement();
  23. }
  24. #region 2.1 厂级MES下发工单信息
  25. [HttpPost]
  26. [Route("receiveWorkOrder")]
  27. public IHttpActionResult ReceiveWorkOrder([FromBody] WorkOrderRequest request)
  28. {
  29. try
  30. {
  31. LogHelper.WriteLogInfo("厂级MES下发工单信息");
  32. // 验证必填字段
  33. if ( string.IsNullOrEmpty(request.WorkOrderNo) ||
  34. string.IsNullOrEmpty(request.MaterialCode) ||
  35. string.IsNullOrEmpty(request.MaterialName) ||
  36. string.IsNullOrEmpty(request.LineCode) )
  37. {
  38. LogHelper.WriteLogInfo("必填字段不能为空");
  39. return BadRequest("必填字段不能为空");
  40. }
  41. // 工单状态验证
  42. if ( !IsValidStatus(request.Status) )
  43. {
  44. LogHelper.WriteLogInfo("无效的工单状态");
  45. return BadRequest($"无效的工单状态: {request.Status}");
  46. }
  47. // 创建或更新工单信息
  48. var workOrder = new WorkOrderInfo
  49. {
  50. WorkOrderNo = request.WorkOrderNo,
  51. MaterialCode = request.MaterialCode,
  52. OrderNo = request.OrderNo,
  53. MaterialName = request.MaterialName,
  54. PlannedQuantity = int.TryParse(request.WorkOrderNum, out var qty) ? qty : 0,
  55. CompletedQuantity = 0,
  56. Status = request.Status,
  57. LineCode = request.LineCode,
  58. CreateTime = DateTime.Now,
  59. StartTime = DateTime.Now.AddSeconds(2),
  60. EndTime = DateTime.Now.AddSeconds(5)
  61. };
  62. if ( DatabaseHelper.InsertWorkOrderInfo(workOrder) )
  63. {
  64. var response = new ApiResponse<bool>
  65. {
  66. code = "200",
  67. success = true,
  68. msg = "工单接收成功",
  69. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  70. traceId = Guid.NewGuid().ToString("N").Substring(0, 24),
  71. data = true
  72. };
  73. LogHelper.WriteLogInfo("工单接收成功");
  74. return Ok(response);
  75. }
  76. else
  77. {
  78. var errorResponse = new ErrorResponse
  79. {
  80. code = "55000",
  81. success = false,
  82. msg = $"工单接收失败:数据库插入异常",
  83. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  84. traceId = Guid.NewGuid().ToString("N").Substring(0, 24)
  85. };
  86. LogHelper.WriteLogInfo("数据库插入异常");
  87. return Content(System.Net.HttpStatusCode.InternalServerError, errorResponse);
  88. }
  89. }
  90. catch ( Exception ex )
  91. {
  92. var errorResponse = new ErrorResponse
  93. {
  94. code = "55000",
  95. success = false,
  96. msg = $"工单接收失败: {ex.Message}",
  97. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  98. traceId = Guid.NewGuid().ToString("N").Substring(0, 24)
  99. };
  100. return Content(System.Net.HttpStatusCode.InternalServerError, errorResponse);
  101. }
  102. }
  103. [HttpGet]
  104. [Route("getWorkOrders")]
  105. public IHttpActionResult GetWorkOrders()
  106. {
  107. try
  108. {
  109. LogHelper.WriteLogInfo("接口getWorkOrders收到消息");
  110. var workOrders = DatabaseHelper.SelectWorkOrderInfo(null);
  111. var response = new ApiResponse<List<WorkOrderInfo>>
  112. {
  113. code = "200",
  114. success = true,
  115. msg = "获取成功",
  116. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  117. traceId = Guid.NewGuid().ToString("N").Substring(0, 24),
  118. data = workOrders
  119. };
  120. return Ok(response);
  121. }
  122. catch ( Exception ex )
  123. {
  124. var errorResponse = new ErrorResponse
  125. {
  126. code = "55000",
  127. success = false,
  128. msg = $"获取工单失败: {ex.Message}",
  129. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  130. traceId = Guid.NewGuid().ToString("N").Substring(0, 24)
  131. };
  132. return Content(System.Net.HttpStatusCode.InternalServerError, errorResponse);
  133. }
  134. }
  135. #endregion
  136. #region 2.2 SN打印请求
  137. [HttpPost]
  138. [Route("requestSnPrint")]
  139. public async Task<IHttpActionResult> RequestSnPrint([FromBody] SnPrintRequest request)
  140. {
  141. try
  142. {
  143. // 验证请求头
  144. if ( !ValidateHeaders() )
  145. {
  146. return Unauthorized();
  147. }
  148. // 验证必填字段
  149. if ( string.IsNullOrEmpty(request.workOrderNo) || request.count <= 0 )
  150. {
  151. return BadRequest("工单号和数量为必填项且数量必须大于0");
  152. }
  153. var workOrder = DatabaseHelper.SelectWorkOrderInfo(request.workOrderNo);
  154. // 验证工单是否存在
  155. if ( workOrder.Count == 0 )
  156. {
  157. return BadRequest($"工单 {request.workOrderNo} 不存在");
  158. }
  159. // 验证打印类型
  160. if ( request.printType < 1 || request.printType > 4 )
  161. {
  162. return BadRequest($"无效的打印类型: {request.printType}");
  163. }
  164. LogHelper.WriteLogInfo("请求参数:");
  165. LogHelper.WriteLogInfo(JsonConvert.SerializeObject(request, Formatting.Indented));
  166. if ( workOrder[ 0 ].IsLocalhost )
  167. {
  168. var Manualsninfo = DatabaseHelper.SelectSnInfo(request.workOrderNo);
  169. var WorkOrder= DatabaseHelper.SelectWorkOrderInfo(request.workOrderNo);
  170. DatabaseHelper.InsertSnInfo(new SnInfo()
  171. {
  172. Sn = WorkOrder[ 0 ].MaterialCode + "000001" + DateCodeConverter.GetYearCode(DateTime.Now.Year) +
  173. DateCodeConverter.GetMonthCode(DateTime.Now.Month) +
  174. DateCodeConverter.GetDayCode(DateTime.Now.Day) +
  175. "00000" + ( Manualsninfo.Count + 1 ),
  176. IsUsed = false,
  177. WorkOrderNo = request.workOrderNo,
  178. GenerateTime = DateTime.Now,
  179. PrintType = "1",
  180. });
  181. }
  182. else
  183. {
  184. var hassninfo = DatabaseHelper.SelectSnInfo(request.workOrderNo, true, false);
  185. if ( hassninfo.Count == 0 )
  186. {
  187. ApiResponse<SnPrintResponseData> mesres = await management.ApiClient.RequestSnPrintAsync(request);
  188. if ( mesres.success && mesres.data != null && mesres.data.Sn.Count != 0 )
  189. {
  190. for ( int i = 0; i < mesres.data.Sn.Count; i++ )
  191. {
  192. if ( !DatabaseHelper.InsertSnInfo(new SnInfo()
  193. {
  194. WorkOrderNo = mesres.data.WorkOrderNo,
  195. Sn = mesres.data.Sn[ i ].Sn,
  196. GenerateTime = DateTime.Now,
  197. PrintType = "1",
  198. IsUsed = false,
  199. }) )
  200. {
  201. mesres.msg = "插入SN到数据库出错";
  202. mesres.success = false;
  203. return Content(System.Net.HttpStatusCode.InternalServerError, mesres);
  204. }
  205. }
  206. return Ok(mesres);
  207. }
  208. return Content(System.Net.HttpStatusCode.InternalServerError, mesres);
  209. }
  210. }
  211. var sninfo = DatabaseHelper.SelectSnInfo(request.workOrderNo, true, false);
  212. // 生成SN列表
  213. var snList = new List<SnItem>();
  214. if ( sninfo.Count != 0 )
  215. {
  216. snList.Add(new SnItem { Sn = sninfo[ 0 ].Sn });
  217. var responseData = new SnPrintResponseData
  218. {
  219. Sn = snList,
  220. OrderNo = request.orderNo ?? "",
  221. WorkOrderNo = request.workOrderNo,
  222. Line = request.line ?? "",
  223. VehicleCode = workOrder[0].MaterialCode,
  224. MaterialDesc = workOrder[0].MaterialName
  225. };
  226. var response = new ApiResponse<SnPrintResponseData>
  227. {
  228. code = "200",
  229. success = true,
  230. msg = "SN生成成功",
  231. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  232. traceId = Guid.NewGuid().ToString("N").Substring(0, 24),
  233. data = responseData
  234. };
  235. return Ok(response);
  236. }
  237. var errorResponse = new ErrorResponse
  238. {
  239. code = "55000",
  240. success = false,
  241. msg = $"SN获取失败",
  242. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  243. traceId = Guid.NewGuid().ToString("N").Substring(0, 24)
  244. };
  245. return Content(System.Net.HttpStatusCode.InternalServerError, errorResponse);
  246. }
  247. catch ( Exception ex )
  248. {
  249. var errorResponse = new ErrorResponse
  250. {
  251. code = "55000",
  252. success = false,
  253. msg = $"SN生成失败: {ex.Message}",
  254. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  255. traceId = Guid.NewGuid().ToString("N").Substring(0, 24)
  256. };
  257. return Content(System.Net.HttpStatusCode.InternalServerError, errorResponse);
  258. }
  259. }
  260. [HttpGet]
  261. [Route("getSns/{workOrderNo}")]
  262. public IHttpActionResult GetSns(string workOrderNo)
  263. {
  264. try
  265. {
  266. var sninfo = DatabaseHelper.SelectSnInfo(workOrderNo, true, false);
  267. if ( sninfo.Count != 0 )
  268. {
  269. var response = new ApiResponse<List<SnInfo>>
  270. {
  271. code = "200",
  272. success = true,
  273. msg = "获取成功",
  274. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  275. traceId = Guid.NewGuid().ToString("N").Substring(0, 24),
  276. data = sninfo
  277. };
  278. return Ok(response);
  279. }
  280. var errorResponse = new ErrorResponse
  281. {
  282. code = "55001",
  283. success = false,
  284. msg = $"工单 {workOrderNo} 没有SN记录",
  285. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  286. traceId = Guid.NewGuid().ToString("N").Substring(0, 24)
  287. };
  288. return Content(System.Net.HttpStatusCode.NotFound, errorResponse);
  289. }
  290. catch ( Exception ex )
  291. {
  292. var errorResponse = new ErrorResponse
  293. {
  294. code = "55000",
  295. success = false,
  296. msg = $"获取SN失败: {ex.Message}",
  297. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  298. traceId = Guid.NewGuid().ToString("N").Substring(0, 24)
  299. };
  300. return Content(System.Net.HttpStatusCode.InternalServerError, errorResponse);
  301. }
  302. }
  303. #endregion
  304. #region 2.3 接收SN和关键件
  305. [HttpPost]
  306. [Route("receiveSnComponent")]
  307. public async Task<IHttpActionResult> ReceiveSnComponent([FromBody] SnKeyComponentRequest request)
  308. {
  309. try
  310. {
  311. LogHelper.WriteLogInfo($"收到请求: 接收SN和关键件");
  312. // 验证请求头
  313. if ( !ValidateHeaders() )
  314. {
  315. return Unauthorized();
  316. }
  317. // 验证必填字段
  318. if ( string.IsNullOrEmpty(request.plant) ||
  319. string.IsNullOrEmpty(request.stationCode) ||
  320. string.IsNullOrEmpty(request.positionCode) ||
  321. // string.IsNullOrEmpty(request.sn) || //之前这里需要扫SN,客户新需求 不扫码。直接按顺序走
  322. string.IsNullOrEmpty(request.scanTime) )
  323. {
  324. return BadRequest("必填字段不能为空");
  325. }
  326. var res = DatabaseHelper.SelectWorkOrderInfo();
  327. string stationOrder = "";
  328. string _materialCode="";
  329. if ( request.stationCode.Split('-')[ 2 ] == "L" )
  330. {
  331. stationOrder = res.LeftOrderNo;
  332. _materialCode = res.LeftCheckCode;
  333. }
  334. else
  335. {
  336. stationOrder = res.RightOrderNo;
  337. _materialCode = res.RightCheckCode;
  338. }
  339. var workOrder = DatabaseHelper.SelectWorkOrderInfo(stationOrder);
  340. // 验证工单是否存在
  341. if ( workOrder.Count == 0 )
  342. {
  343. return BadRequest($"工单 {res.LeftOrderNo} 不存在");
  344. }
  345. if ( string.IsNullOrEmpty(request.sn) )
  346. {
  347. List<LocalhostPartInfo> partInfos= DatabaseHelper.SelectPartInfo(_materialCode, request.stationCode);
  348. if ( partInfos.Count != 0 )
  349. {
  350. SnInfo info= DatabaseHelper.SelectSnInfoForStation(stationOrder, partInfos[ 0 ].StationType);
  351. if ( info != null )
  352. {
  353. request.sn = info.Sn;
  354. }
  355. }
  356. else
  357. {
  358. return BadRequest($"工站信息不存在");
  359. }
  360. }
  361. if ( workOrder[ 0 ].IsLocalhost )
  362. {
  363. return Ok(new ApiResponse<bool?>() { data = true });
  364. }
  365. // 处理关键件绑定
  366. if ( request.part != null && request.part.Count > 0 )
  367. {
  368. foreach ( var part in request.part )
  369. {
  370. if ( string.IsNullOrEmpty(part.partNum) )
  371. {
  372. return BadRequest("关键件条码不能为空");
  373. }
  374. var bindRecord = new BindRecord
  375. {
  376. Sn = request.sn,
  377. PartNum = part.partNum,
  378. StationCode = request.stationCode,
  379. BindTime = DateTime.TryParse(request.scanTime, out var scanTime) ? scanTime : DateTime.Now,
  380. Employee = request.employee ?? "",
  381. ScanType = request.scanTpye
  382. };
  383. DatabaseHelper.InsertBindRecord(bindRecord);
  384. if ( workOrder[ 0 ].IsLocalhost )
  385. {
  386. //if (DatabaseHelper.GetProductProductionRecords(request.sn) == 0)
  387. //{
  388. var response = new ApiResponse<bool>
  389. {
  390. code = "200",
  391. success = true,
  392. msg = "已存在记录",
  393. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  394. traceId = Guid.NewGuid().ToString("N").Substring(0, 24),
  395. data = true
  396. };
  397. return Ok(response);
  398. }
  399. }
  400. }
  401. else
  402. {
  403. var bindRecord = new BindRecord
  404. {
  405. Sn = request.sn,
  406. PartNum ="",
  407. StationCode = request.stationCode,
  408. BindTime = DateTime.TryParse(request.scanTime, out var scanTime) ? scanTime : DateTime.Now,
  409. Employee = request.employee ?? "",
  410. ScanType = request.scanTpye
  411. };
  412. DatabaseHelper.InsertBindRecord(bindRecord);
  413. }
  414. if ( workOrder[ 0 ].IsLocalhost )
  415. {
  416. LogHelper.WriteLogInfo($"收到请求: 接收SN和关键件 成功");
  417. return Ok(new ApiResponse<bool?>() { data = true });
  418. }
  419. var okresponse = await management.ApiClient.SendSnComponentAsync(request);
  420. if ( okresponse.success && okresponse.code == "200" )
  421. {
  422. LogHelper.WriteLogInfo($"收到请求: 接收SN和关键件 成功");
  423. return Ok(okresponse);
  424. }
  425. else
  426. {
  427. LogHelper.WriteLogInfo($"收到请求: 接收SN和关键件 失败\r\n" + okresponse.ToString());
  428. okresponse.success = false;
  429. return Content(System.Net.HttpStatusCode.InternalServerError, okresponse);
  430. }
  431. }
  432. catch ( Exception ex )
  433. {
  434. var errorResponse = new ErrorResponse
  435. {
  436. code = "55000",
  437. success = false,
  438. msg = $"SN和关键件接收失败: {ex.Message}",
  439. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  440. traceId = Guid.NewGuid().ToString("N").Substring(0, 24)
  441. };
  442. return Content(System.Net.HttpStatusCode.InternalServerError, errorResponse);
  443. }
  444. }
  445. [HttpGet]
  446. [Route("getBindRecords")]
  447. public IHttpActionResult GetBindRecords()
  448. {
  449. try
  450. {
  451. var records = DatabaseHelper.SelectBindRecord();
  452. var response = new ApiResponse<List<BindRecord>>
  453. {
  454. code = "200",
  455. success = true,
  456. msg = "获取成功",
  457. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  458. traceId = Guid.NewGuid().ToString("N").Substring(0, 24),
  459. data = records
  460. };
  461. return Ok(response);
  462. }
  463. catch ( Exception ex )
  464. {
  465. var errorResponse = new ErrorResponse
  466. {
  467. code = "55000",
  468. success = false,
  469. msg = $"获取绑定记录失败: {ex.Message}",
  470. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  471. traceId = Guid.NewGuid().ToString("N").Substring(0, 24)
  472. };
  473. return Content(System.Net.HttpStatusCode.InternalServerError, errorResponse);
  474. }
  475. }
  476. #endregion
  477. #region 2.4 接收工件加工参数
  478. [HttpPost]
  479. [Route("receiveProcessParameters")]
  480. public async Task<IHttpActionResult> ReceiveProcessParameters([FromBody] ProcessParameterRequest request)
  481. {
  482. try
  483. {
  484. LogHelper.WriteLogInfo($"收到请求:接收工件加工参数 ");
  485. // 验证请求头
  486. if ( !ValidateHeaders() )
  487. {
  488. return Unauthorized();
  489. }
  490. // 验证必填字段
  491. if ( string.IsNullOrEmpty(request.plant) ||
  492. string.IsNullOrEmpty(request.station) ||
  493. //string.IsNullOrEmpty(request.sn) ||
  494. string.IsNullOrEmpty(request.overallResult) )
  495. {
  496. return BadRequest("必填字段不能为空");
  497. }
  498. // 验证总结果
  499. if ( request.overallResult != "OK" && request.overallResult != "NG" )
  500. {
  501. return BadRequest($"无效的总结果: {request.overallResult}");
  502. }
  503. var res = DatabaseHelper.SelectWorkOrderInfo();
  504. string stationOrder = "";
  505. string _materialCode="";
  506. StationType stationtype= StationType.OP10;
  507. if ( request.station.Split('-')[ 2 ] == "L" )
  508. {
  509. stationOrder = res.LeftOrderNo;
  510. _materialCode = res.LeftCheckCode;
  511. }
  512. else
  513. {
  514. stationOrder = res.RightOrderNo;
  515. _materialCode = res.RightCheckCode;
  516. }
  517. var workOrder = DatabaseHelper.SelectWorkOrderInfo(stationOrder);
  518. // 验证工单是否存在
  519. if ( workOrder.Count == 0 )
  520. {
  521. return BadRequest($"工单 {stationOrder} 不存在");
  522. }
  523. if ( string.IsNullOrEmpty(request.sn) )
  524. {
  525. List<LocalhostPartInfo> partInfos= DatabaseHelper.SelectPartInfo(_materialCode, request.station);
  526. if ( partInfos.Count != 0 )
  527. {
  528. stationtype= partInfos[0].StationType;
  529. SnInfo info= DatabaseHelper.SelectSnInfoForStation(stationOrder, partInfos[ 0 ].StationType);
  530. if ( info != null )
  531. {
  532. request.sn = info.Sn;
  533. }
  534. }
  535. else
  536. {
  537. return BadRequest($"工站信息不存在");
  538. }
  539. }
  540. // 保存加工记录
  541. var processRecord = new ProcessRecord
  542. {
  543. Sn = request.sn,
  544. Station = request.station,
  545. OverallResult = request.overallResult,
  546. ProcessTime = DateTime.Now,
  547. Equipment = request.equipment ?? ""
  548. };
  549. DatabaseHelper.InsertProcessRecord(processRecord);
  550. if ( workOrder[ 0 ].IsLocalhost )
  551. {
  552. var response = new ApiResponse<bool>
  553. {
  554. code = "200",
  555. success = true,
  556. msg = "加工参数接收成功",
  557. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  558. traceId = Guid.NewGuid().ToString("N").Substring(0, 24),
  559. data = true
  560. };
  561. LogHelper.WriteLogInfo($"收到请求:接收工件加工参数 成功");
  562. DatabaseHelper.UpdateSnInfo(request.sn, stationOrder,stationtype);
  563. return Ok(response);
  564. }
  565. var okresponse = await management.ApiClient.SendProcessParametersAsync(request);
  566. if ( okresponse.success && okresponse.code == "200" )
  567. {
  568. LogHelper.WriteLogInfo($"收到请求: 接收工件加工参数 成功");
  569. DatabaseHelper.UpdateSnInfo(request.sn, stationOrder, stationtype);
  570. return Ok(okresponse);
  571. }
  572. else
  573. {
  574. LogHelper.WriteLogInfo($"收到请求: 接收工件加工参数 失败\r\n" + okresponse.ToString());
  575. okresponse.success = false;
  576. return Content(System.Net.HttpStatusCode.InternalServerError, okresponse);
  577. }
  578. }
  579. catch ( Exception ex )
  580. {
  581. LogHelper.WriteLogInfo("出错");
  582. var errorResponse = new ErrorResponse
  583. {
  584. code = "55000",
  585. success = false,
  586. msg = $"加工参数接收失败: {ex.Message}",
  587. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  588. traceId = Guid.NewGuid().ToString("N").Substring(0, 24)
  589. };
  590. return Content(System.Net.HttpStatusCode.InternalServerError, errorResponse);
  591. }
  592. }
  593. [HttpGet]
  594. [Route("getProcessRecords")]
  595. public IHttpActionResult GetProcessRecords()
  596. {
  597. try
  598. {
  599. var records = DatabaseHelper.SelectProcessRecord();
  600. var response = new ApiResponse<List<ProcessRecord>>
  601. {
  602. code = "200",
  603. success = true,
  604. msg = "获取成功",
  605. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  606. traceId = Guid.NewGuid().ToString("N").Substring(0, 24),
  607. data = records
  608. };
  609. return Ok(response);
  610. }
  611. catch ( Exception ex )
  612. {
  613. var errorResponse = new ErrorResponse
  614. {
  615. code = "55000",
  616. success = false,
  617. msg = $"获取加工记录失败: {ex.Message}",
  618. msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  619. traceId = Guid.NewGuid().ToString("N").Substring(0, 24)
  620. };
  621. return Content(System.Net.HttpStatusCode.InternalServerError, errorResponse);
  622. }
  623. }
  624. #endregion
  625. #region 辅助方法
  626. private bool ValidateHeaders()
  627. {
  628. // 简单的token验证
  629. if ( Request.Headers.TryGetValues("app-key", out var appKeyValues) &&
  630. Request.Headers.TryGetValues("token", out var tokenValues) )
  631. {
  632. var appKey = appKeyValues.FirstOrDefault();
  633. var token = tokenValues.FirstOrDefault();
  634. // 这里使用简单的验证
  635. return appKey == "test-app-key" && token == "test-token-123";
  636. }
  637. return false;
  638. }
  639. private bool IsValidStatus(string status)
  640. {
  641. var validStatuses = new[] { "0", "1", "2", "3", "4", "5", "6", "7" };
  642. return validStatuses.Contains(status);
  643. }
  644. private string GenerateSn(WorkOrderInfo workOrder, int printType)
  645. {
  646. var prefix = GetPrintTypePrefix(printType);
  647. var timestamp = DateTime.Now.ToString("yyMMddHHmm");
  648. var randomStr = Guid.NewGuid().ToString("N").Substring(0, 6).ToUpper();
  649. var counter = Interlocked.Increment(ref _snCounter);
  650. return $"{prefix}-{workOrder.MaterialCode}-{timestamp}-{counter:D4}-{randomStr}";
  651. }
  652. private string GetPrintTypePrefix(int printType)
  653. {
  654. switch ( printType )
  655. {
  656. case 1:
  657. return "P";
  658. case 2:
  659. return "C";
  660. case 3:
  661. return "Q";
  662. case 4:
  663. return "B";
  664. default:
  665. return "U";
  666. }
  667. }
  668. private string GetPrintTypeName(int printType)
  669. {
  670. switch ( printType )
  671. {
  672. case 1:
  673. return "产品码";
  674. case 2:
  675. return "零件码";
  676. case 3:
  677. return "合格码";
  678. case 4:
  679. return "装箱码";
  680. default:
  681. return "未知";
  682. }
  683. }
  684. #endregion
  685. }
  686. }