| | |
| | | Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v18/DocumentLayout.json |
| | | Code/WMS/WIDESEA_WMSClient/yarn.lock |
| | | Code/WMS/WIDESEA_WMSClient/package-lock.json |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/06BDA642C34D304DA3CFBDE5A90B0214/02CEDD732D62C94D758FE67FF83D72CF |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/06BDA642C34D304DA3CFBDE5A90B0214/12313E989BCBD9B17CB5E1F4659BB227 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/06BDA642C34D304DA3CFBDE5A90B0214/20D96583D4E59CBF251955AB3AEE224B |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/06BDA642C34D304DA3CFBDE5A90B0214/326CB4F0763C1328A2FE9B1DEAEEE459 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/06BDA642C34D304DA3CFBDE5A90B0214/41A179025C25D2BE7AF7B6AA41CD697F |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/06BDA642C34D304DA3CFBDE5A90B0214/43DB506154C7EA149D631F3446B3F79A |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/06BDA642C34D304DA3CFBDE5A90B0214/6B3C476AA39528929C43BD504073D1A2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/06BDA642C34D304DA3CFBDE5A90B0214/6D201C9A521C3192EE982AA13020805C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/06BDA642C34D304DA3CFBDE5A90B0214/7A3359239D3444727928DAAA9D7F188C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/06BDA642C34D304DA3CFBDE5A90B0214/966BBA8CF0A87B2A233AEA0A2F0794E9 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/06BDA642C34D304DA3CFBDE5A90B0214/CE1DA310E2C206A7C790F1012746725B |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/06BDA642C34D304DA3CFBDE5A90B0214/EF8B82096B9438E8EF04EF866ACC6365 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/0E757001EF822C40B0B7B32A7191F50B/37BA68D3A4AFE9B4B3E8D1F219796E43 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/0E757001EF822C40B0B7B32A7191F50B/66639773C1563C8E4A66750CD9E91A42 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/0E757001EF822C40B0B7B32A7191F50B/6B3C476AA39528929C43BD504073D1A2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/0E757001EF822C40B0B7B32A7191F50B/6D201C9A521C3192EE982AA13020805C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/0E757001EF822C40B0B7B32A7191F50B/74A5F8BAFAF84678F3DBAD19D2DCA4C4 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/0E757001EF822C40B0B7B32A7191F50B/7A3359239D3444727928DAAA9D7F188C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/0E757001EF822C40B0B7B32A7191F50B/8C3792853AD604BFAF1D21B2148608F2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/11C2B2745D388A49AA91E9482D590508/24ED6D94AF6C551D6278FB0AF2C07239 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/11C2B2745D388A49AA91E9482D590508/4A7264DE6B88B1CE5DB63F2CF21810E0 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/11C2B2745D388A49AA91E9482D590508/4ACFB47A91BDB6CAF109C5CB5A821941 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/11C2B2745D388A49AA91E9482D590508/6B3C476AA39528929C43BD504073D1A2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/11C2B2745D388A49AA91E9482D590508/8E82010873955D36B8637A8AA7594D6D |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/11C2B2745D388A49AA91E9482D590508/AA217133559F0488EC77AF4AAD1A97D6 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/11C2B2745D388A49AA91E9482D590508/B2744ACFBBD6298BD34CEDA635CC7928 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/11C2B2745D388A49AA91E9482D590508/C3FEC06F7A6EB2FD6A2B504485FA7BE9 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/11C2B2745D388A49AA91E9482D590508/ECA5E1DC5AE3AF113B2740CF9FFEA730 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/2D60A5D08D551142A9CDCC8410949C3F/1FFCC3BC333CC2F8F80C3FD42D9C35A7 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/2D60A5D08D551142A9CDCC8410949C3F/4B405FB24AE2E7CDA196C2E13DCCD94D |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/2D60A5D08D551142A9CDCC8410949C3F/6B3C476AA39528929C43BD504073D1A2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/2D60A5D08D551142A9CDCC8410949C3F/6C7A603CDFCA37C8B230FBCE1A6EF3C9 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/2D60A5D08D551142A9CDCC8410949C3F/6D201C9A521C3192EE982AA13020805C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/2D60A5D08D551142A9CDCC8410949C3F/723DEEBD0A5EE2AED06E8CCF18EDC349 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/2D60A5D08D551142A9CDCC8410949C3F/A780863F90E89FAFD4F108245B9FC59C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/2D60A5D08D551142A9CDCC8410949C3F/B6F47F9752892BB8AC3789633BF0B198 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/2D60A5D08D551142A9CDCC8410949C3F/BC33C2D906CA58D53FBC0BD60B91818F |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/2D60A5D08D551142A9CDCC8410949C3F/ED961C09A796FFDF0F5BABA1939DA716 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/40A6D24721279A47A0317205F33DE3FD/288D1FB098610EAA981381CF1D3425C1 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/40A6D24721279A47A0317205F33DE3FD/6B3C476AA39528929C43BD504073D1A2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/40A6D24721279A47A0317205F33DE3FD/6D201C9A521C3192EE982AA13020805C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/40A6D24721279A47A0317205F33DE3FD/74A5F8BAFAF84678F3DBAD19D2DCA4C4 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/40A6D24721279A47A0317205F33DE3FD/7A3359239D3444727928DAAA9D7F188C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/40A6D24721279A47A0317205F33DE3FD/8C3792853AD604BFAF1D21B2148608F2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/40A6D24721279A47A0317205F33DE3FD/A592E03ACCDEC4FECC773C76FCACA72D |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/7029E49609C0524D965C26823A27EEA1/50FD06FB30A9DB2E369D237EB6D8D8F8 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/7029E49609C0524D965C26823A27EEA1/5CFB13DBA9FE67985336DC2F4C226534 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/7029E49609C0524D965C26823A27EEA1/6B3C476AA39528929C43BD504073D1A2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/7029E49609C0524D965C26823A27EEA1/6D201C9A521C3192EE982AA13020805C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/7029E49609C0524D965C26823A27EEA1/74A5F8BAFAF84678F3DBAD19D2DCA4C4 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/7029E49609C0524D965C26823A27EEA1/7A3359239D3444727928DAAA9D7F188C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/7029E49609C0524D965C26823A27EEA1/8C3792853AD604BFAF1D21B2148608F2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/80B3BD5CD7AB2A41AFD5BD70193EC06E/55DE31DE47C1715E5B9151AE24AC74CC |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/80B3BD5CD7AB2A41AFD5BD70193EC06E/6B3C476AA39528929C43BD504073D1A2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/80B3BD5CD7AB2A41AFD5BD70193EC06E/6D201C9A521C3192EE982AA13020805C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/80B3BD5CD7AB2A41AFD5BD70193EC06E/7A3359239D3444727928DAAA9D7F188C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/80B3BD5CD7AB2A41AFD5BD70193EC06E/8C3792853AD604BFAF1D21B2148608F2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/80B3BD5CD7AB2A41AFD5BD70193EC06E/F8448AD0D92C292C4B1EBD43C11F2870 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/80B3BD5CD7AB2A41AFD5BD70193EC06E/FD23F73719A7512E845F2F1D8B1BF111 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/BAE14F88C2A85A4FA1EA674CFD09AB3E/40F7E57802DACE2B3BBB65B9A371BB17 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/BAE14F88C2A85A4FA1EA674CFD09AB3E/6B3C476AA39528929C43BD504073D1A2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/BAE14F88C2A85A4FA1EA674CFD09AB3E/6D201C9A521C3192EE982AA13020805C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/BAE14F88C2A85A4FA1EA674CFD09AB3E/74A5F8BAFAF84678F3DBAD19D2DCA4C4 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/BAE14F88C2A85A4FA1EA674CFD09AB3E/7A3359239D3444727928DAAA9D7F188C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/BAE14F88C2A85A4FA1EA674CFD09AB3E/7CA1586DEF629651EE20C80BA9F5498F |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/BAE14F88C2A85A4FA1EA674CFD09AB3E/8C3792853AD604BFAF1D21B2148608F2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/EAC09E9546070C4397A0096536CDEAD9/464529942B4DF0909C04E15C72912D32 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/EAC09E9546070C4397A0096536CDEAD9/6B3C476AA39528929C43BD504073D1A2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/EAC09E9546070C4397A0096536CDEAD9/6D201C9A521C3192EE982AA13020805C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/EAC09E9546070C4397A0096536CDEAD9/7A3359239D3444727928DAAA9D7F188C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/EAC09E9546070C4397A0096536CDEAD9/811D807D4744CFA93E159B8F74F0F8BC |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/EAC09E9546070C4397A0096536CDEAD9/8C3792853AD604BFAF1D21B2148608F2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/F3CC65965247224EAA3ECED76422C6C8/6B3C476AA39528929C43BD504073D1A2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/F3CC65965247224EAA3ECED76422C6C8/6D201C9A521C3192EE982AA13020805C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/F3CC65965247224EAA3ECED76422C6C8/7A3359239D3444727928DAAA9D7F188C |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/F3CC65965247224EAA3ECED76422C6C8/8C3792853AD604BFAF1D21B2148608F2 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/F3CC65965247224EAA3ECED76422C6C8/C81B0E8985C68630D39D9C4831A88D3D |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/F3CC65965247224EAA3ECED76422C6C8/CE83D9037361C8282E2811065127E2F6 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/CopilotSnapshots/48A4EA5F3CA61E408736097ACF7047F6/state.mpack |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/copilot-chat/bef6627e/sessions/5feaa448-a63c-401e-8736-097acf7047f6 |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db-shm |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db-wal |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db-shm |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db-wal |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db |
| | | Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json |
| | |
| | | |
| | | ### å¼åç¯å¢ |
| | | ```bash |
| | | yarn dev |
| | | yarn serve |
| | | # Vite dev server è¿è¡äº http://localhost:8080/ |
| | | # æ¯æ HMR (Hot Module Replacement) |
| | | ``` |
| | |
| | | "version": "0.1.0", |
| | | "private": true, |
| | | "scripts": { |
| | | "dev": "vite", |
| | | "serve": "vite", |
| | | "build": "vite build", |
| | | "preview": "vite preview", |
| | | "lint": "eslint --ext .js,.vue src" |
| | |
| | | "WorkspaceRootPath": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\", |
| | | "Documents": [ |
| | | { |
| | | "AbsoluteMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_quartzjob\\stackercrane\\spec\\spestackercrane.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", |
| | | "RelativeMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|solutionrelative:wideseawcs_quartzjob\\stackercrane\\spec\\spestackercrane.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" |
| | | "AbsoluteMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_quartzjob\\stackercrane\\spec\\speformationstackercrane.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", |
| | | "RelativeMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|solutionrelative:wideseawcs_quartzjob\\stackercrane\\spec\\speformationstackercrane.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" |
| | | }, |
| | | { |
| | | "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}", |
| | | "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}" |
| | | "AbsoluteMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_quartzjob\\stackercrane\\enum\\formationstackercranestatus.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", |
| | | "RelativeMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|solutionrelative:wideseawcs_quartzjob\\stackercrane\\enum\\formationstackercranestatus.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" |
| | | }, |
| | | { |
| | | "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_tasks\\formationstackercranejob\\formationstackercranedbname.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", |
| | | "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\formationstackercranejob\\formationstackercranedbname.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" |
| | | }, |
| | | { |
| | | "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_tasks\\formationstackercranejob\\formationstackercranetaskcommand.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", |
| | | "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\formationstackercranejob\\formationstackercranetaskcommand.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" |
| | | }, |
| | | { |
| | | "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_tasks\\formationstackercranejob\\formationcommonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", |
| | | "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\formationstackercranejob\\formationcommonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" |
| | | }, |
| | | { |
| | | "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", |
| | | "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" |
| | | } |
| | | ], |
| | | "DocumentGroupContainers": [ |
| | |
| | | "DocumentGroups": [ |
| | | { |
| | | "DockedWidth": 200, |
| | | "SelectedChildIndex": 2, |
| | | "SelectedChildIndex": 6, |
| | | "Children": [ |
| | | { |
| | | "$type": "Bookmark", |
| | |
| | | "Name": "ST:0:0:{40ea2e6b-2121-4bb8-a43e-c83c04b51041}" |
| | | }, |
| | | { |
| | | "$type": "Document", |
| | | "DocumentIndex": 0, |
| | | "Title": "SpeStackerCrane.cs", |
| | | "DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\StackerCrane\\Spec\\SpeStackerCrane.cs", |
| | | "RelativeDocumentMoniker": "WIDESEAWCS_QuartzJob\\StackerCrane\\Spec\\SpeStackerCrane.cs", |
| | | "ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\StackerCrane\\Spec\\SpeStackerCrane.cs", |
| | | "RelativeToolTip": "WIDESEAWCS_QuartzJob\\StackerCrane\\Spec\\SpeStackerCrane.cs", |
| | | "ViewState": "AgIAAAAAAAAAAAAAAAAAAJQAAAARAAAAAAAAAA==", |
| | | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", |
| | | "WhenOpened": "2026-01-28T05:55:14.804Z", |
| | | "EditorCaption": "" |
| | | }, |
| | | { |
| | | "$type": "Bookmark", |
| | | "Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}" |
| | | }, |
| | | { |
| | | "$type": "Document", |
| | | "DocumentIndex": 3, |
| | | "Title": "FormationStackerCraneTaskCommand.cs", |
| | | "DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\FormationStackerCraneJob\\FormationStackerCraneTaskCommand.cs", |
| | | "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\FormationStackerCraneJob\\FormationStackerCraneTaskCommand.cs", |
| | | "ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\FormationStackerCraneJob\\FormationStackerCraneTaskCommand.cs", |
| | | "RelativeToolTip": "WIDESEAWCS_Tasks\\FormationStackerCraneJob\\FormationStackerCraneTaskCommand.cs", |
| | | "ViewState": "AgIAAEcAAAAAAAAAAAAiwDAAAAAVAAAAAAAAAA==", |
| | | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", |
| | | "WhenOpened": "2026-01-29T09:17:51.622Z", |
| | | "EditorCaption": "" |
| | | }, |
| | | { |
| | | "$type": "Document", |
| | | "DocumentIndex": 2, |
| | | "Title": "FormationStackerCraneDBName.cs", |
| | | "DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\FormationStackerCraneJob\\FormationStackerCraneDBName.cs", |
| | | "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\FormationStackerCraneJob\\FormationStackerCraneDBName.cs", |
| | | "ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\FormationStackerCraneJob\\FormationStackerCraneDBName.cs", |
| | | "RelativeToolTip": "WIDESEAWCS_Tasks\\FormationStackerCraneJob\\FormationStackerCraneDBName.cs", |
| | | "ViewState": "AgIAAAAAAAAAAAAAAAAAAC4AAAAQAAAAAAAAAA==", |
| | | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", |
| | | "WhenOpened": "2026-01-29T09:13:24.922Z", |
| | | "EditorCaption": "" |
| | | }, |
| | | { |
| | | "$type": "Document", |
| | | "DocumentIndex": 1, |
| | | "Title": "appsettings.json", |
| | | "DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\appsettings.json", |
| | | "RelativeDocumentMoniker": "WIDESEAWCS_Server\\appsettings.json", |
| | | "ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\appsettings.json", |
| | | "RelativeToolTip": "WIDESEAWCS_Server\\appsettings.json", |
| | | "ViewState": "AgIAAAYAAAAAAAAAAAAAABQAAAAAAAAAAAAAAA==", |
| | | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", |
| | | "WhenOpened": "2026-01-26T08:07:36.508Z", |
| | | "Title": "FormationStackerCraneStatus.cs", |
| | | "DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\StackerCrane\\Enum\\FormationStackerCraneStatus.cs", |
| | | "RelativeDocumentMoniker": "WIDESEAWCS_QuartzJob\\StackerCrane\\Enum\\FormationStackerCraneStatus.cs", |
| | | "ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\StackerCrane\\Enum\\FormationStackerCraneStatus.cs", |
| | | "RelativeToolTip": "WIDESEAWCS_QuartzJob\\StackerCrane\\Enum\\FormationStackerCraneStatus.cs", |
| | | "ViewState": "AgIAAEAAAAAAAAAAAAArwFQAAAAQAAAAAAAAAA==", |
| | | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", |
| | | "WhenOpened": "2026-01-29T03:35:09.011Z", |
| | | "EditorCaption": "" |
| | | }, |
| | | { |
| | | "$type": "Document", |
| | | "DocumentIndex": 0, |
| | | "Title": "SpeFormationStackerCrane.cs", |
| | | "DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\StackerCrane\\Spec\\SpeFormationStackerCrane.cs", |
| | | "RelativeDocumentMoniker": "WIDESEAWCS_QuartzJob\\StackerCrane\\Spec\\SpeFormationStackerCrane.cs", |
| | | "ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\StackerCrane\\Spec\\SpeFormationStackerCrane.cs", |
| | | "RelativeToolTip": "WIDESEAWCS_QuartzJob\\StackerCrane\\Spec\\SpeFormationStackerCrane.cs", |
| | | "ViewState": "AgIAAN8AAAAAAAAAAAAnwPEAAAAUAAAAAAAAAA==", |
| | | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", |
| | | "WhenOpened": "2026-01-29T03:12:53.832Z", |
| | | "EditorCaption": "" |
| | | }, |
| | | { |
| | | "$type": "Document", |
| | | "DocumentIndex": 4, |
| | | "Title": "FormationCommonStackerCraneJob.cs", |
| | | "DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\FormationStackerCraneJob\\FormationCommonStackerCraneJob.cs", |
| | | "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\FormationStackerCraneJob\\FormationCommonStackerCraneJob.cs", |
| | | "ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\FormationStackerCraneJob\\FormationCommonStackerCraneJob.cs", |
| | | "RelativeToolTip": "WIDESEAWCS_Tasks\\FormationStackerCraneJob\\FormationCommonStackerCraneJob.cs", |
| | | "ViewState": "AgIAAEEAAAAAAAAAAAAqwFQAAAAVAAAAAAAAAA==", |
| | | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", |
| | | "WhenOpened": "2026-01-29T03:12:40.035Z", |
| | | "EditorCaption": "" |
| | | }, |
| | | { |
| | | "$type": "Document", |
| | | "DocumentIndex": 5, |
| | | "Title": "CommonStackerCraneJob.cs", |
| | | "DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs", |
| | | "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs", |
| | | "ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs", |
| | | "RelativeToolTip": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs", |
| | | "ViewState": "AgIAAJ4AAAAAAAAAAAAkwLQAAAATAAAAAAAAAA==", |
| | | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", |
| | | "WhenOpened": "2026-01-29T02:59:35.12Z", |
| | | "EditorCaption": "" |
| | | } |
| | | ] |
| | |
| | | Creater = a.Creater, |
| | | CycleHasRunTimes = 0, |
| | | EndTime = a.EndTime, |
| | | Id = b.Id, |
| | | Id = a.Id, |
| | | IntervalSecond = a.IntervalSecond, |
| | | Modifier = a.Modifier, |
| | | ModifyDate = a.ModifyDate, |
| | |
| | | List<Dt_Router> QueryNextRoutes(string startPosi, string endPosi, int routeType); |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®èµ·ç¹è·åä¸ä¸ä¸ªå个åèç¹è·¯ç± |
| | | /// </summary> |
| | | /// <param name="startPosi">èµ·ç¹/å½åä½ç½®</param> |
| | | /// <returns>è¿åä¸ä¸ä¸ªè·¯ç±èç¹ï¼å¦ææ²¡æåè¿ånull</returns> |
| | | public Dt_Router QueryNextRoute(string startPosi); |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®èµ·ç¹åè·¯ç±ç±»åè·åä¸ä¸ä¸ªå个åèç¹è·¯ç± |
| | | /// </summary> |
| | | /// <param name="startPosi">èµ·ç¹/å½åä½ç½®</param> |
| | | /// <param name="routeType">è·¯ç±ç±»å</param> |
| | | /// <returns>è¿åä¸ä¸ä¸ªè·¯ç±èç¹ï¼å¦ææ²¡æåè¿ånull</returns> |
| | | public Dt_Router QueryNextRoute(string startPosi, int routeType); |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®èµ·ç¹ãç»ç¹æ¹ååè·¯ç±ç±»åè·åä¸ä¸ä¸ªå个åèç¹è·¯ç±ï¼æºè½éæ©æåç»ç¹çè·¯ç±ï¼ |
| | | /// </summary> |
| | | /// <param name="startPosi">èµ·ç¹/å½åä½ç½®</param> |
| | | /// <param name="endPosi">ç»ç¹ä½ç½®ï¼ç¨äºæ¹å夿ï¼</param> |
| | | /// <param name="routeType">è·¯ç±ç±»å</param> |
| | | /// <returns>è¿åä¸ä¸ä¸ªè·¯ç±èç¹ï¼ä¼å
è¿åæåç»ç¹çè·¯ç±ï¼å¦ææ²¡æåè¿ånull</returns> |
| | | public Dt_Router QueryNextRoute(string startPosi, string endPosi, int routeType); |
| | | |
| | | /// <summary> |
| | | /// è·åä»èµ·ç¹å°ç»ç¹ç宿´è·¯å¾ï¼æé¡ºåºè¿åæ¯ä¸ªåèç¹è·¯ç±ï¼ |
| | | /// </summary> |
| | | /// <param name="startPosi">èµ·ç¹ä½ç½®</param> |
| | | /// <param name="endPosi">ç»ç¹ä½ç½®</param> |
| | | /// <param name="routeType">è·¯ç±ç±»å</param> |
| | | /// <returns>è¿åæåºçè·¯ç±å表ï¼å¦ææ¾ä¸å°è·¯å¾åè¿å空å表</returns> |
| | | public List<Dt_Router> QueryRoutePath(string startPosi, string endPosi, int routeType); |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤ç¼å·è·å对åºçè·¯ç±ç¹ä½ç¼å·(è¾é线ç«å°ç¼å·)ä¿¡æ¯ |
| | | /// </summary> |
| | | /// <param name="deviceCode">设å¤ç¼å·</param> |
| | |
| | | /// <returns>è¿åè·¯ç±å®ä½éåã</returns> |
| | | public List<Dt_Router> QueryNextRoutes(string startPosi, string endPosi) |
| | | { |
| | | //todo æ¹æ³éä¼å |
| | | List<Dt_Router> routers = new List<Dt_Router>(); |
| | | try |
| | | { |
| | | //æ¥è¯¢ä¸ä¸ä¸ªè·¯ç±ä¿¡æ¯ |
| | | List<Dt_Router> dt_Routers = BaseDal.QueryData(x => (x.NextPosi == endPosi || x.ChildPosi == endPosi), new Dictionary<string, OrderByType> { { nameof(Dt_Router.IsEnd), OrderByType.Desc } }); |
| | | if (dt_Routers.Count > 0) |
| | | // 䏿¬¡æ§æ¥è¯¢ææè·¯ç±æ°æ®å°å
å |
| | | List<Dt_Router> allRouters = BaseDal.QueryData(x => true); |
| | | |
| | | // å¨å
åä¸è¿è¡è·¯å¾æç´¢ |
| | | routers = FindRoutesInMemory(startPosi, endPosi, allRouters, null); |
| | | |
| | | if (routers.Count == 0) |
| | | { |
| | | foreach (var item in dt_Routers) |
| | | { |
| | | //妿ä¸ä¸ä¸ªè·¯ç±çèµ·ç¹åç»ç¹é½å¹é
ï¼åæ·»å å°è·¯ç±åè¡¨ä¸ |
| | | if (item.StartPosi == startPosi && !routers.Any(x => x.Id == item.Id)) |
| | | { |
| | | routers.Add(item); |
| | | } |
| | | else |
| | | { |
| | | //å¦åï¼é彿¥è¯¢ä¸ä¸ä¸ªè·¯ç±çèµ·ç¹ |
| | | List<Dt_Router> tempRouters = QueryNextRoutes(startPosi, item.StartPosi); |
| | | foreach (var router in tempRouters) |
| | | { |
| | | //妿ä¸ä¸ä¸ªè·¯ç±çèµ·ç¹åç»ç¹é½å¹é
ï¼åæ·»å å°è·¯ç±åè¡¨ä¸ |
| | | if (router.StartPosi == startPosi && !routers.Any(x => x.Id == router.Id)) |
| | | { |
| | | routers.Add(router); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //妿æ¥è¯¢ä¸å°ä¸ä¸ä¸ªè·¯ç±ä¿¡æ¯ï¼åæåºå¼å¸¸ |
| | | throw new Exception($"è¯¥è·¯å¾æªé
ç½®æé
ç½®é误,è¯·æ£æ¥è®¾å¤è·¯ç±ä¿¡æ¯,èµ·ç¹:ã{startPosi}ã,ç»ç¹:ã{endPosi}ã"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | //throw new Exception(ex.Message); |
| | | //è®°å½éè¯¯ä¿¡æ¯ |
| | | } |
| | | return routers; |
| | |
| | | /// <returns>è¿åè·¯ç±å®ä½éåã</returns> |
| | | public List<Dt_Router> QueryNextRoutes(string startPosi, string endPosi, int routeType) |
| | | { |
| | | //todo æ¹æ³éä¼å |
| | | List<Dt_Router> routers = new List<Dt_Router>(); |
| | | try |
| | | { |
| | | //æ¥è¯¢ä¸ä¸ä¸ªè·¯ç±ä¿¡æ¯ |
| | | List<Dt_Router> dt_Routers = BaseDal.QueryData(x => (x.NextPosi == endPosi || x.ChildPosi == endPosi) && x.InOutType == routeType, new Dictionary<string, OrderByType> { { nameof(Dt_Router.IsEnd), OrderByType.Desc } }); |
| | | if (dt_Routers.Count > 0) |
| | | // 䏿¬¡æ§æ¥è¯¢æå®ç±»åçææè·¯ç±æ°æ®å°å
å |
| | | List<Dt_Router> allRouters = BaseDal.QueryData(x => x.InOutType == routeType); |
| | | |
| | | // å¨å
åä¸è¿è¡è·¯å¾æç´¢ |
| | | routers = FindRoutesInMemory(startPosi, endPosi, allRouters, routeType); |
| | | |
| | | if (routers.Count == 0) |
| | | { |
| | | foreach (var item in dt_Routers) |
| | | { |
| | | //妿ä¸ä¸ä¸ªè·¯ç±çèµ·ç¹åç»ç¹é½å¹é
ï¼åæ·»å å°è·¯ç±åè¡¨ä¸ |
| | | if (item.StartPosi == startPosi && !routers.Any(x => x.Id == item.Id)) |
| | | { |
| | | routers.Add(item); |
| | | } |
| | | else |
| | | { |
| | | //å¦åï¼é彿¥è¯¢ä¸ä¸ä¸ªè·¯ç±çèµ·ç¹ |
| | | List<Dt_Router> tempRouters = QueryNextRoutes(startPosi, item.StartPosi, routeType); |
| | | foreach (var router in tempRouters) |
| | | { |
| | | //妿ä¸ä¸ä¸ªè·¯ç±çèµ·ç¹åç»ç¹é½å¹é
ï¼åæ·»å å°è·¯ç±åè¡¨ä¸ |
| | | if (router.StartPosi == startPosi && !routers.Any(x => x.Id == router.Id)) |
| | | { |
| | | routers.Add(router); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //妿æ¥è¯¢ä¸å°ä¸ä¸ä¸ªè·¯ç±ä¿¡æ¯ï¼åæåºå¼å¸¸ |
| | | throw new Exception($"è¯¥è·¯å¾æªé
ç½®æé
ç½®é误,è¯·æ£æ¥è®¾å¤è·¯ç±ä¿¡æ¯,èµ·ç¹:ã{startPosi}ã,ç»ç¹:ã{endPosi}ã"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | //throw new Exception(ex.Message); |
| | | //è®°å½éè¯¯ä¿¡æ¯ |
| | | } |
| | | return routers; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¨å
å䏿¥æ¾ä»èµ·ç¹å°ç»ç¹çææè·¯ç± |
| | | /// </summary> |
| | | /// <param name="startPosi">èµ·ç¹ä½ç½®</param> |
| | | /// <param name="endPosi">ç»ç¹ä½ç½®</param> |
| | | /// <param name="allRouters">ææè·¯ç±æ°æ®</param> |
| | | /// <param name="routeType">è·¯ç±ç±»åï¼å¯éï¼</param> |
| | | /// <returns>ç¬¦åæ¡ä»¶çè·¯ç±å表</returns> |
| | | private List<Dt_Router> FindRoutesInMemory(string startPosi, string endPosi, List<Dt_Router> allRouters, int? routeType) |
| | | { |
| | | List<Dt_Router> result = new List<Dt_Router>(); |
| | | HashSet<int> addedIds = new HashSet<int>(); |
| | | |
| | | // æå»ºç´¢å¼ï¼ä»¥ NextPosi å ChildPosi 为é®çåå
¸ï¼å éæ¥æ¾ |
| | | var routersByNext = allRouters |
| | | .GroupBy(r => r.NextPosi) |
| | | .ToDictionary(g => g.Key, g => g.ToList()); |
| | | |
| | | var routersByChild = allRouters |
| | | .GroupBy(r => r.ChildPosi) |
| | | .ToDictionary(g => g.Key, g => g.ToList()); |
| | | |
| | | // æ¾å°æææåç»ç¹çè·¯ç±ï¼ç»ç¹çç¶èç¹ï¼ |
| | | List<Dt_Router> endRouters = new List<Dt_Router>(); |
| | | if (routersByNext.ContainsKey(endPosi)) |
| | | endRouters.AddRange(routersByNext[endPosi]); |
| | | if (routersByChild.ContainsKey(endPosi)) |
| | | endRouters.AddRange(routersByChild[endPosi].Where(r => !endRouters.Any(e => e.Id == r.Id))); |
| | | |
| | | // æ IsEnd éåºæåº |
| | | endRouters = endRouters.OrderByDescending(r => r.IsEnd).ToList(); |
| | | |
| | | // 使ç¨éåè¿è¡å¹¿åº¦ä¼å
æç´¢ |
| | | Queue<(Dt_Router router, List<Dt_Router> path)> queue = new Queue<(Dt_Router, List<Dt_Router>)>(); |
| | | |
| | | // å°ææç»ç¹è·¯ç±å å
¥éå |
| | | foreach (var endRouter in endRouters) |
| | | { |
| | | queue.Enqueue((endRouter, new List<Dt_Router> { endRouter })); |
| | | } |
| | | |
| | | // 广度ä¼å
æç´¢ |
| | | while (queue.Count > 0) |
| | | { |
| | | var (currentRouter, currentPath) = queue.Dequeue(); |
| | | |
| | | // 妿å½åè·¯ç±çèµ·ç¹å°±æ¯ç®æ èµ·ç¹ï¼æ¾å°å®æ´è·¯å¾ |
| | | if (currentRouter.StartPosi == startPosi) |
| | | { |
| | | // å°è·¯å¾ä¸çææè·¯ç±æ·»å å°ç»æä¸ï¼å»éï¼ |
| | | foreach (var router in currentPath) |
| | | { |
| | | if (!addedIds.Contains(router.Id)) |
| | | { |
| | | result.Add(router); |
| | | addedIds.Add(router.Id); |
| | | } |
| | | } |
| | | continue; |
| | | } |
| | | |
| | | // æ¥æ¾å½åè·¯ç±èµ·ç¹çç¶è·¯ç± |
| | | List<Dt_Router> parentRouters = new List<Dt_Router>(); |
| | | if (routersByNext.ContainsKey(currentRouter.StartPosi)) |
| | | parentRouters.AddRange(routersByNext[currentRouter.StartPosi]); |
| | | if (routersByChild.ContainsKey(currentRouter.StartPosi)) |
| | | parentRouters.AddRange(routersByChild[currentRouter.StartPosi].Where(r => !parentRouters.Any(p => p.Id == r.Id))); |
| | | |
| | | // å°ç¶è·¯ç±å å
¥éå |
| | | foreach (var parentRouter in parentRouters) |
| | | { |
| | | // é¿å
循ç¯å¼ç¨ |
| | | if (!currentPath.Any(p => p.Id == parentRouter.Id)) |
| | | { |
| | | var newPath = new List<Dt_Router>(currentPath) { parentRouter }; |
| | | queue.Enqueue((parentRouter, newPath)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®èµ·ç¹è·åä¸ä¸ä¸ªå个åèç¹è·¯ç± |
| | | /// </summary> |
| | | /// <param name="startPosi">èµ·ç¹/å½åä½ç½®</param> |
| | | /// <returns>è¿åä¸ä¸ä¸ªè·¯ç±èç¹ï¼å¦ææ²¡æåè¿ånull</returns> |
| | | public Dt_Router QueryNextRoute(string startPosi) |
| | | { |
| | | try |
| | | { |
| | | // æ¥è¯¢ä»èµ·ç¹åºåçææè·¯ç± |
| | | List<Dt_Router> routes = BaseDal.QueryData(x => x.StartPosi == startPosi, |
| | | new Dictionary<string, OrderByType> { { nameof(Dt_Router.IsEnd), OrderByType.Desc } }); |
| | | |
| | | // è¿å第ä¸ä¸ªè·¯ç± |
| | | return routes.FirstOrDefault(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // è®°å½éè¯¯ä¿¡æ¯ |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®èµ·ç¹åè·¯ç±ç±»åè·åä¸ä¸ä¸ªå个åèç¹è·¯ç± |
| | | /// </summary> |
| | | /// <param name="startPosi">èµ·ç¹/å½åä½ç½®</param> |
| | | /// <param name="routeType">è·¯ç±ç±»å</param> |
| | | /// <returns>è¿åä¸ä¸ä¸ªè·¯ç±èç¹ï¼å¦ææ²¡æåè¿ånull</returns> |
| | | public Dt_Router QueryNextRoute(string startPosi, int routeType) |
| | | { |
| | | try |
| | | { |
| | | // æ¥è¯¢ä»èµ·ç¹åºåçæå®ç±»åè·¯ç± |
| | | List<Dt_Router> routes = BaseDal.QueryData(x => x.StartPosi == startPosi && x.InOutType == routeType, |
| | | new Dictionary<string, OrderByType> { { nameof(Dt_Router.IsEnd), OrderByType.Desc } }); |
| | | |
| | | // è¿å第ä¸ä¸ªè·¯ç± |
| | | return routes.FirstOrDefault(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // è®°å½éè¯¯ä¿¡æ¯ |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®èµ·ç¹ãç»ç¹æ¹ååè·¯ç±ç±»åè·åä¸ä¸ä¸ªå个åèç¹è·¯ç±ï¼æºè½éæ©æåç»ç¹çè·¯ç±ï¼ |
| | | /// </summary> |
| | | /// <param name="startPosi">èµ·ç¹/å½åä½ç½®</param> |
| | | /// <param name="endPosi">ç»ç¹ä½ç½®ï¼ç¨äºæ¹å夿ï¼</param> |
| | | /// <param name="routeType">è·¯ç±ç±»å</param> |
| | | /// <returns>è¿åä¸ä¸ä¸ªè·¯ç±èç¹ï¼ä¼å
è¿åæåç»ç¹çè·¯ç±ï¼å¦ææ²¡æåè¿ånull</returns> |
| | | public Dt_Router QueryNextRoute(string startPosi, string endPosi, int routeType) |
| | | { |
| | | try |
| | | { |
| | | // æ¥è¯¢ä»èµ·ç¹åºåçæå®ç±»åè·¯ç± |
| | | List<Dt_Router> routes = BaseDal.QueryData(x => x.StartPosi == startPosi && x.InOutType == routeType, |
| | | new Dictionary<string, OrderByType> { { nameof(Dt_Router.IsEnd), OrderByType.Desc } }); |
| | | |
| | | if (routes.Count == 0) |
| | | return null; |
| | | |
| | | // ä¼å
éæ©ç´æ¥æåç»ç¹çè·¯ç± |
| | | Dt_Router directRoute = routes.FirstOrDefault(x => x.NextPosi == endPosi || x.ChildPosi == endPosi); |
| | | if (directRoute != null) |
| | | return directRoute; |
| | | |
| | | // å¦ææ²¡æç´æ¥è·¯ç±ï¼ä½¿ç¨æ¥æ¾ç®æ³æ¾å°æåç»ç¹çè·¯ç± |
| | | List<Dt_Router> allRouters = BaseDal.QueryData(x => x.InOutType == routeType); |
| | | foreach (var route in routes) |
| | | { |
| | | // æ£æ¥ä»è¿ä¸ªè·¯ç±çä¸ä¸ä¸ªä½ç½®æ¯å¦è½å°è¾¾ç»ç¹ |
| | | var pathToEnd = FindRoutesInMemory(route.NextPosi, endPosi, allRouters, routeType); |
| | | if (pathToEnd.Count > 0) |
| | | return route; |
| | | } |
| | | |
| | | // 妿é½ä¸è½å°è¾¾ç»ç¹ï¼è¿å第ä¸ä¸ªè·¯ç± |
| | | return routes.FirstOrDefault(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // è®°å½éè¯¯ä¿¡æ¯ |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åä»èµ·ç¹å°ç»ç¹ç宿´è·¯å¾ï¼æé¡ºåºè¿åæ¯ä¸ªåèç¹è·¯ç±ï¼ |
| | | /// </summary> |
| | | /// <param name="startPosi">èµ·ç¹ä½ç½®</param> |
| | | /// <param name="endPosi">ç»ç¹ä½ç½®</param> |
| | | /// <param name="routeType">è·¯ç±ç±»å</param> |
| | | /// <returns>è¿åæåºçè·¯ç±å表ï¼å¦ææ¾ä¸å°è·¯å¾åè¿å空å表</returns> |
| | | public List<Dt_Router> QueryRoutePath(string startPosi, string endPosi, int routeType) |
| | | { |
| | | List<Dt_Router> path = new List<Dt_Router>(); |
| | | string currentPosi = startPosi; |
| | | HashSet<string> visitedPositions = new HashSet<string>(); |
| | | |
| | | try |
| | | { |
| | | while (currentPosi != endPosi) |
| | | { |
| | | if (visitedPositions.Contains(currentPosi)) |
| | | { |
| | | break; |
| | | } |
| | | visitedPositions.Add(currentPosi); |
| | | |
| | | Dt_Router nextRoute = QueryNextRoute(currentPosi, endPosi, routeType); |
| | | |
| | | if (nextRoute == null) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | path.Add(nextRoute); |
| | | currentPosi = nextRoute.NextPosi; |
| | | |
| | | if (path.Count > 1000) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (currentPosi != endPosi) |
| | | { |
| | | return new List<Dt_Router>(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return new List<Dt_Router>(); |
| | | } |
| | | |
| | | return path; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// </summary> |
| | | /// <param name="deviceCode">设å¤ç¼å·</param> |
| | | /// <returns>è¿åè·¯ç±ç¹ä½ç¼å·(è¾é线ç«å°ç¼å·)éå</returns> |
| | | // æ ¹æ®è®¾å¤ç¼ç æ¥è¯¢ææä½ç½® |
| | | public List<string> QueryAllPositions(string deviceCode) |
| | | { |
| | | // å建ä¸ä¸ªå符串å表ï¼ç¨äºå卿æä½ç½® |
| | |
| | | #region << ç æ¬ 注 é >> |
| | | |
| | | /*---------------------------------------------------------------- |
| | | * å½å空é´ï¼WIDESEAWCS_QuartzJob |
| | | * å建è
ï¼è¡ç«¥åº |
| | |
| | | * ä¿®æ¹è¯´æï¼ |
| | | * |
| | | *----------------------------------------------------------------*/ |
| | | |
| | | #endregion << ç æ¬ 注 é >> |
| | | |
| | | using HslCommunication; |
| | | using Microsoft.AspNetCore.Http; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.ComponentModel; |
| | | using System.Linq; |
| | | using System.Reflection; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using WIDESEAWCS_Communicator; |
| | | using WIDESEAWCS_Core.Enums; |
| | | using WIDESEAWCS_QuartzJob.DeviceBase; |
| | | using WIDESEAWCS_QuartzJob.DTO; |
| | | using WIDESEAWCS_QuartzJob.StackerCrane; |
| | |
| | | public class CommonStackerCrane : IStackerCrane |
| | | { |
| | | #region Private Member |
| | | |
| | | /// <summary> |
| | | /// å åæºé讯对象 |
| | | /// </summary> |
| | | private BaseCommunicator _communicator; |
| | | |
| | | /// <summary> |
| | | /// å åæºåè®®ä¿¡æ¯ |
| | | /// </summary> |
| | | private readonly List<DeviceProDTO> _deviceProDTOs; |
| | | |
| | | /// <summary> |
| | | /// å åæºåè®®æç»ä¿¡æ¯ |
| | | /// </summary> |
| | | private readonly List<DeviceProtocolDetailDTO> _deviceProtocolDetailDTOs; |
| | | |
| | | /// <summary> |
| | | /// 设å¤ç¼å· |
| | | /// </summary> |
| | | public readonly string _deviceCode; |
| | | |
| | | /// <summary> |
| | | /// 设å¤åç§° |
| | | /// </summary> |
| | | public readonly string _deviceName; |
| | | |
| | | /// <summary> |
| | | /// ä¸ä¸æ¬¡ä»»å¡å· |
| | | /// </summary> |
| | |
| | | private bool _heartStatr = true; |
| | | |
| | | private bool _isConnected = true; |
| | | |
| | | #endregion Private Member |
| | | |
| | | #region Public Member |
| | | |
| | | /// <summary> |
| | | /// å åæºé讯对象 |
| | | /// </summary> |
| | |
| | | #endregion |
| | | |
| | | #region Constructor Function |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | |
| | | _deviceName = deviceName; |
| | | CheckConnect(); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region Private Method |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®å议读åå åæºç¶æ |
| | | /// </summary> |
| | |
| | | return StackerCraneStatus.Unkonw.ToString(); |
| | | } |
| | | } |
| | | //todo é讯æªè¿æ¥æ¶æåºå¼å¸¸ |
| | | return StackerCraneStatus.Unkonw.ToString(); |
| | | } |
| | | |
| | |
| | | } |
| | | }); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region Public Method |
| | | |
| | | /// <summary> |
| | | /// åéä»»å¡å½ä»¤ |
| | | /// </summary> |
| | |
| | | case TypeCode.Boolean: |
| | | operateResult = Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToBoolean(deviceProtocolDetail.ProtocalDetailValue)); |
| | | break; |
| | | |
| | | case TypeCode.Byte: |
| | | operateResult = Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToByte(deviceProtocolDetail.ProtocalDetailValue)); |
| | | break; |
| | | |
| | | case TypeCode.Int16: |
| | | operateResult = Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToInt16(deviceProtocolDetail.ProtocalDetailValue)); |
| | | break; |
| | | |
| | | case TypeCode.Int32: |
| | | operateResult = Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToInt32(deviceProtocolDetail.ProtocalDetailValue)); |
| | | break; |
| | | |
| | | case TypeCode.UInt16: |
| | | operateResult = Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToUInt16(deviceProtocolDetail.ProtocalDetailValue)); |
| | | break; |
| | | |
| | | case TypeCode.UInt32: |
| | | operateResult = Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToUInt32(deviceProtocolDetail.ProtocalDetailValue)); |
| | | break; |
| | | |
| | | default: |
| | | break; |
| | | } |
| | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | } |
| | | finally |
| | | { |
| | |
| | | /// </summary> |
| | | public void Heartbeat() |
| | | { |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | // åè¯åå¾åæ¶å¨ä¸åè°ç¨æ¤å¯¹è±¡çç»ç»å¨ |
| | | GC.SuppressFinalize(this); |
| | | } |
| | | |
| | | #endregion |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #region << ç æ¬ 注 é >> |
| | | /*---------------------------------------------------------------- |
| | | * å½å空é´ï¼WIDESEAWCS_QuartzJob |
| | | * å建è
ï¼è¡ç«¥åº |
| | | * å建æ¶é´ï¼2024/8/2 16:13:36 |
| | | * çæ¬ï¼V1.0.0 |
| | | * æè¿°ï¼å åæºç¶ææä¸¾ |
| | | * |
| | | * ---------------------------------------------------------------- |
| | | * ä¿®æ¹äººï¼ |
| | | * ä¿®æ¹æ¶é´ï¼ |
| | | * çæ¬ï¼V1.0.1 |
| | | * ä¿®æ¹è¯´æï¼ |
| | | * |
| | | *----------------------------------------------------------------*/ |
| | | #endregion << ç æ¬ 注 é >> |
| | | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.ComponentModel; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace WIDESEAWCS_QuartzJob.StackerCrane.Enum |
| | | { |
| | | |
| | | /// <summary> |
| | | /// å åæºè¿è¡ç¶ææä¸¾ |
| | | /// </summary> |
| | | public enum FormationStackerCraneRunStatus |
| | | { |
| | | /// <summary> |
| | | /// OFF |
| | | /// </summary> |
| | | [Description("OFF")] |
| | | Off, |
| | | |
| | | /// <summary> |
| | | /// å¾
æºä¸ |
| | | /// </summary> |
| | | [Description("å¾
æºä¸")] |
| | | Standby, |
| | | |
| | | /// <summary> |
| | | /// æå¨æ¨¡å¼ |
| | | /// </summary> |
| | | [Description("æå¨æ¨¡å¼")] |
| | | ManualMode, |
| | | |
| | | /// <summary> |
| | | /// åç¹åå½ä¸ |
| | | /// </summary> |
| | | [Description("åç¹åå½ä¸")] |
| | | ReturningToOrigin, |
| | | |
| | | /// <summary> |
| | | /// èªå¨è¿è½¬ä¸ |
| | | /// </summary> |
| | | [Description("èªå¨è¿è½¬ä¸")] |
| | | AutoRunning, |
| | | |
| | | /// <summary> |
| | | /// å¼å¸¸ä¸ |
| | | /// </summary> |
| | | [Description("å¼å¸¸ä¸")] |
| | | Abnormal, |
| | | |
| | | /// <summary> |
| | | /// éå¸¸åæ¢ä¸ |
| | | /// </summary> |
| | | [Description("é叏忢ä¸")] |
| | | EmergencyStopping, |
| | | |
| | | /// <summary> |
| | | /// æªç¥ |
| | | /// </summary> |
| | | [Description("æªç¥")] |
| | | Unkonw |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å åæºå·¥ä½ç¶ææä¸¾ |
| | | /// </summary> |
| | | public enum FormationStackerCraneOperationStatus |
| | | { |
| | | /// <summary> |
| | | /// æ |
| | | /// </summary> |
| | | [Description("æ ")] |
| | | None, |
| | | |
| | | /// <summary> |
| | | /// 空é²ä¸ |
| | | /// </summary> |
| | | [Description("空é²ä¸")] |
| | | Idle, |
| | | |
| | | /// <summary> |
| | | /// ç§»å¨ä¸ |
| | | /// </summary> |
| | | [Description("ç§»å¨ä¸")] |
| | | Moving, |
| | | |
| | | /// <summary> |
| | | /// åè´§ä¸ |
| | | /// </summary> |
| | | [Description("åè´§ä¸")] |
| | | PickingUp, |
| | | |
| | | /// <summary> |
| | | /// æ¾è´§ä¸ |
| | | /// </summary> |
| | | [Description("æ¾è´§ä¸")] |
| | | PuttingDown, |
| | | |
| | | /// <summary> |
| | | /// å¤çä¸ |
| | | /// </summary> |
| | | [Description("å¤çä¸")] |
| | | Processing, |
| | | |
| | | /// <summary> |
| | | /// å¼å¸¸ä¸ |
| | | /// </summary> |
| | | [Description("å¼å¸¸ä¸")] |
| | | Abnormal, |
| | | |
| | | /// <summary> |
| | | /// éå¸¸åæ¢ä¸ |
| | | /// </summary> |
| | | [Description("é叏忢ä¸")] |
| | | EmergencyStopping, |
| | | |
| | | /// <summary> |
| | | /// æªç¥ |
| | | /// </summary> |
| | | [Description("æªç¥")] |
| | | Unkonw |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å åæºä»»å¡å®æç¶ææä¸¾ |
| | | /// </summary> |
| | | public enum FormationStackerCraneTaskCompletionStatus |
| | | { |
| | | /// <summary> |
| | | /// æ |
| | | /// </summary> |
| | | [Description("æ ")] |
| | | None, |
| | | |
| | | /// <summary> |
| | | /// æ£å¸¸å®æ |
| | | /// </summary> |
| | | [Description("æ£å¸¸å®æ")] |
| | | NormalCompleted, |
| | | |
| | | /// <summary> |
| | | /// å¼å¸¸å®æ |
| | | /// </summary> |
| | | [Description("å¼å¸¸å®æ")] |
| | | AbnormalCompleted, |
| | | |
| | | /// <summary> |
| | | /// æªç¥ |
| | | /// </summary> |
| | | [Description("æªç¥")] |
| | | Unkonw |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using HslCommunication; |
| | | using System.ComponentModel; |
| | | using System.Reflection; |
| | | using WIDESEAWCS_Communicator; |
| | | using WIDESEAWCS_QuartzJob.DeviceBase; |
| | | using WIDESEAWCS_QuartzJob.DTO; |
| | | using WIDESEAWCS_QuartzJob.StackerCrane; |
| | | using WIDESEAWCS_QuartzJob.StackerCrane.Enum; |
| | | |
| | | namespace WIDESEAWCS_QuartzJob |
| | | { |
| | | /// <summary> |
| | | /// èªå®ä¹å åæº |
| | | /// </summary> |
| | | [Description("åæå容å åæº")] |
| | | public class SpeFormationStackerCrane : IStackerCrane |
| | | { |
| | | #region Private Member |
| | | |
| | | /// <summary> |
| | | /// å åæºé讯对象 |
| | | /// </summary> |
| | | private BaseCommunicator _communicator; |
| | | |
| | | /// <summary> |
| | | /// å åæºåè®®ä¿¡æ¯ |
| | | /// </summary> |
| | | private readonly List<DeviceProDTO> _deviceProDTOs; |
| | | |
| | | /// <summary> |
| | | /// å åæºåè®®æç»ä¿¡æ¯ |
| | | /// </summary> |
| | | private readonly List<DeviceProtocolDetailDTO> _deviceProtocolDetailDTOs; |
| | | |
| | | /// <summary> |
| | | /// 设å¤ç¼å· |
| | | /// </summary> |
| | | public readonly string _deviceCode; |
| | | |
| | | /// <summary> |
| | | /// 设å¤åç§° |
| | | /// </summary> |
| | | public readonly string _deviceName; |
| | | |
| | | /// <summary> |
| | | /// ä¸ä¸æ¬¡ä»»å¡å· |
| | | /// </summary> |
| | | private int _lastTaskNum; |
| | | |
| | | private bool _isChecked = false; |
| | | |
| | | private bool _heartStart = true; |
| | | |
| | | private bool _isConnected = true; |
| | | |
| | | #endregion Private Member |
| | | |
| | | #region Public Member |
| | | |
| | | /// <summary> |
| | | /// é讯对象 |
| | | /// </summary> |
| | | public BaseCommunicator Communicator => _communicator; |
| | | |
| | | /// <summary> |
| | | /// é讯åè®®ä¿¡æ¯ |
| | | /// </summary> |
| | | public List<DeviceProDTO> DeviceProDTOs => _deviceProDTOs; |
| | | |
| | | /// <summary> |
| | | /// é讯åè®®æç»ä¿¡æ¯ |
| | | /// </summary> |
| | | public List<DeviceProtocolDetailDTO> DeviceProtocolDetailDTOs => _deviceProtocolDetailDTOs; |
| | | |
| | | public FormationStackerCraneTaskCompletionStatus StackerCraneCompletionValue => GetStackerCraneCompletionStatus(); |
| | | |
| | | /// <summary> |
| | | /// å åæºç¶æ |
| | | /// </summary> |
| | | public FormationStackerCraneRunStatus StackerCraneStatusValue => GetStackerCraneStatus(); |
| | | |
| | | /// <summary> |
| | | /// å åæºç¶æä¸æè¯´æ |
| | | /// </summary> |
| | | public string StackerCraneStatusDes => GetEnumDes(StackerCraneStatusValue); |
| | | |
| | | /// <summary> |
| | | /// ä½ä¸ç¶æ |
| | | /// </summary> |
| | | public FormationStackerCraneOperationStatus StackerCraneWorkStatusValue => GetStackerCraneWorkStatus(); |
| | | |
| | | /// <summary> |
| | | /// ä½ä¸ç¶æä¸æè¯´æ |
| | | /// </summary> |
| | | public string StackerCraneWorkStatusDes => GetEnumDes(StackerCraneWorkStatusValue); |
| | | |
| | | /// <summary> |
| | | /// ä¸ä¸æ¬¡æ§è¡çä»»å¡å· |
| | | /// </summary> |
| | | public int LastTaskNum => _lastTaskNum; |
| | | |
| | | /// <summary> |
| | | /// å½åæ£å¨æ§è¡çä»»å¡å· |
| | | /// </summary> |
| | | public int CurrentTaskNum => GetCurrentTaskNum(); |
| | | |
| | | /// <summary> |
| | | /// ä¸ä¸æ¬¡æ§è¡çä»»å¡ç±»å |
| | | /// </summary> |
| | | public int? LastTaskType { get; set; } = null; |
| | | |
| | | /// <summary> |
| | | /// 设å¤ç¼å· |
| | | /// </summary> |
| | | public string DeviceCode => _deviceCode; |
| | | |
| | | /// <summary> |
| | | /// 设å¤åç§° |
| | | /// </summary> |
| | | public string DeviceName => _deviceName; |
| | | |
| | | /// <summary> |
| | | /// è®¾å¤æ¯å¦å·²è¿æ¥ |
| | | /// </summary> |
| | | public bool IsConnected => Communicator.IsConnected && _isConnected; |
| | | |
| | | /// <summary> |
| | | /// å åæºä»»å¡å½ä»¤ |
| | | /// </summary> |
| | | public object StackerCraneTaskCommand { get; set; } |
| | | |
| | | /// <summary> |
| | | /// å åæºä»»å¡å®æäºä»¶ |
| | | /// </summary> |
| | | public event EventHandler<StackerCraneTaskCompletedEventArgs> StackerCraneTaskCompletedEventHandler; |
| | | |
| | | /// <summary> |
| | | /// å åæºå®æäºä»¶æ¯å¦å·²è®¢é
|
| | | /// </summary> |
| | | public bool IsEventSubscribed => StackerCraneTaskCompletedEventHandler != null; |
| | | |
| | | #endregion Public Member |
| | | |
| | | #region Constructor Function |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | /// <param name="communicator">å åæºé讯对象</param> |
| | | /// <param name="deviceProDTOs">å åæºå议信æ¯</param> |
| | | /// <param name="deviceProtocolDetailDTOs">å åæºåè®®æç»ä¿¡æ¯</param> |
| | | /// <param name="deviceCode">设å¤ç¼å·</param> |
| | | /// <param name="deviceName">设å¤åç§°</param> |
| | | public SpeFormationStackerCrane(BaseCommunicator communicator, List<DeviceProDTO> deviceProDTOs, List<DeviceProtocolDetailDTO> deviceProtocolDetailDTOs, string deviceCode, string deviceName) |
| | | { |
| | | _communicator = communicator; |
| | | _deviceProDTOs = deviceProDTOs; |
| | | _deviceProtocolDetailDTOs = deviceProtocolDetailDTOs; |
| | | _deviceCode = deviceCode; |
| | | _deviceName = deviceName; |
| | | CheckConnect(); |
| | | } |
| | | |
| | | #endregion Constructor Function |
| | | |
| | | #region Private Method |
| | | |
| | | private object GetStatus(string protocolParamType) |
| | | { |
| | | if (!Communicator.IsConnected) |
| | | { |
| | | return StackerCraneStatus.Unkonw.ToString(); |
| | | } |
| | | |
| | | List<DeviceProDTO> devicePros = _deviceProDTOs.Where(x => x.DeviceProParamType == protocolParamType).ToList(); |
| | | if (devicePros.Count == 0) |
| | | { |
| | | throw new Exception($"æªè·åå°å议信æ¯ï¼åè®®åæ°ç±»åï¼{protocolParamType}"); |
| | | } |
| | | |
| | | foreach (var devicePro in devicePros) |
| | | { |
| | | object readStatus = Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType); |
| | | |
| | | DeviceProtocolDetailDTO? deviceProtocolDetail = _deviceProtocolDetailDTOs.FirstOrDefault( |
| | | x => x.DeviceProParamName == devicePro.DeviceProParamType |
| | | && x.ProtocalDetailValue.Equals(readStatus.ToString())); |
| | | |
| | | if (deviceProtocolDetail != null) |
| | | { |
| | | return Convert.ToInt32(readStatus); |
| | | } |
| | | } |
| | | |
| | | return StackerCraneStatus.Unkonw.ToString(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åå åæºè®¾å¤ç¶æ |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | private FormationStackerCraneRunStatus GetStackerCraneStatus() |
| | | { |
| | | return (FormationStackerCraneRunStatus)GetStatus(nameof(FormationStackerCraneRunStatus)); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åå åæºå·¥ä½ç¶æ |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | private FormationStackerCraneOperationStatus GetStackerCraneWorkStatus() |
| | | { |
| | | return (FormationStackerCraneOperationStatus)GetStatus(nameof(FormationStackerCraneOperationStatus)); |
| | | } |
| | | |
| | | private FormationStackerCraneTaskCompletionStatus GetStackerCraneCompletionStatus() |
| | | { |
| | | return (FormationStackerCraneTaskCompletionStatus)GetStatus(nameof(FormationStackerCraneTaskCompletionStatus)); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åæä¸¾è¯´æ |
| | | /// </summary> |
| | | /// <typeparam name="T">æä¸¾æ³å</typeparam> |
| | | /// <param name="value"></param> |
| | | /// <returns></returns> |
| | | private string GetEnumDes<T>(T value) where T : Enum |
| | | { |
| | | FieldInfo? fieldInfo = typeof(T).GetField(value.ToString()); |
| | | if (fieldInfo != null) |
| | | { |
| | | DescriptionAttribute? descriptionAttribute = fieldInfo.GetCustomAttribute<DescriptionAttribute>(); |
| | | if (descriptionAttribute != null) |
| | | { |
| | | return descriptionAttribute.Description; |
| | | } |
| | | return "æªå®ä¹"; |
| | | } |
| | | return "æªç¥"; |
| | | } |
| | | |
| | | private int GetCurrentTaskNum() |
| | | { |
| | | DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CurrentTaskNum)); |
| | | return devicePro == null ? throw new Exception($"读åå½åä»»å¡å·é误,æªè·åå°å议信æ¯,è¯·æ£æ¥é
ç½®åæ°åç§°æ¯å¦é
ç½®,ä¸é
置为{nameof(CurrentTaskNum)}") : (int)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType); |
| | | } |
| | | |
| | | private void CheckConnect() |
| | | { |
| | | Task.Run(() => |
| | | { |
| | | while (_heartStart) |
| | | { |
| | | try |
| | | { |
| | | DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(); |
| | | if (devicePro == null) |
| | | { |
| | | _isConnected = false; |
| | | } |
| | | else |
| | | { |
| | | Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType); |
| | | _isConnected = true; |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _isConnected = false; |
| | | } |
| | | Thread.Sleep(500); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | #endregion Private Method |
| | | |
| | | #region Public Method |
| | | |
| | | /// <summary> |
| | | /// è·åå åæºç¶æ |
| | | /// </summary> |
| | | public T GetStackerCraneStatus<T>() where T : notnull, Enum |
| | | { |
| | | return (T)GetStatus(typeof(T).Name); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éæ¾å¯¹è±¡ |
| | | /// </summary> |
| | | public void Dispose() |
| | | { |
| | | _heartStart = false; |
| | | _communicator.Dispose(); |
| | | GC.SuppressFinalize(this); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®åæ°å称读åå åæºå¯¹åºçæ°æ®ã |
| | | /// </summary> |
| | | /// <typeparam name="TEnum">åæ°åç§°æä¸¾ç±»åã</typeparam> |
| | | /// <typeparam name="TResult">读åç»æçè¿åå¼ç±»åã</typeparam> |
| | | /// <param name="value">åæ°åç§°ã</param> |
| | | /// <returns>è¿å读åå°çæ°æ®ã</returns> |
| | | /// <exception cref="Exception"></exception> |
| | | public TResult GetValue<TEnum, TResult>(TEnum value) where TEnum : Enum |
| | | { |
| | | if (!IsConnected) throw new Exception($"éè®¯è¿æ¥é误ï¼è¯·æ£æ¥ç½ç»"); |
| | | DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == value.ToString()); |
| | | return devicePro == null ? throw new Exception($"è¯»åæ°æ®é误,æªå¨å议信æ¯é颿¾å°åæ°{value.ToString()}") : (TResult)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¿è·³ |
| | | /// </summary> |
| | | public void Heartbeat() |
| | | { |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åéä»»å¡å½ä»¤ |
| | | /// </summary> |
| | | /// <param name="command">ä»»å¡å½ä»¤</param> |
| | | /// <returns></returns> |
| | | public bool SendCommand<T>(T command) where T : IDataTransfer, new() |
| | | { |
| | | if (Communicator is SiemensS7) |
| | | { |
| | | if (!IsConnected) throw new Exception($"éè®¯è¿æ¥é误ï¼è¯·æ£æ¥ç½ç»"); |
| | | DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand)).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); |
| | | if (devicePro == null) |
| | | { |
| | | return false; |
| | | } |
| | | if (Communicator.WriteCustomer(devicePro.DeviceProAddress, command)) |
| | | { |
| | | StackerCraneTaskCommand = command; |
| | | //CheckStackerCraneTaskCompleted(); |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | else |
| | | { |
| | | throw new Exception("æä¸æ¯æé¤è¥¿é¨åä¹å¤çPLC"); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// çæµå åæºä»»å¡æ¯å¦å®æ(鲿¢ä»»å¡å®æäºä»¶çæµè¶
æ¶ï¼å®ä¹æå¨è§¦ååè½) |
| | | /// </summary> |
| | | public void CheckStackerCraneTaskCompleted() |
| | | { |
| | | if (_isChecked) |
| | | return; |
| | | |
| | | Task.Run(() => |
| | | { |
| | | _isChecked = true; |
| | | try |
| | | { |
| | | DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(FormationStackerCraneTaskCompletionStatus)); |
| | | if (devicePro == null) |
| | | return; |
| | | |
| | | DeviceProtocolDetailDTO? deviceProtocolDetail = _deviceProtocolDetailDTOs.FirstOrDefault( |
| | | x => x.DeviceProParamName == devicePro.DeviceProParamName |
| | | && x.ProtocolDetailType == FormationStackerCraneTaskCompletionStatus.NormalCompleted.ToString()); |
| | | |
| | | if (deviceProtocolDetail == null) |
| | | return; |
| | | |
| | | OperateResult<TimeSpan> operateResult = WaitForCompletion(devicePro, deviceProtocolDetail); |
| | | |
| | | if (operateResult.IsSuccess) |
| | | { |
| | | int taskNum = CurrentTaskNum; |
| | | StackerCraneTaskCompletedEventArgs args = new(taskNum); |
| | | StackerCraneTaskCompletedEventHandler?.Invoke(this, args); |
| | | _lastTaskNum = taskNum; |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // TODO: æ·»å æ¥å¿è®°å½ |
| | | } |
| | | finally |
| | | { |
| | | _isChecked = false; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// çå¾
ä»»å¡å®æä¿¡å· |
| | | /// </summary> |
| | | private OperateResult<TimeSpan> WaitForCompletion(DeviceProDTO devicePro, DeviceProtocolDetailDTO deviceProtocolDetail) |
| | | { |
| | | TypeCode typeCode = SiemensDBDataType.GetTypeCode(devicePro.DeviceDataType); |
| | | |
| | | return typeCode switch |
| | | { |
| | | TypeCode.Boolean => Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, |
| | | Convert.ToBoolean(deviceProtocolDetail.ProtocalDetailValue)), |
| | | |
| | | TypeCode.Byte => Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, |
| | | Convert.ToByte(deviceProtocolDetail.ProtocalDetailValue)), |
| | | |
| | | TypeCode.Int16 => Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, |
| | | Convert.ToInt16(deviceProtocolDetail.ProtocalDetailValue)), |
| | | |
| | | TypeCode.Int32 => Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, |
| | | Convert.ToInt32(deviceProtocolDetail.ProtocalDetailValue)), |
| | | |
| | | TypeCode.UInt16 => Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, |
| | | Convert.ToUInt16(deviceProtocolDetail.ProtocalDetailValue)), |
| | | |
| | | TypeCode.UInt32 => Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, |
| | | Convert.ToUInt32(deviceProtocolDetail.ProtocalDetailValue)), |
| | | |
| | | _ => new OperateResult<TimeSpan>() |
| | | }; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®åæ°åç§°åå
¥å åæºå¯¹åºçæ°æ®ã |
| | | /// </summary> |
| | | /// <typeparam name="TEnum">åæ°åç§°æä¸¾ç±»åã</typeparam> |
| | | /// <typeparam name="TValue">è¦åå
¥çæ°æ®ç±»åã</typeparam> |
| | | /// <param name="enum">åæ°åç§°ã</param> |
| | | /// <param name="value">è¦åå
¥çæ°æ®ã</param> |
| | | /// <returns>è¿ååå
¥æåæå¤±è´¥</returns> |
| | | /// <exception cref="Exception"></exception> |
| | | public bool SetValue<TEnum, TValue>(TEnum @enum, TValue value) |
| | | where TEnum : Enum |
| | | where TValue : notnull |
| | | { |
| | | if (!IsConnected) throw new Exception($"éè®¯è¿æ¥é误ï¼è¯·æ£æ¥ç½ç»"); |
| | | DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == @enum.ToString()); |
| | | return devicePro == null ? throw new Exception($"åå
¥æ°æ®é误,æªå¨å议信æ¯é颿¾å°åæ°{value.ToString()}") : Communicator.WriteObj(devicePro.DeviceProAddress, devicePro.DeviceDataType, value); |
| | | } |
| | | |
| | | #endregion Public Method |
| | | } |
| | | } |
| | |
| | | "ApiName": "WIDESEAWCS", |
| | | "ExpMinutes": 120, |
| | | "QuartzJobAutoStart": true, |
| | | "DBSeedEnable": true, |
| | | "QuartzDBSeedEnable": true, |
| | | "DBSeedEnable": false, |
| | | "QuartzDBSeedEnable": false, |
| | | "LogDeubgEnable": false, //æ¯å¦è®°å½è°è¯æ¥å¿ |
| | | "PrintSql": true, //æå°SQLè¯å¥ |
| | | "LogAOPEnable": true, //æ¯å¦è®°å½AOPæ¥å¿ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using Quartz; |
| | | using System.Diagnostics.CodeAnalysis; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_ITaskInfoRepository; |
| | | using WIDESEAWCS_ITaskInfoService; |
| | | using WIDESEAWCS_Model.Models; |
| | | using WIDESEAWCS_QuartzJob; |
| | | using WIDESEAWCS_QuartzJob.Models; |
| | | using WIDESEAWCS_QuartzJob.Service; |
| | | using WIDESEAWCS_QuartzJob.StackerCrane.Enum; |
| | | using WIDESEAWCS_Tasks.StackerCraneJob; |
| | | |
| | | namespace WIDESEAWCS_Tasks |
| | | { |
| | | [DisallowConcurrentExecution] |
| | | public class FormationCommonStackerCraneJob : IJob |
| | | { |
| | | private readonly ITaskService _taskService; |
| | | private readonly ITaskExecuteDetailService _taskExecuteDetailService; |
| | | private readonly ITaskRepository _taskRepository; |
| | | private readonly IRouterService _routerService; |
| | | |
| | | public FormationCommonStackerCraneJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService) |
| | | { |
| | | _taskService = taskService; |
| | | _taskExecuteDetailService = taskExecuteDetailService; |
| | | _taskRepository = taskRepository; |
| | | _routerService = routerService; |
| | | } |
| | | |
| | | public Task Execute(IJobExecutionContext context) |
| | | { |
| | | try |
| | | { |
| | | Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " FormationCommonStackerCraneJob Start"); |
| | | |
| | | bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); |
| | | if (!flag || value is not SpeFormationStackerCrane commonStackerCrane) |
| | | { |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | if (!commonStackerCrane.IsEventSubscribed) |
| | | { |
| | | commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler; |
| | | } |
| | | |
| | | if (commonStackerCrane.StackerCraneStatusValue != FormationStackerCraneRunStatus.Standby) |
| | | { |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | commonStackerCrane.CheckStackerCraneTaskCompleted(); |
| | | |
| | | if (commonStackerCrane.StackerCraneWorkStatusValue == FormationStackerCraneOperationStatus.Idle) |
| | | { |
| | | Dt_Task? task = GetTask(commonStackerCrane); |
| | | if (task != null) |
| | | { |
| | | FormationStackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task); |
| | | if (stackerCraneTaskCommand != null) |
| | | { |
| | | bool sendFlag = commonStackerCrane.SendCommand(stackerCraneTaskCommand); |
| | | if (sendFlag) |
| | | { |
| | | commonStackerCrane.LastTaskType = task.TaskType; |
| | | _taskService.UpdateTaskStatusToNext(task.TaskNum); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"FormationCommonStackerCraneJob Error: {ex.Message}"); |
| | | } |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ä»»å¡å®æäºä»¶è®¢é
çæ¹æ³ |
| | | /// </summary> |
| | | /// <param name="sender"></param> |
| | | /// <param name="e"></param> |
| | | private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, WIDESEAWCS_QuartzJob.StackerCrane.StackerCraneTaskCompletedEventArgs e) |
| | | { |
| | | SpeFormationStackerCrane? commonStackerCrane = sender as SpeFormationStackerCrane; |
| | | if (commonStackerCrane != null) |
| | | { |
| | | if (commonStackerCrane.GetValue<FormationStackerCraneDBName, short>(FormationStackerCraneDBName.WorkType) != 7) |
| | | { |
| | | Console.Out.WriteLine("TaskCompleted" + e.TaskNum); |
| | | _taskService.StackCraneTaskCompleted(e.TaskNum); |
| | | commonStackerCrane.SetValue(FormationStackerCraneDBName.WorkType, 4); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åä»»å¡ |
| | | /// </summary> |
| | | /// <param name="commonStackerCrane">å åæºå¯¹è±¡</param> |
| | | /// <returns></returns> |
| | | private Dt_Task? GetTask(SpeFormationStackerCrane commonStackerCrane) |
| | | { |
| | | Dt_Task? task = null; |
| | | |
| | | if (commonStackerCrane.LastTaskType == null) |
| | | { |
| | | task = _taskService.QueryStackerCraneTask(commonStackerCrane.DeviceCode); |
| | | } |
| | | else |
| | | { |
| | | if (commonStackerCrane.LastTaskType.GetValueOrDefault().GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) |
| | | { |
| | | task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode); |
| | | task ??= _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode); |
| | | } |
| | | else |
| | | { |
| | | task = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode); |
| | | } |
| | | } |
| | | |
| | | if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) |
| | | { |
| | | if (IsOutTaskStationAvailable(task)) |
| | | { |
| | | return task; |
| | | } |
| | | |
| | | List<string> otherOutStationCodes = _routerService.QueryNextRoutes(commonStackerCrane.DeviceCode, task.NextAddress, task.TaskType) |
| | | .Select(x => x.ChildPosi).ToList(); |
| | | |
| | | List<Dt_Task> tasks = _taskService.QueryStackerCraneOutTasks(commonStackerCrane.DeviceCode, otherOutStationCodes); |
| | | |
| | | foreach (var alternativeTask in tasks) |
| | | { |
| | | if (IsOutTaskStationAvailable(alternativeTask)) |
| | | { |
| | | return alternativeTask; |
| | | } |
| | | } |
| | | |
| | | task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode); |
| | | } |
| | | |
| | | return task; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ£æ¥åºåºä»»å¡çåºåºç«å°æ¯å¦å¯ç¨ |
| | | /// </summary> |
| | | /// <param name="task">ä»»å¡å®ä½</param> |
| | | /// <returns>妿ç«å°å¯ç¨è¿åtrueï¼å¦åè¿åfalse</returns> |
| | | private bool IsOutTaskStationAvailable([NotNull] Dt_Task task) |
| | | { |
| | | Dt_Router? router = _routerService.QueryNextRoute(task.Roadway, task.NextAddress, task.TaskType); |
| | | if (router == null) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"æªæ¾å°ç«å°ã{task.NextAddress}ãä¿¡æ¯ï¼æ æ³æ ¡éªç«å°"); |
| | | return false; |
| | | } |
| | | |
| | | IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == router.ChildPosiDeviceCode); |
| | | if (device == null) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"æªæ¾å°åºåºç«å°ã{router.ChildPosiDeviceCode}ã对åºçéè®¯å¯¹è±¡ï¼æ æ³å¤æåºåºç«å°æ¯å¦è¢«å ç¨"); |
| | | return false; |
| | | } |
| | | |
| | | CommonConveyorLine conveyorLine = (CommonConveyorLine)device; |
| | | return conveyorLine.IsOccupied(router.ChildPosi); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ä»»å¡å®ä½è½¬æ¢æå½ä»¤Model |
| | | /// </summary> |
| | | /// <param name="task">ä»»å¡å®ä½</param> |
| | | /// <returns></returns> |
| | | public FormationStackerCraneTaskCommand? ConvertToStackerCraneTaskCommand([NotNull] Dt_Task task) |
| | | { |
| | | FormationStackerCraneTaskCommand stackerCraneTaskCommand = new FormationStackerCraneTaskCommand |
| | | { |
| | | Barcode = task.PalletCode, |
| | | TaskNum = task.TaskNum, |
| | | WorkType = 4, |
| | | WorkAction = 1, |
| | | FireAlarm = 0, |
| | | FieldName = "" |
| | | }; |
| | | |
| | | TaskTypeGroup taskTypeGroup = task.TaskType.GetTaskTypeGroup(); |
| | | |
| | | return taskTypeGroup switch |
| | | { |
| | | TaskTypeGroup.InboundGroup => BuildInboundCommand(task, stackerCraneTaskCommand), |
| | | TaskTypeGroup.OutbondGroup => BuildOutboundCommand(task, stackerCraneTaskCommand), |
| | | TaskTypeGroup.RelocationGroup => BuildRelocationCommand(task, stackerCraneTaskCommand), |
| | | _ => stackerCraneTaskCommand |
| | | }; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æå»ºå
¥åºå½ä»¤ |
| | | /// </summary> |
| | | private FormationStackerCraneTaskCommand? BuildInboundCommand(Dt_Task task, FormationStackerCraneTaskCommand command) |
| | | { |
| | | Dt_Router? router = _routerService.QueryNextRoute(task.CurrentAddress, task.Roadway, task.TaskType); |
| | | if (router == null) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"æªæ¾å°ç«å°ã{task.CurrentAddress}ãä¿¡æ¯ï¼æ æ³è·å对åºçå åæºåè´§ç«å°ä¿¡æ¯"); |
| | | return null; |
| | | } |
| | | |
| | | command.StartRow = Convert.ToInt16(router.SrmRow); |
| | | command.StartColumn = Convert.ToInt16(router.SrmColumn); |
| | | command.StartLayer = Convert.ToInt16(router.SrmLayer); |
| | | |
| | | if (!TryParseAddress(task.NextAddress, out short endRow, out short endColumn, out short endLayer)) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"å
¥åºä»»å¡ç»ç¹é误ï¼ç»ç¹ï¼ã{task.NextAddress}ã"); |
| | | return null; |
| | | } |
| | | |
| | | command.EndRow = endRow; |
| | | command.EndColumn = endColumn; |
| | | command.EndLayer = endLayer; |
| | | |
| | | return command; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æå»ºåºåºå½ä»¤ |
| | | /// </summary> |
| | | private FormationStackerCraneTaskCommand? BuildOutboundCommand(Dt_Task task, FormationStackerCraneTaskCommand command) |
| | | { |
| | | Dt_Router? router = _routerService.QueryNextRoute(task.Roadway, task.TargetAddress, task.TaskType); |
| | | if (router == null) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"æªæ¾å°ç«å°ã{task.TargetAddress}ãä¿¡æ¯ï¼æ æ³è·å对åºçå åæºæ¾è´§ç«å°ä¿¡æ¯"); |
| | | return null; |
| | | } |
| | | |
| | | command.EndRow = Convert.ToInt16(router.SrmRow); |
| | | command.EndColumn = Convert.ToInt16(router.SrmColumn); |
| | | command.EndLayer = Convert.ToInt16(router.SrmLayer); |
| | | |
| | | if (!TryParseAddress(task.CurrentAddress, out short startRow, out short startColumn, out short startLayer)) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"åºåºä»»å¡èµ·ç¹é误ï¼èµ·ç¹ï¼ã{task.CurrentAddress}ã"); |
| | | return null; |
| | | } |
| | | |
| | | command.StartRow = startRow; |
| | | command.StartColumn = startColumn; |
| | | command.StartLayer = startLayer; |
| | | |
| | | return command; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æå»ºç§»åºå½ä»¤ |
| | | /// </summary> |
| | | private FormationStackerCraneTaskCommand? BuildRelocationCommand(Dt_Task task, FormationStackerCraneTaskCommand command) |
| | | { |
| | | if (!TryParseAddress(task.NextAddress, out short endRow, out short endColumn, out short endLayer)) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"ç§»åºä»»å¡ç»ç¹é误ï¼ç»ç¹ï¼ã{task.NextAddress}ã"); |
| | | return null; |
| | | } |
| | | |
| | | command.EndRow = endRow; |
| | | command.EndColumn = endColumn; |
| | | command.EndLayer = endLayer; |
| | | |
| | | if (!TryParseAddress(task.CurrentAddress, out short startRow, out short startColumn, out short startLayer)) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"ç§»åºä»»å¡èµ·ç¹é误ï¼èµ·ç¹ï¼ã{task.CurrentAddress}ã"); |
| | | return null; |
| | | } |
| | | |
| | | command.StartRow = startRow; |
| | | command.StartColumn = startColumn; |
| | | command.StartLayer = startLayer; |
| | | |
| | | return command; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è§£æå°ååç¬¦ä¸²ï¼æ ¼å¼ï¼è¡-å-å±ï¼ |
| | | /// </summary> |
| | | private bool TryParseAddress(string address, out short row, out short column, out short layer) |
| | | { |
| | | row = column = layer = 0; |
| | | |
| | | string[] parts = address.Split("-"); |
| | | if (parts.Length != 3) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | return short.TryParse(parts[0], out row) |
| | | && short.TryParse(parts[1], out column) |
| | | && short.TryParse(parts[2], out layer); |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #region << ç æ¬ 注 é >> |
| | | |
| | | /*---------------------------------------------------------------- |
| | | * å½å空é´ï¼WIDESEAWCS_Tasks.StackerCraneJob |
| | | * å建è
ï¼è¡ç«¥åº |
| | | * å建æ¶é´ï¼2024/8/2 16:13:36 |
| | | * çæ¬ï¼V1.0.0 |
| | | * æè¿°ï¼ |
| | | * |
| | | * ---------------------------------------------------------------- |
| | | * ä¿®æ¹äººï¼ |
| | | * ä¿®æ¹æ¶é´ï¼ |
| | | * çæ¬ï¼V1.0.1 |
| | | * ä¿®æ¹è¯´æï¼ |
| | | * |
| | | *----------------------------------------------------------------*/ |
| | | |
| | | #endregion << ç æ¬ 注 é >> |
| | | |
| | | namespace WIDESEAWCS_Tasks.StackerCraneJob |
| | | { |
| | | public enum FormationStackerCraneDBName |
| | | { |
| | | /// <summary> |
| | | /// å¿è·³ |
| | | /// </summary> |
| | | HeartBeat, |
| | | |
| | | /// <summary> |
| | | /// ä»»å¡å· |
| | | /// </summary> |
| | | TaskNum, |
| | | |
| | | /// <summary> |
| | | /// ä½ä¸æä»¤ |
| | | /// </summary> |
| | | WorkAction, |
| | | |
| | | /// <summary> |
| | | /// æ¶é²æä»¤ |
| | | /// </summary> |
| | | FireAlarm, |
| | | |
| | | /// <summary> |
| | | /// ä½ä¸ç±»å |
| | | /// </summary> |
| | | WorkType, |
| | | |
| | | /// <summary> |
| | | /// èµ·å§è¡ |
| | | /// </summary> |
| | | StartRow, |
| | | |
| | | /// <summary> |
| | | /// èµ·å§å |
| | | /// </summary> |
| | | StartColumn, |
| | | |
| | | /// <summary> |
| | | /// èµ·å§å± |
| | | /// </summary> |
| | | StartLayer, |
| | | |
| | | /// <summary> |
| | | /// ç®æ è¡ |
| | | /// </summary> |
| | | EndRow, |
| | | |
| | | /// <summary> |
| | | /// ç®æ å |
| | | /// </summary> |
| | | EndColumn, |
| | | |
| | | /// <summary> |
| | | /// ç®æ å± |
| | | /// </summary> |
| | | EndLayer, |
| | | |
| | | /// <summary> |
| | | /// æçå· |
| | | /// </summary> |
| | | Barcode, |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #region << ç æ¬ 注 é >> |
| | | |
| | | /*---------------------------------------------------------------- |
| | | * å½å空é´ï¼WIDESEAWCS_Tasks.StackerCraneJob |
| | | * å建è
ï¼è¡ç«¥åº |
| | | * å建æ¶é´ï¼2024/8/2 16:13:36 |
| | | * çæ¬ï¼V1.0.0 |
| | | * æè¿°ï¼ |
| | | * |
| | | * ---------------------------------------------------------------- |
| | | * ä¿®æ¹äººï¼ |
| | | * ä¿®æ¹æ¶é´ï¼ |
| | | * çæ¬ï¼V1.0.1 |
| | | * ä¿®æ¹è¯´æï¼ |
| | | * |
| | | *----------------------------------------------------------------*/ |
| | | |
| | | #endregion << ç æ¬ 注 é >> |
| | | |
| | | using WIDESEAWCS_QuartzJob.DeviceBase; |
| | | |
| | | namespace WIDESEAWCS_Tasks.StackerCraneJob |
| | | { |
| | | public class FormationStackerCraneTaskCommand : DeviceCommand |
| | | { |
| | | #region <Public Menber> |
| | | |
| | | /// <summary> |
| | | /// å¿è·³ |
| | | /// </summary> |
| | | public short HeartBeat { get; set; } |
| | | |
| | | /// <summary> |
| | | /// ä»»å¡å· |
| | | /// </summary> |
| | | public int TaskNum { get; set; } |
| | | |
| | | /// <summary> |
| | | /// æ æåæ®µ |
| | | /// </summary> |
| | | [DataLength(32)] |
| | | public string FieldName { get; set; } |
| | | |
| | | /// <summary> |
| | | /// ä½ä¸æä»¤ |
| | | /// </summary> |
| | | public short WorkAction { get; set; } |
| | | |
| | | /// <summary> |
| | | /// æ¶é²æä»¤ |
| | | /// </summary> |
| | | public short FireAlarm { get; set; } |
| | | |
| | | /// <summary> |
| | | /// ä½ä¸ç±»å |
| | | /// </summary> |
| | | public short WorkType { get; set; } |
| | | |
| | | /// <summary> |
| | | /// èµ·å§è¡ |
| | | /// </summary> |
| | | public short StartRow { get; set; } |
| | | |
| | | /// <summary> |
| | | /// èµ·å§å |
| | | /// </summary> |
| | | public short StartColumn { get; set; } |
| | | |
| | | /// <summary> |
| | | /// èµ·å§å± |
| | | /// </summary> |
| | | public short StartLayer { get; set; } |
| | | |
| | | /// <summary> |
| | | /// ç®æ è¡ |
| | | /// </summary> |
| | | public short EndRow { get; set; } |
| | | |
| | | /// <summary> |
| | | /// ç®æ å |
| | | /// </summary> |
| | | public short EndColumn { get; set; } |
| | | |
| | | /// <summary> |
| | | /// ç®æ å± |
| | | /// </summary> |
| | | public short EndLayer { get; set; } |
| | | |
| | | /// <summary> |
| | | /// æçå· |
| | | /// </summary> |
| | | [DataLength(26)] |
| | | public string Barcode { get; set; } |
| | | |
| | | #endregion <Public Menber> |
| | | } |
| | | } |
| | |
| | | { |
| | | try |
| | | { |
| | | List<Dt_Task> tasks = _taskService.Repository.QueryData(); |
| | | |
| | | Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " CommonStackerCraneJob Start"); |
| | | |
| | | bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); |
| | | if (flag && value != null && value is CommonStackerCrane commonStackerCrane) |
| | | if (!flag || value is not CommonStackerCrane commonStackerCrane) |
| | | { |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | if (!commonStackerCrane.IsEventSubscribed) |
| | | { |
| | | commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订é
ä»»å¡å®æäºä»¶ |
| | | commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler; |
| | | } |
| | | if (commonStackerCrane.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneStatusValue == StackerCraneStatus.Normal) |
| | | |
| | | if (commonStackerCrane.StackerCraneAutoStatusValue != StackerCraneAutoStatus.Automatic |
| | | || commonStackerCrane.StackerCraneStatusValue != StackerCraneStatus.Normal) |
| | | { |
| | | commonStackerCrane.CheckStackerCraneTaskCompleted();//鲿¢ä»»å¡å®æäºä»¶çæµè¶
æ¶ï¼åæå¨è§¦å䏿¬¡ |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | commonStackerCrane.CheckStackerCraneTaskCompleted(); |
| | | |
| | | if (commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby) |
| | | { |
| | | Dt_Task? task = GetTask(commonStackerCrane); |
| | | if (task != null) |
| | | { |
| | | int num = new Random().Next(1, 100); |
| | | if (num < 30) |
| | | { |
| | | throw new CommunicationException("é误æµè¯", CommunicationErrorType.Unknown); |
| | | } |
| | | StackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task); |
| | | if (stackerCraneTaskCommand != null) |
| | | { |
| | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"CommonStackerCraneJob Error: {ex.Message}"); |
| | | } |
| | | return Task.CompletedTask; |
| | | } |
| | |
| | | /// <returns></returns> |
| | | private Dt_Task? GetTask(CommonStackerCrane commonStackerCrane) |
| | | { |
| | | Dt_Task task; |
| | | Dt_Task? task = null; |
| | | if (commonStackerCrane.LastTaskType == null) |
| | | { |
| | | task = _taskService.QueryStackerCraneTask(commonStackerCrane.DeviceCode); |
| | |
| | | if (commonStackerCrane.LastTaskType.GetValueOrDefault().GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) |
| | | { |
| | | task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode); |
| | | if (task == null) |
| | | { |
| | | task = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode); |
| | | } |
| | | task ??= _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode); |
| | | } |
| | | else |
| | | { |
| | |
| | | |
| | | if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) |
| | | { |
| | | if (OutTaskStationIsOccupied(task) != null) |
| | | if (IsOutTaskStationAvailable(task)) |
| | | { |
| | | return task; |
| | | } |
| | | else |
| | | |
| | | List<string> otherOutStationCodes = _routerService.QueryNextRoutes(commonStackerCrane.DeviceCode, task.NextAddress, task.TaskType) |
| | | .Select(x => x.ChildPosi).ToList(); |
| | | List<Dt_Task> tasks = _taskService.QueryStackerCraneOutTasks(commonStackerCrane.DeviceCode, otherOutStationCodes); |
| | | foreach (var alternativeTask in tasks) |
| | | { |
| | | List<string> otherOutStaionCodes = _routerService.QueryNextRoutes(commonStackerCrane.DeviceCode, task.NextAddress).Select(x => x.ChildPosi).ToList(); |
| | | List<Dt_Task> tasks = _taskService.QueryStackerCraneOutTasks(commonStackerCrane.DeviceCode, otherOutStaionCodes); |
| | | foreach (var item in tasks) |
| | | if (IsOutTaskStationAvailable(alternativeTask)) |
| | | { |
| | | if (OutTaskStationIsOccupied(task) != null) |
| | | { |
| | | return task; |
| | | return alternativeTask; |
| | | } |
| | | } |
| | | task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode); |
| | | } |
| | | } |
| | | |
| | | return task; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åºåºä»»å¡å¤æåºåºç«å°æ¯å¦è¢«å ç¨ |
| | | /// åºåºä»»å¡å¤æåºåºç«å°æ¯å¦å¯ç¨ |
| | | /// </summary> |
| | | /// <param name="task">ä»»å¡å®ä½</param> |
| | | /// <returns>妿æªè¢«å ç¨ï¼è¿åä¼ å
¥çä»»å¡ä¿¡æ¯ï¼å¦åï¼è¿ånull</returns> |
| | | private Dt_Task? OutTaskStationIsOccupied([NotNull] Dt_Task task) |
| | | /// <returns>妿ç«å°å¯ç¨è¿åtrueï¼å¦åè¿åfalse</returns> |
| | | private bool IsOutTaskStationAvailable([NotNull] Dt_Task task) |
| | | { |
| | | |
| | | Dt_Router? router = _routerService.QueryNextRoutes(task.Roadway, task.NextAddress).FirstOrDefault(); |
| | | if (router != null) |
| | | { |
| | | IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == router.ChildPosiDeviceCode); |
| | | if (device != null) |
| | | { |
| | | CommonConveyorLine conveyorLine = (CommonConveyorLine)device; |
| | | if (conveyorLine.IsOccupied(router.ChildPosi))//åºåºç«å°æªè¢«å ç¨ |
| | | { |
| | | return task; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"æªæ¾å°åºåºç«å°ã{router.ChildPosiDeviceCode}ã对åºçéè®¯å¯¹è±¡ï¼æ æ³å¤æåºåºç«å°æ¯å¦è¢«å ç¨"); |
| | | } |
| | | } |
| | | else |
| | | Dt_Router? router = _routerService.QueryNextRoute(task.Roadway, task.NextAddress, task.TaskType); |
| | | if (router == null) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"æªæ¾å°ç«å°ã{task.NextAddress}ãä¿¡æ¯ï¼æ æ³æ ¡éªç«å°"); |
| | | return false; |
| | | } |
| | | return null; |
| | | |
| | | IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == router.ChildPosiDeviceCode); |
| | | if (device == null) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"æªæ¾å°åºåºç«å°ã{router.ChildPosiDeviceCode}ã对åºçéè®¯å¯¹è±¡ï¼æ æ³å¤æåºåºç«å°æ¯å¦è¢«å ç¨"); |
| | | return false; |
| | | } |
| | | |
| | | CommonConveyorLine conveyorLine = (CommonConveyorLine)device; |
| | | return conveyorLine.IsOccupied(router.ChildPosi); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// </summary> |
| | | /// <param name="task">ä»»å¡å®ä½</param> |
| | | /// <returns></returns> |
| | | /// <exception cref="Exception"></exception> |
| | | public StackerCraneTaskCommand? ConvertToStackerCraneTaskCommand([NotNull] Dt_Task task) |
| | | { |
| | | StackerCraneTaskCommand stackerCraneTaskCommand = new StackerCraneTaskCommand(); |
| | | StackerCraneTaskCommand stackerCraneTaskCommand = new StackerCraneTaskCommand |
| | | { |
| | | Barcode = task.PalletCode, |
| | | TaskNum = task.TaskNum, |
| | | WorkType = 1, |
| | | TrayType = 0 |
| | | }; |
| | | |
| | | stackerCraneTaskCommand.Barcode = task.PalletCode; |
| | | stackerCraneTaskCommand.TaskNum = task.TaskNum; |
| | | stackerCraneTaskCommand.WorkType = 1; |
| | | stackerCraneTaskCommand.TrayType = 0; |
| | | if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//夿æ¯å¦æ¯å
¥åºä»»å¡ |
| | | TaskTypeGroup taskTypeGroup = task.TaskType.GetTaskTypeGroup(); |
| | | return taskTypeGroup switch |
| | | { |
| | | List<Dt_Router> routers = _routerService.QueryNextRoutes(task.CurrentAddress, task.Roadway); |
| | | if (routers.Count > 0) |
| | | { |
| | | stackerCraneTaskCommand.StartRow = Convert.ToInt16(routers.FirstOrDefault().SrmRow); |
| | | stackerCraneTaskCommand.StartColumn = Convert.ToInt16(routers.FirstOrDefault().SrmColumn); |
| | | stackerCraneTaskCommand.StartLayer = Convert.ToInt16(routers.FirstOrDefault().SrmLayer); |
| | | |
| | | string[] targetCodes = task.NextAddress.Split("-"); |
| | | if (targetCodes.Length == 3) |
| | | { |
| | | stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[0]); |
| | | stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[1]); |
| | | stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[2]); |
| | | TaskTypeGroup.InboundGroup => BuildInboundCommand(task, stackerCraneTaskCommand), |
| | | TaskTypeGroup.OutbondGroup => BuildOutboundCommand(task, stackerCraneTaskCommand), |
| | | TaskTypeGroup.RelocationGroup => BuildRelocationCommand(task, stackerCraneTaskCommand), |
| | | _ => stackerCraneTaskCommand |
| | | }; |
| | | } |
| | | else |
| | | |
| | | /// <summary> |
| | | /// æå»ºå
¥åºå½ä»¤ |
| | | /// </summary> |
| | | private StackerCraneTaskCommand? BuildInboundCommand(Dt_Task task, StackerCraneTaskCommand command) |
| | | { |
| | | //æ°æ®é
ç½®é误 |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"å
¥åºä»»å¡ç»ç¹é误ï¼èµ·ç¹ï¼ã{task.NextAddress}ã"); |
| | | Dt_Router? router = _routerService.QueryNextRoute(task.CurrentAddress, task.Roadway, task.TaskType); |
| | | if (router == null) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"æªæ¾å°ç«å°ã{task.CurrentAddress}ãä¿¡æ¯ï¼æ æ³è·å对åºçå åæºåè´§ç«å°ä¿¡æ¯"); |
| | | return null; |
| | | } |
| | | } |
| | | else |
| | | |
| | | command.StartRow = Convert.ToInt16(router.SrmRow); |
| | | command.StartColumn = Convert.ToInt16(router.SrmColumn); |
| | | command.StartLayer = Convert.ToInt16(router.SrmLayer); |
| | | |
| | | if (!TryParseAddress(task.NextAddress, out short endRow, out short endColumn, out short endLayer)) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"æªæ¾å°ç«å°ã{task.NextAddress}ãä¿¡æ¯ï¼æ æ³è·å对åºçå åæºåè´§ç«å°ä¿¡æ¯"); |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"å
¥åºä»»å¡ç»ç¹é误ï¼ç»ç¹ï¼ã{task.NextAddress}ã"); |
| | | return null; |
| | | } |
| | | } |
| | | else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) |
| | | { |
| | | List<Dt_Router> routers = _routerService.QueryNextRoutes(task.Roadway, task.TargetAddress); |
| | | if (routers.Count > 0) |
| | | { |
| | | stackerCraneTaskCommand.EndRow = Convert.ToInt16(routers.FirstOrDefault().SrmRow); |
| | | stackerCraneTaskCommand.EndColumn = Convert.ToInt16(routers.FirstOrDefault().SrmColumn); |
| | | stackerCraneTaskCommand.EndLayer = Convert.ToInt16(routers.FirstOrDefault().SrmLayer); |
| | | |
| | | string[] sourceCodes = task.CurrentAddress.Split("-"); |
| | | if (sourceCodes.Length == 3) |
| | | { |
| | | stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[0]); |
| | | stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[1]); |
| | | stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[2]); |
| | | command.EndRow = endRow; |
| | | command.EndColumn = endColumn; |
| | | command.EndLayer = endLayer; |
| | | |
| | | return command; |
| | | } |
| | | else |
| | | |
| | | /// <summary> |
| | | /// æå»ºåºåºå½ä»¤ |
| | | /// </summary> |
| | | private StackerCraneTaskCommand? BuildOutboundCommand(Dt_Task task, StackerCraneTaskCommand command) |
| | | { |
| | | //æ°æ®é
ç½®é误 |
| | | Dt_Router? router = _routerService.QueryNextRoute(task.Roadway, task.TargetAddress, task.TaskType); |
| | | if (router == null) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"æªæ¾å°ç«å°ã{task.TargetAddress}ãä¿¡æ¯ï¼æ æ³è·å对åºçå åæºæ¾è´§ç«å°ä¿¡æ¯"); |
| | | return null; |
| | | } |
| | | |
| | | command.EndRow = Convert.ToInt16(router.SrmRow); |
| | | command.EndColumn = Convert.ToInt16(router.SrmColumn); |
| | | command.EndLayer = Convert.ToInt16(router.SrmLayer); |
| | | |
| | | if (!TryParseAddress(task.CurrentAddress, out short startRow, out short startColumn, out short startLayer)) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"åºåºä»»å¡èµ·ç¹é误ï¼èµ·ç¹ï¼ã{task.CurrentAddress}ã"); |
| | | return null; |
| | | } |
| | | |
| | | command.StartRow = startRow; |
| | | command.StartColumn = startColumn; |
| | | command.StartLayer = startLayer; |
| | | |
| | | return command; |
| | | } |
| | | else |
| | | |
| | | /// <summary> |
| | | /// æå»ºç§»åºå½ä»¤ |
| | | /// </summary> |
| | | private StackerCraneTaskCommand? BuildRelocationCommand(Dt_Task task, StackerCraneTaskCommand command) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"æªæ¾å°ç«å°ã{task.NextAddress}ãä¿¡æ¯ï¼æ æ³è·å对åºçå åæºæ¾è´§ç«å°ä¿¡æ¯"); |
| | | if (!TryParseAddress(task.NextAddress, out short endRow, out short endColumn, out short endLayer)) |
| | | { |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"ç§»åºä»»å¡ç»ç¹é误ï¼ç»ç¹ï¼ã{task.NextAddress}ã"); |
| | | return null; |
| | | } |
| | | } |
| | | else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup) |
| | | |
| | | command.EndRow = endRow; |
| | | command.EndColumn = endColumn; |
| | | command.EndLayer = endLayer; |
| | | |
| | | if (!TryParseAddress(task.CurrentAddress, out short startRow, out short startColumn, out short startLayer)) |
| | | { |
| | | string[] targetCodes = task.NextAddress.Split("-"); |
| | | if (targetCodes.Length == 3) |
| | | { |
| | | stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[0]); |
| | | stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[1]); |
| | | stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[2]); |
| | | } |
| | | else |
| | | { |
| | | //æ°æ®é
ç½®é误 |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"ç§»åºä»»å¡ç»ç¹é误ï¼èµ·ç¹ï¼ã{task.NextAddress}ã"); |
| | | return null; |
| | | } |
| | | string[] sourceCodes = task.CurrentAddress.Split("-"); |
| | | if (sourceCodes.Length == 3) |
| | | { |
| | | stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[0]); |
| | | stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[1]); |
| | | stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[2]); |
| | | } |
| | | else |
| | | { |
| | | //æ°æ®é
ç½®é误 |
| | | _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"ç§»åºä»»å¡èµ·ç¹é误ï¼èµ·ç¹ï¼ã{task.CurrentAddress}ã"); |
| | | return null; |
| | | } |
| | | |
| | | command.StartRow = startRow; |
| | | command.StartColumn = startColumn; |
| | | command.StartLayer = startLayer; |
| | | |
| | | return command; |
| | | } |
| | | return stackerCraneTaskCommand; |
| | | |
| | | /// <summary> |
| | | /// è§£æå°ååç¬¦ä¸²ï¼æ ¼å¼ï¼è¡-å-å±ï¼ |
| | | /// </summary> |
| | | private bool TryParseAddress(string address, out short row, out short column, out short layer) |
| | | { |
| | | row = column = layer = 0; |
| | | |
| | | string[] parts = address.Split("-"); |
| | | if (parts.Length != 3) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | return short.TryParse(parts[0], out row) |
| | | && short.TryParse(parts[1], out column) |
| | | && short.TryParse(parts[2], out layer); |
| | | } |
| | | } |
| | | } |