refactor(mes): 优化MES生产扫码入库功能支持多类型扫码
- 移除ERP销售订单中的MES相关API依赖和发货通知单功能
- 新增多种仓库管理错误码,包括合格库验证、库存质检、袋码管理等
- 扩展MES首页统计数据,增加出库流通和质量预警统计项
- 添加种子质检业务类型常量和袋码质检状态字段
- 实现追溯码扫码入库功能,支持袋码/托盘码/批次码三种扫码类型
- 完善托盘和批次整批入库的幂等处理机制
- 移除售后退货中的销售订单关联逻辑
已删除4个文件
已添加41个文件
已修改76个文件
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active] [ref=e1]: å·¥ä¸AIæºé å¹³å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: å·¥ä¸AIæºé å¹³å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: å·¥ä¸AIæºé å¹³å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: å·¥ä¸AIæºé å¹³å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: å·¥ä¸AIæºé å¹³å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: å·¥ä¸AIæºé å¹³å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [ref=f10e7]: |
| | | - complementary [ref=f10e9]: |
| | | - generic [ref=f10e10]: |
| | | - link [ref=f10e13] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - img "å·¥ä¸AIæºé å¹³å°" [ref=f10e16] |
| | | - menu [ref=f10e19]: |
| | | - menuitem [ref=f10e20] [cursor=pointer] |
| | | - listitem [ref=f10e24]: |
| | | - generic [ref=f10e25] [cursor=pointer] |
| | | - listitem [ref=f10e31]: |
| | | - generic [ref=f10e32] [cursor=pointer] |
| | | - listitem [ref=f10e36]: |
| | | - generic [ref=f10e37] [cursor=pointer] |
| | | - listitem [ref=f10e43]: |
| | | - generic [ref=f10e44] [cursor=pointer] |
| | | - listitem [ref=f10e48]: |
| | | - generic [ref=f10e49] [cursor=pointer] |
| | | - listitem [ref=f10e53]: |
| | | - generic [ref=f10e54] [cursor=pointer] |
| | | - listitem [ref=f10e58]: |
| | | - generic [ref=f10e59] [cursor=pointer] |
| | | - listitem [ref=f10e63]: |
| | | - generic [ref=f10e64] [cursor=pointer] |
| | | - listitem [ref=f10e68]: |
| | | - generic [ref=f10e69] [cursor=pointer] |
| | | - generic [ref=f10e74] [cursor=pointer] |
| | | - generic [ref=f10e79]: |
| | | - generic [ref=f10e80]: |
| | | - banner [ref=f10e81]: |
| | | - button [ref=f10e82] [cursor=pointer] |
| | | - button [ref=f10e85] [cursor=pointer] |
| | | - navigation "breadcrumb" [ref=f10e90]: |
| | | - list [ref=f10e91]: |
| | | - listitem [ref=f10e625]: |
| | | - link "åºåºæµé管ç" [ref=f10e626] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - listitem [ref=f10e630] |
| | | - listitem [ref=f10e633]: |
| | | - link "éå®åºåº" [disabled] [ref=f10e634] |
| | | - generic [ref=f10e98]: |
| | | - generic [ref=f10e100] [cursor=pointer]: |
| | | - generic [ref=f10e104]: æç´¢ |
| | | - generic [ref=f10e105]: Ctrl K |
| | | - button [ref=f10e107] [cursor=pointer] |
| | | - button "dark" [ref=f10e112] [cursor=pointer] |
| | | - button [ref=f10e121] [cursor=pointer] |
| | | - button [ref=f10e127] [cursor=pointer] |
| | | - button [ref=f10e130] [cursor=pointer] |
| | | - button [ref=f10e136] [cursor=pointer]: |
| | | - button [ref=f10e138] |
| | | - button "å·¥ä½å°" [ref=f10e142] [cursor=pointer] |
| | | - button "çå" [ref=f10e146] [cursor=pointer] |
| | | - generic [ref=f10e153]: |
| | | - generic [ref=f10e158]: |
| | | - generic [ref=f10e159] [cursor=pointer]: é¦é¡µ |
| | | - generic [ref=f10e641] [cursor=pointer]: éå®åºåº |
| | | - generic [ref=f10e173]: |
| | | - button [ref=f10e174] [cursor=pointer] |
| | | - generic [ref=f10e181] [cursor=pointer] |
| | | - generic [ref=f10e185] [cursor=pointer] |
| | | - main [ref=f10e192]: |
| | | - generic [ref=f10e196]: |
| | | - generic [ref=f10e197]: |
| | | - generic [ref=f10e198]: ä¸å¡å
¨é¾è·¯ |
| | | - generic [ref=f10e210]: |
| | | - generic [ref=f10e217] [cursor=pointer]: |
| | | - generic [ref=f10e218]: åç§ |
| | | - generic [ref=f10e219]: "1" |
| | | - generic [ref=f10e227] [cursor=pointer]: |
| | | - generic [ref=f10e228]: 产线 |
| | | - generic [ref=f10e229]: "1" |
| | | - generic [ref=f10e240] [cursor=pointer]: |
| | | - generic [ref=f10e241]: çäº§æ¹æ¬¡ |
| | | - generic [ref=f10e242]: "103" |
| | | - generic [ref=f10e250] [cursor=pointer]: |
| | | - generic [ref=f10e251]: è¢ç |
| | | - generic [ref=f10e252]: 1,101 |
| | | - generic [ref=f10e262] [cursor=pointer]: |
| | | - generic [ref=f10e263]: æçç |
| | | - generic [ref=f10e264]: "11" |
| | | - generic [ref=f10e275] [cursor=pointer]: |
| | | - generic [ref=f10e276]: éå®åºåº |
| | | - generic [ref=f10e277]: "0" |
| | | - generic [ref=f10e285] [cursor=pointer]: |
| | | - generic [ref=f10e286]: æµéæ«ç |
| | | - generic [ref=f10e287]: "23" |
| | | - generic [ref=f10e295] [cursor=pointer]: |
| | | - generic [ref=f10e296]: é²çª/æº¯æº |
| | | - generic [ref=f10e297]: "0" |
| | | - generic [ref=f10e298]: |
| | | - generic [ref=f10e308] [cursor=pointer]: |
| | | - generic [ref=f10e309]: åç§æ»æ° |
| | | - generic [ref=f10e310]: "1" |
| | | - generic [ref=f10e312]: åºç¡æ°æ® |
| | | - generic [ref=f10e323] [cursor=pointer]: |
| | | - generic [ref=f10e324]: çäº§æ¹æ¬¡ |
| | | - generic [ref=f10e325]: "103" |
| | | - generic [ref=f10e327]: ä¸è¢ä¸ç |
| | | - generic [ref=f10e335] [cursor=pointer]: |
| | | - generic [ref=f10e336]: è¢ç |
| | | - generic [ref=f10e337]: 1,101 |
| | | - generic [ref=f10e339]: èµç |
| | | - generic [ref=f10e349] [cursor=pointer]: |
| | | - generic [ref=f10e350]: æçç |
| | | - generic [ref=f10e351]: "11" |
| | | - generic [ref=f10e353]: æç |
| | | - generic [ref=f10e364] [cursor=pointer]: |
| | | - generic [ref=f10e365]: éå®åºåºå |
| | | - generic [ref=f10e366]: "0" |
| | | - generic [ref=f10e368]: åºåºæµé |
| | | - generic [ref=f10e376] [cursor=pointer]: |
| | | - generic [ref=f10e377]: 累计æ«ç |
| | | - generic [ref=f10e378]: "23" |
| | | - generic [ref=f10e380]: æº¯æº |
| | | - generic [ref=f10e387] [cursor=pointer]: |
| | | - generic [ref=f10e388]: åºåé¢è¦ |
| | | - generic [ref=f10e389]: "0" |
| | | - generic [ref=f10e391]: ä»å¨ |
| | | - generic [ref=f10e399] [cursor=pointer]: |
| | | - generic [ref=f10e400]: å¾
è¯å®¡ä¸åæ ¼ |
| | | - generic [ref=f10e401]: "0" |
| | | - generic [ref=f10e403]: è´¨é |
| | | - generic [ref=f10e404]: |
| | | - generic [ref=f10e408]: |
| | | - generic [ref=f10e409]: è¢ç çæè¶å¿ |
| | | - generic [ref=f10e411]: |
| | | - generic [ref=f10e412] [cursor=pointer]: |
| | | - generic [ref=f10e413]: |
| | | - radio "è¿ 7 天" [checked] |
| | | - generic [ref=f10e414]: è¿ 7 天 |
| | | - generic [ref=f10e415] [cursor=pointer]: |
| | | - generic [ref=f10e416]: |
| | | - radio "è¿ 30 天" |
| | | - generic [ref=f10e417]: è¿ 30 天 |
| | | - generic [ref=f10e422]: æ¶è´¹è
æ«ç å°åºåå¸ |
| | | - generic [ref=f10e431]: |
| | | - generic [ref=f10e432]: æ¹æ¬¡ç¶æåå¸ |
| | | - generic [ref=f10e441]: è¢ç ç¶æåå¸ |
| | | - generic [ref=f10e451]: |
| | | - generic [ref=f10e452]: å¾
åä¸é¢è¦ |
| | | - generic [ref=f10e456]: |
| | | - generic [ref=f10e461] [cursor=pointer]: |
| | | - generic [ref=f10e462]: çªè´§é¢è¦ |
| | | - generic [ref=f10e463]: å¾
å¤çççªè´§é¢è¦ |
| | | - generic [ref=f10e467] [cursor=pointer]: |
| | | - generic [ref=f10e468]: åºåé¢è¦ |
| | | - generic [ref=f10e469]: æªå¤ççåºåé¢è¦ |
| | | - generic [ref=f10e474] [cursor=pointer]: |
| | | - generic [ref=f10e475]: ä¸åæ ¼å |
| | | - generic [ref=f10e476]: å¾
è¯å®¡çä¸åæ ¼åå |
| | | - generic [ref=f10e477]: |
| | | - generic [ref=f10e478]: å¿«æ·å
¥å£ |
| | | - generic [ref=f10e482]: |
| | | - generic [ref=f10e484]: |
| | | - generic [ref=f10e485]: åºç¡æ°æ® |
| | | - generic [ref=f10e486]: |
| | | - generic [ref=f10e487] [cursor=pointer]: åç§ç®¡ç |
| | | - generic [ref=f10e493] [cursor=pointer]: åç§åç±» |
| | | - generic [ref=f10e499] [cursor=pointer]: 计éåä½ |
| | | - generic [ref=f10e504]: |
| | | - generic [ref=f10e505]: ä¸è¢ä¸ç ç产 |
| | | - generic [ref=f10e506]: |
| | | - generic [ref=f10e507] [cursor=pointer]: äº§çº¿ç»´æ¤ |
| | | - generic [ref=f10e511] [cursor=pointer]: æ¹æ¬¡ç产 |
| | | - generic [ref=f10e518] [cursor=pointer]: èµç 管ç |
| | | - generic [ref=f10e522] [cursor=pointer]: æçç |
| | | - generic [ref=f10e528] [cursor=pointer]: æ«ç å
¥åº |
| | | - generic [ref=f10e533]: |
| | | - generic [ref=f10e534]: åºåºæµé |
| | | - generic [ref=f10e535]: |
| | | - generic [ref=f10e536] [cursor=pointer]: åè´§éç¥ |
| | | - generic [ref=f10e540] [cursor=pointer]: éå®åºåº |
| | | - generic [ref=f10e547] [cursor=pointer]: éå®éè´§ |
| | | - generic [ref=f10e554]: |
| | | - generic [ref=f10e555]: é²ä¼ªé²çªè´§ |
| | | - generic [ref=f10e556]: |
| | | - generic [ref=f10e557] [cursor=pointer]: çªè´§é¢è¦ |
| | | - generic [ref=f10e561] [cursor=pointer]: æ«ç å°çåå¸ |
| | | - generic [ref=f10e567] [cursor=pointer]: 宿´æ§æ ¡éª |
| | | - generic [ref=f10e575]: |
| | | - generic [ref=f10e576]: 溯æºåæ |
| | | - generic [ref=f10e577]: æ¶è´¹è
æ«ç ç»è®¡ |
| | | - generic [ref=f10e583]: |
| | | - generic [ref=f10e584]: ä»å¨ç©æµ |
| | | - generic [ref=f10e585]: |
| | | - generic [ref=f10e586] [cursor=pointer]: ä»åºè®¾ç½® |
| | | - generic [ref=f10e592] [cursor=pointer]: åºåç°æé |
| | | - generic [ref=f10e598] [cursor=pointer]: åºåé¢è¦ |
| | | - generic [ref=f10e601] [cursor=pointer]: è½¬ç§»è°æ¨ |
| | | - generic [ref=f10e606]: |
| | | - generic [ref=f10e607]: è´¨é管ç |
| | | - generic [ref=f10e608]: |
| | | - generic [ref=f10e609] [cursor=pointer]: æ¹æ¬¡è¿½æº¯ |
| | | - generic [ref=f10e615] [cursor=pointer]: ä¸åæ ¼å |
| | | - generic [ref=f10e619] [cursor=pointer]: ç§åè´¨æ£ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: å·¥ä¸AIæºé å¹³å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [ref=f11e7]: |
| | | - complementary [ref=f11e9]: |
| | | - generic [ref=f11e10]: |
| | | - link [ref=f11e13] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - img "å·¥ä¸AIæºé å¹³å°" [ref=f11e16] |
| | | - menu [ref=f11e19]: |
| | | - menuitem [ref=f11e20] [cursor=pointer] |
| | | - listitem [ref=f11e24]: |
| | | - generic [ref=f11e25] [cursor=pointer] |
| | | - listitem [ref=f11e31]: |
| | | - generic [ref=f11e32] [cursor=pointer] |
| | | - listitem [ref=f11e36]: |
| | | - generic [ref=f11e37] [cursor=pointer] |
| | | - listitem [ref=f11e43]: |
| | | - generic [ref=f11e44] [cursor=pointer] |
| | | - listitem [ref=f11e48]: |
| | | - generic [ref=f11e49] [cursor=pointer] |
| | | - listitem [ref=f11e53]: |
| | | - generic [ref=f11e54] [cursor=pointer] |
| | | - listitem [ref=f11e58]: |
| | | - generic [ref=f11e59] [cursor=pointer] |
| | | - listitem [ref=f11e63]: |
| | | - generic [ref=f11e64] [cursor=pointer] |
| | | - listitem [ref=f11e68]: |
| | | - generic [ref=f11e69] [cursor=pointer] |
| | | - generic [ref=f11e74] [cursor=pointer] |
| | | - generic [ref=f11e79]: |
| | | - generic [ref=f11e80]: |
| | | - banner [ref=f11e81]: |
| | | - button [ref=f11e82] [cursor=pointer] |
| | | - button [ref=f11e85] [cursor=pointer] |
| | | - navigation "breadcrumb" [ref=f11e90]: |
| | | - list [ref=f11e91]: |
| | | - listitem [ref=f11e630]: |
| | | - link "é²ä¼ªé²çªè´§ç®¡ç" [ref=f11e631] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - listitem [ref=f11e635] |
| | | - listitem [ref=f11e638]: |
| | | - link "çªè´§é¢è¦" [disabled] [ref=f11e639] |
| | | - generic [ref=f11e98]: |
| | | - generic [ref=f11e100] [cursor=pointer]: |
| | | - generic [ref=f11e104]: æç´¢ |
| | | - generic [ref=f11e105]: Ctrl K |
| | | - button [ref=f11e107] [cursor=pointer] |
| | | - button "dark" [ref=f11e112] [cursor=pointer] |
| | | - button [ref=f11e121] [cursor=pointer] |
| | | - button [ref=f11e127] [cursor=pointer] |
| | | - button [ref=f11e130] [cursor=pointer] |
| | | - button [ref=f11e136] [cursor=pointer]: |
| | | - button [ref=f11e138] |
| | | - button "å·¥ä½å°" [ref=f11e142] [cursor=pointer] |
| | | - button "çå" [ref=f11e146] [cursor=pointer] |
| | | - generic [ref=f11e153]: |
| | | - generic [ref=f11e158]: |
| | | - generic [ref=f11e159] [cursor=pointer]: é¦é¡µ |
| | | - generic [ref=f11e645] [cursor=pointer]: çªè´§é¢è¦ |
| | | - generic [ref=f11e173]: |
| | | - button [ref=f11e174] [cursor=pointer] |
| | | - generic [ref=f11e181] [cursor=pointer] |
| | | - generic [ref=f11e185] [cursor=pointer] |
| | | - main [ref=f11e192]: |
| | | - generic [ref=f11e196]: |
| | | - generic [ref=f11e197]: |
| | | - generic [ref=f11e198]: ä¸å¡å
¨é¾è·¯ |
| | | - generic [ref=f11e210]: |
| | | - generic [ref=f11e217] [cursor=pointer]: |
| | | - generic [ref=f11e218]: åç§ |
| | | - generic [ref=f11e219]: "1" |
| | | - generic [ref=f11e227] [cursor=pointer]: |
| | | - generic [ref=f11e228]: 产线 |
| | | - generic [ref=f11e229]: "1" |
| | | - generic [ref=f11e240] [cursor=pointer]: |
| | | - generic [ref=f11e241]: çäº§æ¹æ¬¡ |
| | | - generic [ref=f11e242]: "103" |
| | | - generic [ref=f11e250] [cursor=pointer]: |
| | | - generic [ref=f11e251]: è¢ç |
| | | - generic [ref=f11e252]: 1,101 |
| | | - generic [ref=f11e262] [cursor=pointer]: |
| | | - generic [ref=f11e263]: æçç |
| | | - generic [ref=f11e264]: "11" |
| | | - generic [ref=f11e275] [cursor=pointer]: |
| | | - generic [ref=f11e276]: éå®åºåº |
| | | - generic [ref=f11e277]: "0" |
| | | - generic [ref=f11e285] [cursor=pointer]: |
| | | - generic [ref=f11e286]: æµéæ«ç |
| | | - generic [ref=f11e287]: "23" |
| | | - generic [ref=f11e295] [cursor=pointer]: |
| | | - generic [ref=f11e296]: é²çª/æº¯æº |
| | | - generic [ref=f11e297]: "0" |
| | | - generic [ref=f11e298]: |
| | | - generic [ref=f11e308] [cursor=pointer]: |
| | | - generic [ref=f11e309]: åç§æ»æ° |
| | | - generic [ref=f11e310]: "1" |
| | | - generic [ref=f11e312]: åºç¡æ°æ® |
| | | - generic [ref=f11e323] [cursor=pointer]: |
| | | - generic [ref=f11e324]: çäº§æ¹æ¬¡ |
| | | - generic [ref=f11e325]: "103" |
| | | - generic [ref=f11e327]: ä¸è¢ä¸ç |
| | | - generic [ref=f11e335] [cursor=pointer]: |
| | | - generic [ref=f11e336]: è¢ç |
| | | - generic [ref=f11e337]: 1,101 |
| | | - generic [ref=f11e339]: èµç |
| | | - generic [ref=f11e349] [cursor=pointer]: |
| | | - generic [ref=f11e350]: æçç |
| | | - generic [ref=f11e351]: "11" |
| | | - generic [ref=f11e353]: æç |
| | | - generic [ref=f11e364] [cursor=pointer]: |
| | | - generic [ref=f11e365]: éå®åºåºå |
| | | - generic [ref=f11e366]: "0" |
| | | - generic [ref=f11e368]: åºåºæµé |
| | | - generic [ref=f11e376] [cursor=pointer]: |
| | | - generic [ref=f11e377]: 累计æ«ç |
| | | - generic [ref=f11e378]: "23" |
| | | - generic [ref=f11e380]: æº¯æº |
| | | - generic [ref=f11e387] [cursor=pointer]: |
| | | - generic [ref=f11e388]: åºåé¢è¦ |
| | | - generic [ref=f11e389]: "0" |
| | | - generic [ref=f11e391]: ä»å¨ |
| | | - generic [ref=f11e399] [cursor=pointer]: |
| | | - generic [ref=f11e400]: å¾
è¯å®¡ä¸åæ ¼ |
| | | - generic [ref=f11e401]: "0" |
| | | - generic [ref=f11e403]: è´¨é |
| | | - generic [ref=f11e404]: |
| | | - generic [ref=f11e408]: |
| | | - generic [ref=f11e409]: è¢ç çæè¶å¿ |
| | | - generic [ref=f11e411]: |
| | | - generic [ref=f11e412] [cursor=pointer]: |
| | | - generic [ref=f11e413]: |
| | | - radio "è¿ 7 天" [checked] |
| | | - generic [ref=f11e414]: è¿ 7 天 |
| | | - generic [ref=f11e415] [cursor=pointer]: |
| | | - generic [ref=f11e416]: |
| | | - radio "è¿ 30 天" |
| | | - generic [ref=f11e417]: è¿ 30 天 |
| | | - generic [ref=f11e422]: æ¶è´¹è
æ«ç å°åºåå¸ |
| | | - generic [ref=f11e431]: |
| | | - generic [ref=f11e432]: æ¹æ¬¡ç¶æåå¸ |
| | | - generic [ref=f11e441]: è¢ç ç¶æåå¸ |
| | | - generic [ref=f11e451]: |
| | | - generic [ref=f11e452]: å¾
åä¸é¢è¦ |
| | | - generic [ref=f11e456]: |
| | | - generic [ref=f11e461] [cursor=pointer]: |
| | | - generic [ref=f11e462]: çªè´§é¢è¦ |
| | | - generic [ref=f11e463]: å¾
å¤çççªè´§é¢è¦ |
| | | - generic [ref=f11e467] [cursor=pointer]: |
| | | - generic [ref=f11e468]: åºåé¢è¦ |
| | | - generic [ref=f11e469]: æªå¤ççåºåé¢è¦ |
| | | - generic [ref=f11e474] [cursor=pointer]: |
| | | - generic [ref=f11e475]: ä¸åæ ¼å |
| | | - generic [ref=f11e476]: å¾
è¯å®¡çä¸åæ ¼åå |
| | | - generic [ref=f11e477]: |
| | | - generic [ref=f11e478]: å¿«æ·å
¥å£ |
| | | - generic [ref=f11e482]: |
| | | - generic [ref=f11e484]: |
| | | - generic [ref=f11e485]: åºç¡æ°æ® |
| | | - generic [ref=f11e486]: |
| | | - generic [ref=f11e487] [cursor=pointer]: åç§ç®¡ç |
| | | - generic [ref=f11e493] [cursor=pointer]: åç§åç±» |
| | | - generic [ref=f11e499] [cursor=pointer]: 计éåä½ |
| | | - generic [ref=f11e504]: |
| | | - generic [ref=f11e505]: ä¸è¢ä¸ç ç产 |
| | | - generic [ref=f11e506]: |
| | | - generic [ref=f11e507] [cursor=pointer]: äº§çº¿ç»´æ¤ |
| | | - generic [ref=f11e511] [cursor=pointer]: æ¹æ¬¡ç产 |
| | | - generic [ref=f11e518] [cursor=pointer]: èµç 管ç |
| | | - generic [ref=f11e522] [cursor=pointer]: æçç |
| | | - generic [ref=f11e528] [cursor=pointer]: æ«ç å
¥åº |
| | | - generic [ref=f11e533]: |
| | | - generic [ref=f11e534]: åºåºæµé |
| | | - generic [ref=f11e535]: |
| | | - generic [ref=f11e536] [cursor=pointer]: åè´§éç¥ |
| | | - generic [ref=f11e540] [cursor=pointer]: éå®åºåº |
| | | - generic [ref=f11e547] [cursor=pointer]: éå®éè´§ |
| | | - generic [ref=f11e554]: |
| | | - generic [ref=f11e555]: é²ä¼ªé²çªè´§ |
| | | - generic [ref=f11e556]: |
| | | - generic [ref=f11e557] [cursor=pointer]: çªè´§é¢è¦ |
| | | - generic [ref=f11e561] [cursor=pointer]: æ«ç å°çåå¸ |
| | | - generic [ref=f11e567] [cursor=pointer]: 宿´æ§æ ¡éª |
| | | - generic [ref=f11e575]: |
| | | - generic [ref=f11e576]: 溯æºåæ |
| | | - generic [ref=f11e577]: æ¶è´¹è
æ«ç ç»è®¡ |
| | | - generic [ref=f11e583]: |
| | | - generic [ref=f11e584]: ä»å¨ç©æµ |
| | | - generic [ref=f11e585]: |
| | | - generic [ref=f11e586] [cursor=pointer]: ä»åºè®¾ç½® |
| | | - generic [ref=f11e592] [cursor=pointer]: åºåç°æé |
| | | - generic [ref=f11e598] [cursor=pointer]: åºåé¢è¦ |
| | | - generic [ref=f11e601] [cursor=pointer]: è½¬ç§»è°æ¨ |
| | | - generic [ref=f11e606]: |
| | | - generic [ref=f11e607]: è´¨é管ç |
| | | - generic [ref=f11e608]: |
| | | - generic [ref=f11e609] [cursor=pointer]: æ¹æ¬¡è¿½æº¯ |
| | | - generic [ref=f11e615] [cursor=pointer]: ä¸åæ ¼å |
| | | - generic [ref=f11e619] [cursor=pointer]: ç§åè´¨æ£ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: å·¥ä¸AIæºé å¹³å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: å·¥ä¸AIæºé å¹³å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: å·¥ä¸AIæºé å¹³å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [ref=f15e7]: |
| | | - complementary [ref=f15e9]: |
| | | - generic [ref=f15e10]: |
| | | - link [ref=f15e13] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - img "å·¥ä¸AIæºé å¹³å°" [ref=f15e16] |
| | | - menu [ref=f15e19]: |
| | | - menuitem [ref=f15e20] [cursor=pointer] |
| | | - listitem [ref=f15e24]: |
| | | - generic [ref=f15e25] [cursor=pointer] |
| | | - listitem [ref=f15e31]: |
| | | - generic [ref=f15e32] [cursor=pointer] |
| | | - listitem [ref=f15e36]: |
| | | - generic [ref=f15e37] [cursor=pointer] |
| | | - listitem [ref=f15e43]: |
| | | - generic [ref=f15e44] [cursor=pointer] |
| | | - listitem [ref=f15e48]: |
| | | - generic [ref=f15e49] [cursor=pointer] |
| | | - listitem [ref=f15e53]: |
| | | - generic [ref=f15e54] [cursor=pointer] |
| | | - listitem [ref=f15e58]: |
| | | - generic [ref=f15e59] [cursor=pointer] |
| | | - listitem [ref=f15e63]: |
| | | - generic [ref=f15e64] [cursor=pointer] |
| | | - listitem [ref=f15e68]: |
| | | - generic [ref=f15e69] [cursor=pointer] |
| | | - generic [ref=f15e74] [cursor=pointer] |
| | | - generic [ref=f15e79]: |
| | | - generic [ref=f15e80]: |
| | | - banner [ref=f15e81]: |
| | | - button [ref=f15e82] [cursor=pointer] |
| | | - button [ref=f15e85] [cursor=pointer] |
| | | - navigation "breadcrumb" [ref=f15e90]: |
| | | - list [ref=f15e91]: |
| | | - listitem [ref=f15e92]: |
| | | - link "é¦é¡µ" [disabled] [ref=f15e93] |
| | | - generic [ref=f15e98]: |
| | | - generic [ref=f15e100] [cursor=pointer]: |
| | | - generic [ref=f15e104]: æç´¢ |
| | | - generic [ref=f15e105]: Ctrl K |
| | | - button [ref=f15e107] [cursor=pointer] |
| | | - button "dark" [ref=f15e112] [cursor=pointer] |
| | | - button [ref=f15e121] [cursor=pointer] |
| | | - button [ref=f15e127] [cursor=pointer] |
| | | - button [ref=f15e130] [cursor=pointer] |
| | | - button [ref=f15e136] [cursor=pointer]: |
| | | - button [ref=f15e138] |
| | | - button "å·¥ä½å°" [ref=f15e142] [cursor=pointer] |
| | | - button "çå" [ref=f15e146] [cursor=pointer] |
| | | - generic [ref=f15e153]: |
| | | - generic [ref=f15e154]: é¦é¡µ |
| | | - generic [ref=f15e173]: |
| | | - button [ref=f15e174] [cursor=pointer] |
| | | - generic [ref=f15e181] [cursor=pointer] |
| | | - generic [ref=f15e185] [cursor=pointer] |
| | | - main [ref=f15e192]: |
| | | - generic [ref=f15e196]: |
| | | - generic [ref=f15e197]: |
| | | - generic [ref=f15e198]: ä¸å¡å
¨é¾è·¯ |
| | | - generic [ref=f15e210]: |
| | | - generic [ref=f15e217] [cursor=pointer]: |
| | | - generic [ref=f15e218]: åç§ |
| | | - generic [ref=f15e219]: "1" |
| | | - generic [ref=f15e227] [cursor=pointer]: |
| | | - generic [ref=f15e228]: 产线 |
| | | - generic [ref=f15e229]: "1" |
| | | - generic [ref=f15e240] [cursor=pointer]: |
| | | - generic [ref=f15e241]: çäº§æ¹æ¬¡ |
| | | - generic [ref=f15e242]: "103" |
| | | - generic [ref=f15e250] [cursor=pointer]: |
| | | - generic [ref=f15e251]: è¢ç |
| | | - generic [ref=f15e252]: 1,101 |
| | | - generic [ref=f15e262] [cursor=pointer]: |
| | | - generic [ref=f15e263]: æçç |
| | | - generic [ref=f15e264]: "11" |
| | | - generic [ref=f15e275] [cursor=pointer]: |
| | | - generic [ref=f15e276]: éå®åºåº |
| | | - generic [ref=f15e277]: "0" |
| | | - generic [ref=f15e285] [cursor=pointer]: |
| | | - generic [ref=f15e286]: æµéæ«ç |
| | | - generic [ref=f15e287]: "23" |
| | | - generic [ref=f15e295] [cursor=pointer]: |
| | | - generic [ref=f15e296]: é²çª/æº¯æº |
| | | - generic [ref=f15e297]: "0" |
| | | - generic [ref=f15e298]: |
| | | - generic [ref=f15e308] [cursor=pointer]: |
| | | - generic [ref=f15e309]: åç§æ»æ° |
| | | - generic [ref=f15e310]: "1" |
| | | - generic [ref=f15e311]: åºç¡æ°æ® |
| | | - generic [ref=f15e322] [cursor=pointer]: |
| | | - generic [ref=f15e323]: çäº§æ¹æ¬¡ |
| | | - generic [ref=f15e324]: "92" |
| | | - generic [ref=f15e325]: ä¸è¢ä¸ç |
| | | - generic [ref=f15e333] [cursor=pointer]: |
| | | - generic [ref=f15e334]: è¢ç |
| | | - generic [ref=f15e335]: "981" |
| | | - generic [ref=f15e336]: èµç |
| | | - generic [ref=f15e346] [cursor=pointer]: |
| | | - generic [ref=f15e347]: æçç |
| | | - generic [ref=f15e348]: "10" |
| | | - generic [ref=f15e349]: æç |
| | | - generic [ref=f15e360] [cursor=pointer]: |
| | | - generic [ref=f15e361]: éå®åºåºå |
| | | - generic [ref=f15e362]: "0" |
| | | - generic [ref=f15e363]: åºåºæµé |
| | | - generic [ref=f15e371] [cursor=pointer]: |
| | | - generic [ref=f15e372]: 累计æ«ç |
| | | - generic [ref=f15e373]: "20" |
| | | - generic [ref=f15e374]: æº¯æº |
| | | - generic [ref=f15e381] [cursor=pointer]: |
| | | - generic [ref=f15e382]: åºåé¢è¦ |
| | | - generic [ref=f15e383]: "0" |
| | | - generic [ref=f15e384]: ä»å¨ |
| | | - generic [ref=f15e392] [cursor=pointer]: |
| | | - generic [ref=f15e393]: å¾
è¯å®¡ä¸åæ ¼ |
| | | - generic [ref=f15e394]: "0" |
| | | - generic [ref=f15e395]: è´¨é |
| | | - generic [ref=f15e396]: |
| | | - generic [ref=f15e400]: |
| | | - generic [ref=f15e401]: è¢ç çæè¶å¿ |
| | | - generic [ref=f15e403]: |
| | | - generic [ref=f15e404] [cursor=pointer]: |
| | | - generic [ref=f15e405]: |
| | | - radio "è¿ 7 天" [checked] |
| | | - generic [ref=f15e406]: è¿ 7 天 |
| | | - generic [ref=f15e407] [cursor=pointer]: |
| | | - generic [ref=f15e408]: |
| | | - radio "è¿ 30 天" |
| | | - generic [ref=f15e409]: è¿ 30 天 |
| | | - generic [ref=f15e414]: æ¶è´¹è
æ«ç å°åºåå¸ |
| | | - generic [ref=f15e423]: |
| | | - generic [ref=f15e424]: æ¹æ¬¡ç¶æåå¸ |
| | | - generic [ref=f15e433]: è¢ç ç¶æåå¸ |
| | | - generic [ref=f15e443]: |
| | | - generic [ref=f15e444]: å¾
åä¸é¢è¦ |
| | | - generic [ref=f15e448]: |
| | | - generic [ref=f15e453] [cursor=pointer]: |
| | | - generic [ref=f15e454]: çªè´§é¢è¦ |
| | | - generic [ref=f15e455]: å¾
å¤çççªè´§é¢è¦ |
| | | - generic [ref=f15e459] [cursor=pointer]: |
| | | - generic [ref=f15e460]: åºåé¢è¦ |
| | | - generic [ref=f15e461]: æªå¤ççåºåé¢è¦ |
| | | - generic [ref=f15e466] [cursor=pointer]: |
| | | - generic [ref=f15e467]: ä¸åæ ¼å |
| | | - generic [ref=f15e468]: å¾
è¯å®¡çä¸åæ ¼åå |
| | | - generic [ref=f15e469]: |
| | | - generic [ref=f15e470]: å¿«æ·å
¥å£ |
| | | - generic [ref=f15e474]: |
| | | - generic [ref=f15e476]: |
| | | - generic [ref=f15e477]: åºç¡æ°æ® |
| | | - generic [ref=f15e478]: |
| | | - generic [ref=f15e479] [cursor=pointer]: åç§ç®¡ç |
| | | - generic [ref=f15e485] [cursor=pointer]: åç§åç±» |
| | | - generic [ref=f15e491] [cursor=pointer]: 计éåä½ |
| | | - generic [ref=f15e496]: |
| | | - generic [ref=f15e497]: ä¸è¢ä¸ç ç产 |
| | | - generic [ref=f15e498]: |
| | | - generic [ref=f15e499] [cursor=pointer]: äº§çº¿ç»´æ¤ |
| | | - generic [ref=f15e503] [cursor=pointer]: æ¹æ¬¡ç产 |
| | | - generic [ref=f15e510] [cursor=pointer]: èµç 管ç |
| | | - generic [ref=f15e514] [cursor=pointer]: æçç |
| | | - generic [ref=f15e520] [cursor=pointer]: æ«ç å
¥åº |
| | | - generic [ref=f15e525]: |
| | | - generic [ref=f15e526]: åºåºæµé |
| | | - generic [ref=f15e527]: |
| | | - generic [ref=f15e528] [cursor=pointer]: åè´§éç¥ |
| | | - generic [ref=f15e532] [cursor=pointer]: éå®åºåº |
| | | - generic [ref=f15e539] [cursor=pointer]: éå®éè´§ |
| | | - generic [ref=f15e546]: |
| | | - generic [ref=f15e547]: é²ä¼ªé²çªè´§ |
| | | - generic [ref=f15e548]: |
| | | - generic [ref=f15e549] [cursor=pointer]: çªè´§é¢è¦ |
| | | - generic [ref=f15e553] [cursor=pointer]: æ«ç å°çåå¸ |
| | | - generic [ref=f15e559] [cursor=pointer]: 宿´æ§æ ¡éª |
| | | - generic [ref=f15e567]: |
| | | - generic [ref=f15e568]: 溯æºåæ |
| | | - generic [ref=f15e569]: æ¶è´¹è
æ«ç ç»è®¡ |
| | | - generic [ref=f15e575]: |
| | | - generic [ref=f15e576]: ä»å¨ç©æµ |
| | | - generic [ref=f15e577]: |
| | | - generic [ref=f15e578] [cursor=pointer]: ä»åºè®¾ç½® |
| | | - generic [ref=f15e584] [cursor=pointer]: åºåç°æé |
| | | - generic [ref=f15e590] [cursor=pointer]: åºåé¢è¦ |
| | | - generic [ref=f15e593] [cursor=pointer]: è½¬ç§»è°æ¨ |
| | | - generic [ref=f15e598]: |
| | | - generic [ref=f15e599]: è´¨é管ç |
| | | - generic [ref=f15e600]: |
| | | - generic [ref=f15e601] [cursor=pointer]: æ¹æ¬¡è¿½æº¯ |
| | | - generic [ref=f15e607] [cursor=pointer]: ä¸åæ ¼å |
| | | - generic [ref=f15e611] [cursor=pointer]: ç§åè´¨æ£ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [ref=f15e7]: |
| | | - complementary [ref=f15e9]: |
| | | - generic [ref=f15e10]: |
| | | - link [ref=f15e13] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - img "å·¥ä¸AIæºé å¹³å°" [ref=f15e16] |
| | | - menu [ref=f15e19]: |
| | | - menuitem [ref=f15e20] [cursor=pointer] |
| | | - listitem [ref=f15e24]: |
| | | - generic [ref=f15e25] [cursor=pointer] |
| | | - listitem [ref=f15e31]: |
| | | - generic [ref=f15e32] [cursor=pointer] |
| | | - listitem [ref=f15e36]: |
| | | - generic [ref=f15e37] [cursor=pointer] |
| | | - listitem [ref=f15e43]: |
| | | - generic [ref=f15e44] [cursor=pointer] |
| | | - listitem [ref=f15e48]: |
| | | - generic [ref=f15e49] [cursor=pointer] |
| | | - listitem [ref=f15e53]: |
| | | - generic [ref=f15e54] [cursor=pointer] |
| | | - listitem [ref=f15e58]: |
| | | - generic [ref=f15e59] [cursor=pointer] |
| | | - listitem [ref=f15e63]: |
| | | - generic [ref=f15e64] [cursor=pointer] |
| | | - listitem [ref=f15e68]: |
| | | - generic [ref=f15e69] [cursor=pointer] |
| | | - generic [ref=f15e74] [cursor=pointer] |
| | | - generic [ref=f15e79]: |
| | | - generic [ref=f15e80]: |
| | | - banner [ref=f15e81]: |
| | | - button [ref=f15e82] [cursor=pointer] |
| | | - button [ref=f15e85] [cursor=pointer] |
| | | - navigation "breadcrumb" [ref=f15e90]: |
| | | - list [ref=f15e91]: |
| | | - listitem [ref=f15e92]: |
| | | - link "é¦é¡µ" [disabled] [ref=f15e93] |
| | | - generic [ref=f15e98]: |
| | | - generic [ref=f15e100] [cursor=pointer]: |
| | | - generic [ref=f15e104]: æç´¢ |
| | | - generic [ref=f15e105]: Ctrl K |
| | | - button [ref=f15e107] [cursor=pointer] |
| | | - button "dark" [ref=f15e112] [cursor=pointer] |
| | | - button [ref=f15e121] [cursor=pointer] |
| | | - button [ref=f15e127] [cursor=pointer] |
| | | - button [ref=f15e130] [cursor=pointer] |
| | | - button [ref=f15e136] [cursor=pointer]: |
| | | - button [ref=f15e138] |
| | | - button "å·¥ä½å°" [ref=f15e142] [cursor=pointer] |
| | | - button "çå" [ref=f15e146] [cursor=pointer] |
| | | - generic [ref=f15e153]: |
| | | - generic [ref=f15e154]: é¦é¡µ |
| | | - generic [ref=f15e173]: |
| | | - button [ref=f15e174] [cursor=pointer] |
| | | - generic [ref=f15e181] [cursor=pointer] |
| | | - generic [ref=f15e185] [cursor=pointer] |
| | | - main [ref=f15e192]: |
| | | - generic [ref=f15e196]: |
| | | - generic [ref=f15e197]: |
| | | - generic [ref=f15e198]: ä¸å¡å
¨é¾è·¯ |
| | | - generic [ref=f15e210]: |
| | | - generic [ref=f15e217] [cursor=pointer]: |
| | | - generic [ref=f15e218]: åç§ |
| | | - generic [ref=f15e219]: "1" |
| | | - generic [ref=f15e227] [cursor=pointer]: |
| | | - generic [ref=f15e228]: 产线 |
| | | - generic [ref=f15e229]: "1" |
| | | - generic [ref=f15e240] [cursor=pointer]: |
| | | - generic [ref=f15e241]: çäº§æ¹æ¬¡ |
| | | - generic [ref=f15e242]: "103" |
| | | - generic [ref=f15e250] [cursor=pointer]: |
| | | - generic [ref=f15e251]: è¢ç |
| | | - generic [ref=f15e252]: 1,101 |
| | | - generic [ref=f15e262] [cursor=pointer]: |
| | | - generic [ref=f15e263]: æçç |
| | | - generic [ref=f15e264]: "11" |
| | | - generic [ref=f15e275] [cursor=pointer]: |
| | | - generic [ref=f15e276]: éå®åºåº |
| | | - generic [ref=f15e277]: "0" |
| | | - generic [ref=f15e285] [cursor=pointer]: |
| | | - generic [ref=f15e286]: æµéæ«ç |
| | | - generic [ref=f15e287]: "23" |
| | | - generic [ref=f15e295] [cursor=pointer]: |
| | | - generic [ref=f15e296]: é²çª/æº¯æº |
| | | - generic [ref=f15e297]: "0" |
| | | - generic [ref=f15e298]: |
| | | - generic [ref=f15e308] [cursor=pointer]: |
| | | - generic [ref=f15e309]: åç§æ»æ° |
| | | - generic [ref=f15e310]: "1" |
| | | - generic [ref=f15e311]: åºç¡æ°æ® |
| | | - generic [ref=f15e322] [cursor=pointer]: |
| | | - generic [ref=f15e323]: çäº§æ¹æ¬¡ |
| | | - generic [ref=f15e324]: "103" |
| | | - generic [ref=f15e325]: ä¸è¢ä¸ç |
| | | - generic [ref=f15e333] [cursor=pointer]: |
| | | - generic [ref=f15e334]: è¢ç |
| | | - generic [ref=f15e335]: 1,101 |
| | | - generic [ref=f15e336]: èµç |
| | | - generic [ref=f15e346] [cursor=pointer]: |
| | | - generic [ref=f15e347]: æçç |
| | | - generic [ref=f15e348]: "11" |
| | | - generic [ref=f15e349]: æç |
| | | - generic [ref=f15e360] [cursor=pointer]: |
| | | - generic [ref=f15e361]: éå®åºåºå |
| | | - generic [ref=f15e362]: "0" |
| | | - generic [ref=f15e363]: åºåºæµé |
| | | - generic [ref=f15e371] [cursor=pointer]: |
| | | - generic [ref=f15e372]: 累计æ«ç |
| | | - generic [ref=f15e373]: "23" |
| | | - generic [ref=f15e374]: æº¯æº |
| | | - generic [ref=f15e381] [cursor=pointer]: |
| | | - generic [ref=f15e382]: åºåé¢è¦ |
| | | - generic [ref=f15e383]: "0" |
| | | - generic [ref=f15e384]: ä»å¨ |
| | | - generic [ref=f15e392] [cursor=pointer]: |
| | | - generic [ref=f15e393]: å¾
è¯å®¡ä¸åæ ¼ |
| | | - generic [ref=f15e394]: "0" |
| | | - generic [ref=f15e395]: è´¨é |
| | | - generic [ref=f15e396]: |
| | | - generic [ref=f15e400]: |
| | | - generic [ref=f15e401]: è¢ç çæè¶å¿ |
| | | - generic [ref=f15e403]: |
| | | - generic [ref=f15e404] [cursor=pointer]: |
| | | - generic [ref=f15e405]: |
| | | - radio "è¿ 7 天" [checked] |
| | | - generic [ref=f15e406]: è¿ 7 天 |
| | | - generic [ref=f15e407] [cursor=pointer]: |
| | | - generic [ref=f15e408]: |
| | | - radio "è¿ 30 天" |
| | | - generic [ref=f15e409]: è¿ 30 天 |
| | | - generic [ref=f15e414]: æ¶è´¹è
æ«ç å°åºåå¸ |
| | | - generic [ref=f15e423]: |
| | | - generic [ref=f15e424]: æ¹æ¬¡ç¶æåå¸ |
| | | - generic [ref=f15e433]: è¢ç ç¶æåå¸ |
| | | - generic [ref=f15e443]: |
| | | - generic [ref=f15e444]: å¾
åä¸é¢è¦ |
| | | - generic [ref=f15e448]: |
| | | - generic [ref=f15e453] [cursor=pointer]: |
| | | - generic [ref=f15e454]: çªè´§é¢è¦ |
| | | - generic [ref=f15e455]: å¾
å¤çççªè´§é¢è¦ |
| | | - generic [ref=f15e459] [cursor=pointer]: |
| | | - generic [ref=f15e460]: åºåé¢è¦ |
| | | - generic [ref=f15e461]: æªå¤ççåºåé¢è¦ |
| | | - generic [ref=f15e466] [cursor=pointer]: |
| | | - generic [ref=f15e467]: ä¸åæ ¼å |
| | | - generic [ref=f15e468]: å¾
è¯å®¡çä¸åæ ¼åå |
| | | - generic [ref=f15e469]: |
| | | - generic [ref=f15e470]: å¿«æ·å
¥å£ |
| | | - generic [ref=f15e474]: |
| | | - generic [ref=f15e476]: |
| | | - generic [ref=f15e477]: åºç¡æ°æ® |
| | | - generic [ref=f15e478]: |
| | | - generic [ref=f15e479] [cursor=pointer]: åç§ç®¡ç |
| | | - generic [ref=f15e485] [cursor=pointer]: åç§åç±» |
| | | - generic [ref=f15e491] [cursor=pointer]: 计éåä½ |
| | | - generic [ref=f15e496]: |
| | | - generic [ref=f15e497]: ä¸è¢ä¸ç ç产 |
| | | - generic [ref=f15e498]: |
| | | - generic [ref=f15e499] [cursor=pointer]: äº§çº¿ç»´æ¤ |
| | | - generic [ref=f15e503] [cursor=pointer]: æ¹æ¬¡ç产 |
| | | - generic [ref=f15e510] [cursor=pointer]: èµç 管ç |
| | | - generic [ref=f15e514] [cursor=pointer]: æçç |
| | | - generic [ref=f15e520] [cursor=pointer]: æ«ç å
¥åº |
| | | - generic [ref=f15e525]: |
| | | - generic [ref=f15e526]: åºåºæµé |
| | | - generic [ref=f15e527]: |
| | | - generic [ref=f15e528] [cursor=pointer]: åè´§éç¥ |
| | | - generic [ref=f15e532] [cursor=pointer]: éå®åºåº |
| | | - generic [ref=f15e539] [cursor=pointer]: éå®éè´§ |
| | | - generic [ref=f15e546]: |
| | | - generic [ref=f15e547]: é²ä¼ªé²çªè´§ |
| | | - generic [ref=f15e548]: |
| | | - generic [ref=f15e549] [cursor=pointer]: çªè´§é¢è¦ |
| | | - generic [ref=f15e553] [cursor=pointer]: æ«ç å°çåå¸ |
| | | - generic [ref=f15e559] [cursor=pointer]: 宿´æ§æ ¡éª |
| | | - generic [ref=f15e567]: |
| | | - generic [ref=f15e568]: 溯æºåæ |
| | | - generic [ref=f15e569]: æ¶è´¹è
æ«ç ç»è®¡ |
| | | - generic [ref=f15e575]: |
| | | - generic [ref=f15e576]: ä»å¨ç©æµ |
| | | - generic [ref=f15e577]: |
| | | - generic [ref=f15e578] [cursor=pointer]: ä»åºè®¾ç½® |
| | | - generic [ref=f15e584] [cursor=pointer]: åºåç°æé |
| | | - generic [ref=f15e590] [cursor=pointer]: åºåé¢è¦ |
| | | - generic [ref=f15e593] [cursor=pointer]: è½¬ç§»è°æ¨ |
| | | - generic [ref=f15e598]: |
| | | - generic [ref=f15e599]: è´¨é管ç |
| | | - generic [ref=f15e600]: |
| | | - generic [ref=f15e601] [cursor=pointer]: æ¹æ¬¡è¿½æº¯ |
| | | - generic [ref=f15e607] [cursor=pointer]: ä¸åæ ¼å |
| | | - generic [ref=f15e611] [cursor=pointer]: ç§åè´¨æ£ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: å·¥ä¸AIæºé å¹³å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ä¸è¢ä¸ç é¦é¡µæ¹ç(å
¨é¾è·¯é©¾é©¶è±) â å端èè°æ¹æ¡ |
| | | |
| | | ## èæ¯ |
| | | |
| | | å° `/bagcode-home` é¦é¡µä»"åºç¡æ°æ® + ä¸è¢ä¸ç ç产"çå±é¨ç»è®¡é¡µ,éæä¸ºè¦ç**宿´ä»·å¼é¾**ç驾驶è±:åç§ â 产线/æ¹æ¬¡ â è¢ç /æç â éå®åºåº â æµéæ«ç â é²çªæº¯æº,并串èä»å¨åºåãè´¨éé¢è¦ãå¿«æ·å
¥å£ãæ´ä½è§è§å¯¹é½ç»å½é¡µç**åä¸ç¿ 绿ç»ç**飿 ¼ã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - é¦é¡µ(驾驶è±):`src/views/dashboard/bagCodeHome/index.vue` ââ å
¨é¾è·¯éæ |
| | | - å
³è跳转页é¢:åºç¡æ°æ®ãä¸è¢ä¸ç ç产ãåºåºæµéãé²ä¼ªé²çªè´§ã溯æºåæãä»å¨ç©æµãè´¨é管ç ä¸çåä¸å¡é¡µ |
| | | |
| | | ## æ¥å£åæ´ |
| | | |
| | | ### 1. æ©å±æ±æ»æ¥å£(è¿åæ°å¢å段) |
| | | |
| | | `GET /mes/bag-code-home-statistics/summary` |
| | | |
| | | æ°å¢ååºå段(å `Long`,æ é»è®¤å¼æ¶è¿å 0): |
| | | |
| | | | åæ®µ | 说æ | æ°æ®æ¥æºè¡¨ | |
| | | |------|------|-----------| |
| | | | `salesNoticeCount` | åè´§éç¥åæ° | `mes_wm_sales_notice` | |
| | | | `productSalesCount` | éå®åºåºåæ° | `mes_wm_product_sales` | |
| | | | `returnSalesCount` | éå®éè´§åæ° | `mes_wm_return_sales` | |
| | | | `stockWarningPendingCount` | æªå¤çåºåé¢è¦æ°(`status=10`) | `mes_wm_stock_warning` | |
| | | | `ncrPendingCount` | å¾
è¯å®¡ä¸åæ ¼ååæ°(`status=0`) | `mes_qc_ncr` | |
| | | |
| | | åæå段(`mdmItemCount/mesItemCount/itemTypeCount/unitMeasureCount/lineCount/batchCount/bagCodeCount/palletCount/batchStatusList/bagCodeStatusList`)ä¿æä¸åã |
| | | |
| | | ### 2. å¤ç¨å·²æç»è®¡æ¥å£(æ éæ¹å¨) |
| | | |
| | | | æ¥å£ | ç¨é | å端 API | |
| | | |------|------|---------| |
| | | | `GET /mes/trace-cross-region/summary` | çªè´§é¢è¦æ±æ»(`total/pending/handled/falseAlarm/crossProvince/crossCity`) | `api/mes/trace-cross-region`(æ°å¢) | |
| | | | `GET /mes/trace-consumer-scan/summary` | 累计æ«ç /æå/失败/æ¶åæ¹æ¬¡ | å·²æ | |
| | | | `GET /mes/trace-consumer-scan/distribution?groupBy=province` | æ¶è´¹è
æ«ç å°åºåå¸ | å·²æ | |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. é¦é¡µç»æ(index.vue) |
| | | |
| | | | åºå | ç»ä»¶ | æ°æ® | |
| | | |------|------|------| |
| | | | ä¸å¡å
¨é¾è·¯ | `modules/business-flow.vue` | summary + æ«ç æ»æ° + çªè´§æ»æ° | |
| | | | å
¨é¾è·¯ KPI æ»è§(8 å¡) | `modules/kpi-cards.vue` | summary + æ«ç æ»æ° | |
| | | | è¢ç çæè¶å¿ | `modules/trend-chart.vue`(å¤ç¨) | `summary/trend` | |
| | | | æ¶è´¹è
æ«ç å°åºåå¸ | `modules/scan-region-chart.vue`(æ°å¢) | `distribution/groupBy=province` | |
| | | | æ¹æ¬¡ç¶æåå¸ / è¢ç ç¶æåå¸ | `batch-status-chart.vue` / `bag-code-status-chart.vue`(å¤ç¨) | summary ç¶æå表 | |
| | | | å¾
åä¸é¢è¦ | `modules/alert-panel.vue`(æ°å¢) | summary + çªè´§æ±æ» | |
| | | | åç»å¿«æ·å
¥å£ | `modules/shortcuts.vue`(éå为åç») | éæè·¯ç±é
ç½® | |
| | | |
| | | ### 2. æ°å¢/å 餿件 |
| | | |
| | | - æ°å¢:`api/mes/trace-cross-region/index.ts` |
| | | - æ°å¢:é¦é¡µ `modules/business-flow.vue`ã`kpi-cards.vue`ã`scan-region-chart.vue`ã`alert-panel.vue` |
| | | - éå:é¦é¡µ `index.vue`ã`modules/shortcuts.vue` |
| | | - æ´æ°:`api/mes/bag-code-home/index.ts`(Summary å 5 åæ®µ)ã`data.ts`ã`chart-options.ts` |
| | | - å é¤:`modules/basic-cards.vue`ã`modules/bag-code-cards.vue`(ä¸å使ç¨) |
| | | |
| | | ### 3. æ ·å¼ä¸»é¢ |
| | | |
| | | - é¦é¡µå
容åºç»ä¸"åä¸ç¿ 绿ç»ç"主é¢:æµ
è²ç¿ 绿æ¸åèæ¯(æ èæ¯å¾)ãç½è²ç£¨ç ç»çå¡çãèè·ç½/墨绿æåã |
| | | - å¾è¡¨ç»ä¸ç¿ 绿主è²(`#10b981`)å¹¶éé
æµ
åºæåè²ã |
| | | - 䏻颿 ·å¼éä¸å¨ `index.vue` çé scoped `<style>` ä¸(`.agri-dashboard` 容å¨ä¸ºä½ç¨å),åå¡çç»ä»¶ä½¿ç¨å¯¹åºç»çç±»ã |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | åç§æ»æ° | KPI + ä¸å¡é¾è·¯ | ç¹æè·³è½¬ `MdmItem` | |
| | | | çäº§æ¹æ¬¡ | KPI + ä¸å¡é¾è·¯ | 跳转 `MesProBatch` | |
| | | | è¢ç / æçç | KPI + ä¸å¡é¾è·¯ | 跳转 `MesProBagCode` / `MesProPallet` | |
| | | | éå®åºåºåæ° | KPI + ä¸å¡é¾è·¯ | 跳转 `MesWmProductSales` | |
| | | | 累计æ«ç | KPI + ä¸å¡é¾è·¯ | æ¥èª `trace-consumer-scan/summary`,跳转 `MesConsumerScanStatistics` | |
| | | | çªè´§é¢è¦æ»æ° | ä¸å¡é¾è·¯(é²çª/溯æº) | æ¥èª `trace-cross-region/summary`,跳转 `MesTraceCrossRegion` | |
| | | | åºåé¢è¦(æªå¤ç) | KPI + å¾
åé¢è¦ | 跳转 `MesWmStockWarning` | |
| | | | å¾
è¯å®¡ä¸åæ ¼ | KPI + å¾
åé¢è¦ | 跳转 `MesQcNcr` | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - æ°å¢ç 5 ä¸ªæ±æ»å段éè¦**åç«¯éæ°ç¼è¯å¹¶éå¯**åæä¼è¿å;éå¯åå端已å `?? 0` å
åº,ç¸å
³å¡ç/èç¹æ¾ç¤º 0,ä¸å½±åå
¶å®æ°æ®ã |
| | | - è·¯ç±è·³è½¬ä½¿ç¨**è·¯ç± name**(å·²ä¸èå `component_name` 对é½),æªå è½½çèåæ²¿ç¨ `message.warning('å½åèåå°æªå è½½...')` å
åºã |
| | | - æ¶è´¹è
æ«ç /çªè´§æ ç»çº¬åº¦å段,ä»
æ¯æç/叿æ¬åå¸å¾,䏿¯æå°å¾åæ ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # æ¹æ¬¡è¿½æº¯ç»ä¸èåæ¥å£ - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - MES â è´¨æ£ â æ¹æ¬¡è¿½æº¯ï¼`/qc/batch-trace`ï¼ |
| | | - æ¹æ¬¡è¿½æº¯è¯¦æ
|
| | | - æ¹æ¬¡ç ãæçç ãè¢ç æ«ç 追溯å
¥å£ |
| | | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | 1. 卿¹æ¬¡è¿½æº¯å表è¾å
¥çäº§æ¹æ¬¡ç ãä¸´æ¶æ¹æ¬¡ç ãè¢ç ææçç ã |
| | | 2. 页é¢è°ç¨ç»ä¸è¯¦æ
æ¥å£ï¼å端å°å
¥å£ç è§£æå°çäº§æ¹æ¬¡ï¼å¹¶èåç产ãè´¨æ£ãä»å¨ãéå®åé²ä¼ªä¿¡æ¯ã |
| | | 3. 详æ
页以çäº§æ¹æ¬¡ä¸ºæ ¹å±ç¤ºå
¨é¾è·¯æ°æ®ï¼è¢ç åæçä¿¡æ¯æ¥èªç产èµç æ°æ®ï¼ä»å¨ä¸éå®ä¿¡æ¯æ¥èªä»å¨ä¸å¡æ°æ®ã |
| | | 4. åå追溯å±ç¤ºå½åæ¹æ¬¡äº§åºç䏿¸¸æ¹æ¬¡ï¼åå追溯å±ç¤ºå½åæ¹æ¬¡æ¶èç䏿¸¸æ¹æ¬¡ã |
| | | 5. æ¶é´çº¿ãé¶æ®µè§å¾åå³çæè¦å使ç¨å䏿¬¡èåååºï¼é¿å
æå¼è¯¦æ
åéå¤è¯·æ±å¤ä¸ªæ§æ¥å£ã |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |---|---|---| |
| | | | GET | `/mes/trace/batch/detail` | æ¥è¯¢ç»ä¸æ¹æ¬¡è¿½æº¯è¯¦æ
| |
| | | |
| | | ### 请æ±åæ° |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |---|---|---|---| |
| | | | `code` | String | æ¯ | çäº§æ¹æ¬¡ç ãä¸´æ¶æ¹æ¬¡ç ãè¢ç ææçç | |
| | | |
| | | 示ä¾ï¼`code=BAG-202608280001` |
| | | |
| | | ### ååºä¸»è¦å段 |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |---|---|---| |
| | | | `sourceType` | String | å
¥å£ç±»åï¼`BAG`ã`PALLET`ã`BATCH` | |
| | | | `requestCode` | String | åå§è¾å
¥ç | |
| | | | `itemCode` / `itemName` | String | åç§ç¼ç ãåç§° | |
| | | | `itemSpecification` | String | åç§è§æ ¼ | |
| | | | `batchCode` / `tempCode` | String | æ£å¼æ¹æ¬¡å·ãä¸´æ¶æ¹æ¬¡ç | |
| | | | `batchStatusName` | String | æ¹æ¬¡ç¶æåç§° | |
| | | | `produceDate` | DateTime | çäº§æ¥æ | |
| | | | `lineCode` / `lineName` | String | 产线ç¼ç ãåç§° | |
| | | | `ownerUserName` | String | ç产责任人 | |
| | | | `planQuantity` | Decimal | è®¡åæ°é | |
| | | | `bagQuantity` / `palletQuantity` | Integer | è¢ç æ°éãæçæ°é | |
| | | | `workers` | Array | ç产人å | |
| | | | `pallets` | Array | æçæè¦ | |
| | | | `bagTotal` / `bags` | Long / Array | è¢ç æ»æ°åæå¤ 100 æ¡æç» | |
| | | | `inbound` | Object | ææ°å
¥åºäºä»¶ | |
| | | | `quality` | Object | ç§åè´¨éæ£éªä¸ææ | |
| | | | `antiFake` | Object | å½åè¿½æº¯ç æ«ç 次æ°ã馿¬¡åæè¿æ«ç æ¶é´ | |
| | | | `purchaseSources` | Array | éè´æ¥æºãä¾åºåå IQC ä¿¡æ¯ | |
| | | | `salesTargets` | Array | éå®åºåºã客æ·å OQC ä¿¡æ¯ | |
| | | | `processTraces` | Array | å·¥åºæå
¥ãäº§åºæµè½¬ä¿¡æ¯ | |
| | | |
| | | ### ååºç¤ºä¾ |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "sourceType": "BAG", |
| | | "requestCode": "BAG-202608280001", |
| | | "batchCode": "B20260828001", |
| | | "itemName": "示ä¾åç§", |
| | | "batchStatusName": "已宿", |
| | | "workers": [], |
| | | "pallets": [], |
| | | "bags": [], |
| | | "purchaseSources": [], |
| | | "salesTargets": [], |
| | | "processTraces": [] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## 页é¢å±ç¤ºè§å |
| | | |
| | | | è§å¾ | å±ç¤ºå
容 | |
| | | |---|---| |
| | | | é¶æ®µæ»è§ | æ¥æºãç产ãè´¨æ£ãèµç ãå
¥åºãéå®ãæ¶è´¹ãé²ä¼ªå
«ä¸ªé¶æ®µçç¶æåæ°é | |
| | | | å
¨é¾è·¯æ¶é´çº¿ | ææ¶é´å±ç¤ºéè´ãç产ãè´¨æ£ãèµç ãå
¥åºãåºåºåæ«ç äºä»¶ï¼å¼å¸¸ç¶æä¼å
é«äº® | |
| | | | æµå¨å¾è°± | ä»¥æ¹æ¬¡ãå·¥åºãä»åºãæçãè¢ç ãéå®åå客æ·ä¸ºèç¹ï¼é»è®¤å±ç¤ºæ¹æ¬¡çº§å
³ç³» | |
| | | | å³çåæ | å±ç¤ºè´¨éç»è®ºãåºåæ°éãéå®å»åãé²ä¼ªæ«ç 次æ°åçªè´§é£é© | |
| | | | éè´æ¥æº | å±ç¤ºéè´å
¥åºãä¾åºåãéè´è®¢åãIQC åå·åæ£éªç»è®º | |
| | | | éå®å»å | å±ç¤ºéå®åºåºã客æ·ãéå®è®¢åãOQC åå·åè´¨éç¶æ | |
| | | | å·¥åºæµè½¬ | `IN` æ¾ç¤ºä¸ºæå
¥ï¼`OUT` æ¾ç¤ºä¸ºäº§åº | |
| | | |
| | | ## ä¸å¡è§å |
| | | |
| | | - è¾å
¥è¢ç ææçç æ¶ï¼è¯¦æ
ä»ä»¥å
¶æå±çäº§æ¹æ¬¡ä¸ºæ ¹è¿è¡èåã |
| | | - å½åæ¥å£è¿åçè¢ç æç»æå¤ 100 æ¡ï¼`bagTotal` ç¨äºå±ç¤ºå®æ´æ°éï¼å¤§æ¹æ¬¡ä¸å¾ææç»æ°é夿æ»éã |
| | | - 空æ°ç»è¡¨ç¤ºè¯¥ä¸å¡é¶æ®µææ è®°å½ï¼`quality`ã`inbound`ã`antiFake` ä¸ºç©ºè¡¨ç¤ºææ å¯¹åºä¿¡æ¯ã |
| | | - é²ä¼ªæ«ç ç»è®¡ä»
ç¨äºå±ç¤ºï¼ä¸è½æ¿ä»£è´¨éæ£éªç»è®ºæåºåºç¶æã |
| | | - 客æ·ãä¾åºåãæä½äººçåç§°åºä»¥æ¥å£è¿åå¼ä¸ºåï¼ä¸å¨å端é夿¥è¯¢æ§æ¹æ¬¡æ¥å£ã |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - 管ç端æ¥å£éè¦æ¹æ¬¡è¿½æº¯æ¥è¯¢æéï¼`mes:trace-batch:query`ã |
| | | - æ§ç `/mes/wm/batch/*` æ¥å£ç»§ç»ä¾ä»å¨æ¹æ¬¡é¡µé¢ä½¿ç¨ï¼æ¹æ¬¡è¿½æº¯é¡µé¢åæ¢åä¸åºåå¹¶è¡è¯·æ±æ§çäºä¸ªè¯¦æ
æ¥å£ã |
| | | - åç»æ©å±æ¶é´çº¿åå¾è°±æ¶ï¼å»ºè®®å端å¢å å页ä¸èç¹å±çº§åæ°ï¼é¿å
䏿¬¡æ§å è½½å
¨é¨è¢ç ã |
| | | - å±ç¤ºæ¶è´¹è
æ«ç ä¿¡æ¯æ¶ä¸å¾å±ç¤º IP å°åå User-Agent åæã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # åºåè¢ç æç»èè°æ¹æ¡ |
| | | |
| | | ## ä¸å¡æµç¨ |
| | | |
| | | ç§åè´¨æ£ä»¥è¢ç æäº¤ãè´¨æ£åæ ¼æ¶ï¼æååºåæ±æ»æ°éåå° 1ï¼åæ ¼åºåæ±æ»æ°éå¢å 1ï¼åæ¶è¯¥è¢ç æç»è¿ç§»å°åæ ¼ä»ï¼è´¨æ£ä¸åæ ¼æ¶ï¼æååºåæ±æ»æ°éåå° 1ï¼è¢ç æç»æ 记为æ¥åºãå
¶ä»è¢ç ä¸åå½±åã |
| | | |
| | | åºåå°è´¦ç»§ç»æç©æãæ¹æ¬¡ãä»åºãåºåºãåºä½åä¾åºåæ±æ»ï¼è¢ç æç»ç¨äºè®°å½æ¯ä¸ªè¢ç çå
·ä½ç¶æåä½ç½®ã |
| | | |
| | | ## è¢ç æç»çå½å¨æï¼ç»ä¸æå¡æç®¡ï¼ |
| | | |
| | | ææå¸¦è¢ç çåºååå¨ç»ä¸éè¿åºåäºå¡æå¡å¨åä¸äºå¡å
åæ¥ç»´æ¤ **æ±æ»åºå + è¢ç æç» + åºåæµæ°´** ä¸è
ä¸è´ï¼åä¸å¡å
¥å£æ éåèªå®ç°è¢ç é»è¾ãçå½å¨æï¼ |
| | | |
| | | | é¶æ®µ | å¨ä½ | è¢ç æç»åå | |
| | | |------|------|--------------| |
| | | | åè¢æ«ç å
¥åº | ç产æ«ç å
¥åºï¼æ«ç ç±»å BAGï¼ | å»ºç«æ´»å¨æç»ï¼æååºï¼ | |
| | | | ç§åè´¨æ£åæ ¼ | æååºåº + åæ ¼å
¥åº | æç»ç±æååºè¿ç§»å°åæ ¼åº | |
| | | | ç§åè´¨æ£ä¸åæ ¼ | æååºåº | æç»æ¥åº | |
| | | | éå®åºåºå®æ | åºåºæ£å | æç»ç½®ä¸ºå·²åºåº | |
| | | | æ´ä½ç§»åº | è°æ¨ç§»åº + ç§»å
¥ | æç»ä½ç½®è¿ç§»å°ç®æ åºä½ | |
| | | |
| | | 说æï¼ |
| | | - æçï¼PALLETï¼/æ¹æ¬¡ï¼BATCHï¼æ´æ¹å
¥åºãéè´/æé¡¹/éè´§çæè¡ææ°éå
¥åºçåºå
¥å£ï¼ä¸ºæ¹éæ±æ»ï¼ä¸éè¢å»ºç«æç»ï¼è¿äºè¢ç å¨é¦æ¬¡ç§åè´¨æ£æ¶éè¿ææ¹æ¬¡å®ä½æååºå补建æç»ã |
| | | - äºå¡æµæ°´ DTO å¢å `bagCodeId`/`bagCode` åæ®µï¼åºåº/ç§»å
¥æè¢ç èªå¨æ´æ°è¢ç æç»ã |
| | | - æ¯ç¬å¸¦è¢ç çå
¥åºãåºåºãç§»åºãè´¨æ£é½ä¼çæå¯¹åºç `mes_wm_transaction` æµæ°´å¹¶åå¡«è¢ç ï¼ä¾¿äºå¨åºåæµæ°´é¡µé¢æè¢ç çé追溯ã |
| | | |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | `/mes/wm/material-stock/page` | åºåæ±æ»å页ï¼ååºå¢å è¢ç ç»è®¡å段 | |
| | | | GET | `/mes/wm/material-stock/bag-details` | æ¥è¯¢æå®åºåæ±æ»è®°å½ä¸çå¨åºè¢ç æç» | |
| | | | GET | `/mes/wm/transaction/page` | åºåäºå¡æµæ°´ï¼æ¯æ `bagCode` çéå¹¶è¿åè¢ç | |
| | | |
| | | ### è¢ç æç»æ¥è¯¢ |
| | | |
| | | 请æ±åæ°ï¼ |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | materialStockId | Long | æ¯ | åºåæ±æ»è®°å½ ID | |
| | | | bagCode | String | å¦ | è¢ç æ¨¡ç³æ¥è¯¢ | |
| | | | pageNo | Integer | æ¯ | 页ç | |
| | | | pageSize | Integer | æ¯ | æ¯é¡µæ¡æ° | |
| | | |
| | | ååºå段å
æ¬ `bagCode`ã`batchCode`ã`stockState`ã`status`ã`quantity`ã`warehouseId`ã`locationId`ã`areaId`ã`inboundTime` å `outboundTime`ã |
| | | |
| | | åºåæ±æ»å页ååºæ°å¢ï¼ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | bagCount | Long | å½åå¨åºè¢ç æç»æ°é | |
| | | | bagDetailSupported | Boolean | æ¯å¦åå¨è¢ç æç»ï¼å岿 æ³è¿åè¢ç çåºå为 false | |
| | | |
| | | ## å端è°ç¨æ¶åº |
| | | |
| | | 1. è°ç¨åºåå°è´¦å页æ¥å£è·åæ±æ»è®°å½ã |
| | | 2. 对 `bagDetailSupported=true` çè®°å½æ¾ç¤ºâæ¥çè¢ç âã |
| | | 3. ç¹å»åè°ç¨ `/mes/wm/material-stock/bag-details`ï¼ä¼ å
¥å½åè¡ `id` ä½ä¸º `materialStockId`ã |
| | | 4. è¢ç æç»ä¸ç `bagCode` å¯ç»§ç»è°ç¨æ¹æ¬¡/è¢ç 追溯æ¥å£æ¥çè´¨æ£åç产信æ¯ã |
| | | 5. åºåæµæ°´é¡µé¢ä½¿ç¨ `bagCode` çéæ¶ï¼å±ç¤ºè´¨æ£è¿ç§»äº§ççè¢ç çº§æµæ°´ã |
| | | |
| | | ## ä¸å¡è§å |
| | | |
| | | - åä¸è¢ç åªè½åå¨ä¸æ¡åºåè¢ç æç»ã |
| | | - è´¨æ£æå®é
è¢ç å®ä½æååºåï¼ä¸ææ¹æ¬¡éæºæ£åã |
| | | - æ¥åºè¢ç ä¸è®¡å
¥å¨åºæç»æ¥è¯¢ï¼ä½ä¿çæç»è®°å½ç¨äºè¿½æº¯ã |
| | | - æ æ³ä»å岿±æ»åºåè¿åè¢ç æ¶ï¼ä¸ä¼ªé è¢ç æç»ã |
| | | - SQL èæ¬ä¸å
å« `tenant_id` åæ®µã |
| | |
| | | |
| | | **注æï¼** æ£è´§æç»éè¦æå¨æ·»å |
| | | |
| | | ## åè´§éç¥è¡ç©ææ ¡éª |
| | | |
| | | æ°å¢æä¿®æ¹åè´§éç¥è¡æ¶ï¼ç©æå¿
é¡»å
³èæ¹æ¬¡ï¼ä¸è¯¥ç©ææ¹æ¬¡å¿
é¡»å卿£å¼åºåºåãæ£å¼åºæåºåç¶æä¸ºåæ ¼åºï¼`stockState = 20`ï¼çåºåè®°å½ã |
| | | |
| | | | æ ¡éªé¡¹ | è§å | |
| | | |--------|------| |
| | | | ç©æ | å¿
é¡»åå¨ä¸å¯ç¨ | |
| | | | æ¹æ¬¡ | `batchId` æ `batchCode` å¿
é¡»è½å¹é
æææ¹æ¬¡ï¼ä¸æ¹æ¬¡å±äºæéç©æ | |
| | | | æ£å¼åºå | ä»
ç»è®¡åæ ¼åºåºåï¼ä¸ç»è®¡æååºåºå | |
| | | | æ°é | åä¸ç©æãæ¹æ¬¡çåæ ¼åºåºåå计å¿
é¡»ä¸å°äºåè´§æ°é | |
| | | | åºååæ´ | ä¿ååè´§éç¥è¡æ¶ä¸æ£åãä¸é¢å åºåï¼å®é
åºåºæ¶åæ¬¡æ ¡éª | |
| | | |
| | | åºåä¸è¶³æ¶ï¼å端åºç´æ¥å±ç¤ºå端è¿åçâåºåæ°éä¸è¶³âä¸å¡æç¤ºï¼å¹¶ä¿çç¨æ·å¡«åç表åå
容ã |
| | | |
| | | ## åæ®µæ å°è¡¨ |
| | | |
| | | ### ä¸»è¡¨åæ®µæ å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ç产线æ«ç å
¥åºï¼æ¯æè¢ç /æçç /æ¹æ¬¡ç + å»æè®¾å¤ç¼ç - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ç产线æ«ç å
¥åºï¼`src/views/mes/pro/scan-in/index.vue`ï¼ |
| | | |
| | | ## ä¸å¡åæ´ |
| | | |
| | | 1. **å»æè®¾å¤ç¼ç **ï¼æ«ç å
¥åºä¸åå½å
¥/å±ç¤ºè®¾å¤ç¼ç ï¼æ¥å£ `deviceCode` æ¹ä¸ºéå¿
å¡«ï¼å端ä¸åä¼ ã |
| | | 2. **产线ãåºåºãåºä½æ¹ä¸ºä¸æéæ©**ï¼æ°æ®æºä¸ºç°æç²¾ç®å表æ¥å£ï¼ä¸åæå¡«ç¼å·ã |
| | | 3. **çå¾
æ«ç åºå¢å "æ«ç ç±»å"éæ©**ï¼è¢ç / æçç / æ¹æ¬¡ç ä¸éä¸ï¼æ«ç æ¡éç±»åæäº¤å¯¹åºç å¼ã |
| | | |
| | | ## API |
| | | |
| | | ### 主æ¥å£ï¼è¿½æº¯ç æ«ç å
¥åº |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /mes/pro/scan-in/inbound | è¿½æº¯ç æ«ç å
¥åºï¼è¢ç /æçç /æ¹æ¬¡ç ï¼ | |
| | | |
| | | **请æ±åæ°ï¼æ¬æ¬¡åæ´ï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | åæ´ | 说æ | |
| | | |------|------|------|------|------| |
| | | | scanType | String | å¦ | æ°å¢ | æ«ç ç±»åï¼`BAG` è¢ç / `PALLET` æçç / `BATCH` æ¹æ¬¡ç ï¼ä¸ä¼ é»è®¤ `BAG` | |
| | | | deviceCode | String | å¦ | æ¹ä¸ºéå¿
å¡« | 设å¤ç¼ç ï¼å端ä¸åä¼ | |
| | | | bagCode | String | æ¯ | è¯ä¹æ©å± | æ«ç å
容ï¼è¢ç /æçç /æ¹æ¬¡ç çç å¼ï¼å«ä¸´æ¶ç ï¼ | |
| | | | eventId | String | æ¯ | - | äºä»¶å·ï¼å»ºè®®ç¨ `{scanType}-{æ¶é´æ³}` ä¿è¯å¯ä¸ï¼ | |
| | | | quantity | Number | æ¯ | - | è¢ç åºæ¯ä¼ 1ï¼æç/æ¹æ¬¡åºæ¯å端忽ç¥è¯¥å¼ï¼æå·²è£
è¢æ°/æ¹æ¬¡è¢æ°è®¡ç® | |
| | | | lineCode | String | å¦ | - | 产线ç¼ç ï¼åç«¯ä¸æéæ©ï¼ | |
| | | | locationId | Long | æ¯ | - | WIP æååºåºç¼å·ï¼åç«¯ä¸æéæ©ï¼ | |
| | | | areaId | Long | æ¯ | - | WIP æååºä½ç¼å·ï¼åç«¯ä¸æéæ©ï¼ | |
| | | |
| | | **ååºæ°å¢å段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | scanType | String | æ¬æ¬¡æ«ç ç±»åï¼BAG/PALLET/BATCHï¼ | |
| | | |
| | | **å
¥åºæ°éå£å¾ï¼** |
| | | |
| | | | scanType | æ°é | 说æ | |
| | | |----------|------|------| |
| | | | BAG | åç«¯ä¼ 1 | åè¢å
¥åº | |
| | | | PALLET | æçå·²è£
è¢æ° `bag_count` | æ´æä¸æ¬¡æ§å
¥æååº | |
| | | | BATCH | æ¹æ¬¡è¢æ° `bag_quantity` | æ´æ¹ä¸æ¬¡æ§å
¥æååº | |
| | | |
| | | **å
¥åºå»éï¼** è¢ç ãæçç ãæ¹æ¬¡ç å以åèª `inbound_event_id` 夿æ¯å¦å·²å
¥åºï¼é夿«ç è¿å对åº"å·²å
¥åº"é误ç ï¼ä¸ä¼éå¤åå
¥åºåäºå¡ã |
| | | |
| | | ### ä¸ææ°æ®æºï¼å¤ç¨ç°ææ¥å£ï¼æ æ°å¢ï¼ |
| | | |
| | | | ç¨é | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------|------| |
| | | | 产线 | GET | /mes/pro/line/simple-list | è¿åå¯ç¨äº§çº¿ `{id, code, name}` | |
| | | | åºåº | GET | /mes/wm/warehouse-location/simple-list | è¿ååºåº `{id, code, name}`ï¼éåºåºåèå¨å è½½å
¶ä¸åºä½ | |
| | | | åºä½ | GET | /mes/wm/warehouse-area/simple-list?locationId= | è¿ååºä½ `{id, code, name}` | |
| | | |
| | | ## æ°æ®å¸¦å
¥è¯´æ |
| | | |
| | | - 产线/åºåº/åºä½ï¼ä¸æéæ©ï¼é¡µé¢ `onMounted` 䏿¬¡æ§å 载产线ãåºåºï¼éæ©åºåºåæ `locationId` èå¨å è½½åºä½ã |
| | | - æ«ç æäº¤ï¼`locationId`ã`areaId`ã`scanType`ã`bagCode` ä¸å¹¶å¸¦å
¥å
¥åºæ¥å£ï¼äº§çº¿ `lineCode` æå¼æä¼ ã |
| | | - äºä»¶å表/çæ¿ï¼ä»¥ `scanType` åºå追溯ç ç±»åå±ç¤ºï¼å岿 ç±»åçæ°æ®é»è®¤æ¾ç¤º"è¢ç "ï¼ã |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | æ«ç ç±»å | çå¾
æ«ç åºä¸æ | ä¸éä¸ï¼è¢ç /æçç /æ¹æ¬¡ç | |
| | | | ç产产线 | æ«ç å¡é
ç½®åº + ç¶æå¡ | 䏿鿩ï¼å¯æ¸
空 | |
| | | | WIP æååºåº/åºä½ | æ«ç å¡é
ç½®åº + ç¶æå¡ | 䏿鿩ï¼åºä½éåºåºèå¨ç¦ç¨/å¯ç¨ | |
| | | | æè¿å
¥åºè¿½æº¯ç | ç»è®¡å¡ | å±ç¤ºææ°ä¸æ¡æ«ç å
容 | |
| | | | 追溯ç /ç±»å/产线 | æè¿æ«ç äºä»¶è¡¨ | è¡¨æ ¼æ°å¢"ç±»å"åï¼å"设å¤/产线"åæ¹ä¸º"产线" | |
| | | | æè¿æ«ç ç±»å | ç¶æå¡ | å±ç¤ºææ°äºä»¶æ«ç ç±»å | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. å端é**æ§è¡ SQL èæ¬** `sql/mysql/mes_pro_scan_event_scan_type.sql`ï¼`mes_pro_scan_event` å¢å `scan_type` åï¼`mes_pro_pallet` å¢å `inbound_event_id`/`inbound_time` åï¼ï¼å**éæ°ç¼è¯å¹¶éå¯**ã |
| | | 2. éå¯åæ§æ¥å£ä¼å¿½ç¥ `scanType`ï¼æè¢ç å¤çï¼ï¼æç/æ¹æ¬¡ç æ«ç ä¼è¿å"è¢ç ä¸åå¨"ï¼å端类å䏿ç
§å¸¸å¯éï¼åè½é级为ä»
è¢ç ã |
| | | 3. 产线/åºåº/åºä½ä¸æè¥æ¥å£ 404ï¼å端æªéå¯ï¼ï¼ä¸æä¸ºç©ºï¼éå
ä¿éå端å¯ç¨ã |
| | | 4. æçãæ¹æ¬¡æ´æ/æ´æ¹å
¥åºä¼åæ¥æå
¶ä¸æªå
¥åºè¢ç æ 记为已å
¥åºï¼é¿å
åç»åè¢æ«ç éå¤å
¥åºã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ç§åè´¨æ£æè¢ç ç²åº¦æµè½¬åºå - å端èè°æ¹æ¡ |
| | | |
| | | ## èæ¯ |
| | | |
| | | ç§åè´¨æ£åé»è¾ï¼è´¨æ£åæ ¼å**æ´æ¹**å°ä»åºæ¹æ¬¡åºå仿ååº(10)è½¬ä¸ºåæ ¼åº(20)ï¼ä¸è¢åæ ¼å³æ´æ¹æ¾è¡ï¼é¢ç²åº¦è¿ç²ã |
| | | |
| | | æ¬æ¬¡æ¹é 为**æè¢ç ç²åº¦**ï¼è´¨æ£åªé对被æ«çé£ä¸è¢ï¼åæ ¼ä»
å°è¯¥è¢å¯¹åºåºå仿ååºè½¬å
¥åæ ¼åºï¼åæ¹æ¬¡å
¶ä»è¢ä¿ææååºå¾
æ£ï¼åæ¶ç»æ¯è¢æä¸è´¨æ£æ è®°ï¼`qc_status`ï¼ï¼éå®åºåºæ«è¢ç /æçæ¶æ ¡éªå·²è´¨æ£åæ ¼æå
许åºåºã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - è´¨é管ç-ç§åè´¨æ£ï¼æäº¤è´¨æ£è¡¨åï¼ |
| | | - éå®åºåº-æ«ç æ£è´§ï¼æ«è¢ç /æçï¼ |
| | | - åºåå°è´¦ï¼`mes_wm_material_stock` å页ï¼åæ¹æ¬¡å¯è½åæ¶åºç°æååºä¸åæ ¼åºä¸¤æ¡è®°å½ï¼ç¶æåå·²æåå
¸å±ç¤ºæåï¼ |
| | | |
| | | ## API |
| | | |
| | | æ¬æ¬¡**æ æ°å¢/ä¿®æ¹æ¥å£**ï¼åä¸ºæ¢ææ¥å£çæ ¡éªè¯ä¹ä¸æ°æ®æµè½¬ååã |
| | | |
| | | ### 1. æäº¤ç§åè´¨æ£ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | `/mes/qc/seed-quality/submit` | æäº¤ç§åè´¨æ£ï¼æè¢ç ï¼ | |
| | | |
| | | **请æ±åæ°ï¼ä¸åï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | code | String | æ¯ | è¢ç ï¼æ«ç å
容ï¼ï¼**å¿
须为ææè¢ç ** | |
| | | | batchCode | String | å¦ | çäº§æ¹æ¬¡å·ï¼å
¼å®¹é¢çï¼ | |
| | | | indicators | Array | æ¯ | åé¡¹ææ ï¼purity/cleanliness/germination_rate/moistureï¼ | |
| | | | reason | String | å¦ | 夿³¨ | |
| | | |
| | | **ååºï¼ä¸åï¼ï¼** `{ "code": 0, "data": è´¨æ£è®°å½ID }` |
| | | |
| | | ### 2. æ«ç æ£è´§ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | `/mes/wm/product-sales/scan` | æ«ç æ£è´§ï¼è¢ç /æçï¼ | |
| | | |
| | | **请æ±åæ°ï¼ä¸åï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | salesId | Long | æ¯ | éå®åºåºåID | |
| | | | scanContent | String | æ¯ | è¢ç ææçç | |
| | | | quantity | BigDecimal | å¦ | åºåºæ°éï¼ç¼ºçç¨è¡æ°éï¼ | |
| | | |
| | | **ååºï¼ä¸åï¼ï¼** æ²¿ç¨ `MesWmProductSalesScanRespVO`ï¼`availableQuantity`/`outboundQuantity` ååºäº**åæ ¼åº**åºå计ç®ã |
| | | |
| | | ## ä¸å¡è§ååå |
| | | |
| | | | åºæ¯ | åè¡ä¸º | æ°è¡ä¸º | |
| | | |------|--------|--------| |
| | | | ç§åè´¨æ£æäº¤éè¢ç | å
¼å®¹æ¹æ¬¡ç æäº¤ | æ¥éãæªè§£æå°ææè¢ç ï¼ç§åè´¨æ£å¿
须以è¢ç æäº¤ã | |
| | | | è´¨æ£åæ ¼ | æ´æ¹æååºâåæ ¼åº | ä»
该è¢ï¼æååº -1ãåæ ¼åº +1ï¼åæ¹æ¬¡å
¶ä»è¢ä»ä¸ºæååºï¼ï¼è¢ç qc_status=20 | |
| | | | è´¨æ£ä¸åæ ¼ | æ åºååå | 该è¢ä»æååºåæ¸
é¤ï¼æ¥åºï¼ï¼è¢ç qc_status=30 | |
| | | | éå®åºåºæ«è¢ç | 䏿 ¡éªè´¨æ£ | qc_status å¿
须为 20ï¼å¦åæ¥ã该è¢ç æªè´¨æ£åæ ¼ï¼ç¦æ¢åºåºã | |
| | | | éå®åºåºæ«æç | 䏿 ¡éªè´¨æ£ | æç䏿æè¢ç qc_status å¿
须为 20ï¼å¦åæ¥ãæçä¸å卿ªè´¨æ£è¢ç ï¼ç¦æ¢æ´æåºåºã | |
| | | | éå®åºåºéåºå | å¯è½é䏿ååºè®°å½ | ä»
ä»åæ ¼åº(20)è®°å½ä¸éæ°éè¶³å¤ç | |
| | | |
| | | ## åºåè¯ä¹è¯´æ |
| | | |
| | | å䏿¬¡ï¼å
¥åºä»ææ¹æ¬¡èåï¼è´¨æ£åæ ¼åï¼åæ¹æ¬¡ `mes_wm_material_stock` ä¼åæ¶åå¨ä¸¤æ¡è®°å½ï¼ |
| | | |
| | | | è®°å½ | stock_state | å«ä¹ | æ¯å¦å¯åºåº | |
| | | |------|-------------|------|-----------| |
| | | | æååº | 10 | è¯¥æ¹æ¬¡æªè´¨æ£çå©ä½è¢æ° | å¦ | |
| | | | åæ ¼åº | 20 | 已质æ£åæ ¼ãå¯éå®çè¢æ° | æ¯ | |
| | | |
| | | 示ä¾ï¼æ¹æ¬¡å
¥åº 3 è¢ï¼quantity=3ãæååºï¼ãè´¨æ£åæ ¼ 1 è¢å â æååº quantity=2 + åæ ¼åº quantity=1ã |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | è´¨æ£ç¶æï¼qc_statusï¼ | ç§åè´¨æ£æäº¤ç»æåé¦ | å端æ éå±ç¤ºï¼å端å¨ç¬¬äºæ¬¡æäº¤åä¸è¢ç æ¶æ¥ã该è¢ç 已质æ£ï¼ç¦æ¢éå¤æäº¤ã | |
| | | | åºåç¶æ | åºåå°è´¦å表 | åä¸ç©æ/æ¹æ¬¡å¯è½åºç°ä¸¤æ¡ä¸åç¶æè®°å½ï¼å为æ£å¸¸ç°è±¡ | |
| | | | å¯åºåºæ°é | æ«ç æ£è´§ç»æ | 以 `availableQuantity` 为åï¼åªåæ åæ ¼åºåºå | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **ç§åè´¨æ£æäº¤å¿
é¡»ä¼ è¢ç **ï¼`code` åæ®µç°å¨å¿
é¡»æ¯ç³»ç»ä¸åå¨çææè¢ç ï¼ä»
ä¼ æ¹æ¬¡å·ä¸å被æ¥åã |
| | | 2. **è´¨æ£æåååºåæ»æ°ä¸å**ï¼æååº -1 ä¸åæ ¼åº +1 忥åçï¼ç©æå¨åºæ»æ°å®æï¼åªæ¯ä»"å¾
æ£"å为"å¯å®"ã |
| | | 3. **åæ¹æ¬¡åç¶æå¹¶å**ï¼æååºä¸åæ ¼åºè®°å½åæ¶å卿¯é¢æè¡ä¸ºï¼å端å¨åºåå°è´¦ãåºåºéåºåæ¶åºè½æ¥ååä¸ç©æ/æ¹æ¬¡åºç°å¤è¡ã |
| | | 4. **åºåºæ°éæç¤º**ï¼è¥ææ¹æ¬¡ä»
é¨åè¢è´¨æ£åæ ¼ï¼æ«ç æ£è´§å¯åºåºæ°éåªå
å«åæ ¼è¢ï¼å端æç¤ºåºä»¥æ¥å£è¿åç `availableQuantity` 为åã |
| | | 5. **ä¸åæ ¼è¢æ¥åº**ï¼è´¨æ£ä¸åæ ¼çè¢ä¼ä»æååºå䏿£é¤ï¼ä¸è¯¥è¢ç qc_status=30ï¼ç¦æ¢åºåºã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- æ¹æ¬¡è¿½æº¯æ°æ®æ¨¡å补强 |
| | | -- 说æï¼å段å
å
许为空ï¼å岿°æ®å填宿ååè¯ä¼°æ¯å¦æ¶ç´§çº¦æã |
| | | -- 注æï¼é¡¹ç®ä¸ä½¿ç¨ tenant_idï¼æ§è¡åè¯·ç¡®è®¤åæ®µåç´¢å¼ä¸åå¨ã |
| | | |
| | | ALTER TABLE mes_wm_batch |
| | | ADD COLUMN pro_batch_id BIGINT NULL COMMENT '对åºçäº§æ¹æ¬¡ID' AFTER id; |
| | | ALTER TABLE mes_wm_batch |
| | | ADD INDEX idx_mes_wm_batch_pro_batch_id (pro_batch_id); |
| | | |
| | | ALTER TABLE mes_wm_sn |
| | | ADD COLUMN pro_batch_id BIGINT NULL COMMENT 'çäº§æ¹æ¬¡ID' AFTER id; |
| | | ALTER TABLE mes_wm_sn |
| | | ADD COLUMN bag_code_id BIGINT NULL COMMENT 'è¢ç ID' AFTER pro_batch_id; |
| | | ALTER TABLE mes_wm_sn |
| | | ADD COLUMN pallet_id BIGINT NULL COMMENT 'æçID' AFTER bag_code_id; |
| | | ALTER TABLE mes_wm_sn |
| | | ADD COLUMN sales_id BIGINT NULL COMMENT 'éå®åºåºåID' AFTER pallet_id; |
| | | ALTER TABLE mes_wm_sn |
| | | ADD INDEX idx_mes_wm_sn_pro_batch_id (pro_batch_id); |
| | | ALTER TABLE mes_wm_sn |
| | | ADD INDEX idx_mes_wm_sn_bag_code_id (bag_code_id); |
| | | |
| | | ALTER TABLE mes_qc_seed_quality |
| | | ADD COLUMN batch_id BIGINT NULL COMMENT 'çäº§æ¹æ¬¡ID' AFTER item_id; |
| | | ALTER TABLE mes_qc_seed_quality |
| | | ADD INDEX idx_mes_qc_seed_quality_batch_id (batch_id); |
| | | |
| | | CREATE TABLE mes_trace_event ( |
| | | id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主é®', |
| | | event_no VARCHAR(64) NOT NULL COMMENT 'äºä»¶ç¼å·', |
| | | event_type VARCHAR(32) NOT NULL COMMENT 'äºä»¶ç±»å', |
| | | event_category VARCHAR(32) NULL COMMENT 'äºä»¶åç±»', |
| | | event_time DATETIME NOT NULL COMMENT 'äºä»¶æ¶é´', |
| | | pro_batch_id BIGINT NULL COMMENT 'çäº§æ¹æ¬¡ID', |
| | | wm_batch_id BIGINT NULL COMMENT 'ä»å¨æ¹æ¬¡ID', |
| | | bag_code_id BIGINT NULL COMMENT 'è¢ç ID', |
| | | pallet_id BIGINT NULL COMMENT 'æçID', |
| | | sn_id BIGINT NULL COMMENT 'SN ID', |
| | | item_id BIGINT NULL COMMENT 'ç©æID', |
| | | biz_type VARCHAR(32) NULL COMMENT 'ä¸å¡ç±»å', |
| | | biz_id BIGINT NULL COMMENT 'ä¸å¡ID', |
| | | biz_code VARCHAR(100) NULL COMMENT 'ä¸å¡ç¼ç ', |
| | | biz_line_id BIGINT NULL COMMENT 'ä¸å¡æç»ID', |
| | | from_node_type VARCHAR(32) NULL COMMENT 'æ¥æºèç¹ç±»å', |
| | | from_node_id BIGINT NULL COMMENT 'æ¥æºèç¹ID', |
| | | from_node_code VARCHAR(100) NULL COMMENT 'æ¥æºèç¹ç¼ç ', |
| | | to_node_type VARCHAR(32) NULL COMMENT 'ç®æ èç¹ç±»å', |
| | | to_node_id BIGINT NULL COMMENT 'ç®æ èç¹ID', |
| | | to_node_code VARCHAR(100) NULL COMMENT 'ç®æ èç¹ç¼ç ', |
| | | quantity DECIMAL(18, 6) NULL COMMENT 'æ°é', |
| | | warehouse_id BIGINT NULL COMMENT 'ä»åºID', |
| | | location_id BIGINT NULL COMMENT 'åºåºID', |
| | | area_id BIGINT NULL COMMENT 'åºä½ID', |
| | | line_id BIGINT NULL COMMENT '产线ID', |
| | | work_order_id BIGINT NULL COMMENT 'å·¥åID', |
| | | process_id BIGINT NULL COMMENT 'å·¥åºID', |
| | | sales_id BIGINT NULL COMMENT 'éå®åºåºåID', |
| | | quality_id BIGINT NULL COMMENT 'è´¨æ£è®°å½ID', |
| | | operator_id BIGINT NULL COMMENT 'æä½äººID', |
| | | payload_json JSON NULL COMMENT 'äºä»¶æ©å±æ°æ®', |
| | | content_hash VARCHAR(64) NULL COMMENT 'äºä»¶å
容SHA-256æè¦', |
| | | prev_hash VARCHAR(64) NULL COMMENT 'åä¸äºä»¶æè¦', |
| | | creator VARCHAR(64) NULL DEFAULT '' COMMENT 'å建è
', |
| | | create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | updater VARCHAR(64) NULL DEFAULT '' COMMENT 'æ´æ°è
', |
| | | update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | deleted BIT(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (id), |
| | | UNIQUE KEY uk_mes_trace_event_no (event_no), |
| | | KEY idx_mes_trace_event_batch_time (pro_batch_id, event_time), |
| | | KEY idx_mes_trace_event_biz (biz_type, biz_id, biz_line_id), |
| | | KEY idx_mes_trace_event_nodes (from_node_id, to_node_id) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MESç»ä¸è¿½æº¯äºä»¶'; |
| | | |
| | | -- å岿°æ®å填示ä¾ï¼ç¡®è®¤æ°æ®è´¨éåæ§è¡ï¼ |
| | | -- UPDATE mes_wm_batch w JOIN mes_pro_batch p ON p.code = w.code AND p.deleted = b'0' |
| | | -- SET w.pro_batch_id = p.id WHERE w.pro_batch_id IS NULL AND w.deleted = b'0'; |
| | | -- UPDATE mes_qc_seed_quality q JOIN mes_pro_batch p ON p.code = q.batch_code AND p.deleted = b'0' |
| | | -- SET q.batch_id = p.id WHERE q.batch_id IS NULL AND q.deleted = b'0'; |
| | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /mes/wm/transaction/page | å页æ¥è¯¢åºåäºå¡æµæ°´ | |
| | | | GET | /mes/pro/batch/get-by-code | ç¹å»æ¹æ¬¡å·æ¥è¯¢çäº§æ¹æ¬¡ãæçåè¢ç ä¿¡æ¯ | |
| | | |
| | | ### 请æ±åæ° |
| | | |
| | |
| | | | bizType | Integer | å¦ | ä¸å¡ç±»å | |
| | | | bizCode | String | å¦ | ä¸å¡åå·ï¼æ¨¡ç³å¹é
| |
| | | | materialStockId | Long | å¦ | åºåè®°å½ID | |
| | | | bagCode | String | å¦ | è¢ç ï¼æ¨¡ç³å¹é
ï¼è´¨æ£ãéå®åºåºçè¢ç çº§æµæ°´ï¼ | |
| | | | startTime | String | å¦ | å¼å§æ¶é´ï¼æ ¼å¼ï¼yyyy-MM-dd HH:mm:ssï¼ | |
| | | | endTime | String | å¦ | ç»ææ¶é´ï¼æ ¼å¼ï¼yyyy-MM-dd HH:mm:ssï¼ | |
| | | | pageNo | Integer | æ¯ | 页ç ï¼é»è®¤1 | |
| | | | pageSize | Integer | æ¯ | æ¯é¡µæ¡æ°ï¼é»è®¤10 | |
| | | |
| | | ### æ¹æ¬¡è¿½æº¯æ¥è¯¢ |
| | | |
| | | ç¹å»æµæ°´å表ä¸çæ¹æ¬¡å·æ¶ï¼ä½¿ç¨å½åè¡ç `batchCode` è°ç¨ä»¥ä¸æ¥å£ï¼ |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | code | String | æ¯ | æ¹æ¬¡å·ææ¹æ¬¡äºç»´ç å
容 | |
| | | |
| | | 请æ±ç¤ºä¾ï¼`GET /mes/pro/batch/get-by-code?code={batchCode}` |
| | | |
| | | æ¥å£è¿åçéç¹åæ®µï¼ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | Long | çäº§æ¹æ¬¡ID | |
| | | | code | String | æ£å¼æ¹æ¬¡å· | |
| | | | tempCode | String | ä¸´æ¶æ¹æ¬¡ç | |
| | | | itemCode | String | ç©æç¼ç | |
| | | | itemName | String | ç©æåç§° | |
| | | | workers | Array | æ¹æ¬¡äººåé
ç½® | |
| | | | pallets | Array | æ¹æ¬¡ä¸çæçå表 | |
| | | | bagTotal | Integer | è¢ç æ»æ° | |
| | | | bags | Array | æ¹æ¬¡ä¸çè¢ç å表 | |
| | | |
| | | 该æ¥å£åæ¶æ¯ææ£å¼æ¹æ¬¡å·åä¸´æ¶æ¹æ¬¡ç ãè¥æ¹æ¬¡å·ä¸ºç©ºï¼ä¸æ¾ç¤ºç¹å»å
¥å£ï¼è¥æ¥è¯¢ä¸å°çäº§æ¹æ¬¡ï¼ææ¥å£è¿åçä¸å¡é误æç¤ºç¨æ·ã |
| | | |
| | | ### ååºå段 |
| | | |
| | |
| | | | quantity | BigDecimal | å卿°éï¼æ£æ°=å
¥åºï¼è´æ°=åºåºï¼ | |
| | | | batchId | Long | æ¹æ¬¡ID | |
| | | | batchCode | String | æ¹æ¬¡å· | |
| | | | bagCodeId | Long | è¢ç IDï¼è¢ç çº§æµæ°´éç©ºï¼ | |
| | | | bagCode | String | è¢ç ï¼è¢ç çº§æµæ°´é空ï¼å¦è´¨æ£ãéå®åºåºãç§»åºï¼ | |
| | | | warehouseId | Long | ä»åºID | |
| | | | warehouseName | String | ä»åºåç§° | |
| | | | locationId | Long | åºåºID | |
| | |
| | | | 121 | å¤ååæ | å¤ååæ | |
| | | | 122 | å¤åå
¥åº | å¤åå
¥åº | |
| | | |
| | | ## è°ç¨æ¶åº |
| | | |
| | | 1. è¿å
¥åºåäºå¡æµæ°´é¡µé¢æ¶ï¼è°ç¨ `/mes/wm/transaction/page` è·åæµæ°´å表ã |
| | | 2. å表ä¸å±ç¤º `batchCode`ï¼æ¹æ¬¡å·é空æ¶å
许ç¹å»ã |
| | | 3. ç¹å»æ¹æ¬¡å·åï¼å°å½åè¡ç `batchCode` ä½ä¸º `code` è°ç¨ `/mes/pro/batch/get-by-code`ã |
| | | 4. æ ¹æ®è¿åç»æå±ç¤ºçäº§æ¹æ¬¡ä¿¡æ¯ãæçå表åè¢ç å表ï¼`bagTotal` ç¨äºæ¾ç¤ºè¢ç æ»æ°ï¼`bags` ç¨äºå±ç¤ºè¢ç æç»ã |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | batchCode | åºåæµæ°´å表 | æ¹æ¬¡å·é空æ¶ä½ä¸ºå¯ç¹å»å
¥å£ | |
| | | | code | æ¹æ¬¡è¯¦æ
| æ£å¼æ¹æ¬¡å· | |
| | | | tempCode | æ¹æ¬¡è¯¦æ
| ä¸´æ¶æ¹æ¬¡ç ï¼æå¼æ¶å±ç¤º | |
| | | | bagTotal | æ¹æ¬¡è¯¦æ
| å±ç¤ºè¯¥æ¹æ¬¡è¢ç æ»æ° | |
| | | | bags[].code | æ¹æ¬¡è¯¦æ
| å±ç¤ºè¢ç æç» | |
| | | | pallets | æ¹æ¬¡è¯¦æ
| å±ç¤ºè¯¥æ¹æ¬¡å
³èçæçä¿¡æ¯ | |
| | | |
| | | ## æç´¢æ¡ä»¶ |
| | | |
| | | | æ¡ä»¶å段 | ç»ä»¶ç±»å | 说æ | |
| | |
| | | | åºåº | locationName | 100 | - | |
| | | | åºä½ | areaName | 100 | - | |
| | | | äºå¡æ¶é´ | transactionTime | 160 | æ ¼å¼ï¼yyyy-MM-dd HH:mm:ss | |
| | | | è¢ç | bagCode | 150 | è¢ç çº§æµæ°´çè¢ç ï¼æ¹æ¬¡/è¢ç å¯ç»§ç»è¿½æº¯ | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | |
| | | | æ°éæ¾ç¤º | quantity > 0 æ¾ç¤ºç»¿è²ï¼quantity < 0 æ¾ç¤ºçº¢è² | |
| | | | ç±»åæ ç¾ | å
¥åºæ¾ç¤ºç»¿è² success æ ç¾ï¼åºåºæ¾ç¤ºçº¢è² danger æ ç¾ | |
| | | | ä¸å¡åå·è·³è½¬ | ç¹å» bizCode å¯è·³è½¬å°å¯¹åºä¸å¡åæ®è¯¦æ
页 | |
| | | | è¢ç çé | ä¼ bagCode 坿¥çæå®è¢ç ç宿´æµè½¬ï¼è´¨æ£æååºåº/åæ ¼å
¥åº/éå®åºåºçï¼ | |
| | | |
| | | ## æéé
ç½® |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ========================================= |
| | | -- è¢ç è´¨æ£ç¶æï¼æ¯æç§åè´¨æ£æè¢ç ç²åº¦æµè½¬åºå |
| | | -- qc_statusï¼10 æªè´¨æ£ / 20 è´¨æ£åæ ¼ / 30 è´¨æ£ä¸åæ ¼ |
| | | -- æ°å¢åç¨äºè®°å½æ¯è¢çè´¨æ£ç»æï¼éå®åºåºæ«è¢ç æ¶æ ¡éªè¯¥è¢å·²è´¨æ£åæ ¼ã |
| | | -- ========================================= |
| | | |
| | | ALTER TABLE `mes_pro_bag_code` |
| | | ADD COLUMN `qc_status` TINYINT NOT NULL DEFAULT 10 COMMENT 'è´¨æ£ç¶æï¼10æªè´¨æ£ 20è´¨æ£åæ ¼ 30è´¨æ£ä¸åæ ¼ï¼' AFTER `status`; |
| | | |
| | | -- åå¡«åéæ°æ®ï¼æå·²æç§åè´¨æ£è®°å½åæ¥è¢ç è´¨æ£ç¶æ |
| | | UPDATE `mes_pro_bag_code` b |
| | | JOIN `mes_qc_seed_quality` q ON b.code = q.code AND b.deleted = 0 |
| | | SET b.qc_status = IF(q.result = 1, 20, 30), b.update_time = NOW(); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ç产线æ«ç å
¥åºï¼æ¯æè¢ç /æçç /æ¹æ¬¡ç ä¸ç§æ«ç ç±»åï¼å¹¶å»æè®¾å¤ç¼ç å¿
å¡« |
| | | -- 说æï¼ |
| | | -- 1. mes_pro_scan_event å¢å scan_type åï¼æ è®°æ«ç ç±»åï¼BAG è¢ç / PALLET æçç / BATCH æ¹æ¬¡ç ï¼ï¼åå²è¢ç æ°æ®åå¡« BAG |
| | | -- 2. mes_pro_pallet å¢å å
¥åºæ è®°åï¼æçåå
æ å
¥åºæ è®°åæ®µï¼æ´æå
¥åºéå»éï¼é²æ¢å䏿çé夿«ç å
¥åºï¼ |
| | | |
| | | ALTER TABLE mes_pro_scan_event ADD COLUMN scan_type VARCHAR(16) NULL COMMENT 'æ«ç ç±»åï¼BAGè¢ç /PALLETæçç /BATCHæ¹æ¬¡ç ï¼' AFTER bag_code; |
| | | |
| | | -- 设å¤ç¼ç ä¸åå¿
å¡«ï¼åç«¯å»æè®¾å¤ç¼ç ï¼åå²åä¿æå
¼å®¹ï¼ |
| | | ALTER TABLE mes_pro_scan_event MODIFY COLUMN device_code VARCHAR(64) NULL DEFAULT NULL COMMENT '设å¤ç¼ç ï¼ä¸åå¿
å¡«ï¼'; |
| | | |
| | | ALTER TABLE mes_pro_pallet ADD COLUMN inbound_event_id BIGINT NULL COMMENT 'æè¿å
¥åºæ«ç äºä»¶ç¼å·' AFTER bag_count; |
| | | ALTER TABLE mes_pro_pallet ADD COLUMN inbound_time DATETIME NULL COMMENT 'æè¿å
¥åºæ¶é´' AFTER inbound_event_id; |
| | | |
| | | UPDATE mes_pro_scan_event SET scan_type = 'BAG' WHERE scan_type IS NULL; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- ç§åè´¨æ£è®°å½ç¬ç«èå |
| | | -- å°è´¨æ£è®°å½ä»ãç§åè´¨æ£ã页(æäº¤+è®°å½åä¸)æåºï¼ç¬ç«æèåé¡µé¢ |
| | | -- 说æï¼ |
| | | -- 1. ç§åè´¨æ£æäº¤é¡µï¼seed-quality -> mes/qc/seedQuality/indexï¼ä»
æäº¤ï¼ |
| | | -- 2. è´¨æ£è®°å½é¡µï¼seed-quality-record -> mes/qc/seedQuality/recordï¼ä»
è®°å½æ¥è¯¢ï¼ |
| | | -- æå¨ãè´¨é管çã(5500) ç®å½ä¸ï¼å¹çï¼å¯é夿§è¡ï¼æ ç§æ·å段ã |
| | | -- ============================================= |
| | | |
| | | INSERT INTO system_menu |
| | | (id, name, parent_id, type, sort, status, path, icon, component, component_name, permission, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) |
| | | SELECT 1065224, 'è´¨æ£è®°å½', 5500, 2, 95, 0, 'seed-quality-record', 'ep:list', 'mes/qc/seedQuality/record', 'MesQcSeedQualityRecord', '', b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 1065224 AND deleted = b'0'); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | CREATE TABLE mes_wm_material_stock_bag ( |
| | | id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | material_stock_id BIGINT NOT NULL COMMENT 'åºåæ±æ»è®°å½ID', |
| | | bag_code_id BIGINT NOT NULL COMMENT 'ç产è¢ç ID', |
| | | bag_code VARCHAR(64) NOT NULL COMMENT 'è¢ç ', |
| | | item_id BIGINT NOT NULL COMMENT 'ç©æID', |
| | | batch_id BIGINT NULL COMMENT 'ä»åºæ¹æ¬¡ID', |
| | | batch_code VARCHAR(64) NULL COMMENT 'æ¹æ¬¡å·', |
| | | vendor_id BIGINT NULL COMMENT 'ä¾åºåID', |
| | | warehouse_id BIGINT NOT NULL COMMENT 'ä»åºID', |
| | | location_id BIGINT NULL COMMENT 'åºåºID', |
| | | area_id BIGINT NULL COMMENT 'åºä½ID', |
| | | stock_state TINYINT NOT NULL COMMENT 'åºåç¶æï¼10æåï¼20åæ ¼ï¼30å·²åºåºï¼40æ¥åº', |
| | | status TINYINT NOT NULL DEFAULT 1 COMMENT 'æç»ç¶æï¼1å¨åºï¼2å·²åºåºï¼3å·²æ¥åº', |
| | | quantity DECIMAL(18, 6) NOT NULL DEFAULT 1 COMMENT 'è¢ç åºåæ°é', |
| | | frozen BIT NOT NULL DEFAULT 0 COMMENT 'æ¯å¦å»ç»', |
| | | last_transaction_id BIGINT NULL COMMENT 'æè¿åºåäºå¡ID', |
| | | inbound_time DATETIME NULL COMMENT 'å
¥åºæ¶é´', |
| | | outbound_time DATETIME NULL COMMENT 'åºåºæ¶é´', |
| | | creator VARCHAR(64) DEFAULT '' COMMENT 'å建è
', |
| | | create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | updater VARCHAR(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | deleted BIT NOT NULL DEFAULT 0 COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (id), |
| | | UNIQUE KEY uk_bag_code (bag_code), |
| | | KEY idx_material_stock (material_stock_id), |
| | | KEY idx_batch_state (batch_id, stock_state, status), |
| | | KEY idx_location_state (warehouse_id, location_id, area_id, stock_state, status), |
| | | KEY idx_bag_code_id (bag_code_id) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MESåºåè¢ç æç»'; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- MES éå®åºåºåè¡¨ç»æä¿®æ¹ |
| | | -- æ ¹æ® MesWmProductSalesDO è¡¥å
ç¼ºå¤±åæ®µ |
| | | -- 说æï¼ä¿®å¤æ¥è¯¢æ¥é Unknown column 'client_name'ï¼åæ¶è¡¥å
outbound_timeãoutbound_user_id |
| | | |
| | | -- 1. ç»éååç§°å¿«ç
§ |
| | | ALTER TABLE mes_wm_product_sales ADD COLUMN client_name VARCHAR(128) DEFAULT NULL COMMENT 'ç»éååç§°å¿«ç
§' AFTER client_id; |
| | | |
| | | -- 2. å®é
åºåºæ¶é´ |
| | | ALTER TABLE mes_wm_product_sales ADD COLUMN outbound_time DATETIME DEFAULT NULL COMMENT 'å®é
åºåºæ¶é´'; |
| | | |
| | | -- 3. æ§è¡åºåºæä½äººID |
| | | ALTER TABLE mes_wm_product_sales ADD COLUMN outbound_user_id BIGINT DEFAULT NULL COMMENT 'æ§è¡åºåºæä½äººID'; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================================== |
| | | -- æ°å»ºåæ ¼ä»åº + ä»åºç±»å + è´¨æ£å
¥åæ ¼åºæ¹é |
| | | -- |
| | | -- 1) mes_wm_warehouse å¢å type åæ®µï¼10 æååº / 20 åæ ¼åºï¼ |
| | | -- 2) ç°æä»åºåç±»ï¼èæçº¿è¾¹ä»åº=10ï¼æååºï¼ï¼äº§ååº/ç©æåº=20ï¼åæ ¼åºï¼ |
| | | -- 3) æ°å»º"æååæ ¼åº"(type=20) + ä¸ä¸ªåºåº + ä¸ä¸ªåºä½ |
| | | -- 4) èæä»åºä¸ stock_state=20 çåæ ¼åºåè¿ç§»å°æ°åæ ¼åº |
| | | -- |
| | | -- 说æï¼æ¬èæ¬å¹çï¼å¯é夿§è¡ï¼æ ç§æ·å段ã |
| | | -- ===================================================================== |
| | | |
| | | -- 1) å¢å ä»åºç±»ååæ®µï¼MySQL 䏿¯æ ALTER ADD COLUMN IF NOT EXISTSï¼å
æ¥å卿§ï¼ |
| | | SET @type_exists = ( |
| | | SELECT COUNT(*) |
| | | FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() |
| | | AND table_name = 'mes_wm_warehouse' |
| | | AND column_name = 'type' |
| | | ); |
| | | SET @type_sql = IF( |
| | | @type_exists = 0, |
| | | 'ALTER TABLE mes_wm_warehouse ADD COLUMN type tinyint NOT NULL DEFAULT 10 COMMENT ''ä»åºç±»åï¼10æååºï¼20åæ ¼åº'' AFTER frozen', |
| | | 'SELECT 1' |
| | | ); |
| | | PREPARE type_stmt FROM @type_sql; |
| | | EXECUTE type_stmt; |
| | | DEALLOCATE PREPARE type_stmt; |
| | | |
| | | -- 2) ç°æä»åºåç±» |
| | | UPDATE mes_wm_warehouse SET type = 10 WHERE code = 'WIP_VIRTUAL_WAREHOUSE' AND deleted = 0; |
| | | UPDATE mes_wm_warehouse SET type = 20 WHERE code IN ('1212', 'WHS000001') AND deleted = 0; |
| | | |
| | | -- 3) æ°å»º"æååæ ¼åº"ï¼type=20ï¼ |
| | | SET @wh_exists = ( |
| | | SELECT COUNT(*) FROM mes_wm_warehouse WHERE code = 'FG_QUALIFIED_WH' AND deleted = 0 |
| | | ); |
| | | INSERT INTO mes_wm_warehouse (code, name, frozen, type, remark) |
| | | SELECT 'FG_QUALIFIED_WH', 'æååæ ¼åº', 0, 20, 'è´¨æ£åæ ¼ç´æ¥å
¥åºçç®æ ä»åºï¼type=20 åæ ¼åºï¼' |
| | | WHERE @wh_exists = 0; |
| | | SET @wh_id = (SELECT id FROM mes_wm_warehouse WHERE code = 'FG_QUALIFIED_WH' AND deleted = 0 LIMIT 1); |
| | | |
| | | -- æ°å»º"æååæ ¼åºåº" |
| | | SET @loc_exists = ( |
| | | SELECT COUNT(*) FROM mes_wm_warehouse_location WHERE code = 'FG_QUALIFIED_WH_LOC' AND deleted = 0 |
| | | ); |
| | | INSERT INTO mes_wm_warehouse_location (code, name, warehouse_id, frozen, remark) |
| | | SELECT 'FG_QUALIFIED_WH_LOC', 'æååæ ¼åºåº', @wh_id, 0, 'è´¨æ£åæ ¼å
¥åºé»è®¤åºåº' |
| | | WHERE @loc_exists = 0; |
| | | SET @loc_id = (SELECT id FROM mes_wm_warehouse_location WHERE code = 'FG_QUALIFIED_WH_LOC' AND deleted = 0 LIMIT 1); |
| | | |
| | | -- æ°å»º"æååæ ¼åºä½" |
| | | SET @area_exists = ( |
| | | SELECT COUNT(*) FROM mes_wm_warehouse_area WHERE code = 'FG_QUALIFIED_WH_AREA' AND deleted = 0 |
| | | ); |
| | | INSERT INTO mes_wm_warehouse_area (code, name, location_id, frozen, remark) |
| | | SELECT 'FG_QUALIFIED_WH_AREA', 'æååæ ¼åºä½', @loc_id, 0, 'è´¨æ£åæ ¼å
¥åºé»è®¤åºä½' |
| | | WHERE @area_exists = 0; |
| | | SET @area_id = (SELECT id FROM mes_wm_warehouse_area WHERE code = 'FG_QUALIFIED_WH_AREA' AND deleted = 0 LIMIT 1); |
| | | |
| | | -- 4) è¿ç§»èæä»åºåæ ¼åºåå°æ°åæ ¼åº |
| | | -- 4.1 è¥æ°åæ ¼åºå·²åå¨å (item_id, batch_id, vendor_id) ç state=20 è®°å½ï¼å
æ°éç´¯å åå¹¶ |
| | | UPDATE mes_wm_material_stock t |
| | | JOIN mes_wm_material_stock s |
| | | ON s.warehouse_id = 3 AND s.stock_state = 20 AND s.deleted = 0 |
| | | AND t.warehouse_id = @wh_id AND t.stock_state = 20 AND t.deleted = 0 |
| | | AND t.item_id = s.item_id |
| | | AND IFNULL(t.batch_id, 0) = IFNULL(s.batch_id, 0) |
| | | AND IFNULL(t.vendor_id, 0) = IFNULL(s.vendor_id, 0) |
| | | SET t.quantity = t.quantity + s.quantity, |
| | | t.reserved_quantity = t.reserved_quantity + s.reserved_quantity, |
| | | t.frozen_quantity = t.frozen_quantity + s.frozen_quantity; |
| | | |
| | | -- 4.2 å é¤å·²åå¹¶å°æ°åæ ¼åºçæºè®°å½ï¼èæä»åºä¸ï¼ |
| | | DELETE s FROM mes_wm_material_stock s |
| | | JOIN mes_wm_material_stock t |
| | | ON s.warehouse_id = 3 AND s.stock_state = 20 AND s.deleted = 0 |
| | | AND t.warehouse_id = @wh_id AND t.stock_state = 20 AND t.deleted = 0 |
| | | AND t.item_id = s.item_id |
| | | AND IFNULL(t.batch_id, 0) = IFNULL(s.batch_id, 0) |
| | | AND IFNULL(t.vendor_id, 0) = IFNULL(s.vendor_id, 0); |
| | | |
| | | -- 4.3 å
¶ä½åæ ¼åºåç´æ¥æ¹ä»åº/åºåº/åºä½ |
| | | UPDATE mes_wm_material_stock |
| | | SET warehouse_id = @wh_id, location_id = @loc_id, area_id = @area_id |
| | | WHERE warehouse_id = 3 AND stock_state = 20 AND deleted = 0; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | SET @exists_bag_code_id = (SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'mes_wm_transaction' AND column_name = 'bag_code_id'); |
| | | SET @sql_bag_code_id = IF(@exists_bag_code_id = 0, 'ALTER TABLE mes_wm_transaction ADD COLUMN bag_code_id BIGINT NULL COMMENT ''ç产è¢ç ID'' AFTER material_stock_id', 'SELECT 1'); |
| | | PREPARE stmt FROM @sql_bag_code_id; |
| | | EXECUTE stmt; |
| | | DEALLOCATE PREPARE stmt; |
| | | |
| | | SET @exists_bag_code = (SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'mes_wm_transaction' AND column_name = 'bag_code'); |
| | | SET @sql_bag_code = IF(@exists_bag_code = 0, 'ALTER TABLE mes_wm_transaction ADD COLUMN bag_code VARCHAR(64) NULL COMMENT ''è¢ç '' AFTER bag_code_id', 'SELECT 1'); |
| | | PREPARE stmt FROM @sql_bag_code; |
| | | EXECUTE stmt; |
| | | DEALLOCATE PREPARE stmt; |
| | | |
| | | SET @exists_bag_code_index = (SELECT COUNT(*) FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'mes_wm_transaction' AND index_name = 'idx_bag_code'); |
| | | SET @sql_bag_code_index = IF(@exists_bag_code_index = 0, 'ALTER TABLE mes_wm_transaction ADD KEY idx_bag_code (bag_code)', 'SELECT 1'); |
| | | PREPARE stmt FROM @sql_bag_code_index; |
| | | EXECUTE stmt; |
| | | DEALLOCATE PREPARE stmt; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- åºåºæµé管çèåæåèæ¬ |
| | | -- å°"éå®ä»åº"(602479) æå为ä¸çº§èå"åºåºæµé管ç" |
| | | -- åç»æï¼ä»å¨ç©æµ(5780) -> éå®ä»åº(602479) -> åè´§éç¥/éå®åºåº/éå®éè´§ |
| | | -- ============================================= |
| | | |
| | | -- 1. æå为ä¸çº§èå |
| | | -- 说æï¼é¡¶çº§"è¥é管ç"(2617) å·²å ç¨ path=saleï¼æ
æ¹ç¨ sales-outbound é¿å
è·¯ç±å²çª |
| | | UPDATE system_menu SET |
| | | parent_id = 0, |
| | | name = 'åºåºæµé管ç', |
| | | path = 'sales-outbound', |
| | | sort = 10 -- æ¾å¨ä»å¨ç©æµ(sort=9)ä¹å |
| | | WHERE id = 602479 AND deleted = b'0'; |
| | | |
| | | -- ============================================= |
| | | -- 说æï¼ |
| | | -- 1. åèå(åè´§éç¥ 5867 / éå®åºåº 5970 / éå®éè´§ 5847) æ éæ¹å¨ï¼ |
| | | -- åç«¯å¨æè·¯ç±ä¼èªå¨æ¼æ¥ä¸º /sales-outbound/sales-notice çè·¯å¾ |
| | | -- 2. 顶级ç®å½èåç±å端èªå¨æ¸²æä¸º BasicLayoutï¼component åæ®µæ éå¡«å |
| | | -- 3. å¦éæ¢å¤ï¼æ§è¡ä»¥ä¸ååèæ¬ï¼ |
| | | -- ============================================= |
| | | |
| | | -- ååèæ¬ï¼å¦éæ¢å¤ï¼ï¼ |
| | | -- UPDATE system_menu SET parent_id = 5780, name = 'éå®ä»åº', path = 'sale', sort = 5 WHERE id = 602479; |
| | |
| | | MesWmReturnSalesCreateReqDTO mesReqDTO = new MesWmReturnSalesCreateReqDTO(); |
| | | mesReqDTO.setCode(returnDO.getNo()); |
| | | mesReqDTO.setName("å®åéè´§-" + returnDO.getNo()); |
| | | mesReqDTO.setSaleOrderId(returnDO.getSaleOrderId()); |
| | | mesReqDTO.setSalesOrderCode(ticket != null ? ticket.getSaleOrderNo() : null); |
| | | mesReqDTO.setClientId(returnDO.getCustomerId()); |
| | | mesReqDTO.setReturnDate(LocalDate.now()); |
| | | mesReqDTO.setReturnReason(returnDO.getReturnReason()); |
| | |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; |
| | | import cn.iocoder.yudao.module.mes.api.mps.MesProMpsApi; |
| | | import cn.iocoder.yudao.module.mes.api.productsales.MesWmProductSalesLineApi; |
| | | import cn.iocoder.yudao.module.mes.api.salesnotice.MesWmSalesNoticeApi; |
| | | import cn.iocoder.yudao.module.mes.api.wms.MesWmStockApi; |
| | | import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | |
| | | private MdmItemApi mdmItemApi; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | @Resource |
| | | private MesWmSalesNoticeApi salesNoticeApi; |
| | | @Resource |
| | | private MesWmProductSalesLineApi productSalesLineApi; |
| | | @Resource |
| | | private MesProMpsApi mpsApi; |
| | | @Resource |
| | | private StorageAttachmentApi storageAttachmentApi; |
| | | @Resource |
| | |
| | | // 2. æ¹éæ¥è¯¢å
³èæ°æ® |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductId)); |
| | | Map<Long, String> batchCodeMap = productSalesLineApi.getBatchCodesBySaleOrderItemIds( |
| | | convertSet(saleOrderItemList, ErpSaleOrderItemDO::getId)); |
| | | Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureMap( |
| | | convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductUnitId)); |
| | | // 3. 转æ¢è®¢å项 |
| | | List<ErpSaleOrderRespVO.Item> itemVOList = BeanUtils.toBean(saleOrderItemList, ErpSaleOrderRespVO.Item.class, item -> { |
| | | item.setStockCount(mesWmStockApi.getStockQuantity(item.getProductId())); |
| | | item.setBatchCode(batchCodeMap.get(item.getId())); |
| | | MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> |
| | | item.setProductName(mdmItem.getName()).setProductBarCode(mdmItem.getBarCode()) |
| | | .setProductSpecification(mdmItem.getSpecification())); |
| | |
| | | // 1.4 管çåä¿¡æ¯ |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( |
| | | convertSet(pageResult.getList(), saleOrder -> Long.parseLong(saleOrder.getCreator()))); |
| | | // 1.5 åè´§éç¥åä¿¡æ¯ |
| | | Map<Long, Boolean> salesNoticeMap = salesNoticeApi.checkSalesNoticeBySaleOrderIds( |
| | | convertSet(pageResult.getList(), ErpSaleOrderDO::getId)); |
| | | // 1.6 åºåºæ¹å· |
| | | Map<Long, String> batchCodeMap = productSalesLineApi.getBatchCodesBySaleOrderItemIds( |
| | | convertSet(saleOrderItemList, ErpSaleOrderItemDO::getId)); |
| | | // 1.7 计éåä½ |
| | | // 1.5 计éåä½ |
| | | Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureMap( |
| | | convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductUnitId)); |
| | | // 1.8 æ£æ¥æ¯å¦å¯ä»¥çæåè´§éç¥åï¼éè¦ç产çæç»å¯¹åºç MPS æ¯å¦å·²å®æï¼ |
| | | // çéåºéè¦ç产çæç»ID |
| | | List<Long> needProductionItemIds = saleOrderItemList.stream() |
| | | .filter(item -> item.getNeedProduction() != null && item.getNeedProduction() == 1) |
| | | .map(ErpSaleOrderItemDO::getId) |
| | | .toList(); |
| | | Map<Long, Boolean> canCreateSalesNoticeMap = new java.util.HashMap<>(); |
| | | if (!needProductionItemIds.isEmpty()) { |
| | | // æè®¢ååç»æç»ID |
| | | Map<Long, List<Long>> orderItemIdsMap = new java.util.HashMap<>(); |
| | | for (ErpSaleOrderItemDO item : saleOrderItemList) { |
| | | orderItemIdsMap.computeIfAbsent(item.getOrderId(), k -> new java.util.ArrayList<>()) |
| | | .add(item.getId()); |
| | | } |
| | | // æ£æ¥æ¯ä¸ªè®¢å |
| | | for (Map.Entry<Long, List<Long>> entry : orderItemIdsMap.entrySet()) { |
| | | List<Long> itemIds = entry.getValue().stream() |
| | | .filter(id -> { |
| | | ErpSaleOrderItemDO item = saleOrderItemList.stream() |
| | | .filter(i -> i.getId().equals(id)) |
| | | .findFirst().orElse(null); |
| | | return item != null && item.getNeedProduction() != null && item.getNeedProduction() == 1; |
| | | } |
| | | ).toList(); |
| | | if (itemIds.isEmpty()) { |
| | | canCreateSalesNoticeMap.put(entry.getKey(), true); |
| | | } else { |
| | | canCreateSalesNoticeMap.put(entry.getKey(), mpsApi.checkCanCreateSalesNotice(itemIds)); |
| | | } |
| | | } |
| | | } else { |
| | | // 没æéè¦ç产çæç»ï¼é½å¯ä»¥çæåè´§éç¥å |
| | | pageResult.getList().forEach(order -> canCreateSalesNoticeMap.put(order.getId(), true)); |
| | | } |
| | | // 2. å¼å§æ¼æ¥ |
| | | return BeanUtils.toBean(pageResult, ErpSaleOrderRespVO.class, saleOrder -> { |
| | | saleOrder.setItems(BeanUtils.toBean(saleOrderItemMap.get(saleOrder.getId()), ErpSaleOrderRespVO.Item.class, |
| | | item -> { |
| | | item.setBatchCode(batchCodeMap.get(item.getId())); |
| | | MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> |
| | | item.setProductName(mdmItem.getName()).setProductBarCode(mdmItem.getBarCode()) |
| | | .setProductSpecification(mdmItem.getSpecification())); |
| | |
| | | saleOrder.setProductNames(CollUtil.join(saleOrder.getItems(), "ï¼", ErpSaleOrderRespVO.Item::getProductName)); |
| | | MapUtils.findAndThen(customerMap, saleOrder.getCustomerId(), supplier -> saleOrder.setCustomerName(supplier.getName())); |
| | | MapUtils.findAndThen(userMap, Long.parseLong(saleOrder.getCreator()), user -> saleOrder.setCreatorName(user.getNickname())); |
| | | // 设置æ¯å¦å·²çæåè´§éç¥å |
| | | saleOrder.setHasSalesNotice(salesNoticeMap.getOrDefault(saleOrder.getId(), false)); |
| | | // 设置æ¯å¦å¯ä»¥çæåè´§éç¥åï¼å·²çæåè´§éç¥åæ¶ä¸æ¾ç¤ºæé® |
| | | saleOrder.setCanCreateSalesNotice(!saleOrder.getHasSalesNotice() && canCreateSalesNoticeMap.getOrDefault(saleOrder.getId(), true)); |
| | | // 设置æ¯å¦æéè¦ç产çæç» |
| | | boolean hasNeedProduction = saleOrder.getItems().stream() |
| | | .anyMatch(item -> item.getNeedProduction() != null && item.getNeedProduction() == 1); |
| | |
| | | @Schema(description = "åºåºç¶æ", example = "0") |
| | | private Integer outStatus; |
| | | |
| | | // ========== åè´§éç¥ ========== |
| | | |
| | | @Schema(description = "æ¯å¦å·²çæåè´§éç¥å", example = "false") |
| | | private Boolean hasSalesNotice; |
| | | |
| | | @Schema(description = "æ¯å¦å¯ä»¥çæåè´§éç¥åï¼æéè¦çäº§ä¸æªå®æçæç»æ¶ä¸º falseï¼", example = "true") |
| | | private Boolean canCreateSalesNotice; |
| | | // ========== ç产å
³è ========== |
| | | |
| | | @Schema(description = "æ¯å¦æéè¦ç产çæç»ï¼0=å¦ 1=æ¯ï¼", example = "1") |
| | | private Integer needProduction; |
| | | |
| | | // ========== ç产å
³è ========== |
| | | |
| | | @Schema(description = "çäº§ç¶æï¼0-æªå®æï¼1-已宿", example = "1") |
| | | private Integer productionStatus; |
| | |
| | | |
| | | @Schema(description = "å
³èç MPS ç¼å·", example = "1024") |
| | | private Long mpsId; |
| | | |
| | | // ========== åºåºæ¹å· ========== |
| | | |
| | | @Schema(description = "åºåºæ¹å·", example = "B2026001ãB2026002") |
| | | private String batchCode; |
| | | |
| | | // ========== å
³èåæ®µ ========== |
| | | |
| | |
| | | @Schema(description = "éè´§ååç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "å®åéè´§") |
| | | private String name; |
| | | |
| | | @Schema(description = "éå®è®¢å ID", example = "1") |
| | | private Long saleOrderId; |
| | | |
| | | @Schema(description = "éå®è®¢åç¼å·", example = "SO202603010001") |
| | | private String salesOrderCode; |
| | | |
| | | @Schema(description = "å®¢æ· ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long clientId; |
| | | |
| | |
| | | @Schema(description = "æçç æ»æ°", requiredMode = Schema.RequiredMode.REQUIRED, example = "800") |
| | | private Long palletCount; |
| | | |
| | | // ========== åºåºæµé ========== |
| | | |
| | | @Schema(description = "åè´§éç¥åæ°ï¼mes_wm_sales_noticeï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | private Long salesNoticeCount; |
| | | |
| | | @Schema(description = "éå®åºåºåæ°ï¼mes_wm_product_salesï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") |
| | | private Long productSalesCount; |
| | | |
| | | @Schema(description = "éå®éè´§åæ°ï¼mes_wm_return_salesï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") |
| | | private Long returnSalesCount; |
| | | |
| | | // ========== ä»å¨é¢è¦ / è´¨é ========== |
| | | |
| | | @Schema(description = "æªå¤çåºåé¢è¦æ°ï¼mes_wm_stock_warning.status=10ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "3") |
| | | private Long stockWarningPendingCount; |
| | | |
| | | @Schema(description = "å¾
è¯å®¡ä¸åæ ¼ååæ°ï¼mes_qc_ncr.status=0ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") |
| | | private Long ncrPendingCount; |
| | | |
| | | // ========== ç¶æåå¸ ========== |
| | | |
| | | @Schema(description = "æ¹æ¬¡ç¶æåå¸") |
| | |
| | | @RestController @RequestMapping("/mes/pro/scan-in") |
| | | public class MesProScanEventController { |
| | | @Resource private MesProScanEventService service; |
| | | @PostMapping("/inbound") @PreAuthorize("@ss.hasPermission('mes:pro-scan-in:inbound')") @Operation(summary = "è¢ç æ«ç å
¥åº") |
| | | @PostMapping("/inbound") @PreAuthorize("@ss.hasPermission('mes:pro-scan-in:inbound')") @Operation(summary = "è¿½æº¯ç æ«ç å
¥åºï¼è¢ç /æçç /æ¹æ¬¡ç ï¼") |
| | | public CommonResult<MesProScanEventRespVO> inbound(@Valid @RequestBody MesProScanEventCreateReqVO req) { |
| | | return success(BeanUtils.toBean(service.createInbound(req), MesProScanEventRespVO.class)); |
| | | } |
| | |
| | | @Data |
| | | public class MesProScanEventCreateReqVO { |
| | | @NotBlank private String eventId; |
| | | /** |
| | | * æ«ç å
容ï¼è¢ç / æçç / æ¹æ¬¡ç çç å¼ï¼å«ä¸´æ¶ç ï¼ |
| | | */ |
| | | @NotBlank private String bagCode; |
| | | /** |
| | | * æ«ç ç±»åï¼BAG è¢ç / PALLET æçç / BATCH æ¹æ¬¡ç ï¼é»è®¤ BAG |
| | | */ |
| | | private String scanType; |
| | | @NotNull @DecimalMin("0.000001") private BigDecimal quantity; |
| | | @NotBlank private String deviceCode; |
| | | /** |
| | | * 设å¤ç¼ç ï¼ä¸åå¿
å¡«ï¼äº§çº¿æ«ç 以产线+åºåºåºä½å®ä½ï¼ |
| | | */ |
| | | @Size(max = 64) private String deviceCode; |
| | | private String lineCode; |
| | | @NotNull private Long locationId; |
| | | @NotNull private Long areaId; |
| | |
| | | private Long id; |
| | | private String eventId; |
| | | private String bagCode; |
| | | private String scanType; |
| | | private String batchCode; |
| | | private BigDecimal quantity; |
| | | private String deviceCode; |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualitySubmitReqVO; |
| | | import cn.iocoder.yudao.module.mes.service.qc.seedquality.MesQcSeedQualityService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | |
| | | @RestController @RequestMapping("/mes/qc/seed-quality") @Validated |
| | | public class MesQcSeedQualityController { |
| | | @Resource private MesQcSeedQualityService service; |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾ç§åè´¨æ£è®°å½å页") |
| | | @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:query')") |
| | | public CommonResult<PageResult<MesQcSeedQualityRespVO>> getQualityPage(@Valid MesQcSeedQualityPageReqVO pageReqVO) { |
| | | return success(BeanUtils.toBean(service.getQualityPage(pageReqVO), MesQcSeedQualityRespVO.class)); |
| | | } |
| | | |
| | | @PostMapping("/submit") @Operation(summary = "æäº¤ç§åè´¨æ£") |
| | | @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:submit')") |
| | | public CommonResult<Long> submit(@Valid @RequestBody MesQcSeedQualitySubmitReqVO reqVO) { return success(service.submit(reqVO)); } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | @Schema(description = "管çåå° - MES ç§åè´¨æ£è®°å½å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class MesQcSeedQualityPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "è´¨æ£è¢ç ") |
| | | private String code; |
| | | |
| | | @Schema(description = "çäº§æ¹æ¬¡") |
| | | private String batchCode; |
| | | |
| | | @Schema(description = "æ£éªç»æï¼1åæ ¼ 2ä¸åæ ¼") |
| | | private Integer result; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - MES ç§åè´¨æ£è®°å½ Response VO") |
| | | @Data |
| | | public class MesQcSeedQualityRespVO { |
| | | |
| | | private Long id; |
| | | private String code; |
| | | private Long itemId; |
| | | private Long batchId; |
| | | private String batchCode; |
| | | private Integer result; |
| | | private String reason; |
| | | private Long inspectorId; |
| | | private LocalDateTime inspectedAt; |
| | | private LocalDateTime createTime; |
| | | } |
| | |
| | | @Data |
| | | public class MesQcSeedQualitySubmitReqVO { |
| | | @NotBlank private String code; |
| | | @NotNull private Long itemId; |
| | | private String batchCode; |
| | | @NotEmpty @Valid private List<Indicator> indicators; |
| | | private String reason; |
| | | /** ç®æ åæ ¼åºç¼å·ï¼è´¨æ£åæ ¼åå
¥è¯¥ä»åºï¼ï¼å¿
é¡»æ¯ä»åºç±»åä¸ºåæ ¼åº(20)çä»åº */ |
| | | @NotNull private Long qualifiedWarehouseId; |
| | | @Data public static class Indicator { |
| | | @NotBlank private String code; |
| | | @NotNull @DecimalMin("0") private BigDecimal value; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.trace.batch; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.mes.controller.pub.trace.vo.MesProTracePublicRespVO; |
| | | import cn.iocoder.yudao.module.mes.service.trace.MesProTracePublicService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - MES æ¹æ¬¡è¿½æº¯") |
| | | @RestController |
| | | @RequestMapping("/mes/trace/batch") |
| | | @Validated |
| | | public class MesTraceBatchController { |
| | | |
| | | @Resource |
| | | private MesProTracePublicService traceService; |
| | | |
| | | @GetMapping("/detail") |
| | | @Operation(summary = "æ¥è¯¢ç»ä¸æ¹æ¬¡è¿½æº¯è¯¦æ
") |
| | | @Parameter(name = "code", description = "æ¹æ¬¡ç ãä¸´æ¶æ¹æ¬¡ç ãè¢ç ææçç ", required = true, |
| | | example = "BAG-202608280001") |
| | | @PreAuthorize("@ss.hasPermission('mes:trace-batch:query')") |
| | | public CommonResult<MesProTracePublicRespVO> getBatchTraceDetail( |
| | | @RequestParam("code") @NotBlank(message = "追溯ç ä¸è½ä¸ºç©º") String code) { |
| | | return success(traceService.queryTrace(code)); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockBagPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockBagRespVO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstockbag.MesWmMaterialStockBagMapper; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmStockSummaryRespVO; |
| | | import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi; |
| | | import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO; |
| | |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag.MesWmMaterialStockBagDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; |
| | |
| | | private MesWmWarehouseAreaService areaService; |
| | | @Resource |
| | | private SrmSupplierApi srmSupplierApi; |
| | | @Resource |
| | | private MesWmMaterialStockBagMapper materialStockBagMapper; |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾åºåè®°å½") |
| | |
| | | @Valid MesWmMaterialStockPageReqVO pageReqVO) { |
| | | PageResult<MesWmMaterialStockDO> pageResult = materialStockService.getMaterialStockPage(pageReqVO); |
| | | return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); |
| | | } |
| | | |
| | | @GetMapping("/bag-details") |
| | | @Operation(summary = "æ¥è¯¢åºåè¢ç æç»") |
| | | @PreAuthorize("@ss.hasPermission('mes:wm-material-stock:query')") |
| | | public CommonResult<PageResult<MesWmMaterialStockBagRespVO>> getMaterialStockBagDetails( |
| | | @Valid MesWmMaterialStockBagPageReqVO pageReqVO) { |
| | | PageResult<MesWmMaterialStockBagRespVO> result = new PageResult<>(); |
| | | PageResult<cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag.MesWmMaterialStockBagDO> page = |
| | | materialStockBagMapper.selectPage(pageReqVO); |
| | | return success(new PageResult<>(BeanUtils.toBean(page.getList(), MesWmMaterialStockBagRespVO.class), page.getTotal())); |
| | | } |
| | | |
| | | @PutMapping("/update-frozen") |
| | |
| | | convertSet(list, MesWmMaterialStockDO::getLocationId)); |
| | | Map<Long, MesWmWarehouseAreaDO> areaMap = areaService.getWarehouseAreaMap( |
| | | convertSet(list, MesWmMaterialStockDO::getAreaId)); |
| | | Map<Long, Long> bagCountMap = materialStockBagMapper.selectListByMaterialStockIds( |
| | | convertSet(list, MesWmMaterialStockDO::getId)).stream() |
| | | .collect(Collectors.groupingBy(MesWmMaterialStockBagDO::getMaterialStockId, Collectors.counting())); |
| | | Map<Long, SrmSupplierRespDTO> vendorMap = srmSupplierApi.getSupplierList( |
| | | convertSet(list, MesWmMaterialStockDO::getVendorId)).getCheckedData().stream() |
| | | .collect(Collectors.toMap(SrmSupplierRespDTO::getId, s -> s)); |
| | |
| | | area -> vo.setAreaName(area.getName())); |
| | | MapUtils.findAndThen(vendorMap, vo.getVendorId(), |
| | | vendor -> vo.setVendorName(vendor.getName())); |
| | | vo.setBagCount(bagCountMap.getOrDefault(vo.getId(), 0L)); |
| | | vo.setBagDetailSupported(bagCountMap.containsKey(vo.getId())); |
| | | // 计ç®å¯ç¨é = å¨åºæ°é - å»ç»æ°é - å ç¨é |
| | | BigDecimal quantity = vo.getQuantity() != null ? vo.getQuantity() : BigDecimal.ZERO; |
| | | BigDecimal frozenQty = vo.getFrozenQuantity() != null ? vo.getFrozenQuantity() : BigDecimal.ZERO; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | @Schema(description = "管çåå° - åºåè¢ç æç»å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class MesWmMaterialStockBagPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "åºåæ±æ»è®°å½ID", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private Long materialStockId; |
| | | |
| | | @Schema(description = "è¢ç ") |
| | | private String bagCode; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo; |
| | | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag.MesWmMaterialStockBagDO; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - åºåè¢ç æç» Response VO") |
| | | @Data |
| | | public class MesWmMaterialStockBagRespVO { |
| | | private Long id; |
| | | private Long materialStockId; |
| | | private Long bagCodeId; |
| | | private String bagCode; |
| | | private Long itemId; |
| | | private Long batchId; |
| | | private String batchCode; |
| | | private Long warehouseId; |
| | | private Long locationId; |
| | | private Long areaId; |
| | | private Integer stockState; |
| | | private Integer status; |
| | | private BigDecimal quantity; |
| | | private Boolean frozen; |
| | | private LocalDateTime inboundTime; |
| | | private LocalDateTime outboundTime; |
| | | } |
| | |
| | | @Schema(description = "ä»åºç¼å·") |
| | | private Long warehouseId; |
| | | |
| | | @Schema(description = "ä»åºç±»åï¼10æååºï¼20åæ ¼åºï¼æç±»åè¿æ»¤ä»åºï¼ä¸ warehouseId äºéä¸ï¼", example = "20") |
| | | private Integer warehouseType; |
| | | |
| | | @Schema(description = "åºåºç¼å·") |
| | | private Long locationId; |
| | | |
| | |
| | | @Schema(description = "ä»åºç¼å·", example = "1") |
| | | private Long warehouseId; |
| | | |
| | | @Schema(description = "ä»åºç±»åï¼10æååºï¼20åæ ¼åºï¼æç±»åè¿æ»¤ä»åºï¼ä¸ warehouseId äºéä¸ï¼", example = "20") |
| | | private Integer warehouseType; |
| | | |
| | | @Schema(description = "åºåºç¼å·", example = "1") |
| | | private Long locationId; |
| | | |
| | |
| | | @ExcelProperty("æ¹æ¬¡å·") |
| | | private String batchCode; |
| | | |
| | | @Schema(description = "å½åè¢ç æ°é", example = "10") |
| | | private Long bagCount; |
| | | |
| | | @Schema(description = "æ¯å¦åå¨è¢ç æç»", example = "true") |
| | | private Boolean bagDetailSupported; |
| | | |
| | | @Schema(description = "ä»åºç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long warehouseId; |
| | | |
| | |
| | | @ExcelProperty("åºåºæä½äºº") |
| | | private String outboundUserName; |
| | | |
| | | @Schema(description = "éå®è®¢åå·", example = "SO2026030001") |
| | | @ExcelProperty("éå®è®¢åå·") |
| | | private String salesOrderCode; |
| | | |
| | | @Schema(description = "åºåºæ¥æ") |
| | | @ExcelProperty("åºåºæ¥æ") |
| | | private LocalDateTime salesDate; |
| | |
| | | @NotNull(message = "客æ·ä¸è½ä¸ºç©º") |
| | | private Long clientId; |
| | | |
| | | @Schema(description = "éå®è®¢åå·", example = "SO2026030001") |
| | | private String salesOrderCode; |
| | | |
| | | @Schema(description = "åºåºæ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "åºåºæ¥æä¸è½ä¸ºç©º") |
| | | private LocalDateTime salesDate; |
| | |
| | | @Schema(description = "éè´§ååç§°", example = "éå®éè´§") |
| | | private String name; |
| | | |
| | | @Schema(description = "éå®è®¢å ID", example = "1") |
| | | private Long saleOrderId; |
| | | |
| | | @Schema(description = "éå®è®¢åç¼å·", example = "SO202603010001") |
| | | private String salesOrderCode; |
| | | |
| | | @Schema(description = "å®¢æ· ID", example = "1") |
| | | private Long clientId; |
| | | |
| | |
| | | @Schema(description = "éè´§ååç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "éå®éè´§") |
| | | private String name; |
| | | |
| | | @Schema(description = "éå®è®¢å ID", example = "1") |
| | | private Long saleOrderId; |
| | | |
| | | @Schema(description = "éå®è®¢åç¼å·", example = "SO202603010001") |
| | | private String salesOrderCode; |
| | | |
| | | @Schema(description = "å®¢æ· ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long clientId; |
| | | |
| | |
| | | @NotBlank(message = "éè´§ååç§°ä¸è½ä¸ºç©º") |
| | | private String name; |
| | | |
| | | @Schema(description = "éå®è®¢å ID", example = "1") |
| | | private Long saleOrderId; |
| | | |
| | | @Schema(description = "éå®è®¢åç¼å·", example = "SO202603010001") |
| | | private String salesOrderCode; |
| | | |
| | | @Schema(description = "å®¢æ· ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "å®¢æ· ID ä¸è½ä¸ºç©º") |
| | | private Long clientId; |
| | |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/generate-from-sale-order") |
| | | @Operation(summary = "ä»éå®è®¢åçæåè´§éç¥å") |
| | | @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:create')") |
| | | public CommonResult<Long> generateFromSaleOrder(@RequestBody Map<String, Long> params) { |
| | | Long saleOrderId = params.get("saleOrderId"); |
| | | return success(salesNoticeService.generateSalesNoticeFromSaleOrder(saleOrderId)); |
| | | } |
| | | |
| | | @PostMapping("/generate-product-sales") |
| | | @Operation(summary = "ä»åè´§éç¥åçæéå®åºåºå") |
| | | @Parameter(name = "id", description = "åè´§éç¥åç¼å·", required = true) |
| | |
| | | @Schema(description = "éç¥ååç§°", example = "æµè¯åè´§éç¥") |
| | | private String name; |
| | | |
| | | @Schema(description = "éå®è®¢åç¼å·", example = "SO202603010001") |
| | | private String saleOrderCode; |
| | | |
| | | @Schema(description = "客æ·ç¼å·", example = "1") |
| | | private Long clientId; |
| | | |
| | |
| | | @ExcelProperty("客æ·åç§°") |
| | | private String clientName; |
| | | |
| | | @Schema(description = "éå®è®¢åID", example = "1") |
| | | private Long saleOrderId; |
| | | |
| | | @Schema(description = "éå®è®¢åå·", example = "SO202603010001") |
| | | @ExcelProperty("éå®è®¢åå·") |
| | | private String saleOrderCode; |
| | | |
| | | @Schema(description = "åè´§æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @ExcelProperty("åè´§æ¥æ") |
| | | private LocalDateTime salesDate; |
| | |
| | | @NotNull(message = "客æ·ç¼å·ä¸è½ä¸ºç©º") |
| | | private Long clientId; |
| | | |
| | | @Schema(description = "éå®è®¢åID", example = "1") |
| | | private Long saleOrderId; |
| | | |
| | | @Schema(description = "éå®è®¢åå·", example = "SO202603010001") |
| | | private String saleOrderCode; |
| | | |
| | | @Schema(description = "åè´§æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "åè´§æ¥æä¸è½ä¸ºç©º") |
| | | private LocalDateTime salesDate; |
| | |
| | | @Schema(description = "åè´§éç¥åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long noticeId; |
| | | |
| | | @Schema(description = "éå®è®¢åæç»ID", example = "1") |
| | | private Long saleOrderItemId; |
| | | |
| | | @Schema(description = "ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long itemId; |
| | | |
| | |
| | | @NotNull(message = "åè´§éç¥åç¼å·ä¸è½ä¸ºç©º") |
| | | private Long noticeId; |
| | | |
| | | @Schema(description = "éå®è®¢åæç»ID", example = "1") |
| | | private Long saleOrderItemId; |
| | | |
| | | @Schema(description = "ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "ç©æç¼å·ä¸è½ä¸ºç©º") |
| | | private Long itemId; |
| | |
| | | @Schema(description = "æ¹æ¬¡å·", example = "BATCH001") |
| | | private String batchCode; |
| | | |
| | | @Schema(description = "è¢ç ", example = "BG202608180001") |
| | | private String bagCode; |
| | | |
| | | @Schema(description = "ä»åºID", example = "1") |
| | | private Long warehouseId; |
| | | |
| | |
| | | @Schema(description = "æ¹æ¬¡å·", example = "BATCH001") |
| | | private String batchCode; |
| | | |
| | | @Schema(description = "è¢ç ID", example = "1") |
| | | private Long bagCodeId; |
| | | |
| | | @Schema(description = "è¢ç ", example = "BG202608180001") |
| | | private String bagCode; |
| | | |
| | | // ========== åºåä½ç½® ========== |
| | | |
| | | @Schema(description = "ä»åºID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | |
| | | @Schema(description = "æ¯å¦å»ç»", example = "false") |
| | | private Boolean frozen; |
| | | |
| | | @Schema(description = "ä»åºç±»åï¼10æååº 20åæ ¼åº", example = "20") |
| | | private Integer type; |
| | | |
| | | } |
| | |
| | | @ExcelProperty("æ¯å¦å»ç»") |
| | | private Boolean frozen; |
| | | |
| | | @Schema(description = "ä»åºç±»åï¼10æååº 20åæ ¼åº", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") |
| | | @ExcelProperty("ä»åºç±»å") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | |
| | | @NotNull(message = "æ¯å¦å»ç»ä¸è½ä¸ºç©º") |
| | | private Boolean frozen; |
| | | |
| | | @Schema(description = "ä»åºç±»åï¼10æååº 20åæ ¼åº", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") |
| | | @NotNull(message = "ä»åºç±»åä¸è½ä¸ºç©º") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | |
| | |
| | | @Schema(description = "å å·¥æµè½¬ï¼å¯éï¼") |
| | | private List<MesWmBatchProcessTraceRespVO> processTraces; |
| | | |
| | | @Schema(description = "追溯æ¶é´çº¿") |
| | | private List<TimelineVO> timeline; |
| | | |
| | | @Schema(description = "追溯å³çæè¦") |
| | | private DecisionVO decision; |
| | | |
| | | @Schema(description = "追溯æ¶é´çº¿äºä»¶") |
| | | @Data |
| | | public static class TimelineVO { |
| | | @Schema(description = "é¶æ®µ") |
| | | private String stage; |
| | | @Schema(description = "äºä»¶ç±»å") |
| | | private String eventType; |
| | | @Schema(description = "äºä»¶åç§°") |
| | | private String eventName; |
| | | @Schema(description = "äºä»¶æ¶é´") |
| | | private LocalDateTime eventTime; |
| | | @Schema(description = "æ°é") |
| | | private BigDecimal quantity; |
| | | @Schema(description = "ç¶æ") |
| | | private String status; |
| | | } |
| | | |
| | | @Schema(description = "追溯å³çæè¦") |
| | | @Data |
| | | public static class DecisionVO { |
| | | @Schema(description = "è´¨éæ¯å¦åå¨é£é©") |
| | | private Boolean qualityRisk; |
| | | @Schema(description = "åºåå
¥åºæ°é") |
| | | private BigDecimal inboundQuantity; |
| | | @Schema(description = "éå®å»åæ°é") |
| | | private Integer salesTargetCount; |
| | | @Schema(description = "æ¶è´¹è
æ«ç 次æ°") |
| | | private Long consumerScanCount; |
| | | @Schema(description = "é£é©ç级") |
| | | private String riskLevel; |
| | | } |
| | | |
| | | @Schema(description = "ç产人å") |
| | | @Data |
| | | public static class WorkerVO { |
| | |
| | | private Long palletId; |
| | | private String palletCode; |
| | | private Integer status; |
| | | private Integer qcStatus; |
| | | private LocalDateTime printTime; |
| | | private LocalDateTime cancelTime; |
| | | private String cancelReason; |
| | |
| | | */ |
| | | private Integer bagCount; |
| | | /** |
| | | * æè¿å
¥åºæ«ç äºä»¶ç¼å·ï¼æ´ææ«ç å
¥åºåååï¼ç¨äºé²éå¤å
¥åºï¼ |
| | | */ |
| | | private Long inboundEventId; |
| | | /** |
| | | * æè¿å
¥åºæ¶é´ |
| | | */ |
| | | private java.time.LocalDateTime inboundTime; |
| | | /** |
| | | * æ¯å¦èªå¨çæï¼æææè¢ç 累计éå¼çæï¼å®¹éåºå®ä¸ºéå¼ï¼ |
| | | */ |
| | | private Boolean autoGenerated; |
| | |
| | | public class MesProScanEventDO extends BaseDO { |
| | | @TableId private Long id; |
| | | private String eventId; |
| | | /** |
| | | * æ«ç å
容ï¼è¢ç / æçç / æ¹æ¬¡ç çç å¼ï¼å«ä¸´æ¶ç ï¼ |
| | | */ |
| | | private String bagCode; |
| | | /** |
| | | * æ«ç ç±»åï¼BAG è¢ç / PALLET æçç / BATCH æ¹æ¬¡ç |
| | | */ |
| | | private String scanType; |
| | | private Long bagCodeId; |
| | | private Long batchId; |
| | | private String batchCode; |
| | |
| | | @TableId private Long id; |
| | | private String code; |
| | | private Long itemId; |
| | | /** çäº§æ¹æ¬¡ ID */ |
| | | private Long batchId; |
| | | private String batchCode; |
| | | private Integer result; |
| | | private String reason; |
| | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO; |
| | |
| | | @TableId |
| | | private Long id; |
| | | /** |
| | | * 对åºçäº§æ¹æ¬¡ ID |
| | | * |
| | | * å
³è {@link MesProBatchDO#getId()} |
| | | */ |
| | | private Long proBatchId; |
| | | /** |
| | | * æ¹æ¬¡ç¼ç |
| | | */ |
| | | private String code; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * MES åºåè¢ç æç» DO |
| | | */ |
| | | @TableName("mes_wm_material_stock_bag") |
| | | @KeySequence("mes_wm_material_stock_bag_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class MesWmMaterialStockBagDO extends BaseDO { |
| | | |
| | | @TableId |
| | | private Long id; |
| | | private Long materialStockId; |
| | | private Long bagCodeId; |
| | | private String bagCode; |
| | | private Long itemId; |
| | | private Long batchId; |
| | | private String batchCode; |
| | | private Long vendorId; |
| | | private Long warehouseId; |
| | | private Long locationId; |
| | | private Long areaId; |
| | | private Integer stockState; |
| | | private Integer status; |
| | | private BigDecimal quantity; |
| | | private Boolean frozen; |
| | | private Long lastTransactionId; |
| | | private LocalDateTime inboundTime; |
| | | private LocalDateTime outboundTime; |
| | | } |
| | |
| | | */ |
| | | private String clientName; |
| | | /** |
| | | * éå®è®¢åID |
| | | */ |
| | | private Long saleOrderId; |
| | | /** |
| | | * éå®è®¢åå· |
| | | */ |
| | | private String salesOrderCode; |
| | | /** |
| | | * åè´§éç¥å ID |
| | | * |
| | | * å
³è {@link MesWmSalesNoticeDO#getId()} |
| | |
| | | */ |
| | | private Long salesId; |
| | | /** |
| | | * éå®è®¢åæç»ID |
| | | */ |
| | | private Long saleOrderItemId; |
| | | /** |
| | | * åè´§éç¥åè¡ID |
| | | * |
| | | * å
³è {@link MesWmSalesNoticeLineDO#getId()} |
| | |
| | | */ |
| | | private String name; |
| | | /** |
| | | * éå®è®¢å ID |
| | | */ |
| | | private Long saleOrderId; |
| | | /** |
| | | * éå®è®¢åç¼å· |
| | | */ |
| | | private String salesOrderCode; |
| | | /** |
| | | * å®¢æ· ID |
| | | * |
| | | * å
³è CRM å®¢æ· {@link cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO#getId()} |
| | |
| | | */ |
| | | private Long clientId; |
| | | /** |
| | | * éå®è®¢åID |
| | | */ |
| | | private Long saleOrderId; |
| | | /** |
| | | * éå®è®¢åå· |
| | | */ |
| | | private String saleOrderCode; |
| | | /** |
| | | * åè´§æ¥æ |
| | | */ |
| | | private LocalDateTime salesDate; |
| | |
| | | */ |
| | | private Long noticeId; |
| | | /** |
| | | * éå®è®¢åæç»ID |
| | | */ |
| | | private Long saleOrderItemId; |
| | | /** |
| | | * ç©æç¼å· |
| | | * |
| | | * å
³è {@link MesMdItemDO#getId()} |
| | |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | |
| | | @TableId |
| | | private Long id; |
| | | /** |
| | | * çäº§æ¹æ¬¡ ID |
| | | * |
| | | * å
³è {@link MesProBatchDO#getId()} |
| | | */ |
| | | private Long proBatchId; |
| | | /** |
| | | * è¢ç ID |
| | | * |
| | | * å
³è {@link MesProBagCodeDO#getId()} |
| | | */ |
| | | private Long bagCodeId; |
| | | /** |
| | | * æç ID |
| | | * |
| | | * å
³è {@link MesProPalletDO#getId()} |
| | | */ |
| | | private Long palletId; |
| | | /** |
| | | * éå®åºåºå ID |
| | | */ |
| | | private Long salesId; |
| | | /** |
| | | * æ¹æ¬¡ UUIDï¼ç¨äºæ è®°å䏿¹æ¬¡çæç SN ç ï¼ |
| | | */ |
| | | private String uuid; |
| | |
| | | * å
³è {@link MesWmBatchDO#getCode()} |
| | | */ |
| | | private String batchCode; |
| | | /** è¢ç ID */ |
| | | private Long bagCodeId; |
| | | /** è¢ç */ |
| | | private String bagCode; |
| | | |
| | | // ==================== åºåä½ç½® ==================== |
| | | |
| | |
| | | */ |
| | | private Boolean frozen; |
| | | /** |
| | | * ä»åºç±»å |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmWarehouseTypeEnum}ï¼ |
| | | * 10 æååºï¼å¦èæçº¿è¾¹ä»åºï¼åæ¾æ«ç å
¥åºå¾
æ£/æååºåï¼ï¼20 åæ ¼åºï¼åæ¾è´¨æ£åæ ¼ã坿£è´§åºåï¼ |
| | | */ |
| | | private Integer type; |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | |
| | | /** ç»è®¡æçç æ»æ°ï¼mes_pro_palletï¼ */ |
| | | Long selectPalletCount(); |
| | | |
| | | // ========== åºåºæµé / ä»å¨ / è´¨é ========== |
| | | |
| | | /** ç»è®¡åè´§éç¥åæ°ï¼mes_wm_sales_noticeï¼ */ |
| | | Long selectSalesNoticeCount(); |
| | | |
| | | /** ç»è®¡éå®åºåºåæ°ï¼mes_wm_product_salesï¼ */ |
| | | Long selectProductSalesCount(); |
| | | |
| | | /** ç»è®¡éå®éè´§åæ°ï¼mes_wm_return_salesï¼ */ |
| | | Long selectReturnSalesCount(); |
| | | |
| | | /** ç»è®¡æªå¤çåºåé¢è¦æ°ï¼mes_wm_stock_warning.status=10ï¼ */ |
| | | Long selectStockWarningPendingCount(); |
| | | |
| | | /** ç»è®¡å¾
è¯å®¡ä¸åæ ¼ååæ°ï¼mes_qc_ncr.status=0ï¼ */ |
| | | Long selectNcrPendingCount(); |
| | | |
| | | // ========== ç¶æåå¸ ========== |
| | | |
| | | /** |
| | |
| | | int markInbound(@org.apache.ibatis.annotations.Param("id") Long id, @org.apache.ibatis.annotations.Param("eventId") Long eventId, |
| | | @org.apache.ibatis.annotations.Param("deviceCode") String deviceCode, @org.apache.ibatis.annotations.Param("lineCode") String lineCode); |
| | | |
| | | /** æ¹æ¬¡æ´æ¹å
¥åºæ¶æ¹éæ è®°å
¶ä¸æªå
¥åºè¢ç ï¼å¹çï¼ï¼ä¿æè¢ç ä¸åºåç¶æä¸è´ */ |
| | | @Update("UPDATE mes_pro_bag_code SET inbound_time = NOW(), inbound_event_id = #{eventId}, inbound_line_code = #{lineCode}, update_time = NOW() " |
| | | + "WHERE deleted = 0 AND inbound_event_id IS NULL AND batch_id = #{batchId}") |
| | | int markInboundByBatchId(@Param("batchId") Long batchId, @Param("eventId") Long eventId, |
| | | @Param("lineCode") String lineCode); |
| | | |
| | | /** æ´æå
¥åºæ¶æ¹éæ è®°æç䏿ªå
¥åºè¢ç ï¼å¹çï¼ */ |
| | | @Update("UPDATE mes_pro_bag_code SET inbound_time = NOW(), inbound_event_id = #{eventId}, inbound_line_code = #{lineCode}, update_time = NOW() " |
| | | + "WHERE deleted = 0 AND inbound_event_id IS NULL AND pallet_id = #{palletId}") |
| | | int markInboundByPalletId(@Param("palletId") Long palletId, @Param("eventId") Long eventId, |
| | | @Param("lineCode") String lineCode); |
| | | |
| | | /** |
| | | * æ´æ°è¢ç è´¨æ£ç¶æï¼ç§åè´¨æ£åæ ¼/ä¸åæ ¼æ¶è®°å½è¯¥è¢ç»æï¼ |
| | | * |
| | | * @param id è¢ç ç¼å· |
| | | * @param qcStatus è´¨æ£ç¶æï¼è§ MesProBagCodeQcStatusEnumï¼ |
| | | */ |
| | | default void updateQcStatus(Long id, Integer qcStatus) { |
| | | update(null, new LambdaUpdateWrapper<MesProBagCodeDO>() |
| | | .eq(MesProBagCodeDO::getId, id) |
| | | .set(MesProBagCodeDO::getQcStatus, qcStatus)); |
| | | } |
| | | |
| | | default List<MesProBagCodeDO> selectListByUuid(String uuid) { |
| | | return selectList(MesProBagCodeDO::getUuid, uuid); |
| | | } |
| | |
| | | int markInbound(@org.apache.ibatis.annotations.Param("id") Long id, @org.apache.ibatis.annotations.Param("eventId") Long eventId, |
| | | @org.apache.ibatis.annotations.Param("deviceCode") String deviceCode, @org.apache.ibatis.annotations.Param("lineCode") String lineCode); |
| | | |
| | | /** æ¹æ¬¡æ´æ¹æ«ç å
¥åºååï¼å
¥åºè¢æ°ç´æ¥ç½®ä¸ºæ¹æ¬¡è¢æ°ï¼å¹çï¼å·²æå
¥åºæ è®°çä¸åæ´æ°ï¼ */ |
| | | @org.apache.ibatis.annotations.Update("UPDATE mes_pro_batch SET inbound_time = NOW(), inbound_event_id = #{eventId}, inbound_line_code = #{lineCode}, inbound_bag_quantity = #{bagQuantity}, update_time = NOW() " |
| | | + "WHERE id = #{id} AND deleted = 0 AND inbound_event_id IS NULL") |
| | | int markBatchInbound(@org.apache.ibatis.annotations.Param("id") Long id, @org.apache.ibatis.annotations.Param("eventId") Long eventId, |
| | | @org.apache.ibatis.annotations.Param("lineCode") String lineCode, @org.apache.ibatis.annotations.Param("bagQuantity") Integer bagQuantity); |
| | | |
| | | default PageResult<MesProBatchDO> selectPage(MesProBatchPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesProBatchDO>() |
| | | .likeIfPresent(MesProBatchDO::getCode, reqVO.getCode()) |
| | |
| | | void markOutbound(@Param("id") Long id, @Param("salesId") Long salesId, |
| | | @Param("outboundTime") java.time.LocalDateTime outboundTime); |
| | | |
| | | /** æ´ææ«ç å
¥åºååï¼å¹çï¼å·²æå
¥åºæ è®°çä¸åæ´æ°ï¼ï¼ç¨äºé²éå¤å
¥åº */ |
| | | @org.apache.ibatis.annotations.Update("UPDATE mes_pro_pallet SET inbound_event_id = #{eventId}, inbound_time = NOW(), update_time = NOW() " |
| | | + "WHERE id = #{id} AND deleted = 0 AND inbound_event_id IS NULL") |
| | | int markInbound(@Param("id") Long id, @Param("eventId") Long eventId); |
| | | |
| | | @org.apache.ibatis.annotations.Update("UPDATE mes_pro_pallet SET sales_id = NULL, outbound_time = NULL, update_time = NOW() " |
| | | + "WHERE id = #{id} AND deleted = 0") |
| | | void clearOutbound(@Param("id") Long id); |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityPageReqVO; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | |
| | | |
| | | @Mapper |
| | | public interface MesQcSeedQualityMapper extends BaseMapperX<MesQcSeedQualityDO> { |
| | | |
| | | default PageResult<MesQcSeedQualityDO> selectPage(MesQcSeedQualityPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesQcSeedQualityDO>() |
| | | .likeIfPresent(MesQcSeedQualityDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MesQcSeedQualityDO::getBatchCode, reqVO.getBatchCode()) |
| | | .eqIfPresent(MesQcSeedQualityDO::getResult, reqVO.getResult()) |
| | | .orderByDesc(MesQcSeedQualityDO::getInspectedAt) |
| | | .orderByDesc(MesQcSeedQualityDO::getId)); |
| | | } |
| | | default MesQcSeedQualityDO selectByCode(String code) { |
| | | return selectOne(new LambdaQueryWrapperX<MesQcSeedQualityDO>().eq(MesQcSeedQualityDO::getCode, code)); |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockStateEnum; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | |
| | | default PageResult<MesWmMaterialStockDO> selectPage(MesWmMaterialStockPageReqVO reqVO, |
| | | Collection<Long> itemTypeIds, |
| | | Collection<Long> itemIds, |
| | | Long virtualWarehouseId) { |
| | | Long virtualWarehouseId, |
| | | Collection<Long> warehouseIds) { |
| | | LambdaQueryWrapperX<MesWmMaterialStockDO> wrapper = new LambdaQueryWrapperX<MesWmMaterialStockDO>() |
| | | .inIfPresent(MesWmMaterialStockDO::getItemTypeId, itemTypeIds) |
| | | .inIfPresent(MesWmMaterialStockDO::getItemId, itemIds) |
| | | .likeIfPresent(MesWmMaterialStockDO::getBatchCode, reqVO.getBatchCode()) |
| | | .eqIfPresent(MesWmMaterialStockDO::getBatchId, reqVO.getBatchId()) |
| | | .eqIfPresent(MesWmMaterialStockDO::getWarehouseId, reqVO.getWarehouseId()) |
| | | .inIfPresent(MesWmMaterialStockDO::getWarehouseId, warehouseIds) |
| | | .eqIfPresent(MesWmMaterialStockDO::getLocationId, reqVO.getLocationId()) |
| | | .eqIfPresent(MesWmMaterialStockDO::getAreaId, reqVO.getAreaId()) |
| | | .eqIfPresent(MesWmMaterialStockDO::getVendorId, reqVO.getVendorId()) |
| | |
| | | } |
| | | |
| | | /** |
| | | * æç»å鮿¥è¯¢åºåè®°å½ï¼å¿½ç¥ä¾åºåç»´åº¦ï¼ |
| | | * æç»å鮿¥è¯¢åºåè®°å½ï¼å¿½ç¥ä¾åºå维度ï¼ä»
åæ ¼åºï¼ |
| | | * |
| | | * ç¨äºç§»åºåºæ¯ï¼ç§»åºæ¶å°åºååå¹¶å°ç®æ åºä½å·²æåºåï¼ä¸åºåä¾åºå |
| | | * ç¨äºç§»åºåºæ¯ï¼ç§»åºæ¶å°åæ ¼åºååå¹¶å°ç®æ åºä½å·²æåæ ¼åºåï¼ä¸åºåä¾åºå |
| | | * åªå¹é
åæ ¼åº(20)ï¼é¿å
å°ç§»å
¥æ°éåå¹¶å°åæ¹æ¬¡çæååºè®°å½ |
| | | */ |
| | | default MesWmMaterialStockDO selectByCompositeKeyIgnoreVendor(Long itemId, Long warehouseId, Long locationId, |
| | | Long areaId, Long batchId) { |
| | |
| | | .eq(MesWmMaterialStockDO::getItemId, itemId) |
| | | .eq(MesWmMaterialStockDO::getWarehouseId, warehouseId) |
| | | .eq(MesWmMaterialStockDO::getLocationId, locationId) |
| | | .eq(MesWmMaterialStockDO::getAreaId, areaId); |
| | | .eq(MesWmMaterialStockDO::getAreaId, areaId) |
| | | .eq(MesWmMaterialStockDO::getStockState, MesWmStockStateEnum.QUALIFIED.getState()); |
| | | // batchId=null æ¶ç²¾ç¡®å¹é
is null |
| | | if (batchId != null) { |
| | | wrapper.eq(MesWmMaterialStockDO::getBatchId, batchId); |
| | |
| | | return selectOne(wrapper); |
| | | } |
| | | |
| | | /** |
| | | * æç»å鮿¥è¯¢åæ ¼åºåºåè®°å½ï¼ç¨äºåºåºäºå¡å¹é
ï¼ |
| | | * |
| | | * åæ¹æ¬¡å¯è½åæ¶å卿ååº(10)ä¸åæ ¼åº(20)两æ¡è®°å½ï¼ç§åè´¨æ£æè¢ææ°éï¼ï¼ |
| | | * åºåºå¿
é¡»åªä»åæ ¼åºå¹é
ï¼é¿å
æ£å°æªè´¨æ£çæååºåã |
| | | */ |
| | | default MesWmMaterialStockDO selectQualifiedByCompositeKey(Long itemId, Long warehouseId, Long locationId, |
| | | Long areaId, Long batchId, Long vendorId) { |
| | | LambdaQueryWrapperX<MesWmMaterialStockDO> wrapper = new LambdaQueryWrapperX<MesWmMaterialStockDO>() |
| | | .eq(MesWmMaterialStockDO::getItemId, itemId) |
| | | .eq(MesWmMaterialStockDO::getWarehouseId, warehouseId) |
| | | .eq(MesWmMaterialStockDO::getLocationId, locationId) |
| | | .eq(MesWmMaterialStockDO::getAreaId, areaId) |
| | | .eq(MesWmMaterialStockDO::getStockState, MesWmStockStateEnum.QUALIFIED.getState()); |
| | | // batchId=null æ¶ç²¾ç¡®å¹é
is null |
| | | if (batchId != null) { |
| | | wrapper.eq(MesWmMaterialStockDO::getBatchId, batchId); |
| | | } else { |
| | | wrapper.isNull(MesWmMaterialStockDO::getBatchId); |
| | | } |
| | | if (vendorId != null) { |
| | | wrapper.eq(MesWmMaterialStockDO::getVendorId, vendorId); |
| | | } |
| | | wrapper.last("ORDER BY quantity DESC LIMIT 1"); |
| | | return selectOne(wrapper); |
| | | } |
| | | |
| | | default List<MesWmMaterialStockDO> selectList(MesWmMaterialStockListReqVO reqVO) { |
| | | return selectList(reqVO, null); |
| | | } |
| | | |
| | | default List<MesWmMaterialStockDO> selectList(MesWmMaterialStockListReqVO reqVO, Collection<Long> warehouseIds) { |
| | | return selectList(new LambdaQueryWrapperX<MesWmMaterialStockDO>() |
| | | .eqIfPresent(MesWmMaterialStockDO::getWarehouseId, reqVO.getWarehouseId()) |
| | | .inIfPresent(MesWmMaterialStockDO::getWarehouseId, warehouseIds) |
| | | .eqIfPresent(MesWmMaterialStockDO::getLocationId, reqVO.getLocationId()) |
| | | .eqIfPresent(MesWmMaterialStockDO::getAreaId, reqVO.getAreaId()) |
| | | .eqIfPresent(MesWmMaterialStockDO::getItemId, reqVO.getItemId()) |
| | |
| | | .orderByAsc(MesWmMaterialStockDO::getReceiptTime)); |
| | | } |
| | | |
| | | /** |
| | | * æç©æ/æ¹æ¬¡æ¥è¯¢åæ ¼åºåºåè®°å½ï¼ä»
stock_state=20ï¼ä¸ä»
éåæ ¼ä»åºï¼ |
| | | * |
| | | * <p>åæ¹æ¬¡å¯è½åæ¶å卿ååº(10)ä¸åæ ¼åº(20)两æ¡è®°å½ï¼ç§åè´¨æ£æè¢ææ°éï¼ï¼ |
| | | * éå®åºåºéåºååªè½ä»åæ ¼åºè®°å½ä¸éï¼æç»é䏿ªè´¨æ£çæååºåï¼ |
| | | * åæ¶éå®åæ ¼ä»åºï¼type=20ï¼ï¼é¿å
仿åä»åºä¸è¯¯éåæ ¼æåºåã</p> |
| | | */ |
| | | default List<MesWmMaterialStockDO> selectQualifiedListByItemAndBatch(Long itemId, Long batchId, |
| | | Collection<Long> qualifiedWarehouseIds) { |
| | | return selectList(new LambdaQueryWrapperX<MesWmMaterialStockDO>() |
| | | .eq(MesWmMaterialStockDO::getItemId, itemId) |
| | | .eqIfPresent(MesWmMaterialStockDO::getBatchId, batchId) |
| | | .eq(MesWmMaterialStockDO::getStockState, MesWmStockStateEnum.QUALIFIED.getState()) |
| | | .in(MesWmMaterialStockDO::getWarehouseId, qualifiedWarehouseIds) |
| | | .gt(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO) |
| | | .orderByAsc(MesWmMaterialStockDO::getReceiptTime)); |
| | | } |
| | | |
| | | /** |
| | | * æä»åºæ¹æ¬¡æ¥è¯¢å
¨é¨åºåè®°å½ï¼å«æååºä¸åæ ¼åºï¼quantity>0ï¼ |
| | | * |
| | | * <p>ç¨äºç§åè´¨æ£æè¢ç æµè½¬ï¼å®ä½è¯¥æ¹æ¬¡æååºè®°å½æ£å 1 è¢ï¼ä»¥åå®ä½/æ°å»ºåæ ¼åºè®°å½ç´¯å 1 è¢ã</p> |
| | | */ |
| | | default List<MesWmMaterialStockDO> selectStockListByBatchId(Long batchId) { |
| | | return selectList(new LambdaQueryWrapperX<MesWmMaterialStockDO>() |
| | | .eq(MesWmMaterialStockDO::getBatchId, batchId) |
| | | .gt(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO) |
| | | .orderByAsc(MesWmMaterialStockDO::getReceiptTime)); |
| | | } |
| | | |
| | | default List<MesWmMaterialStockDO> selectListByItemIds(Collection<Long> itemIds) { |
| | | if (itemIds == null || itemIds.isEmpty()) { |
| | | return java.util.Collections.emptyList(); |
| | |
| | | } |
| | | |
| | | /** |
| | | * ææ¹æ¬¡å·æ´æ°åºåç¶æï¼ç¨äºç§åè´¨æ£åæ ¼åï¼å°æååºæ´æ¹è½¬ä¸ºåæ ¼åºï¼ |
| | | * ç»è®¡æ¹æ¬¡å¨æååºä¸çåºåè®°å½æ°ï¼ç¨äºç§åè´¨æ£åæ ¡éªè¢ç /æ¹æ¬¡æ¯å¦å¤äºå¾
è´¨æ£ç¶æï¼ |
| | | * |
| | | * @param batchId ä»åºæ¹æ¬¡ID |
| | | * @param toState ç®æ åºåç¶æ |
| | | * @param fromState ååºåç¶æï¼éå®åªæ´æ°è¯¥ç¶æçè®°å½ï¼ |
| | | * @return å½±åè¡æ° |
| | | * @return æååºåºåè®°å½æ° |
| | | */ |
| | | default int updateStockStateByBatchId(Long batchId, Integer toState, Integer fromState) { |
| | | return update(new MesWmMaterialStockDO().setStockState(toState), |
| | | new LambdaUpdateWrapper<MesWmMaterialStockDO>() |
| | | default Long selectTempStockCountByBatchId(Long batchId) { |
| | | return selectCount(new LambdaQueryWrapperX<MesWmMaterialStockDO>() |
| | | .eq(MesWmMaterialStockDO::getBatchId, batchId) |
| | | .eq(MesWmMaterialStockDO::getStockState, fromState)); |
| | | .eq(MesWmMaterialStockDO::getStockState, MesWmStockStateEnum.TEMP.getState()) |
| | | .gt(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstockbag; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockBagPageReqVO; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag.MesWmMaterialStockBagDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | @Mapper |
| | | public interface MesWmMaterialStockBagMapper extends BaseMapperX<MesWmMaterialStockBagDO> { |
| | | |
| | | default PageResult<MesWmMaterialStockBagDO> selectPage(MesWmMaterialStockBagPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesWmMaterialStockBagDO>() |
| | | .eq(MesWmMaterialStockBagDO::getMaterialStockId, reqVO.getMaterialStockId()) |
| | | .likeIfPresent(MesWmMaterialStockBagDO::getBagCode, reqVO.getBagCode()) |
| | | .eq(MesWmMaterialStockBagDO::getStatus, 1) |
| | | .orderByAsc(MesWmMaterialStockBagDO::getInboundTime)); |
| | | } |
| | | |
| | | default MesWmMaterialStockBagDO selectByBagCode(String bagCode) { |
| | | return selectOne(new LambdaQueryWrapperX<MesWmMaterialStockBagDO>() |
| | | .eq(MesWmMaterialStockBagDO::getBagCode, bagCode) |
| | | .orderByDesc(MesWmMaterialStockBagDO::getId) |
| | | .last("LIMIT 1")); |
| | | } |
| | | |
| | | default MesWmMaterialStockBagDO selectByBagCodeId(Long bagCodeId) { |
| | | return selectOne(new LambdaQueryWrapperX<MesWmMaterialStockBagDO>() |
| | | .eq(MesWmMaterialStockBagDO::getBagCodeId, bagCodeId) |
| | | .orderByDesc(MesWmMaterialStockBagDO::getId) |
| | | .last("LIMIT 1")); |
| | | } |
| | | |
| | | default MesWmMaterialStockBagDO selectOneActiveByMaterialStockId(Long materialStockId) { |
| | | return selectOne(new LambdaQueryWrapperX<MesWmMaterialStockBagDO>() |
| | | .eq(MesWmMaterialStockBagDO::getMaterialStockId, materialStockId) |
| | | .eq(MesWmMaterialStockBagDO::getStatus, 1) |
| | | .last("LIMIT 1")); |
| | | } |
| | | |
| | | default MesWmMaterialStockBagDO selectActiveByBagCode(String bagCode) { |
| | | return selectOne(new LambdaQueryWrapperX<MesWmMaterialStockBagDO>() |
| | | .eq(MesWmMaterialStockBagDO::getBagCode, bagCode) |
| | | .eq(MesWmMaterialStockBagDO::getStatus, 1) |
| | | .last("LIMIT 1")); |
| | | } |
| | | |
| | | default MesWmMaterialStockBagDO selectActiveByBagCodeId(Long bagCodeId) { |
| | | return selectOne(new LambdaQueryWrapperX<MesWmMaterialStockBagDO>() |
| | | .eq(MesWmMaterialStockBagDO::getBagCodeId, bagCodeId) |
| | | .eq(MesWmMaterialStockBagDO::getStatus, 1) |
| | | .last("LIMIT 1")); |
| | | } |
| | | |
| | | default List<MesWmMaterialStockBagDO> selectActiveListByItemAndBatch(Long itemId, Long batchId, Integer stockState) { |
| | | return selectList(new LambdaQueryWrapperX<MesWmMaterialStockBagDO>() |
| | | .eq(MesWmMaterialStockBagDO::getItemId, itemId) |
| | | .eqIfPresent(MesWmMaterialStockBagDO::getBatchId, batchId) |
| | | .eqIfPresent(MesWmMaterialStockBagDO::getStockState, stockState) |
| | | .eq(MesWmMaterialStockBagDO::getStatus, 1) |
| | | .eq(MesWmMaterialStockBagDO::getFrozen, false) |
| | | .orderByAsc(MesWmMaterialStockBagDO::getInboundTime)); |
| | | } |
| | | |
| | | default List<MesWmMaterialStockBagDO> selectListByMaterialStockIds(Collection<Long> materialStockIds) { |
| | | return selectList(new LambdaQueryWrapperX<MesWmMaterialStockBagDO>() |
| | | .in(MesWmMaterialStockBagDO::getMaterialStockId, materialStockIds) |
| | | .eq(MesWmMaterialStockBagDO::getStatus, 1) |
| | | .orderByAsc(MesWmMaterialStockBagDO::getInboundTime)); |
| | | } |
| | | |
| | | default List<MesWmMaterialStockBagDO> selectListByMaterialStockId(Long materialStockId) { |
| | | return selectList(new LambdaQueryWrapperX<MesWmMaterialStockBagDO>() |
| | | .eq(MesWmMaterialStockBagDO::getMaterialStockId, materialStockId) |
| | | .eq(MesWmMaterialStockBagDO::getStatus, 1) |
| | | .orderByAsc(MesWmMaterialStockBagDO::getInboundTime)); |
| | | } |
| | | } |
| | |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * MES éå®åºåºåè¡ Mapper |
| | |
| | | .eqIfPresent(MesWmProductSalesLineDO::getSalesId, reqVO.getSalesId()) |
| | | .inIfPresent(MesWmProductSalesLineDO::getSalesId, reqVO.getSalesIds()) |
| | | .orderByDesc(MesWmProductSalesLineDO::getId)); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®éå®è®¢åæç» ID å表æ¥è¯¢åºåºè¡ï¼æ saleOrderItemId åç»è¿åæ¹å· |
| | | */ |
| | | default Map<Long, String> selectBatchCodesBySaleOrderItemIds(java.util.Collection<Long> saleOrderItemIds) { |
| | | if (saleOrderItemIds == null || saleOrderItemIds.isEmpty()) { |
| | | return java.util.Collections.emptyMap(); |
| | | } |
| | | List<MesWmProductSalesLineDO> lines = selectList(new LambdaQueryWrapperX<MesWmProductSalesLineDO>() |
| | | .in(MesWmProductSalesLineDO::getSaleOrderItemId, saleOrderItemIds)); |
| | | return lines.stream() |
| | | .filter(l -> l.getBatchCode() != null && !l.getBatchCode().isEmpty()) |
| | | .collect(java.util.stream.Collectors.groupingBy( |
| | | MesWmProductSalesLineDO::getSaleOrderItemId, |
| | | java.util.LinkedHashMap::new, |
| | | java.util.stream.Collectors.collectingAndThen( |
| | | java.util.stream.Collectors.mapping(MesWmProductSalesLineDO::getBatchCode, |
| | | java.util.stream.Collectors.toSet()), |
| | | codes -> String.join("ã", codes)))); |
| | | } |
| | | |
| | | default void updateQualityStatusByIds(List<Long> ids, Integer qualityStatus) { |
| | |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesWmReturnSalesDO>() |
| | | .likeIfPresent(MesWmReturnSalesDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MesWmReturnSalesDO::getName, reqVO.getName()) |
| | | .likeIfPresent(MesWmReturnSalesDO::getSalesOrderCode, reqVO.getSalesOrderCode()) |
| | | .eqIfPresent(MesWmReturnSalesDO::getClientId, reqVO.getClientId()) |
| | | .eqIfPresent(MesWmReturnSalesDO::getStatus, reqVO.getStatus()) |
| | | .betweenIfPresent(MesWmReturnSalesDO::getReturnDate, reqVO.getReturnDate()) |
| | |
| | | LambdaQueryWrapperX<MesWmReturnSalesDO> wrapper = new LambdaQueryWrapperX<MesWmReturnSalesDO>() |
| | | .likeIfPresent(MesWmReturnSalesDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MesWmReturnSalesDO::getName, reqVO.getName()) |
| | | .likeIfPresent(MesWmReturnSalesDO::getSalesOrderCode, reqVO.getSalesOrderCode()) |
| | | .eqIfPresent(MesWmReturnSalesDO::getClientId, reqVO.getClientId()) |
| | | .eqIfPresent(MesWmReturnSalesDO::getStatus, reqVO.getStatus()) |
| | | .betweenIfPresent(MesWmReturnSalesDO::getReturnDate, reqVO.getReturnDate()) |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesWmSalesNoticeDO>() |
| | | .likeIfPresent(MesWmSalesNoticeDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MesWmSalesNoticeDO::getName, reqVO.getName()) |
| | | .likeIfPresent(MesWmSalesNoticeDO::getSaleOrderCode, reqVO.getSaleOrderCode()) |
| | | .eqIfPresent(MesWmSalesNoticeDO::getClientId, reqVO.getClientId()) |
| | | .eqIfPresent(MesWmSalesNoticeDO::getStatus, reqVO.getStatus()) |
| | | .orderByDesc(MesWmSalesNoticeDO::getId)); |
| | |
| | | LambdaQueryWrapperX<MesWmSalesNoticeDO> wrapper = new LambdaQueryWrapperX<MesWmSalesNoticeDO>() |
| | | .likeIfPresent(MesWmSalesNoticeDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MesWmSalesNoticeDO::getName, reqVO.getName()) |
| | | .likeIfPresent(MesWmSalesNoticeDO::getSaleOrderCode, reqVO.getSaleOrderCode()) |
| | | .eqIfPresent(MesWmSalesNoticeDO::getClientId, reqVO.getClientId()) |
| | | .eqIfPresent(MesWmSalesNoticeDO::getStatus, reqVO.getStatus()) |
| | | .orderByDesc(MesWmSalesNoticeDO::getId); |
| | |
| | | |
| | | default MesWmSalesNoticeDO selectByCode(String code) { |
| | | return selectOne(MesWmSalesNoticeDO::getCode, code); |
| | | } |
| | | |
| | | default MesWmSalesNoticeDO selectBySaleOrderId(Long saleOrderId) { |
| | | return selectOne(MesWmSalesNoticeDO::getSaleOrderId, saleOrderId); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢å·²åå¨åè´§éç¥åçéå®è®¢å ID å表 |
| | | */ |
| | | default List<Long> selectExistingSaleOrderIds(Collection<Long> saleOrderIds) { |
| | | return selectObjs(new LambdaQueryWrapperX<MesWmSalesNoticeDO>() |
| | | .select(MesWmSalesNoticeDO::getSaleOrderId) |
| | | .in(MesWmSalesNoticeDO::getSaleOrderId, saleOrderIds)); |
| | | } |
| | | |
| | | } |
| | |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesWmTransactionDO>() |
| | | .eqIfPresent(MesWmTransactionDO::getItemId, reqVO.getItemId()) |
| | | .likeIfPresent(MesWmTransactionDO::getBatchCode, reqVO.getBatchCode()) |
| | | .likeIfPresent(MesWmTransactionDO::getBagCode, reqVO.getBagCode()) |
| | | .eqIfPresent(MesWmTransactionDO::getWarehouseId, reqVO.getWarehouseId()) |
| | | .eqIfPresent(MesWmTransactionDO::getLocationId, reqVO.getLocationId()) |
| | | .eqIfPresent(MesWmTransactionDO::getAreaId, reqVO.getAreaId()) |
| | |
| | | .likeIfPresent(MesWmWarehouseDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MesWmWarehouseDO::getName, reqVO.getName()) |
| | | .eqIfPresent(MesWmWarehouseDO::getFrozen, reqVO.getFrozen()) |
| | | .eqIfPresent(MesWmWarehouseDO::getType, reqVO.getType()) |
| | | .orderByDesc(MesWmWarehouseDO::getId)); |
| | | } |
| | | |
| | | default List<MesWmWarehouseDO> selectListByType(Integer type) { |
| | | return selectList(new LambdaQueryWrapperX<MesWmWarehouseDO>() |
| | | .eq(MesWmWarehouseDO::getType, type) |
| | | .orderByAsc(MesWmWarehouseDO::getId)); |
| | | } |
| | | |
| | | default MesWmWarehouseDO selectByCode(String code) { |
| | | return selectOne(MesWmWarehouseDO::getCode, code); |
| | | } |
| | |
| | | ErrorCode WM_WAREHOUSE_HAS_WORKSTATION = new ErrorCode(1_040_700_004, "ä»åºå·²è¢«å·¥ä½ç«å¼ç¨ï¼æ æ³å é¤"); |
| | | ErrorCode WM_WAREHOUSE_HAS_MATERIAL_STOCK = new ErrorCode(1_040_700_005, "ä»åºä¸æåºåè®°å½ï¼æ æ³å é¤"); |
| | | ErrorCode WM_WAREHOUSE_IS_VIRTUAL = new ErrorCode(1_040_700_006, "èæä»åºä¸å
许æä½"); |
| | | ErrorCode WM_WAREHOUSE_TYPE_NOT_QUALIFIED = new ErrorCode(1_040_700_007, "æéä»åºä¸æ¯åæ ¼åº"); |
| | | ErrorCode WM_QUALIFIED_WAREHOUSE_NOT_CONFIGURED = new ErrorCode(1_040_700_008, "æªé
ç½®åæ ¼åºï¼è¯·å
å¨ä»åºç®¡çä¸å建并设置ä»åºç±»åä¸ºåæ ¼åº"); |
| | | |
| | | // ========== MES ä»åºç®¡ç-åºåºï¼1-040-701-000ï¼ ========== |
| | | ErrorCode WM_WAREHOUSE_LOCATION_NOT_EXISTS = new ErrorCode(1_040_701_000, "åºåºä¸åå¨"); |
| | |
| | | ErrorCode WM_MATERIAL_STOCK_SELECTION_MISMATCH = new ErrorCode(1_040_703_014, "åºåè®°å½ä¸æäº¤çç©æãæ¹æ¬¡æåºä½ä¿¡æ¯ä¸ä¸è´"); |
| | | ErrorCode WM_MATERIAL_STOCK_QUANTITY_INVALID = new ErrorCode(1_040_703_015, "è°æ´æ°éä¸è½ä¸ºç©ºæé¶"); |
| | | ErrorCode WM_MATERIAL_STOCK_FROZEN = new ErrorCode(1_040_703_016, "åºåè®°å½å·²å»ç»ï¼æ æ³ç§»åº"); |
| | | ErrorCode WM_MATERIAL_STOCK_NOT_QUALIFIED = new ErrorCode(1_040_703_017, "éåæ ¼åºåä¸å¯åºåº"); |
| | | ErrorCode WM_MATERIAL_STOCK_BAG_NOT_EXISTS = new ErrorCode(1_040_703_018, "åºåè¢ç æç»ä¸åå¨"); |
| | | ErrorCode WM_MATERIAL_STOCK_BAG_DUPLICATE = new ErrorCode(1_040_703_019, "è¢ç ({})å·²å¨åºï¼ç¦æ¢éå¤å
¥åº"); |
| | | ErrorCode WM_MATERIAL_STOCK_BAG_NOT_ACTIVE = new ErrorCode(1_040_703_020, "è¢ç ({})ä¸å¨åºæå·²åºåº/æ¥åºï¼æ æ³æä½"); |
| | | ErrorCode WM_MATERIAL_STOCK_BAG_REQUIRED = new ErrorCode(1_040_703_021, "è¯¥ç©æå¯ç¨è¢ç 管çï¼å¿
é¡»æºå¸¦è¢ç "); |
| | | ErrorCode WM_MATERIAL_STOCK_BAG_INSUFFICIENT = new ErrorCode(1_040_703_022, "å¨åºè¢ç æç»æ°éä¸è¶³ï¼æ æ³åºåº"); |
| | | |
| | | // ========== MES ä»åºç®¡ç-å°è´§éç¥åï¼1-040-704-000ï¼ ========== |
| | | ErrorCode WM_ARRIVAL_NOTICE_NOT_EXISTS = new ErrorCode(1_040_704_000, "å°è´§éç¥åä¸åå¨"); |
| | |
| | | ErrorCode WM_PRODUCT_SALES_SCAN_STOCK_NOT_FOUND = new ErrorCode(1_040_714_105, "æ«ææ¹æ¬¡å¨åæ ¼åºä¸æªæ¾å°å¯¹åºåºåè®°å½"); |
| | | ErrorCode WM_PRODUCT_SALES_SCAN_NO_MATCH_LINE = new ErrorCode(1_040_714_106, "åºåºå䏿²¡æä¸è¯¥ç©æ/æ¹æ¬¡å¹é
çè¡"); |
| | | ErrorCode WM_PRODUCT_SALES_SCAN_BAG_ALREADY_SCANNED = new ErrorCode(1_040_714_107, "该è¢ç å·²æ«æåºåºï¼è¯·å¿é夿«æ"); |
| | | ErrorCode WM_PRODUCT_SALES_SCAN_BAG_NOT_QUALIFIED = new ErrorCode(1_040_714_108, "该è¢ç æªè´¨æ£åæ ¼ï¼ç¦æ¢åºåº"); |
| | | ErrorCode WM_PRODUCT_SALES_SCAN_PALLET_NOT_ALL_QUALIFIED = new ErrorCode(1_040_714_109, "æçä¸å卿ªè´¨æ£è¢ç ï¼ç¦æ¢æ´æåºåº"); |
| | | |
| | | // ========== MES ä»åºç®¡ç-æé¡¹åºåºåï¼1-040-715-000ï¼ ========== |
| | | ErrorCode WM_MISC_ISSUE_NOT_EXISTS = new ErrorCode(1_040_715_000, "æé¡¹åºåºåä¸åå¨"); |
| | |
| | | ErrorCode WM_SALES_NOTICE_LINE_NOT_EXISTS = new ErrorCode(1_040_720_010, "åè´§éç¥åè¡ä¸åå¨"); |
| | | ErrorCode WM_SALES_NOTICE_LINE_EMPTY = new ErrorCode(1_040_720_011, "åè´§éç¥åè¡ä¸ºç©ºï¼ä¸è½æäº¤"); |
| | | ErrorCode WM_SALES_NOTICE_LINE_NOT_MATCH = new ErrorCode(1_040_720_012, "åè´§éç¥åè¡ä¸å±äºæå®çåè´§éç¥å"); |
| | | ErrorCode WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS = new ErrorCode(1_040_720_013, "éå®è®¢åä¸åå¨"); |
| | | ErrorCode WM_SALES_NOTICE_SALE_ORDER_ITEM_EMPTY = new ErrorCode(1_040_720_014, "éå®è®¢åæç»ä¸ºç©º"); |
| | | ErrorCode WM_SALES_NOTICE_ALREADY_EXISTS = new ErrorCode(1_040_720_015, "该éå®è®¢åå·²çæåè´§éç¥åï¼ä¸è½éå¤çæ"); |
| | | |
| | | // ========== MES ä»åºç®¡ç-æ¡ç é
ç½®ï¼1-040-730-000ï¼ ========== |
| | | ErrorCode WM_BARCODE_CONFIG_NOT_EXISTS = new ErrorCode(1_040_730_000, "æ¡ç é
ç½®ä¸åå¨"); |
| | |
| | | public static final int QC_IPQC = 2; // è¿ç¨æ£éªï¼MesQcIpqcDO |
| | | public static final int QC_OQC = 3; // åºè´§æ£éªï¼MesQcOqcDO |
| | | public static final int QC_RQC = 4; // éè´§æ£éªï¼MesQcRqcDO |
| | | public static final int QC_SEED_QUALITY = 5; // ç§åè´¨æ£ï¼MesQcSeedQualityDOï¼å«æååºåº/åæ ¼å
¥åº/æ¥åºï¼ |
| | | |
| | | // ========== WM ä»åºæ¨¡å [100, 200) ========== |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.enums.pro; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * MES è¢ç ï¼ä¸è¢ä¸ç ï¼è´¨æ£ç¶ææä¸¾ |
| | | * |
| | | * <p>è®°å½æ¯è¢çç§åè´¨æ£ç»æï¼éå®åºåºæ«è¢ç æ¶æ ¡éªè¯¥è¢å·²è´¨æ£åæ ¼ã</p> |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum MesProBagCodeQcStatusEnum implements ArrayValuable<Integer> { |
| | | |
| | | UNCHECKED(10, "æªè´¨æ£"), |
| | | QUALIFIED(20, "è´¨æ£åæ ¼"), |
| | | UNQUALIFIED(30, "è´¨æ£ä¸åæ ¼"); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesProBagCodeQcStatusEnum::getStatus).toArray(Integer[]::new); |
| | | |
| | | /** |
| | | * ç¶æ |
| | | */ |
| | | private final Integer status; |
| | | /** |
| | | * ç¶æåç§° |
| | | */ |
| | | private final String name; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.enums.wm; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum MesWmMaterialStockBagStatusEnum { |
| | | ACTIVE(1, "å¨åº"), |
| | | OUT(2, "å·²åºåº"), |
| | | SCRAPPED(3, "å·²æ¥åº"); |
| | | |
| | | private final Integer status; |
| | | private final String name; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.enums.wm; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * MES ä»åºç±»å |
| | | * |
| | | * ä¸ {@link MesWmStockStateEnum} è¯ä¹å¯¹é½ï¼æååºåæ¾å¾
æ£/æååºåï¼åæ ¼åºåæ¾è´¨æ£åæ ¼ã坿£è´§åºåã |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum MesWmWarehouseTypeEnum { |
| | | |
| | | TEMP(10, "æååº"), |
| | | QUALIFIED(20, "åæ ¼åº"); |
| | | |
| | | private final Integer type; |
| | | private final String name; |
| | | } |
| | |
| | | summary.setBagCodeCount(getCount(homeStatisticsMapper.selectBagCodeCount())); |
| | | summary.setPalletCount(getCount(homeStatisticsMapper.selectPalletCount())); |
| | | |
| | | // 3. ç¶æåå¸ |
| | | // 3. åºåºæµé |
| | | summary.setSalesNoticeCount(getCount(homeStatisticsMapper.selectSalesNoticeCount())); |
| | | summary.setProductSalesCount(getCount(homeStatisticsMapper.selectProductSalesCount())); |
| | | summary.setReturnSalesCount(getCount(homeStatisticsMapper.selectReturnSalesCount())); |
| | | |
| | | // 4. ä»å¨é¢è¦ / è´¨é |
| | | summary.setStockWarningPendingCount(getCount(homeStatisticsMapper.selectStockWarningPendingCount())); |
| | | summary.setNcrPendingCount(getCount(homeStatisticsMapper.selectNcrPendingCount())); |
| | | |
| | | // 5. ç¶æåå¸ |
| | | summary.setBatchStatusList(toStatusList(homeStatisticsMapper.selectBatchCountGroupByStatus())); |
| | | summary.setBagCodeStatusList(toStatusList(homeStatisticsMapper.selectBagCodeCountGroupByStatus())); |
| | | |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.scan.vo.MesProScanEventPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.scan.MesProScanEventDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.bagcode.MesProBagCodeMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.batch.MesProBatchMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.pallet.MesProPalletMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.scan.MesProScanEventMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.enums.MesProScanEventStatusEnum; |
| | |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Slf4j |
| | | @Service |
| | | @Validated |
| | | public class MesProScanEventServiceImpl implements MesProScanEventService { |
| | | @Resource private MesProScanEventMapper eventMapper; |
| | | @Resource private MesProBagCodeMapper bagCodeMapper; |
| | | @Resource private MesProBatchMapper batchMapper; |
| | | @Resource private MesProPalletMapper palletMapper; |
| | | @Resource private MesWmTransactionService transactionService; |
| | | @Resource private MesWmWarehouseService warehouseService; |
| | | @Resource private MesWmBatchService mesWmBatchService; |
| | | |
| | | /** æ«ç ç±»åï¼è¢ç ï¼é»è®¤ï¼ */ |
| | | private static final String SCAN_TYPE_BAG = "BAG"; |
| | | /** æ«ç ç±»åï¼æçç ï¼ææçå·²è£
è¢æ°æ´æå
¥åºï¼ */ |
| | | private static final String SCAN_TYPE_PALLET = "PALLET"; |
| | | /** æ«ç ç±»åï¼æ¹æ¬¡ç ï¼ææ¹æ¬¡è¢æ°æ´æ¹å
¥åºï¼ */ |
| | | private static final String SCAN_TYPE_BATCH = "BATCH"; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public MesProScanEventDO createInbound(MesProScanEventCreateReqVO req) { |
| | | MesProScanEventDO existing = eventMapper.selectByEventIdForUpdate(req.getEventId()); |
| | | if (existing != null) { |
| | | if (!req.getBagCode().equals(existing.getBagCode()) || !req.getDeviceCode().equals(existing.getDeviceCode())) { |
| | | boolean contentMatch = req.getBagCode().equals(existing.getBagCode()) |
| | | && (req.getDeviceCode() == null || req.getDeviceCode().equals(existing.getDeviceCode())); |
| | | if (!contentMatch) { |
| | | return failed(existing, "MES_SCAN_EVENT_ID_CONFLICT", "äºä»¶å·å·²åå¨ä½å
容ä¸ä¸è´"); |
| | | } |
| | | return existing; |
| | | } |
| | | String scanType = (req.getScanType() == null || req.getScanType().isBlank()) ? SCAN_TYPE_BAG : req.getScanType(); |
| | | MesProScanEventDO event = new MesProScanEventDO(); |
| | | event.setEventId(req.getEventId()).setBagCode(req.getBagCode()).setQuantity(req.getQuantity()) |
| | | .setDeviceCode(req.getDeviceCode()).setLineCode(req.getLineCode()).setRemark(req.getRemark()) |
| | | .setStatus(MesProScanEventStatusEnum.FAILED).setReceivedTime(LocalDateTime.now()); |
| | | event.setEventId(req.getEventId()).setBagCode(req.getBagCode()).setScanType(scanType) |
| | | .setQuantity(req.getQuantity()).setDeviceCode(req.getDeviceCode()).setLineCode(req.getLineCode()) |
| | | .setRemark(req.getRemark()).setStatus(MesProScanEventStatusEnum.FAILED).setReceivedTime(LocalDateTime.now()); |
| | | eventMapper.insert(event); |
| | | // 1. ææ«ç ç±»åè§£ææ«ç ç®æ ä¸å
¥åºæ°éï¼æçæå·²è£
è¢æ°ãæ¹æ¬¡ææ¹æ¬¡è¢æ°æ´æ¹/æ´æå
¥åºï¼ |
| | | Long targetId; |
| | | Long batchId; |
| | | BigDecimal quantity; |
| | | MesProBatchDO batch; |
| | | // åè¢æ«ç å
¥åºæ¶ä¼ éè¢ç ï¼ä¾åºåè¢ç æç»å¨å
¥åºç¬¬ä¸æ¶é´å»ºç«ï¼æç/æ¹æ¬¡æ´æ¹å
¥åºä¸ºæ¹éï¼ä¸éè¢å»ºæç» |
| | | Long bagCodeId = null; |
| | | String bagCode = null; |
| | | if (SCAN_TYPE_PALLET.equals(scanType)) { |
| | | MesProPalletDO pallet = palletMapper.selectByCode(req.getBagCode()); |
| | | if (pallet == null) { |
| | | pallet = palletMapper.selectByTempCode(req.getBagCode()); |
| | | } |
| | | if (pallet == null) return failed(event, "MES_SCAN_PALLET_NOT_EXISTS", "æçç ä¸åå¨"); |
| | | if (pallet.getInboundEventId() != null) return failed(event, "MES_SCAN_PALLET_ALREADY_INBOUND", "æçå·²å
¥åº"); |
| | | batch = batchMapper.selectByIdForUpdate(pallet.getBatchId()); |
| | | if (batch == null) return failed(event, "MES_SCAN_BATCH_NOT_EXISTS", "çäº§æ¹æ¬¡ä¸åå¨"); |
| | | batchId = batch.getId(); |
| | | targetId = pallet.getId(); |
| | | quantity = pallet.getBagCount() != null && pallet.getBagCount() > 0 |
| | | ? BigDecimal.valueOf(pallet.getBagCount()) |
| | | : BigDecimal.valueOf(bagCodeMapper.selectCountByPalletId(pallet.getId())); |
| | | } else if (SCAN_TYPE_BATCH.equals(scanType)) { |
| | | batch = batchMapper.selectByCode(req.getBagCode()); |
| | | if (batch == null) { |
| | | batch = batchMapper.selectByTempCode(req.getBagCode()); |
| | | } |
| | | if (batch == null) return failed(event, "MES_SCAN_BATCH_NOT_EXISTS", "çäº§æ¹æ¬¡ä¸åå¨"); |
| | | if (batch.getInboundEventId() != null) return failed(event, "MES_SCAN_BATCH_ALREADY_INBOUND", "æ¹æ¬¡å·²æ´æ¹å
¥åº"); |
| | | batchId = batch.getId(); |
| | | targetId = batch.getId(); |
| | | quantity = batch.getBagQuantity() != null && batch.getBagQuantity() > 0 |
| | | ? BigDecimal.valueOf(batch.getBagQuantity()) |
| | | : BigDecimal.valueOf(bagCodeMapper.selectCountByBatchId(batch.getId())); |
| | | } else { |
| | | MesProBagCodeDO bag = bagCodeMapper.selectByCodeForUpdate(req.getBagCode()); |
| | | if (bag == null) return failed(event, "MES_SCAN_BAG_NOT_EXISTS", "è¢ç ä¸åå¨"); |
| | | event.setBagCodeId(bag.getId()); |
| | | bagCodeId = bag.getId(); |
| | | bagCode = req.getBagCode(); |
| | | if (bag.getInboundEventId() != null) return failed(event, "MES_SCAN_BAG_ALREADY_INBOUND", "è¢ç å·²å
¥åº"); |
| | | MesProBatchDO batch = batchMapper.selectByIdForUpdate(bag.getBatchId()); |
| | | batch = batchMapper.selectByIdForUpdate(bag.getBatchId()); |
| | | if (batch == null) return failed(event, "MES_SCAN_BATCH_NOT_EXISTS", "çäº§æ¹æ¬¡ä¸åå¨"); |
| | | event.setBatchId(batch.getId()).setBatchCode(batch.getCode()).setItemId(batch.getItemId()); |
| | | batchId = batch.getId(); |
| | | targetId = bag.getId(); |
| | | quantity = req.getQuantity(); |
| | | } |
| | | event.setBatchId(batchId).setBatchCode(batch.getCode()).setItemId(batch.getItemId()); |
| | | MesWmWarehouseDO warehouse = warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE); |
| | | if (warehouse == null) return failed(event, "MES_SCAN_WIP_WAREHOUSE_NOT_EXISTS", "WIPèæä»ä¸åå¨"); |
| | | event.setWarehouseId(warehouse.getId()).setLocationId(req.getLocationId()).setAreaId(req.getAreaId()); |
| | |
| | | } |
| | | Long txId = transactionService.createTransaction(new MesWmTransactionSaveReqDTO() |
| | | .setType(MesWmTransactionTypeEnum.IN.getType()).setBizType(MesBizTypeConstants.WM_PRODUCT_PRODUCE) |
| | | .setBizId(batch.getId()).setBizCode(batch.getCode()).setBizLineId(bag.getId()) |
| | | .setItemId(batch.getItemId()).setQuantity(req.getQuantity()) |
| | | .setBizId(batchId).setBizCode(batch.getCode()).setBizLineId(targetId) |
| | | .setItemId(batch.getItemId()).setQuantity(quantity) |
| | | .setBatchId(wmBatch.getId()).setBatchCode(batch.getCode()) |
| | | .setBagCodeId(bagCodeId).setBagCode(bagCode) |
| | | .setWarehouseId(warehouse.getId()).setLocationId(req.getLocationId()).setAreaId(req.getAreaId()) |
| | | .setReceiptTime(LocalDateTime.now()).setCheckFlag(true) |
| | | .setStockState(MesWmStockStateEnum.TEMP.getState())); |
| | | event.setTransactionId(txId).setStatus(MesProScanEventStatusEnum.SUCCESS).setEventTime(LocalDateTime.now()); |
| | | eventMapper.updateById(event); |
| | | bagCodeMapper.markInbound(bag.getId(), event.getId(), req.getDeviceCode(), req.getLineCode()); |
| | | batchMapper.markInbound(batch.getId(), event.getId(), req.getDeviceCode(), req.getLineCode()); |
| | | // 2. ååå
¥åºæ è®°ï¼æç/æ¹æ¬¡æ´æ/æ´æ¹å
¥åºæ¶åæ¥æ è®°å
¶ä¸æªå
¥åºè¢ç ï¼ä¿æç¶æä¸è´ï¼ |
| | | if (SCAN_TYPE_PALLET.equals(scanType)) { |
| | | palletMapper.markInbound(targetId, event.getId()); |
| | | bagCodeMapper.markInboundByPalletId(targetId, event.getId(), req.getLineCode()); |
| | | } else if (SCAN_TYPE_BATCH.equals(scanType)) { |
| | | batchMapper.markBatchInbound(targetId, event.getId(), req.getLineCode(), batch.getBagQuantity()); |
| | | bagCodeMapper.markInboundByBatchId(targetId, event.getId(), req.getLineCode()); |
| | | } else { |
| | | bagCodeMapper.markInbound(targetId, event.getId(), req.getDeviceCode(), req.getLineCode()); |
| | | batchMapper.markInbound(batchId, event.getId(), req.getDeviceCode(), req.getLineCode()); |
| | | } |
| | | return event; |
| | | } catch (Exception ex) { |
| | | return failed(event, "MES_SCAN_TRANSACTION_FAILED", "åºåäºå¡å¤ç失败"); |
| | | log.error("[createInbound] åºåäºå¡å¤ç失败ï¼eventId={}, bagCode={}, batchId={}, itemId={}", |
| | | req.getEventId(), req.getBagCode(), batchId, batch.getItemId(), ex); |
| | | throw ex; |
| | | } |
| | | } |
| | | |
| | |
| | | package cn.iocoder.yudao.module.mes.service.qc.seedquality; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualitySubmitReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityIndicatorDO; |
| | |
| | | |
| | | Long submit(MesQcSeedQualitySubmitReqVO reqVO); |
| | | |
| | | PageResult<MesQcSeedQualityDO> getQualityPage(MesQcSeedQualityPageReqVO reqVO); |
| | | |
| | | /** |
| | | * æ ¹æ®æ¹æ¬¡å·æ¥è¯¢è´¨æ£è®°å½ï¼ææ£éªæ¶é´ååºï¼åææ°ï¼ï¼ç¨äºå
¬å¼æº¯æºã |
| | | * ç§åè´¨æ£è¡¨æªåå§åæ¶è¿å空å表ï¼å®¹éï¼ä¸å½±å追溯ï¼ã |
| | |
| | | package cn.iocoder.yudao.module.mes.service.qc.seedquality; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualitySubmitReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.*; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.bagcode.MesProBagCodeMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality.*; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.batch.MesWmBatchMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag.MesWmMaterialStockBagDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstockbag.MesWmMaterialStockBagMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.pro.MesProBagCodeQcStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockStateEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmWarehouseTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.service.pro.batch.MesProBatchService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.materialstockbag.MesWmMaterialStockBagService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.jdbc.BadSqlGrammarException; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.*; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_QUALIFIED_WAREHOUSE_NOT_CONFIGURED; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_WAREHOUSE_NOT_EXISTS; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_WAREHOUSE_TYPE_NOT_QUALIFIED; |
| | | |
| | | @Service @Validated @Slf4j |
| | | public class MesQcSeedQualityServiceImpl implements MesQcSeedQualityService { |
| | | private static final Set<String> REQUIRED = Set.of("purity", "cleanliness", "germination_rate", "moisture"); |
| | | @Resource private MesQcSeedQualityMapper qualityMapper; |
| | | @Resource private MesQcSeedQualityIndicatorMapper indicatorMapper; |
| | | @Resource private MesProBagCodeMapper bagCodeMapper; |
| | | @Resource private MesProBatchService proBatchService; |
| | | @Resource private MesWmBatchService mesWmBatchService; |
| | | @Resource private MesWmMaterialStockService materialStockService; |
| | | @Resource private MesWmBatchMapper mesWmBatchMapper; |
| | | @Resource private MesWmMaterialStockMapper materialStockMapper; |
| | | @Resource private MesWmMaterialStockBagMapper materialStockBagMapper; |
| | | @Resource private MesWmMaterialStockBagService materialStockBagService; |
| | | @Resource private MesWmTransactionService wmTransactionService; |
| | | @Resource private MesWmWarehouseService warehouseService; |
| | | @Resource private MesWmWarehouseLocationService warehouseLocationService; |
| | | @Resource private MesWmWarehouseAreaService warehouseAreaService; |
| | | |
| | | @Override |
| | | public PageResult<MesQcSeedQualityDO> getQualityPage(MesQcSeedQualityPageReqVO reqVO) { |
| | | return qualityMapper.selectPage(reqVO); |
| | | } |
| | | |
| | | @Override @Transactional(rollbackFor = Exception.class) |
| | | public Long submit(MesQcSeedQualitySubmitReqVO reqVO) { |
| | | if (reqVO.getIndicators().size() != 4) throw new IllegalArgumentException("å¿
é¡»æäº¤åé¡¹ææ "); |
| | | if (qualityMapper.selectByCode(reqVO.getCode()) != null) throw new IllegalArgumentException("该è¢ç 已质æ£ï¼ç¦æ¢éå¤æäº¤"); |
| | | // ç§åè´¨æ£å¿
须以è¢ç ï¼åè¢ï¼æäº¤ï¼ç©æä¿¡æ¯ç±è¢ç èªå¨è§£æï¼å端ä¸ååç¬éæ©ç©æ |
| | | MesProBagCodeDO bag = bagCodeMapper.selectByCode(reqVO.getCode()); |
| | | if (bag == null) { |
| | | throw new IllegalArgumentException("æªè§£æå°ææè¢ç ï¼ç§åè´¨æ£å¿
须以è¢ç æäº¤"); |
| | | } |
| | | MesProBatchDO batch = resolveBatch(reqVO.getCode(), reqVO.getBatchCode()); |
| | | if (batch == null || batch.getItemId() == null) { |
| | | throw new IllegalArgumentException("æªæ ¹æ®è¢ç è§£æå°ç©æä¿¡æ¯ï¼è¯·ç¡®è®¤æ«ç å
å®¹ææ¹æ¬¡å·æ£ç¡®"); |
| | | } |
| | | // è¢ç å¯¹åºæ¹æ¬¡çåºåå¿
é¡»å¤äºæååºï¼å¾
è´¨æ£ï¼ä¸ï¼æè½è¿è¡ç§åè´¨æ£ |
| | | MesWmBatchDO wmBatch = mesWmBatchMapper.selectByCode(batch.getCode()); |
| | | if (wmBatch == null || materialStockMapper.selectTempStockCountByBatchId(wmBatch.getId()) == 0) { |
| | | throw new IllegalArgumentException("该è¢ç /æ¹æ¬¡å¯¹åºçåºåä¸å¨æååºä¸ï¼æ æ³è¿è¡è´¨æ£"); |
| | | } |
| | | // æ ¡éªç®æ åæ ¼åºï¼å¿
é¡»åå¨ä¸ä»åºç±»åä¸ºåæ ¼åº(20) |
| | | if (warehouseService.getFirstQualifiedWarehouse() == null) { |
| | | throw exception(WM_QUALIFIED_WAREHOUSE_NOT_CONFIGURED); |
| | | } |
| | | MesWmWarehouseDO qualifiedWarehouse = warehouseService.getWarehouse(reqVO.getQualifiedWarehouseId()); |
| | | if (qualifiedWarehouse == null) { |
| | | throw exception(WM_WAREHOUSE_NOT_EXISTS); |
| | | } |
| | | if (!MesWmWarehouseTypeEnum.QUALIFIED.getType().equals(qualifiedWarehouse.getType())) { |
| | | throw exception(WM_WAREHOUSE_TYPE_NOT_QUALIFIED); |
| | | } |
| | | // è§£æåæ ¼åºé»è®¤åºåº/åºä½ï¼å该ä»åºä¸ç¬¬ä¸ä¸ªåºåºãå
¶ä¸ç¬¬ä¸ä¸ªåºä½ï¼æªé
ç½®å为 nullï¼ |
| | | Long qualifiedLocationId = null; |
| | | Long qualifiedAreaId = null; |
| | | List<MesWmWarehouseLocationDO> locations = warehouseLocationService.getWarehouseLocationList(qualifiedWarehouse.getId()); |
| | | if (CollUtil.isNotEmpty(locations)) { |
| | | qualifiedLocationId = locations.get(0).getId(); |
| | | List<MesWmWarehouseAreaDO> areas = warehouseAreaService.getWarehouseAreaList(qualifiedLocationId); |
| | | if (CollUtil.isNotEmpty(areas)) { |
| | | qualifiedAreaId = areas.get(0).getId(); |
| | | } |
| | | } |
| | | Set<String> codes = new HashSet<>(); |
| | | boolean passed = true; |
| | | MesQcSeedQualityDO quality = MesQcSeedQualityDO.builder().code(reqVO.getCode()).itemId(reqVO.getItemId()) |
| | | .batchCode(reqVO.getBatchCode()).reason(reqVO.getReason()).result(0) |
| | | MesQcSeedQualityDO quality = MesQcSeedQualityDO.builder().code(reqVO.getCode()).itemId(batch.getItemId()) |
| | | .batchCode(batch.getCode()).reason(reqVO.getReason()).result(0) |
| | | .inspectedAt(LocalDateTime.now()).build(); |
| | | qualityMapper.insert(quality); |
| | | for (MesQcSeedQualitySubmitReqVO.Indicator item : reqVO.getIndicators()) { |
| | |
| | | if (!codes.equals(REQUIRED)) throw new IllegalArgumentException("åé¡¹ææ ä¸å®æ´"); |
| | | quality.setResult(passed ? 1 : 2); |
| | | qualityMapper.updateById(quality); |
| | | // è´¨æ£åæ ¼ â åºåæ´æ¹ç±æååºï¼å¾
è´¨æ£ï¼è½¬ä¸ºåæ ¼åºï¼æ£å¼åºåï¼ |
| | | // æè¢ç ç²åº¦æµè½¬åºåï¼éå®è¯¥è¢å¨æååºä¸çæ´»å¨æç»ï¼ç¦æ¢ææ¹æ¬¡ä»»ææ£å |
| | | MesWmMaterialStockBagDO stockBag = materialStockBagMapper.selectActiveByBagCode(bag.getCode()); |
| | | MesWmMaterialStockDO tempStock = resolveTempStock(bag, wmBatch, stockBag); |
| | | // A. æååºåºï¼-1ï¼ï¼è¯¥è¢ç¦»å¼æååºï¼åå
¥è´¨æ£æååºåºäºå¡ï¼è·³è¿è¢ç èªå¨ç»´æ¤ï¼ç±è´¨æ£ç»ä¸æ§å¶è¢ç æç»è½ç¹ï¼ |
| | | MesWmTransactionSaveReqDTO tempOutReq = new MesWmTransactionSaveReqDTO() |
| | | .setType(MesWmTransactionTypeEnum.OUT.getType()) |
| | | .setBizType(MesBizTypeConstants.QC_SEED_QUALITY) |
| | | .setBizId(quality.getId()) |
| | | .setBizCode(reqVO.getCode()) |
| | | .setBizLineId(quality.getId()) |
| | | .setItemId(batch.getItemId()) |
| | | .setQuantity(BigDecimal.ONE.negate()) |
| | | .setBatchId(tempStock.getBatchId()) |
| | | .setBatchCode(tempStock.getBatchCode()) |
| | | .setBagCodeId(bag.getId()) |
| | | .setBagCode(bag.getCode()) |
| | | .setWarehouseId(tempStock.getWarehouseId()) |
| | | .setLocationId(tempStock.getLocationId()) |
| | | .setAreaId(tempStock.getAreaId()) |
| | | .setVendorId(tempStock.getVendorId()) |
| | | .setMaterialStockId(tempStock.getId()) |
| | | .setCheckFlag(true) |
| | | .setSkipBagManage(true); |
| | | Long tempOutTxId = wmTransactionService.createTransaction(tempOutReq); |
| | | if (passed) { |
| | | MesProBatchDO proBatch = proBatchService.getBatchByCode(reqVO.getBatchCode()); |
| | | if (proBatch != null) { |
| | | MesWmBatchDO wmBatch = mesWmBatchService.getOrCreateByProBatch(proBatch); |
| | | if (wmBatch != null) { |
| | | int updated = materialStockService.updateStockStateByBatchId(wmBatch.getId(), |
| | | MesWmStockStateEnum.QUALIFIED.getState(), MesWmStockStateEnum.TEMP.getState()); |
| | | log.info("[submit][è´¨æ£åæ ¼ï¼æ¹æ¬¡ {} åºåç±æååºè½¬åæ ¼åºï¼å½±å {} æ¡]", reqVO.getBatchCode(), updated); |
| | | // B1. è´¨æ£åæ ¼ â 该è¢è½¬å
¥æä½åéæ©çåæ ¼åºï¼åå
¥åæ ¼å
¥åºäºå¡ï¼è·³è¿è¢ç èªå¨ç»´æ¤ï¼ |
| | | MesWmMaterialStockDO qualifiedStock = getOrCreateQualifiedStock(tempStock, qualifiedWarehouse.getId(), qualifiedLocationId, qualifiedAreaId); |
| | | MesWmTransactionSaveReqDTO qualInReq = new MesWmTransactionSaveReqDTO() |
| | | .setType(MesWmTransactionTypeEnum.IN.getType()) |
| | | .setBizType(MesBizTypeConstants.QC_SEED_QUALITY) |
| | | .setBizId(quality.getId()) |
| | | .setBizCode(reqVO.getCode()) |
| | | .setBizLineId(quality.getId()) |
| | | .setItemId(batch.getItemId()) |
| | | .setQuantity(BigDecimal.ONE) |
| | | .setBatchId(qualifiedStock.getBatchId()) |
| | | .setBatchCode(qualifiedStock.getBatchCode()) |
| | | .setBagCodeId(bag.getId()) |
| | | .setBagCode(bag.getCode()) |
| | | .setWarehouseId(qualifiedStock.getWarehouseId()) |
| | | .setLocationId(qualifiedStock.getLocationId()) |
| | | .setAreaId(qualifiedStock.getAreaId()) |
| | | .setVendorId(qualifiedStock.getVendorId()) |
| | | .setMaterialStockId(qualifiedStock.getId()) |
| | | .setCheckFlag(false) |
| | | .setStockState(MesWmStockStateEnum.QUALIFIED.getState()) |
| | | .setSkipBagManage(true); |
| | | Long qualInTxId = wmTransactionService.createTransaction(qualInReq); |
| | | // B2. 忥è¿ç§»è¢ç æç»å°åæ ¼åºåè½ç¹ |
| | | materialStockBagService.moveIn(qualInReq, qualifiedStock, qualInTxId); |
| | | bagCodeMapper.updateQcStatus(bag.getId(), MesProBagCodeQcStatusEnum.QUALIFIED.getStatus()); |
| | | log.info("[submit][è´¨æ£åæ ¼ï¼è¢ç {} ç±æååºè½¬åæ ¼åº {}]", bag.getCode(), qualifiedWarehouse.getName()); |
| | | } else { |
| | | // C. è´¨æ£ä¸åæ ¼ â è¯¥è¢æ¥åºï¼æååºåºäºå¡å·²æ£åæååºåï¼æ è®°è¢ç æ¥åº |
| | | materialStockBagService.scrap(tempOutReq, tempOutTxId); |
| | | bagCodeMapper.updateQcStatus(bag.getId(), MesProBagCodeQcStatusEnum.UNQUALIFIED.getStatus()); |
| | | log.info("[submit][è´¨æ£ä¸åæ ¼ï¼è¢ç {} æ¥åº]", bag.getCode()); |
| | | } |
| | | } |
| | | } |
| | | // åºä½ç±åå°é
ç½®æå¡æ¥ç®¡ï¼å½åçæ¬ä¿ç审计éç¯ï¼ç¦æ¢åç«¯ä¼ å
¥åºä½ã |
| | | return quality.getId(); |
| | | } |
| | | |
| | | /** |
| | | * å®ä½è¯¥è¢çæååºåæ±æ»è®°å½ï¼åªå®ä½ï¼ä¸æ£åï¼æ£åç±è´¨æ£æååºåºäºå¡å®æï¼ã |
| | | * <p> |
| | | * ä¼å
ä¸¥æ ¼æè¢ç éå®å
¶æ´»å¨æç»å¯¹åºçæåè®°å½ï¼å岿 æç»æ¶åéææ¹æ¬¡å®ä½å¹¶è¡¥å»ºæç»ã |
| | | */ |
| | | private MesWmMaterialStockDO resolveTempStock(MesProBagCodeDO bag, MesWmBatchDO wmBatch, MesWmMaterialStockBagDO stockBag) { |
| | | if (stockBag != null && stockBag.getMaterialStockId() != null) { |
| | | MesWmMaterialStockDO stock = materialStockMapper.selectById(stockBag.getMaterialStockId()); |
| | | if (stock != null && MesWmStockStateEnum.TEMP.getState().equals(stock.getStockState())) { |
| | | return stock; |
| | | } |
| | | } |
| | | MesWmMaterialStockDO tempStock = materialStockMapper.selectStockListByBatchId(wmBatch.getId()).stream() |
| | | .filter(s -> MesWmStockStateEnum.TEMP.getState().equals(s.getStockState())) |
| | | .max(Comparator.comparing(MesWmMaterialStockDO::getQuantity)) |
| | | .orElse(null); |
| | | if (tempStock == null) { |
| | | throw new IllegalArgumentException("è¯¥æ¹æ¬¡æååºåä¸è¶³ï¼æ æ³è´¨æ£"); |
| | | } |
| | | getOrCreateStockBag(bag, tempStock); |
| | | return tempStock; |
| | | } |
| | | |
| | | /** |
| | | * è´¨æ£åæ ¼ï¼å°è´¨æ£éè¿çé£è¢è½¬å
¥æä½åéæ©çåæ ¼åºï¼åç»åé®åæ ¼åºè®°å½ +1ï¼ä¸åå¨åæ°å»ºï¼ã |
| | | * |
| | | * @param tempStock 仿ååºæ£ååè¿åçæåè®°å½ï¼æºå¸¦ item/batch/vendor ç»´åº¦ï¼ |
| | | * @param qualifiedWarehouseId ç®æ åæ ¼åºä»åºç¼å· |
| | | * @param qualifiedLocationId ç®æ åæ ¼åºåºåºç¼å·ï¼æªé
ç½®å为 nullï¼ |
| | | * @param qualifiedAreaId ç®æ åæ ¼åºåºä½ç¼å·ï¼æªé
ç½®å为 nullï¼ |
| | | */ |
| | | private MesWmMaterialStockBagDO getOrCreateStockBag(MesProBagCodeDO bag, MesWmMaterialStockDO tempStock) { |
| | | MesWmMaterialStockBagDO stockBag = materialStockBagMapper.selectByBagCode(bag.getCode()); |
| | | if (stockBag != null) { |
| | | return stockBag; |
| | | } |
| | | stockBag = MesWmMaterialStockBagDO.builder().materialStockId(tempStock.getId()) |
| | | .bagCodeId(bag.getId()).bagCode(bag.getCode()).itemId(tempStock.getItemId()) |
| | | .batchId(tempStock.getBatchId()).batchCode(tempStock.getBatchCode()).vendorId(tempStock.getVendorId()) |
| | | .warehouseId(tempStock.getWarehouseId()).locationId(tempStock.getLocationId()).areaId(tempStock.getAreaId()) |
| | | .stockState(MesWmStockStateEnum.TEMP.getState()).status(1).quantity(BigDecimal.ONE) |
| | | .frozen(false).inboundTime(tempStock.getReceiptTime()).build(); |
| | | materialStockBagMapper.insert(stockBag); |
| | | return stockBag; |
| | | } |
| | | |
| | | private MesWmMaterialStockDO getOrCreateQualifiedStock(MesWmMaterialStockDO tempStock, Long qualifiedWarehouseId, |
| | | Long qualifiedLocationId, Long qualifiedAreaId) { |
| | | MesWmMaterialStockDO qualified = materialStockMapper.selectQualifiedByCompositeKey( |
| | | tempStock.getItemId(), qualifiedWarehouseId, qualifiedLocationId, |
| | | qualifiedAreaId, tempStock.getBatchId(), tempStock.getVendorId()); |
| | | if (qualified != null) { |
| | | return qualified; |
| | | } |
| | | // ä¸åå¨åæ°å»ºåæ ¼åºè®°å½ï¼ä»åº/åºåº/åºä½éç¨æéåæ ¼åºçç»´åº¦ï¼æ°éç±è´¨æ£å
¥åºäºå¡ +1ï¼ |
| | | MesWmMaterialStockDO newStock = MesWmMaterialStockDO.builder() |
| | | .itemId(tempStock.getItemId()).itemTypeId(tempStock.getItemTypeId()) |
| | | .warehouseId(qualifiedWarehouseId).locationId(qualifiedLocationId).areaId(qualifiedAreaId) |
| | | .batchId(tempStock.getBatchId()).batchCode(tempStock.getBatchCode()).vendorId(tempStock.getVendorId()) |
| | | .quantity(BigDecimal.ZERO).receiptTime(LocalDateTime.now()) |
| | | .stockState(MesWmStockStateEnum.QUALIFIED.getState()) |
| | | .frozen(false) |
| | | .build(); |
| | | materialStockMapper.insert(newStock); |
| | | return newStock; |
| | | } |
| | | |
| | | /** |
| | | * ç±è¢ç æçäº§æ¹æ¬¡è§£ææå±çäº§æ¹æ¬¡ï¼è¢ç ä¼å
ï¼æ¹æ¬¡ç å
¼å®¹ä¸´æ¶ç ï¼ |
| | | */ |
| | | private MesProBatchDO resolveBatch(String code, String batchCode) { |
| | | if (StrUtil.isNotBlank(code)) { |
| | | MesProBagCodeDO bag = bagCodeMapper.selectByCode(code); |
| | | if (bag != null && bag.getBatchId() != null) { |
| | | MesProBatchDO batch = proBatchService.getBatch(bag.getBatchId()); |
| | | if (batch != null) { |
| | | return batch; |
| | | } |
| | | } |
| | | } |
| | | if (StrUtil.isNotBlank(batchCode)) { |
| | | return proBatchService.getBatchByCode(batchCode); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | @Override |
| | | public List<MesQcSeedQualityDO> getQualityByBatchCode(String batchCode) { |
| | | try { |
| | |
| | | |
| | | import java.net.URLDecoder; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.math.BigDecimal; |
| | | import java.util.ArrayList; |
| | | import java.util.Comparator; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | |
| | | fillAntiFake(resp, traceCode); |
| | | // å¯éæ©å±åºåï¼ææ°æ®æè¿åï¼ |
| | | fillOptionalModules(resp, batch); |
| | | fillTimelineAndDecision(resp); |
| | | return resp; |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | private void fillTimelineAndDecision(MesProTracePublicRespVO resp) { |
| | | List<MesProTracePublicRespVO.TimelineVO> timeline = new ArrayList<>(); |
| | | if (resp.getProduceDate() != null) { |
| | | timeline.add(timeline("ç产", "BATCH_CREATED", "çäº§æ¹æ¬¡å»ºç«", resp.getProduceDate(), null, |
| | | resp.getBatchStatusName())); |
| | | } |
| | | if (resp.getProcessTraces() != null) { |
| | | resp.getProcessTraces().forEach(item -> timeline.add(timeline("å å·¥", item.getEventType(), |
| | | item.getEventType() == null ? "å·¥åºæµè½¬" : ("IN".equals(item.getEventType()) ? "å·¥åºæå
¥" : "å·¥åºäº§åº"), |
| | | item.getEventTime(), item.getQuantity(), item.getQualityStatus() == null ? null : String.valueOf(item.getQualityStatus())))); |
| | | } |
| | | if (resp.getInbound() != null) { |
| | | timeline.add(timeline("ä»å¨", "INBOUND", "ä»å¨å
¥åº", resp.getInbound().getEventTime(), |
| | | resp.getInbound().getQuantity(), resp.getInbound().getStatus())); |
| | | } |
| | | if (resp.getSalesTargets() != null) { |
| | | resp.getSalesTargets().forEach(item -> timeline.add(timeline("éå®", "OUTBOUND", "éå®åºåº", |
| | | item.getSalesDate(), item.getQuantity(), item.getQualityStatus() == null ? null : String.valueOf(item.getQualityStatus())))); |
| | | } |
| | | timeline.sort(Comparator.comparing(MesProTracePublicRespVO.TimelineVO::getEventTime, |
| | | Comparator.nullsLast(Comparator.naturalOrder()))); |
| | | resp.setTimeline(timeline); |
| | | |
| | | MesProTracePublicRespVO.DecisionVO decision = new MesProTracePublicRespVO.DecisionVO(); |
| | | decision.setQualityRisk(resp.getQuality() != null && Integer.valueOf(2).equals(resp.getQuality().getResult())); |
| | | decision.setInboundQuantity(resp.getInbound() == null ? null : resp.getInbound().getQuantity()); |
| | | decision.setSalesTargetCount(resp.getSalesTargets() == null ? 0 : resp.getSalesTargets().size()); |
| | | decision.setConsumerScanCount(resp.getAntiFake() == null ? 0L : resp.getAntiFake().getScanCount()); |
| | | decision.setRiskLevel(Boolean.TRUE.equals(decision.getQualityRisk()) ? "HIGH" : "NORMAL"); |
| | | resp.setDecision(decision); |
| | | } |
| | | |
| | | private MesProTracePublicRespVO.TimelineVO timeline(String stage, String eventType, String eventName, |
| | | java.time.LocalDateTime eventTime, BigDecimal quantity, |
| | | String status) { |
| | | MesProTracePublicRespVO.TimelineVO vo = new MesProTracePublicRespVO.TimelineVO(); |
| | | vo.setStage(stage).setEventType(eventType).setEventName(eventName).setEventTime(eventTime) |
| | | .setQuantity(quantity).setStatus(status); |
| | | return vo; |
| | | } |
| | | |
| | | // ==================== åç§°æ å° ==================== |
| | | |
| | | private String userName(Long userId) { |
| | |
| | | if (proBatch == null || StrUtil.isBlank(proBatch.getCode())) { |
| | | return null; |
| | | } |
| | | // 1. å¤ç¨å·²æä»åºæ¹æ¬¡ï¼åä¸çäº§æ¹æ¬¡å·ï¼ |
| | | MesWmBatchDO existing = batchMapper.selectByCode(proBatch.getCode()); |
| | | // 1. ä¼å
æçäº§æ¹æ¬¡ ID å¤ç¨ï¼å
¼å®¹å岿°æ®åææ¹æ¬¡å·å¹é
|
| | | MesWmBatchDO existing = batchMapper.selectOne(MesWmBatchDO::getProBatchId, proBatch.getId()); |
| | | if (existing == null) { |
| | | existing = batchMapper.selectByCode(proBatch.getCode()); |
| | | } |
| | | if (existing != null) { |
| | | if (existing.getProBatchId() == null && proBatch.getId() != null) { |
| | | existing.setProBatchId(proBatch.getId()); |
| | | batchMapper.updateById(existing); |
| | | } |
| | | return existing; |
| | | } |
| | | // 2. æ°å»ºä»åºæ¹æ¬¡ï¼ä»¥çäº§æ¹æ¬¡å·ä½ä¸ºä»åºæ¹æ¬¡å·ï¼è´¨éç¶æç½®ä¸ºå¾
æ£éª |
| | | MesWmBatchDO batch = MesWmBatchDO.builder() |
| | | .proBatchId(proBatch.getId()) |
| | | .code(proBatch.getCode()) |
| | | .itemId(proBatch.getItemId()) |
| | | .produceDate(proBatch.getProduceDate()) |
| | |
| | | List<MesWmMaterialStockDO> getMaterialStockListByItemAndBatch(Long itemId, Long batchId); |
| | | |
| | | /** |
| | | * æ¥è¯¢ç©æ/æ¹æ¬¡çåæ ¼åºåºåè®°å½ï¼ä»
stock_state=20ï¼ |
| | | * |
| | | * <p>åæ¹æ¬¡å¯è½åæ¶å卿ååºä¸åæ ¼åºä¸¤æ¡è®°å½ï¼ç§åè´¨æ£æè¢ææ°éï¼ï¼ |
| | | * éå®åºåºéåºåå¿
é¡»ä»åæ ¼åºè®°å½ä¸éï¼é¿å
é䏿ªè´¨æ£çæååºåã</p> |
| | | * |
| | | * @param itemId ç©æç¼å· |
| | | * @param batchId æ¹æ¬¡ç¼å· |
| | | * @return åæ ¼åºåºåè®°å½å表 |
| | | */ |
| | | List<MesWmMaterialStockDO> getQualifiedMaterialStockListByItemAndBatch(Long itemId, Long batchId); |
| | | |
| | | /** |
| | | * æ´æ°åºåæ°é |
| | | * |
| | | * @param id åºåè®°å½ç¼å· |
| | |
| | | * @return ä»åºæ±æ»å表 |
| | | */ |
| | | List<MesWmStockSummaryRespVO> getStockSummaryByWarehouse(MesWmMaterialStockListReqVO reqVO); |
| | | |
| | | /** |
| | | * æä»åºæ¹æ¬¡æ´æ°åºåç¶æï¼ç¨äºç§åè´¨æ£åæ ¼åï¼å°æååºæ´æ¹è½¬ä¸ºåæ ¼åºï¼ |
| | | * |
| | | * @param batchId ä»åºæ¹æ¬¡ID |
| | | * @param toState ç®æ åºåç¶æ |
| | | * @param fromState ååºåç¶æï¼éå®åªæ´æ°è¯¥ç¶æçè®°å½ï¼ |
| | | * @return å½±åè¡æ° |
| | | */ |
| | | int updateStockStateByBatchId(Long batchId, Integer toState, Integer fromState); |
| | | |
| | | /** |
| | | * åºä½æ··æ¾è§åæ ¡éª |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | | import cn.iocoder.yudao.module.mes.service.wm.materialstockbag.MesWmMaterialStockBagService; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstockbag.MesWmMaterialStockBagMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag.MesWmMaterialStockBagDO; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; |
| | | import jakarta.annotation.Resource; |
| | |
| | | import java.util.function.Function; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; |
| | | |
| | |
| | | @Resource |
| | | @Lazy |
| | | private MesWmBatchService batchService; |
| | | |
| | | @Resource |
| | | private MesWmMaterialStockBagMapper materialStockBagMapper; |
| | | @Resource |
| | | private MesWmMaterialStockBagService materialStockBagService; |
| | | |
| | | @Override |
| | | public MesWmMaterialStockDO getMaterialStock(Long id) { |
| | |
| | | Assert.notNull(virtualWarehouse, "èæä»åºï¼WIP_VIRTUAL_WAREHOUSEï¼ä¸åå¨"); |
| | | virtualWarehouseId = virtualWarehouse.getId(); |
| | | } |
| | | // 1.4 è§£æ warehouseTypeï¼è½¬æ¢ä¸ºè¯¥ç±»åä»åº warehouseIdsï¼ä¸ warehouseId / virtualFilter å¹¶åï¼ä¿çå
¼å®¹ï¼ |
| | | List<Long> warehouseIds = resolveWarehouseIdsByType(pageReqVO.getWarehouseType()); |
| | | if (warehouseIds != null && warehouseIds.isEmpty()) { |
| | | return PageResult.empty(); |
| | | } |
| | | |
| | | // 2. å页æ¥è¯¢ |
| | | return materialStockMapper.selectPage(pageReqVO, itemTypeIds, itemIds, virtualWarehouseId); |
| | | return materialStockMapper.selectPage(pageReqVO, itemTypeIds, itemIds, virtualWarehouseId, warehouseIds); |
| | | } |
| | | |
| | | /** |
| | | * å°ä»åºç±»åè§£æä¸ºä»åº id éåï¼warehouseType 为 null æ¶ä¸å è¿æ»¤ï¼è¿å nullï¼ |
| | | * |
| | | * @param warehouseType ä»åºç±»åï¼è§ {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmWarehouseTypeEnum} |
| | | * @return 该类åä»åº id éåï¼warehouseType 为 null è¿å nullï¼è¯¥ç±»åæ ä»åºè¿å空éå |
| | | */ |
| | | private List<Long> resolveWarehouseIdsByType(Integer warehouseType) { |
| | | if (warehouseType == null) { |
| | | return null; |
| | | } |
| | | return convertList(warehouseService.getWarehouseListByType(warehouseType), MesWmWarehouseDO::getId); |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | @Override |
| | | public List<MesWmMaterialStockDO> getMaterialStockList(MesWmMaterialStockListReqVO reqVO) { |
| | | return materialStockMapper.selectList(reqVO); |
| | | List<Long> warehouseIds = resolveWarehouseIdsByType(reqVO.getWarehouseType()); |
| | | if (warehouseIds != null && warehouseIds.isEmpty()) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return materialStockMapper.selectList(reqVO, warehouseIds); |
| | | } |
| | | |
| | | @Override |
| | |
| | | @Override |
| | | public MesWmMaterialStockDO getMaterialStockByCompositeKey(Long itemId, Long warehouseId, Long locationId, Long areaId, |
| | | Long batchId, Long vendorId) { |
| | | return materialStockMapper.selectByCompositeKey(itemId, warehouseId, locationId, areaId, batchId, vendorId); |
| | | // åºåº/å ç¨åªä»åæ ¼åºå¹é
ï¼é¿å
æ£å°åæ¹æ¬¡çæååºï¼ç§åè´¨æ£æè¢ææ°éååæ¹æ¬¡åç¶æå¹¶åï¼ |
| | | return materialStockMapper.selectQualifiedByCompositeKey(itemId, warehouseId, locationId, areaId, batchId, vendorId); |
| | | } |
| | | |
| | | @Override |
| | | public List<MesWmMaterialStockDO> getQualifiedMaterialStockListByItemAndBatch(Long itemId, Long batchId) { |
| | | List<Long> qualifiedWarehouseIds = warehouseService.getQualifiedWarehouseIds(); |
| | | if (CollUtil.isEmpty(qualifiedWarehouseIds)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return materialStockMapper.selectQualifiedListByItemAndBatch(itemId, batchId, qualifiedWarehouseIds); |
| | | } |
| | | |
| | | @Override |
| | |
| | | @Override |
| | | public void updateMaterialStockState(Long id, Integer stockState) { |
| | | materialStockMapper.updateById(new MesWmMaterialStockDO().setId(id).setStockState(stockState)); |
| | | } |
| | | |
| | | @Override |
| | | public int updateStockStateByBatchId(Long batchId, Integer toState, Integer fromState) { |
| | | return materialStockMapper.updateStockStateByBatchId(batchId, toState, fromState); |
| | | } |
| | | |
| | | @Override |
| | |
| | | || ObjUtil.notEqual(stock.getAreaId(), areaId)) { |
| | | throw exception(WM_MATERIAL_STOCK_SELECTION_MISMATCH); |
| | | } |
| | | // 3. æ ¡éªåºåæ°éå
è¶³ï¼å¦æåç«¯ä¼ äº quantityï¼åå¿
é¡»ä¿è¯åºåæ°é >= quantityï¼ |
| | | // 3. æ ¡éªåºåè®°å½å¿
é¡»æ¯åæ ¼åºï¼æååºåæªè´¨æ£ï¼ä¸å¯ç¨äºåºåº/å ç¨ï¼ |
| | | if (!MesWmStockStateEnum.QUALIFIED.getState().equals(stock.getStockState())) { |
| | | throw exception(WM_MATERIAL_STOCK_NOT_QUALIFIED); |
| | | } |
| | | // 4. æ ¡éªåºåæ°éå
è¶³ï¼å¦æåç«¯ä¼ äº quantityï¼åå¿
é¡»ä¿è¯åºåæ°é >= quantityï¼ |
| | | if (quantity != null && stock.getQuantity() != null && stock.getQuantity().compareTo(quantity) < 0) { |
| | | throw exception(WM_MATERIAL_STOCK_INSUFFICIENT); |
| | | } |
| | |
| | | .setRelatedTransactionId(outTransactionId) |
| | | .setCheckFlag(false); |
| | | wmTransactionService.createTransaction(inTransaction); |
| | | |
| | | // 9. æ´ä½ç½®ç§»åºæ¶ï¼éè¢è¿ç§»è¢ç æç»ä½ç½®ï¼æ°éçäºæºåºä½æ´»å¨è¢æ°ä¸ä¸ºæ´æ°æè§ä¸ºæ´ä½ç§»åºï¼ |
| | | MesWmMaterialStockDO finalTargetStock = materialStockMapper.selectByCompositeKeyIgnoreVendor( |
| | | sourceStock.getItemId(), reqVO.getToWarehouseId(), reqVO.getToLocationId(), |
| | | reqVO.getToAreaId(), sourceStock.getBatchId()); |
| | | relocateBagsForMove(sourceStock, reqVO.getQuantity(), inTransaction, finalTargetStock); |
| | | } |
| | | |
| | | /** |
| | | * æ´ä½ç§»åºï¼å°æºåºä½çæ´»å¨è¢ç æç»è¿ç§»å°ç®æ åºä½ã |
| | | * <p> |
| | | * ä»
å½ç§»åºæ°éçäºæºåºä½æ´»å¨è¢æ°ä¸ä¸ºæ´æ°æ¶æ§è¡ï¼æ´ä½ç½®æ¬ç§»ï¼ï¼å°æ¯è¢æç»çåºåæ±æ»ãä»åºãåºåºãåºä½ |
| | | * æ´æ°ä¸ºç®æ ä½ç½®ï¼é¨åç§»åº/æ è¢ç æç»çæ§åºåä¸åè¢ç è¿ç§»ï¼ä¿ææ±æ»åºååå¨å³å¯ã |
| | | */ |
| | | private void relocateBagsForMove(MesWmMaterialStockDO sourceStock, BigDecimal quantity, |
| | | MesWmTransactionSaveReqDTO moveInReq, MesWmMaterialStockDO targetStock) { |
| | | List<MesWmMaterialStockBagDO> bags = materialStockBagMapper.selectActiveListByItemAndBatch( |
| | | sourceStock.getItemId(), sourceStock.getBatchId(), sourceStock.getStockState()); |
| | | if (CollUtil.isEmpty(bags) || targetStock == null || quantity == null |
| | | || quantity.compareTo(BigDecimal.valueOf(bags.size())) != 0) { |
| | | return; |
| | | } |
| | | for (MesWmMaterialStockBagDO bag : bags) { |
| | | moveInReq.setBagCodeId(bag.getBagCodeId()).setBagCode(bag.getBagCode()); |
| | | materialStockBagService.moveIn(moveInReq, targetStock, null); |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.wm.materialstockbag; |
| | | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag.MesWmMaterialStockBagDO; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | | |
| | | /** |
| | | * MES åºåè¢ç æç» Service æ¥å£ |
| | | * |
| | | * ç»ä¸å°è£
è¢ç åºåæç»ç建ç«ãè¿ç§»ãåºåºãæ¥åºé»è¾ï¼ä¾ææå¸¦è¢ç çåºååå¨å
¥å£å¤ç¨ã |
| | | * æ¯ä¸ªè¢ç å¨å䏿¶é´åªæä¸æ¡å¨åºæç»ï¼å¯ä¸çº¦æ bag_codeï¼ï¼æµè½¬éè¿æ´æ°æç»ä½ç½®/ç¶æå®ç°ã |
| | | */ |
| | | public interface MesWmMaterialStockBagService { |
| | | |
| | | /** |
| | | * å
¥åºï¼å»ºç«ææ¿æ´»æ´»å¨è¢ç æç»ã |
| | | * <p> |
| | | * è¢ç 馿¬¡å
¥åºæ¶æ°å»ºæç»ï¼å·²åºåº/å·²æ¥åºçè¢ç 忬¡å
¥åºæ¶æ¿æ´»ä¸ºå¨åºå¹¶æ´æ°ä½ç½®ï¼å·²å¨åºåè§ä¸ºéå¤å
¥åºæåºå¼å¸¸ã |
| | | * |
| | | * @param reqDTO äºå¡è¯·æ± |
| | | * @param stock ç®æ åºåæ±æ»è®°å½ |
| | | * @param transactionId æ¬ç¬äºå¡ ID |
| | | * @return è¢ç æç» |
| | | */ |
| | | MesWmMaterialStockBagDO inbound(MesWmTransactionSaveReqDTO reqDTO, MesWmMaterialStockDO stock, Long transactionId); |
| | | |
| | | /** |
| | | * åºåºï¼å°æå®è¢ç æç»ç½®ä¸ºå·²åºåºã |
| | | * |
| | | * @param reqDTO äºå¡è¯·æ±ï¼éæºå¸¦ bagCode/bagCodeIdï¼ |
| | | * @param transactionId æ¬ç¬äºå¡ ID |
| | | */ |
| | | void outbound(MesWmTransactionSaveReqDTO reqDTO, Long transactionId); |
| | | |
| | | /** |
| | | * ç§»å
¥/è¿ç§»ï¼æ´æ°æ´»å¨è¢ç æç»çä½ç½®ä¸åºåç¶æï¼ç§»åºãè°æ¨ãè´¨æ£åæ ¼è¿ç§»ï¼ã |
| | | * |
| | | * @param reqDTO äºå¡è¯·æ±ï¼éæºå¸¦ bagCodeï¼ |
| | | * @param targetStock ç®æ åºåæ±æ»è®°å½ |
| | | * @param transactionId æ¬ç¬äºå¡ ID |
| | | */ |
| | | void moveIn(MesWmTransactionSaveReqDTO reqDTO, MesWmMaterialStockDO targetStock, Long transactionId); |
| | | |
| | | /** |
| | | * æ¥åºï¼å°æå®è¢ç æç»ç½®ä¸ºæ¥åºã |
| | | * |
| | | * @param reqDTO äºå¡è¯·æ±ï¼éæºå¸¦ bagCodeï¼ |
| | | * @param transactionId æ¬ç¬äºå¡ ID |
| | | */ |
| | | void scrap(MesWmTransactionSaveReqDTO reqDTO, Long transactionId); |
| | | |
| | | /** |
| | | * æ ¹æ®åºåæ±æ» ID æ¥è¯¢å¨åºè¢ç æç»ã |
| | | * |
| | | * @param materialStockId åºåæ±æ» ID |
| | | * @return è¢ç æç»ï¼æ å nullï¼ |
| | | */ |
| | | MesWmMaterialStockBagDO getActiveByMaterialStockId(Long materialStockId); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.wm.materialstockbag; |
| | | |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag.MesWmMaterialStockBagDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstockbag.MesWmMaterialStockBagMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmMaterialStockBagStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockStateEnum; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * MES åºåè¢ç æç» Service å®ç°ç±» |
| | | * |
| | | * è¢ç æç»çå½å¨æï¼é¦æ¬¡å
¥åºå»ºç«ï¼ACTIVEï¼â ç§»åº/è´¨æ£è¿ç§»ä½ç½®ç¶æ â åºåº/æ¥åºç»æï¼OUT/SCRAPPEDï¼ã |
| | | * å¯ä¸çº¦æ bag_code ä¿è¯æ¯ä¸ªè¢ç ä»
䏿¡æç»ï¼å¤ç¨åä¸è¡å®æå
¨çå½å¨ææµè½¬ã |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class MesWmMaterialStockBagServiceImpl implements MesWmMaterialStockBagService { |
| | | |
| | | @Resource |
| | | private MesWmMaterialStockBagMapper materialStockBagMapper; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public MesWmMaterialStockBagDO inbound(MesWmTransactionSaveReqDTO reqDTO, MesWmMaterialStockDO stock, Long transactionId) { |
| | | String bagCode = reqDTO.getBagCode(); |
| | | if (StrUtil.isBlank(bagCode)) { |
| | | throw exception(WM_MATERIAL_STOCK_BAG_REQUIRED); |
| | | } |
| | | // 1. æ¥è¯¢è¯¥è¢ç æ¢ææç»ï¼ä¼å
æ bagCodeIdï¼å
¶æ¬¡æ bagCode |
| | | MesWmMaterialStockBagDO existing = materialStockBagMapper.selectByBagCode(bagCode); |
| | | if (existing == null && reqDTO.getBagCodeId() != null) { |
| | | existing = materialStockBagMapper.selectByBagCodeId(reqDTO.getBagCodeId()); |
| | | } |
| | | if (existing != null) { |
| | | // 2. å·²å¨åº â éå¤å
¥åºï¼ç¦æ¢ |
| | | if (MesWmMaterialStockBagStatusEnum.ACTIVE.getStatus().equals(existing.getStatus())) { |
| | | throw exception(WM_MATERIAL_STOCK_BAG_DUPLICATE, bagCode); |
| | | } |
| | | // 3. å·²åºåº/æ¥åº â éæ°æ¿æ´»å¹¶æ´æ°ä½ç½® |
| | | return reactivate(existing, reqDTO, stock, transactionId); |
| | | } |
| | | // 4. 馿¬¡å
¥åº â æ°å»ºæç» |
| | | MesWmMaterialStockBagDO bag = MesWmMaterialStockBagDO.builder() |
| | | .materialStockId(stock.getId()) |
| | | .bagCodeId(reqDTO.getBagCodeId()) |
| | | .bagCode(bagCode) |
| | | .itemId(stock.getItemId()) |
| | | .batchId(stock.getBatchId()) |
| | | .batchCode(stock.getBatchCode()) |
| | | .vendorId(stock.getVendorId()) |
| | | .warehouseId(stock.getWarehouseId()) |
| | | .locationId(stock.getLocationId()) |
| | | .areaId(stock.getAreaId()) |
| | | .stockState(ObjUtil.defaultIfNull(reqDTO.getStockState(), stock.getStockState())) |
| | | .status(MesWmMaterialStockBagStatusEnum.ACTIVE.getStatus()) |
| | | .quantity(BigDecimal.ONE) |
| | | .frozen(false) |
| | | .lastTransactionId(transactionId) |
| | | .inboundTime(LocalDateTime.now()) |
| | | .build(); |
| | | materialStockBagMapper.insert(bag); |
| | | return bag; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void outbound(MesWmTransactionSaveReqDTO reqDTO, Long transactionId) { |
| | | MesWmMaterialStockBagDO bag = requireActiveBag(reqDTO); |
| | | MesWmMaterialStockBagDO update = new MesWmMaterialStockBagDO(); |
| | | update.setId(bag.getId()); |
| | | update.setStatus(MesWmMaterialStockBagStatusEnum.OUT.getStatus()); |
| | | update.setStockState(MesWmStockStateEnum.OUT.getState()); |
| | | update.setLastTransactionId(transactionId); |
| | | update.setOutboundTime(LocalDateTime.now()); |
| | | materialStockBagMapper.updateById(update); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void moveIn(MesWmTransactionSaveReqDTO reqDTO, MesWmMaterialStockDO targetStock, Long transactionId) { |
| | | MesWmMaterialStockBagDO bag = requireActiveBag(reqDTO); |
| | | MesWmMaterialStockBagDO update = new MesWmMaterialStockBagDO(); |
| | | update.setId(bag.getId()); |
| | | update.setMaterialStockId(targetStock.getId()); |
| | | update.setWarehouseId(targetStock.getWarehouseId()); |
| | | update.setLocationId(targetStock.getLocationId()); |
| | | update.setAreaId(targetStock.getAreaId()); |
| | | update.setStockState(ObjUtil.defaultIfNull(reqDTO.getStockState(), targetStock.getStockState())); |
| | | update.setLastTransactionId(transactionId); |
| | | materialStockBagMapper.updateById(update); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void scrap(MesWmTransactionSaveReqDTO reqDTO, Long transactionId) { |
| | | MesWmMaterialStockBagDO bag = requireActiveBag(reqDTO); |
| | | MesWmMaterialStockBagDO update = new MesWmMaterialStockBagDO(); |
| | | update.setId(bag.getId()); |
| | | update.setStatus(MesWmMaterialStockBagStatusEnum.SCRAPPED.getStatus()); |
| | | update.setStockState(MesWmStockStateEnum.OUT.getState()); |
| | | update.setQuantity(BigDecimal.ZERO); |
| | | update.setLastTransactionId(transactionId); |
| | | update.setOutboundTime(LocalDateTime.now()); |
| | | materialStockBagMapper.updateById(update); |
| | | } |
| | | |
| | | @Override |
| | | public MesWmMaterialStockBagDO getActiveByMaterialStockId(Long materialStockId) { |
| | | return materialStockBagMapper.selectOneActiveByMaterialStockId(materialStockId); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢æå®è¢ç çæ´»å¨æç»ï¼ä¸å卿已åºåº/æ¥åºåæå¼å¸¸ã |
| | | */ |
| | | private MesWmMaterialStockBagDO requireActiveBag(MesWmTransactionSaveReqDTO reqDTO) { |
| | | MesWmMaterialStockBagDO bag = null; |
| | | if (reqDTO.getBagCodeId() != null) { |
| | | bag = materialStockBagMapper.selectActiveByBagCodeId(reqDTO.getBagCodeId()); |
| | | } |
| | | if (bag == null && StrUtil.isNotBlank(reqDTO.getBagCode())) { |
| | | bag = materialStockBagMapper.selectActiveByBagCode(reqDTO.getBagCode()); |
| | | } |
| | | if (bag == null) { |
| | | String code = StrUtil.blankToDefault(reqDTO.getBagCode(), String.valueOf(reqDTO.getBagCodeId())); |
| | | throw exception(WM_MATERIAL_STOCK_BAG_NOT_ACTIVE, code); |
| | | } |
| | | return bag; |
| | | } |
| | | |
| | | private MesWmMaterialStockBagDO reactivate(MesWmMaterialStockBagDO existing, MesWmTransactionSaveReqDTO reqDTO, |
| | | MesWmMaterialStockDO stock, Long transactionId) { |
| | | MesWmMaterialStockBagDO update = new MesWmMaterialStockBagDO(); |
| | | update.setId(existing.getId()); |
| | | update.setMaterialStockId(stock.getId()); |
| | | update.setItemId(stock.getItemId()); |
| | | update.setBatchId(stock.getBatchId()); |
| | | update.setBatchCode(stock.getBatchCode()); |
| | | update.setVendorId(stock.getVendorId()); |
| | | update.setWarehouseId(stock.getWarehouseId()); |
| | | update.setLocationId(stock.getLocationId()); |
| | | update.setAreaId(stock.getAreaId()); |
| | | update.setStockState(ObjUtil.defaultIfNull(reqDTO.getStockState(), stock.getStockState())); |
| | | update.setStatus(MesWmMaterialStockBagStatusEnum.ACTIVE.getStatus()); |
| | | update.setQuantity(BigDecimal.ONE); |
| | | update.setFrozen(false); |
| | | update.setLastTransactionId(transactionId); |
| | | update.setInboundTime(LocalDateTime.now()); |
| | | update.setOutboundTime(null); |
| | | materialStockBagMapper.updateById(update); |
| | | return existing; |
| | | } |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesLineMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.enums.pro.MesProBagCodeQcStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductSalesStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmSalesNoticeStatusEnum; |
| | |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | | import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcService; |
| | | import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.sale.enums.ErpSaleOrderOutStatusEnum; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.annotation.Lazy; |
| | |
| | | |
| | | @Resource |
| | | private MesTraceIntegrityService integrityService; |
| | | |
| | | @Resource |
| | | private ErpSaleOrderApi saleOrderApi; |
| | | |
| | | @Override |
| | | public Long createProductSales(MesWmProductSalesSaveReqVO createReqVO) { |
| | |
| | | if (pallet != null && pallet.getBatchId() == null) { |
| | | throw exception(PRO_PALLET_NOT_BIND_BATCH); |
| | | } |
| | | // ç§åè´¨æ£æè¢ç ç²åº¦æµè½¬åï¼åºåºåªå
许已质æ£åæ ¼çè¢ç /æç |
| | | if (pallet != null) { |
| | | List<MesProBagCodeDO> palletBags = bagCodeService.getBagCodeListByPalletId(pallet.getId()); |
| | | if (palletBags.stream().anyMatch(b -> !MesProBagCodeQcStatusEnum.QUALIFIED.getStatus().equals(b.getQcStatus()))) { |
| | | throw exception(WM_PRODUCT_SALES_SCAN_PALLET_NOT_ALL_QUALIFIED); |
| | | } |
| | | } else if (!MesProBagCodeQcStatusEnum.QUALIFIED.getStatus().equals(bag.getQcStatus())) { |
| | | throw exception(WM_PRODUCT_SALES_SCAN_BAG_NOT_QUALIFIED); |
| | | } |
| | | Long codeId = pallet != null ? pallet.getId() : bag.getId(); |
| | | MesWmProductSalesDetailDO existed = pallet != null |
| | | ? productSalesDetailMapper.selectBySalesIdAndPalletCodeId(reqVO.getSalesId(), codeId) |
| | |
| | | if (quantity == null) { |
| | | quantity = line.getQuantity(); |
| | | } |
| | | List<MesWmMaterialStockDO> stocks = materialStockService.getMaterialStockListByItemAndBatch(batch.getItemId(), wmBatch.getId()); |
| | | // åªä»åæ ¼åºè®°å½ä¸éåºåï¼åæ¹æ¬¡æååºè®°å½ä¸å¯åºåºï¼ |
| | | List<MesWmMaterialStockDO> stocks = materialStockService.getQualifiedMaterialStockListByItemAndBatch(batch.getItemId(), wmBatch.getId()); |
| | | BigDecimal outboundQuantity = quantity; |
| | | MesWmMaterialStockDO stock = stocks.stream().filter(item -> item.getQuantity().compareTo(outboundQuantity) >= 0).findFirst().orElse(null); |
| | | if (stock == null) { |
| | |
| | | // æ§è¡æ£è´§ï¼å¾
æ£è´§ â å¾
å¡«åè¿åï¼ |
| | | productSalesMapper.updateById(new MesWmProductSalesDO() |
| | | .setId(id).setStatus(MesWmProductSalesStatusEnum.SHIPPING.getStatus())); |
| | | |
| | | // åå ERP éå®è®¢ååºåºç¶æä¸º"é¨ååºåº"ï¼è¡¨ç¤ºå·²æ£è´§/å ç¨ï¼ |
| | | if (sales.getSaleOrderId() != null) { |
| | | saleOrderApi.updateOrderOutStatusTo(sales.getSaleOrderId(), |
| | | ErpSaleOrderOutStatusEnum.PART_OUT.getStatus()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | updateSalesNoticeOutCount(sales); |
| | | } |
| | | |
| | | // 6. åå ERP éå®è®¢åçåºåºæ°éåç¶æ |
| | | updateErpSaleOrderOutCount(sales); |
| | | |
| | | // 7. ååè¢ç /æçåºåºå»åï¼ä¾çªè´§ç¨½æ¥å®ä½ç»éåå°åºï¼ï¼å¹¶çæåºåºå®æ´æ§æè¦ |
| | | // 6. ååè¢ç /æçåºåºå»åï¼ä¾çªè´§ç¨½æ¥å®ä½ç»éåå°åºï¼ï¼å¹¶çæåºåºå®æ´æ§æè¦ |
| | | List<MesWmProductSalesDetailDO> outDetails = productSalesDetailService.getProductSalesDetailListBySalesId(id); |
| | | for (MesWmProductSalesDetailDO detail : outDetails) { |
| | | if (detail.getBagCodeId() != null) { |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åå ERP éå®è®¢åçåºåºæ°éåç¶æ |
| | | */ |
| | | private void updateErpSaleOrderOutCount(MesWmProductSalesDO sales) { |
| | | // è·ååºåºåè¡ |
| | | List<MesWmProductSalesLineDO> lines = productSalesLineService.getProductSalesLineListBySalesId(sales.getId()); |
| | | if (CollUtil.isEmpty(lines)) { |
| | | return; |
| | | } |
| | | // ç¨äºåå¨éå®è®¢å IDï¼é¿å
é夿´æ° |
| | | Long saleOrderId = null; |
| | | // éåè¡ï¼æ saleOrderItemId æ´æ°åºåºæ°é |
| | | for (MesWmProductSalesLineDO line : lines) { |
| | | if (line.getSaleOrderItemId() != null && line.getQuantity() != null) { |
| | | saleOrderApi.updateOrderItemOutCount(line.getSaleOrderItemId(), line.getQuantity()); |
| | | // è·åéå®è®¢å IDï¼ä»ç¬¬ä¸ä¸ªææçæç»é¡¹è·åï¼ |
| | | if (saleOrderId == null) { |
| | | cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO itemDTO = |
| | | saleOrderApi.getSaleOrderItem(line.getSaleOrderItemId()).getCheckedData(); |
| | | if (itemDTO != null && itemDTO.getOrderId() != null) { |
| | | saleOrderId = itemDTO.getOrderId(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | // æ´æ°éå®è®¢åçåºåºç¶æ |
| | | if (saleOrderId != null) { |
| | | saleOrderApi.updateOrderOutStatus(saleOrderId); |
| | | } |
| | | } |
| | | |
| | | private void createTransactionList(MesWmProductSalesDO sales) { |
| | | List<MesWmProductSalesDetailDO> details = productSalesDetailService.getProductSalesDetailListBySalesId(sales.getId()); |
| | | wmTransactionService.createTransactionList(convertList(details, detail -> new MesWmTransactionSaveReqDTO() |
| | | .setType(MesWmTransactionTypeEnum.OUT.getType()).setItemId(detail.getItemId()) |
| | | .setQuantity(detail.getQuantity().negate()) // åºåºæ°éä¸ºè´æ° |
| | | .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) |
| | | .setBagCodeId(detail.getBagCodeId()) // è¢ç åæç»åºåºæ¶ç½®è¢ç å·²åºåºï¼æçåæç»ä¸éè¢å¤ç |
| | | .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) |
| | | .setBizType(MesBizTypeConstants.WM_PRODUCT_SALES).setBizId(sales.getId()) |
| | | .setBizCode(sales.getCode()).setBizLineId(detail.getLineId()) |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.line.MesWmSalesNoticeLinePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.line.MesWmSalesNoticeLineSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.salesnotice.MesWmSalesNoticeLineMapper; |
| | | import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | |
| | | private MesWmSalesNoticeService salesNoticeService; |
| | | @Resource |
| | | private MesWmBatchService batchService; |
| | | @Resource |
| | | private MesWmMaterialStockService materialStockService; |
| | | @Resource |
| | | private MesMdmItemService mdmItemService; |
| | | |
| | |
| | | } |
| | | |
| | | private void validateLineSaveData(MesWmSalesNoticeLineSaveReqVO reqVO) { |
| | | // æ ¡éªç¶åæ®åå¨ä¸ä¸ºèç¨¿ç¶æ |
| | | validateNoticeStatusDraft(reqVO.getNoticeId()); |
| | | // æ ¡éªç©æåå¨ |
| | | if (reqVO.getItemId() != null) { |
| | | mdmItemService.validateItemExistsAndEnable(reqVO.getItemId()); |
| | | |
| | | MesWmBatchDO batch = resolveBatch(reqVO); |
| | | if (batch == null) { |
| | | throw exception(WM_MATERIAL_STOCK_NOT_EXISTS); |
| | | } |
| | | if (ObjUtil.notEqual(batch.getItemId(), reqVO.getItemId())) { |
| | | throw exception(WM_MATERIAL_STOCK_NOT_EXISTS); |
| | | } |
| | | BigDecimal qualifiedQuantity = materialStockService |
| | | .getQualifiedMaterialStockListByItemAndBatch(reqVO.getItemId(), batch.getId()).stream() |
| | | .map(MesWmMaterialStockDO::getQuantity) |
| | | .filter(quantity -> quantity != null) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | if (qualifiedQuantity.compareTo(reqVO.getQuantity()) < 0) { |
| | | throw exception(WM_MATERIAL_STOCK_INSUFFICIENT); |
| | | } |
| | | reqVO.setBatchId(batch.getId()); |
| | | reqVO.setBatchCode(batch.getCode()); |
| | | } |
| | | |
| | | private MesWmBatchDO resolveBatch(MesWmSalesNoticeLineSaveReqVO reqVO) { |
| | | if (reqVO.getBatchId() != null) { |
| | | return batchService.getBatch(reqVO.getBatchId()); |
| | | } |
| | | if (StrUtil.isNotBlank(reqVO.getBatchCode())) { |
| | | return batchService.getBatchByCode(reqVO.getBatchCode()); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | /** |
| | | * ä»éå®è®¢åçæåè´§éç¥å |
| | | * |
| | | * @param saleOrderId éå®è®¢åID |
| | | * @return åè´§éç¥åID |
| | | */ |
| | | Long generateSalesNoticeFromSaleOrder(Long saleOrderId); |
| | | |
| | | /** |
| | | * 宿åè´§éç¥åï¼åºåºå®æåè°ç¨ï¼ |
| | | * ç´¯å åºåºæ°é并计ç®åºåºç¶æ |
| | | * |
| | |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductSalesStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.enums.ErpSaleOrderOutStatusEnum; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | @Resource |
| | | private CrmCustomerApi customerApi; |
| | | |
| | | @Resource |
| | | private ErpSaleOrderApi saleOrderApi; |
| | | @Resource |
| | | private MesMdAutoCodeRecordService autoCodeRecordService; |
| | | |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitSalesNotice(Long id) { |
| | | // 1.1 æ ¡éªåå¨ + èç¨¿ç¶æ |
| | | MesWmSalesNoticeDO notice = validateSalesNoticeExistsAndDraft(id); |
| | | validateSalesNoticeExistsAndDraft(id); |
| | | // 1.2 æ£æ¥æ¯å¦æè¡é¡¹ç® |
| | | List<MesWmSalesNoticeLineDO> lines = salesNoticeLineService.getSalesNoticeLineListByNoticeId(id); |
| | | if (CollUtil.isEmpty(lines)) { |
| | |
| | | // 2. æ´æ°ç¶æï¼è稿 â å¾
åºåº |
| | | salesNoticeMapper.updateById(new MesWmSalesNoticeDO() |
| | | .setId(id).setStatus(APPROVED.getStatus())); |
| | | |
| | | // 3. åå ERP éå®è®¢ååºåºç¶æä¸º"å·²é¢ç" |
| | | if (notice.getSaleOrderId() != null) { |
| | | saleOrderApi.updateOrderOutStatusTo(notice.getSaleOrderId(), |
| | | ErpSaleOrderOutStatusEnum.RESERVED.getStatus()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (ObjUtil.notEqual(id, notice.getId())) { |
| | | throw exception(WM_SALES_NOTICE_CODE_DUPLICATE); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long generateSalesNoticeFromSaleOrder(Long saleOrderId) { |
| | | // 1. æ ¡éªæ¯å¦å·²çæè¿åè´§éç¥åï¼é²æ¢éå¤çæï¼ |
| | | MesWmSalesNoticeDO existNotice = salesNoticeMapper.selectBySaleOrderId(saleOrderId); |
| | | if (existNotice != null) { |
| | | throw exception(WM_SALES_NOTICE_ALREADY_EXISTS); |
| | | } |
| | | |
| | | // 2. è·åéå®è®¢åä¿¡æ¯ |
| | | ErpSaleOrderRespDTO saleOrder = saleOrderApi.getSaleOrder(saleOrderId).getCheckedData(); |
| | | if (saleOrder == null) { |
| | | throw exception(WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS); |
| | | } |
| | | |
| | | // 3. è·åéå®è®¢åæç» |
| | | List<ErpSaleOrderItemRespDTO> saleOrderItems = saleOrderApi.getSaleOrderItemList(saleOrderId).getCheckedData(); |
| | | if (CollUtil.isEmpty(saleOrderItems)) { |
| | | throw exception(WM_SALES_NOTICE_SALE_ORDER_ITEM_EMPTY); |
| | | } |
| | | |
| | | // 4. çæåè´§éç¥åç¼ç |
| | | String code = autoCodeRecordService.generateAutoCode("SALESNOTICE_CODE", null); |
| | | |
| | | // 5. å建åè´§éç¥å主表 |
| | | MesWmSalesNoticeDO notice = new MesWmSalesNoticeDO(); |
| | | notice.setCode(code); |
| | | notice.setName("éå®è®¢å[" + saleOrder.getNo() + "]åè´§éç¥"); |
| | | notice.setClientId(saleOrder.getCustomerId()); |
| | | notice.setSaleOrderId(saleOrderId); |
| | | notice.setSaleOrderCode(saleOrder.getNo()); |
| | | notice.setSalesDate(java.time.LocalDateTime.now()); |
| | | notice.setStatus(PREPARE.getStatus()); |
| | | salesNoticeMapper.insert(notice); |
| | | |
| | | // 6. éåæç»å建åè´§éç¥åè¡ |
| | | for (ErpSaleOrderItemRespDTO saleOrderItem : saleOrderItems) { |
| | | MesWmSalesNoticeLineDO line = new MesWmSalesNoticeLineDO(); |
| | | line.setNoticeId(notice.getId()); |
| | | line.setSaleOrderItemId(saleOrderItem.getId()); |
| | | line.setItemId(saleOrderItem.getProductId()); |
| | | line.setQuantity(saleOrderItem.getCount()); |
| | | salesNoticeLineService.createSalesNoticeLine(line); |
| | | } |
| | | |
| | | return notice.getId(); |
| | | } |
| | | |
| | | @Override |
| | |
| | | productSales.setCode(code); |
| | | productSales.setName("åè´§éç¥å[" + notice.getCode() + "]åºåº"); |
| | | productSales.setClientId(notice.getClientId()); |
| | | productSales.setSaleOrderId(notice.getSaleOrderId()); |
| | | productSales.setSalesOrderCode(notice.getSaleOrderCode()); |
| | | productSales.setNoticeId(noticeId); |
| | | productSales.setSalesDate(notice.getSalesDate()); |
| | | // æ¶è´§ä¿¡æ¯ä»åè´§éç¥å带å
¥ |
| | |
| | | for (MesWmSalesNoticeLineDO noticeLine : noticeLines) { |
| | | MesWmProductSalesLineDO salesLine = new MesWmProductSalesLineDO(); |
| | | salesLine.setSalesId(productSales.getId()); |
| | | salesLine.setSaleOrderItemId(noticeLine.getSaleOrderItemId()); |
| | | salesLine.setNoticeLineId(noticeLine.getId()); |
| | | salesLine.setItemId(noticeLine.getItemId()); |
| | | salesLine.setQuantity(noticeLine.getQuantity()); |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.transaction.MesWmTransactionMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockStateEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmWarehouseTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; |
| | |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.materialstockbag.MesWmMaterialStockBagService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | private MesWmWarehouseLocationService locationService; |
| | | @Resource |
| | | private MesWmWarehouseAreaService areaService; |
| | | |
| | | @Resource |
| | | private MesWmMaterialStockBagService materialStockBagService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | materialStockService.updateMaterialStockQuantity(materialStock.getId(), reqDTO.getQuantity(), checkFlag); |
| | | MesWmMaterialStockDO updatedStock = materialStockService.getMaterialStock(materialStock.getId()); |
| | | BigDecimal newQuantity = updatedStock.getQuantity(); |
| | | // åºåç¶æï¼æ¾å¼æå®ä¼å
ï¼å¦æ«ç å
¥æååºï¼ï¼å¦åææ°éèªå¨å¤å®ï¼â¤0 å·²åºåºï¼>0 åæ ¼åºï¼ |
| | | // åºåç¶æï¼æ¾å¼æå®ä¼å
ï¼å¦æ«ç å
¥æååºï¼ï¼å¦åèªå¨å¤å®âââ¤0 å·²åºåºï¼ |
| | | // >0 æ¶ä»
ç®æ ä»åºä¸ºåæ ¼åº(20)æç½®åæ ¼æï¼å¦åä¿ææåæ(10)ï¼ |
| | | // é¿å
çç¹/è°æ´/è°æ¨çæä½ææåä»åºåºåç¿»æåæ ¼æ |
| | | Integer stockState = reqDTO.getStockState(); |
| | | if (stockState == null) { |
| | | stockState = newQuantity.signum() <= 0 |
| | | ? MesWmStockStateEnum.OUT.getState() : MesWmStockStateEnum.QUALIFIED.getState(); |
| | | if (newQuantity.signum() <= 0) { |
| | | stockState = MesWmStockStateEnum.OUT.getState(); |
| | | } else { |
| | | MesWmWarehouseDO warehouse = warehouseService.getWarehouse(reqDTO.getWarehouseId()); |
| | | boolean qualifiedWarehouse = warehouse != null |
| | | && MesWmWarehouseTypeEnum.QUALIFIED.getType().equals(warehouse.getType()); |
| | | stockState = qualifiedWarehouse |
| | | ? MesWmStockStateEnum.QUALIFIED.getState() : MesWmStockStateEnum.TEMP.getState(); |
| | | } |
| | | } |
| | | materialStockService.updateMaterialStockState(updatedStock.getId(), stockState); |
| | | |
| | |
| | | MesWmTransactionDO transaction = MesWmTransactionDO.builder() |
| | | .type(reqDTO.getType()).quantity(reqDTO.getQuantity()).transactionTime(LocalDateTime.now()) |
| | | .itemId(reqDTO.getItemId()).batchId(reqDTO.getBatchId()).batchCode(reqDTO.getBatchCode()) |
| | | .bagCodeId(reqDTO.getBagCodeId()).bagCode(reqDTO.getBagCode()) |
| | | .warehouseId(reqDTO.getWarehouseId()).locationId(reqDTO.getLocationId()).areaId(reqDTO.getAreaId()) |
| | | .bizType(reqDTO.getBizType()).bizId(reqDTO.getBizId()).bizCode(reqDTO.getBizCode()).bizLineId(reqDTO.getBizLineId()) |
| | | .materialStockId(materialStock.getId()).relatedTransactionId(reqDTO.getRelatedTransactionId()) |
| | | .build(); |
| | | transactionMapper.insert(transaction); |
| | | // 4. 带è¢ç æ¶ï¼åæ¥ç»´æ¤åºåè¢ç æç»ï¼å
¥åºå»ºç«/æ¿æ´»ãåºåºç½®å·²åºåºãç§»å
¥è¿ç§»ãæ¥åºï¼ |
| | | boolean skipBagManage = ObjUtil.defaultIfNull(reqDTO.getSkipBagManage(), false); |
| | | if (!skipBagManage && (StrUtil.isNotBlank(reqDTO.getBagCode()) || reqDTO.getBagCodeId() != null)) { |
| | | handleStockBag(reqDTO, materialStock, transaction.getId(), transactionType); |
| | | } |
| | | return transaction.getId(); |
| | | } |
| | | |
| | | /** |
| | | * æäºå¡ç±»åç»´æ¤è¢ç æç»ï¼ä¿è¯æ±æ»åºåãè¢ç æç»ãäºå¡æµæ°´ä¸è
ä¸è´ã |
| | | */ |
| | | private void handleStockBag(MesWmTransactionSaveReqDTO reqDTO, MesWmMaterialStockDO materialStock, |
| | | Long transactionId, MesWmTransactionTypeEnum transactionType) { |
| | | switch (transactionType) { |
| | | case MOVE_IN: |
| | | // ç§»å
¥/è°æ¨/è´¨æ£è¿ç§»ï¼æ´æ°æç»ä½ç½®ä¸ç¶æ |
| | | materialStockBagService.moveIn(reqDTO, materialStock, transactionId); |
| | | break; |
| | | case IN: |
| | | case ADJUST_IN: |
| | | // å
¥åº/ççï¼å»ºç«ææ¿æ´»æç» |
| | | materialStockBagService.inbound(reqDTO, materialStock, transactionId); |
| | | break; |
| | | case MOVE_OUT: |
| | | case OUT: |
| | | case ADJUST_OUT: |
| | | // ç§»åº/åºåº/çäºï¼ç½®ä¸ºå·²åºåº |
| | | materialStockBagService.outbound(reqDTO, transactionId); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void createTransactionList(List<MesWmTransactionSaveReqDTO> reqDTOs) { |
| | |
| | | * æ¹æ¬¡å· |
| | | */ |
| | | private String batchCode; |
| | | /** è¢ç ID */ |
| | | private Long bagCodeId; |
| | | /** è¢ç */ |
| | | private String bagCode; |
| | | |
| | | // ===== åºåä½ç½® ===== |
| | | |
| | |
| | | */ |
| | | private Integer stockState; |
| | | |
| | | /** |
| | | * æ¯å¦è·³è¿è¢ç æç»èªå¨ç»´æ¤ï¼é»è®¤ falseï¼ã |
| | | * <p> |
| | | * è´¨æ£çéè¦èªè¡æ§å¶è¢ç çå½å¨æï¼å¦æååºåºä¸åæ ¼å
¥åºæå¯¹åçãè¢ç ä»
卿ç»è½ç¹è¿ç§»ï¼çåºæ¯ï¼ |
| | | * å¨åäºå¡æ¶ç½® trueï¼é¿å
createTransaction æåç¬äºå¡ç±»åèªå¨ç½®å·²åºåº/è¿ç§»ï¼å¯¼è´è¢ç ç¶æéä¹±ã |
| | | */ |
| | | private Boolean skipBagManage; |
| | | |
| | | } |
| | |
| | | */ |
| | | MesWmWarehouseDO getWarehouseByCode(String code); |
| | | |
| | | /** |
| | | * æä»åºç±»åè·å¾ä»åºåè¡¨ï¼æ id ååºï¼ |
| | | * |
| | | * @param type ä»åºç±»åï¼è§ {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmWarehouseTypeEnum} |
| | | * @return ä»åºå表 |
| | | */ |
| | | List<MesWmWarehouseDO> getWarehouseListByType(Integer type); |
| | | |
| | | /** |
| | | * è·å¾åæ ¼åºï¼type=QUALIFIEDï¼çç¼å·éåï¼ç¨äºæä»åºç±»åè¿æ»¤åæ ¼åºå |
| | | * |
| | | * @return åæ ¼ä»åº id éå |
| | | */ |
| | | List<Long> getQualifiedWarehouseIds(); |
| | | |
| | | /** |
| | | * è·å¾ç¬¬ä¸ä¸ªåæ ¼åºï¼type=QUALIFIEDï¼æ id ååºï¼ |
| | | * |
| | | * @return åæ ¼ä»åºï¼æªé
ç½®è¿å null |
| | | */ |
| | | MesWmWarehouseDO getFirstQualifiedWarehouse(); |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.warehouse.MesWmWarehouseMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmWarehouseTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; |
| | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | |
| | | if (MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE.equals(code)) { |
| | | MesWmWarehouseDO newWarehouse = MesWmWarehouseDO.builder() |
| | | .code(code).name("èæçº¿è¾¹ä»åº").frozen(false) |
| | | .type(MesWmWarehouseTypeEnum.TEMP.getType()) |
| | | .remark("ç³»ç»èªå¨åå§åçèæçº¿è¾¹ä»åºï¼ç¨äºç产æ¥å·¥ä¸å¨å¶å管çè§£è¦ï¼") |
| | | .build(); |
| | | warehouseMapper.insert(newWarehouse); |
| | |
| | | return null; |
| | | } |
| | | |
| | | @Override |
| | | public List<MesWmWarehouseDO> getWarehouseListByType(Integer type) { |
| | | return warehouseMapper.selectListByType(type); |
| | | } |
| | | |
| | | @Override |
| | | public List<Long> getQualifiedWarehouseIds() { |
| | | return convertList(getWarehouseListByType(MesWmWarehouseTypeEnum.QUALIFIED.getType()), |
| | | MesWmWarehouseDO::getId); |
| | | } |
| | | |
| | | @Override |
| | | public MesWmWarehouseDO getFirstQualifiedWarehouse() { |
| | | List<MesWmWarehouseDO> list = getWarehouseListByType(MesWmWarehouseTypeEnum.QUALIFIED.getType()); |
| | | return CollUtil.isNotEmpty(list) ? list.get(0) : null; |
| | | } |
| | | |
| | | } |
| | |
| | | WHERE deleted = 0 |
| | | </select> |
| | | |
| | | <!-- ========== åºåºæµé / ä»å¨ / è´¨é ========== --> |
| | | |
| | | <!-- ç»è®¡åè´§éç¥åæ°ï¼mes_wm_sales_noticeï¼ --> |
| | | <select id="selectSalesNoticeCount" resultType="java.lang.Long"> |
| | | SELECT COUNT(*) |
| | | FROM mes_wm_sales_notice |
| | | WHERE deleted = 0 |
| | | </select> |
| | | |
| | | <!-- ç»è®¡éå®åºåºåæ°ï¼mes_wm_product_salesï¼ --> |
| | | <select id="selectProductSalesCount" resultType="java.lang.Long"> |
| | | SELECT COUNT(*) |
| | | FROM mes_wm_product_sales |
| | | WHERE deleted = 0 |
| | | </select> |
| | | |
| | | <!-- ç»è®¡éå®éè´§åæ°ï¼mes_wm_return_salesï¼ --> |
| | | <select id="selectReturnSalesCount" resultType="java.lang.Long"> |
| | | SELECT COUNT(*) |
| | | FROM mes_wm_return_sales |
| | | WHERE deleted = 0 |
| | | </select> |
| | | |
| | | <!-- ç»è®¡æªå¤çåºåé¢è¦æ°ï¼mes_wm_stock_warning.status=10ï¼ --> |
| | | <select id="selectStockWarningPendingCount" resultType="java.lang.Long"> |
| | | SELECT COUNT(*) |
| | | FROM mes_wm_stock_warning |
| | | WHERE deleted = 0 |
| | | AND status = 10 |
| | | </select> |
| | | |
| | | <!-- ç»è®¡å¾
è¯å®¡ä¸åæ ¼ååæ°ï¼mes_qc_ncr.status=0ï¼ --> |
| | | <select id="selectNcrPendingCount" resultType="java.lang.Long"> |
| | | SELECT COUNT(*) |
| | | FROM mes_qc_ncr |
| | | WHERE deleted = 0 |
| | | AND status = 0 |
| | | </select> |
| | | |
| | | <!-- ========== ç¶æåå¸ ========== --> |
| | | |
| | | <!-- æç¶æç»è®¡æ¹æ¬¡æ°é --> |