MesController.cs 27 KB

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