Merge remote-tracking branch 'origin/dev_银川_九鸿化工' into dev_银川_九鸿化工
| | |
| | | }, |
| | | { |
| | | "name": "ç产é£é©é¢æµ", |
| | | "flow": "IPQC 缺é·ç+设å¤ä¿å
»ç¹æ£+ç©æå¯ç¨ç<20%+å
³é®å·¥åº â chat â 综åé£é©+å ç´ ", |
| | | "flow": "设å¤ä¿å
»ç¹æ£+ç©æå¯ç¨ç<20%+å
³é®å·¥åº â chat â 综åé£é©+å ç´ ", |
| | | "callsApis": [ |
| | | "MdmItemApi" |
| | | ] |
| | |
| | | {"stage": "èå¨", "action": "审æ¹éè¿æå·¥åºæ è®°: åå²âèªå¨ç©ææ¶èæ£çº¿è¾¹åº(å
许è´åºå)ï¼è´¨æ£â产åºå¾
æ£è¡ç IPQCï¼å
³é®éæ£âç´æ¥äº§åºå
¥åº", "roles": ["ç³»ç»èªå¨"]}, |
| | | {"stage": "å®å·¥", "action": "ä»
æ«éå·¥åºååå·¥åå·²ç产æ°éï¼è¾¾æ èªå¨å®æï¼MPS ç´¯è®¡å¤æå®æå¹¶åäºä»¶ç»éå®è®¢å", "roles": ["ç³»ç»èªå¨"]}]}, |
| | | {"id": "quality", "name": "è´¨éæµç¨", "mermaid": "mermaid/05-quality-flow.mmd", "color": "#e06c6c", |
| | | "summary": "å鿣éªé¸å£(IQC/IPQC/OQC/RQCï¼äºæ 0â4) + å¤å®åæ(åæ ¼/ç¹é/éè´§/æ¥åº) + NCR è¯å®¡å¤ç½®å
³éï¼AI æä¾å¤å®å»ºè®®ï¼NCR å½åä»
å°è´¦ä¸è§¦åè¿å·¥åãæ¯æåå·¥æ¥åèå¼ï¼åç»ææ æ +å
¬å¼ææ¬+å¹³è¡æµéæ¹æ¬¡+éæ ·è¡¨å¤´+ç¾ååºï¼æµè§å¨æå°æ£éªæ¥åï¼å¹¶å¯å¯¼åºäº§åæ£éªå Wordï¼çº¸è´¨æ£éªåçå¼ï¼å¤å®ç»è®º/è´¨æ£ç« /æ£éªÂ·å¤æ ¸Â·æ¹åç¾åç空æå¡«ï¼Word æå°ï¼ã", |
| | | "summary": "å鿣éªé¸å£(IQC/IPQC/OQC/RQCï¼äºæ 0â4) + å¤å®åæ(åæ ¼/ç¹é/éè´§/æ¥åºï¼OQC æ¹æäº§åç级 1å/2å/åºåï¼ä»
åºåå¤ä¸åæ ¼) + NCR è¯å®¡å¤ç½®å
³éï¼AI æä¾å¤å®å»ºè®®ï¼NCR å½åä»
å°è´¦ä¸è§¦åè¿å·¥åãæ¯æåå·¥æ¥åèå¼ï¼åç»ææ æ +å
¬å¼ææ¬+å¹³è¡æµéæ¹æ¬¡+éæ ·è¡¨å¤´+ç¾ååºï¼æµè§å¨æå°æ£éªæ¥åï¼å¹¶å¯å¯¼åºäº§åæ£éªå Wordï¼çº¸è´¨æ£éªåçå¼ï¼å¤å®ç»è®º/è´¨æ£ç« /æ£éªÂ·å¤æ ¸Â·æ¹åç¾åç空æå¡«ï¼Word æå°ï¼ã", |
| | | "steps": [ |
| | | {"stage": "æ¥æ", "action": "å°è´§éç¥/å¤åå
¥åºâIQCï¼ç»è®ºå忍è¿å¾
å
¥åºæè§¦åéè´§", "roles": ["IQC è´¨æ£å"]}, |
| | | {"stage": "è¿ç¨", "action": "æ¥å·¥è´¨æ£å·¥åºäº§åºè¡âIPQCï¼åæ ¼æè¡å
¥åºãä¸åæ ¼çæ NCR", "roles": ["IPQC è´¨æ£å"]}, |
| | | {"stage": "åºè´§", "action": "éå®åºåºæäº¤âOQCï¼å®æååºåºåè¿å
¥å¾
æ£è´§", "roles": ["OQC è´¨æ£å"]}, |
| | | {"stage": "åºè´§", "action": "éå®åºåºæäº¤âOQC(æ£æµç»ææäº§åç级 1å/2å/åºåå¿
å¡«ï¼1å/2åå¤è¡åæ ¼ï¼åºåå¤è¡ä¸åæ ¼)ï¼å
¨é¨åæ ¼ååºåºåè¿å
¥å¾
æ£è´§ï¼åºç°åºååæ´ååæ¶", "roles": ["OQC è´¨æ£å"]}, |
| | | {"stage": "éè´§", "action": "éæ/éå®éè´§/å®åéè´§âRQCï¼ç»è®ºåè°åæ®ä¸å®å", "roles": ["RQC è´¨æ£å"]}, |
| | | {"stage": "æ¥å", "action": "æ£éªç»ææåç»æ +æµéæ¹æ¬¡å½å
¥ï¼/indicator-result/report èååå端æå°æ£éªæ¥å(å«éæ ·å°ç¹/è¯ä¹¦ç¼å·/æ§è¡æ å/夿 ¸Â·å®¡æ ¸ç¾ååº)ï¼/indicator-result/export-product-word 导åºäº§åæ£éªåWord(æ ææ¯ææ å·å¤å®ç»è®º/è´¨æ£ä¸ç¨ç« /æ£éªÂ·å¤æ ¸Â·æ¹åç¾åç空æå¡«Â·å¹³è¡æµéé¡¿å·å并·ä¸è½½åWordæå°ï¼è´¨æ£å详æ
æ£æµç»æTabå¯ææ ·åæ¥çåªè¯»æ£æµå¼æç»)", "roles": ["è´¨æ£å", "夿 ¸äºº", "å®¡æ ¸äºº"]}, |
| | | {"stage": "æ¥å", "action": "æ£éªç»ææåç»æ +æµéæ¹æ¬¡å½å
¥ï¼/indicator-result/report èååå端æå°æ£éªæ¥å(å«éæ ·å°ç¹/è¯ä¹¦ç¼å·/æ§è¡æ å/å¤å®ç»è®ºÂ·è´¨æ£ä¸ç¨ç« /夿 ¸Â·å®¡æ ¸ç¾ååºï¼å¤å®ç»è®ºå¸¦åºæ£éªç»æÂ·è´¨æ£ç« ç空çç« Â·æ å¹³è¡æµéæ¶å头称æµéå¼)ï¼/indicator-result/export-product-word 导åºäº§åæ£éªåWord(æ ææ¯ææ å·å¤å®ç»è®ºå¸¦åºæ£éªç»æÂ·è´¨æ£ç« /æ£éªÂ·å¤æ ¸Â·æ¹åç¾åç空æå¡«Â·å¹³è¡æµéé¡¿å·å并·ä¸è½½åWordæå°ï¼è´¨æ£å详æ
æ£æµç»æTabå¯ææ ·åæ¥çåªè¯»æ£æµå¼æç»)", "roles": ["è´¨æ£å", "夿 ¸äºº", "å®¡æ ¸äºº"]}, |
| | | {"stage": "ä¸åæ ¼", "action": "NCR: å¾
è¯å®¡âè¯å®¡âå¤ç½®(éè´§/æ¥åº/è¿å·¥/è®©æ¥æ¥æ¶/é级)âå
³é", "roles": ["è´¨éå·¥ç¨å¸"]}]}, |
| | | {"id": "warehouse", "name": "ä»å¨æµç¨", "mermaid": "mermaid/06-warehouse-flow.mmd", "color": "#7e6bd6", |
| | | "summary": "15 ç±»åæ®é©±å¨åºåå°è´¦(å
å
ç»ãåé)åå¨ï¼å
¨é¨ç»äºå¡æµæ°´ççï¼æ¯æè°æ¨å¨éãçç¹è°æ´ãæ¹æ¬¡/SN 追溯ãåºåå ç¨ä¸å级å»ç»ã线边èæåºè´åºåï¼å¯¹å¤ WmsStockApi ä¾ ERP æ¶åã", |
| | |
| | | {"key": "qc", "name": "è´¨é管ç", "color": "#e06c6c", "tag": "MES-QC", "flow": "quality", |
| | | "positioning": "å鿣éªé¸å£ + ä¸åæ ¼åéç¯å¤ç½®", |
| | | "problem": "æ¥æ/è¿ç¨/åºè´§/éè´§æ£éªæ ååï¼ä¸åæ ¼å¯è¿½æº¯å¤ç½®", |
| | | "features": ["IQC æ¥æ(å°è´§/å¤å)", "IPQC è¿ç¨(è卿¥å·¥)", "OQC åºè´§(èå¨éå®åºåº)", "RQC éè´§(èå¨éæ/å®å)", "è´¨æ£æ¹æ¡Â·ææ ·缺é·åº", "æ£æµç»æ:åæ ¼/ç¹é/éè´§/æ¥åº", "NCR:è¯å®¡âå¤ç½®(éè´§/æ¥åº/è¿å·¥/让æ¥/é级)âå
³é", "AI å¤å®å»ºè®®"], |
| | | "features": ["IQC æ¥æ(å°è´§/å¤å)", "IPQC è¿ç¨(è卿¥å·¥)", "OQC åºè´§(èå¨éå®åºåº)", "RQC éè´§(èå¨éæ/å®å)", "è´¨æ£æ¹æ¡Â·ææ ·缺é·åº", "æ£æµç»æ:IQC/IPQC/RQC åæ ¼Â·ç¹é·é货·æ¥åº / OQC 1å·2å·åºå", "NCR:è¯å®¡âå¤ç½®(éè´§/æ¥åº/è¿å·¥/让æ¥/é级)âå
³é", "AI å¤å®å»ºè®®"], |
| | | "objects": ["IQC", "IPQC", "OQC", "RQC", "è´¨æ£æ¹æ¡", "NCR", "缺é·è®°å½"], |
| | | "roles": ["è´¨æ£å(IQC/IPQC/OQC)", "è´¨éå·¥ç¨å¸"], |
| | | "upstream": ["ä»å¨(å°è´§)", "ç产(æ¥å·¥)", "éå®(åºåº)", "å®å(éè´§)"], "downstream": ["ä»å¨(åæ ¼å
¥åº/æ¥åºåºåº)", "ç产(NCRè¿å·¥)"], |
| | |
| | | {"name": "è系人", "module": "éå®ç®¡ç", "table": "crm_contact", "doc": "客æ·ä¸è系人ï¼ä¸åæºå¤å¯¹å¤", "upstream": ["客æ·"], "downstream": ["åæº"], "keywords": "è系人 contact"}, |
| | | {"name": "åæº", "module": "éå®ç®¡ç", "table": "crm_business", "doc": "é宿ºä¼ï¼DB é
ç½®å¼é¶æ®µæ¨è¿ï¼ç»ææ: èµ¢/è¾/æ æ", "upstream": ["客æ·"], "downstream": ["æ¥ä»·å", "åå"], "keywords": "åæº business èµ¢å è¾å é¶æ®µ"}, |
| | | {"name": "æ¥ä»·å", "module": "éå®ç®¡ç", "table": "crm_sale_quotation", "doc": "QTç¼å·ï¼é MDM ç©ææ¥ä»·ï¼AI OCR å½å
¥ï¼è稿â已转åå", "upstream": ["åæº"], "downstream": ["åå"], "keywords": "æ¥ä»· quotation QT"}, |
| | | {"name": "åå", "module": "éå®ç®¡ç", "table": "crm_contract", "doc": "HTç¼å·ï¼BPM 审æ¹(0è稿/10审æ¹ä¸/20éè¿/30驳å/40åæ¶/50ä½åº)ï¼éè¿åå¯çæéå®è®¢å", "upstream": ["æ¥ä»·å"], "downstream": ["éå®è®¢å", "忬¾è®¡å", "å¼ç¥¨"], "keywords": "åå contract 审æ¹"}, |
| | | {"name": "åå", "module": "éå®ç®¡ç", "table": "crm_contract", "doc": "HTç¼å·(æ°å¢/ç¼è¾åå¯èªå®ä¹ï¼çç©ºåæ°å¢èªå¨çæãç¼è¾ä¿æåç¼å·)ï¼BPM 审æ¹(0è稿/10审æ¹ä¸/20éè¿/30驳å/40åæ¶/50ä½åº)ï¼éè¿åå¯çæéå®è®¢å", "upstream": ["æ¥ä»·å"], "downstream": ["éå®è®¢å", "忬¾è®¡å", "å¼ç¥¨"], "keywords": "åå contract 审æ¹"}, |
| | | {"name": "å票", "module": "éå®ç®¡ç", "table": "crm_invoice", "doc": "KPç¼å·ï¼BPM 审æ¹ï¼ç´¯è®¡å¼ç¥¨â¤ååé¢ï¼éä»¶å¿
ä¼ ", "upstream": ["åå"], "downstream": ["忬¾"], "keywords": "å¼ç¥¨ å票 invoice"}, |
| | | {"name": "忬¾", "module": "éå®ç®¡ç", "table": "crm_receivable", "doc": "HKç¼å·ï¼å建å³å®¡æ¹ä¸(æå¨å®¡æ ¸)ï¼å¼ºå¶å
å¼ç¥¨ï¼éé¢åæ ¡éª", "upstream": ["åå", "å票"], "downstream": ["æ¶æ¬¾å(å
³è)"], "keywords": "忬¾ æ¶æ¬¾è®¡å receivable"}, |
| | | {"name": "éå®ç®æ ", "module": "éå®ç®¡ç", "table": "crm_sales_target", "doc": "å¹´/å£/æÃ个人/é¨é¨/产å维度çåå忬¾çç®æ ", "upstream": [], "downstream": ["ä¸ç»©ç»è®¡"], "keywords": "ç®æ target ä¸ç»©"}, |
| | |
| | | {"name": "å°è´§éç¥å", "module": "ä»å¨", "table": "mes_wm_arrival_notice", "doc": "éè´è®¢å确认æ¶è´§çæï¼è稿0âå¾
è´¨æ£2âå¾
å
¥åº3â宿4", "upstream": ["éè´è®¢å"], "downstream": ["IQC", "éè´å
¥åº"], "keywords": "å°è´§ æ¶è´§ arrival"}, |
| | | {"name": "éè´å
¥åºå", "module": "ä»å¨", "table": "mes_wm_item_receipt", "doc": "è稿0âå¾
䏿¶2âå¾
æ§è¡3â宿4ï¼å®æååºå+å¹¶åå ERP inCount/inStatus", "upstream": ["å°è´§éç¥"], "downstream": ["åºåå°è´¦", "éè´è®¢å(åå)"], "keywords": "éè´å
¥åº æ¶è´§å
¥åº receipt"}, |
| | | {"name": "çäº§é¢æå", "module": "ä»å¨", "table": "mes_wm_product_issue", "doc": "è稿0âå¾
æ£è´§2âå¾
æ§è¡3â宿4ï¼åºå-", "upstream": ["ç产工å"], "downstream": ["åºåå°è´¦"], "keywords": "颿 issue"}, |
| | | {"name": "éå®åºåºå", "module": "ä»å¨", "table": "mes_wm_product_sales", "doc": "åè´§éç¥å®¡æ ¸åçæï¼æäº¤âOQCæ£æµâæ£è´§âåè¿10âå¾
æ§è¡3â宿4ï¼ååéå®è®¢ååºåºæ°ä¸ç¶æ", "upstream": ["åè´§éç¥", "éå®è®¢å"], "downstream": ["åºåå°è´¦", "OQC"], "keywords": "éå®åºåº åè´§ åºåºå sales"}, |
| | | {"name": "éå®åºåºå", "module": "ä»å¨", "table": "mes_wm_product_sales", "doc": "åè´§éç¥å®¡æ ¸åçæï¼æäº¤âOQCæ£æµâæ£è´§âåè¿10âå¾
æ§è¡3â宿4ï¼ååéå®è®¢ååºåºæ°ä¸ç¶æï¼ä»»ä¸ OQC è¡å¤åºååæ´ååæ¶", "upstream": ["åè´§éç¥", "éå®è®¢å"], "downstream": ["åºåå°è´¦", "OQC"], "keywords": "éå®åºåº åè´§ åºåºå sales"}, |
| | | {"name": "éå®éè´§å", "module": "ä»å¨", "table": "mes_wm_return_sales", "doc": "è稿âå¾
æ£éª(RQC)âå¾
䏿¶âå¾
å
¥åºâ宿ï¼å®åä¸æå·¥ä¸¤æ¥æº", "upstream": ["å®åéè´§ç³è¯·"], "downstream": ["åºåå°è´¦", "RQC"], "keywords": "éå®éè´§ éè´§å
¥åº"}, |
| | | {"name": "ä¾åºåéè´§å", "module": "ä»å¨", "table": "mes_wm_return_vendor", "doc": "IQC ä¸åæ ¼éè´§åèµ·ï¼å¾
æ£è´§âå¾
æ§è¡â宿ï¼åºå-", "upstream": ["IQC"], "downstream": ["åºåå°è´¦", "éè´è®¢å(returnCount)"], "keywords": "ä¾åºåéè´§ éæ éè´§ vendor"}, |
| | | {"name": "è°æ¨å", "module": "ä»å¨", "table": "mes_wm_transfer", "doc": "å
é¨/å¤é¨è°æ¨ï¼æå¯¹ MOVE_OUT+MOVE_IN äºå¡ï¼å¨éæ°é", "upstream": [], "downstream": ["åºåå°è´¦"], "keywords": "è°æ¨ ç§»åº transfer"}, |
| | |
| | | {"name": "åºåå°è´¦", "module": "ä»å¨", "table": "mes_wm_material_stock", "doc": "ç©æÃä»åºÃåºåºÃåºä½Ãæ¹æ¬¡Ãä¾åºåå
å
ç»ï¼æ°é/å»ç»/å ç¨/å¨éåé", "upstream": ["å
¨é¨å
¥åºå"], "downstream": ["å
¨é¨åºåºå", "äºå¡æµæ°´"], "keywords": "åºå å°è´¦ stock å¯ç¨é"}, |
| | | {"name": "æ¹æ¬¡", "module": "ä»å¨", "table": "mes_wm_batch", "doc": "å
³èç©æ/å·¥å/ä¾åºå/客æ·/è´¨éç¶æï¼SN ç 嫿¹æ¬¡ uuidï¼æ¡ç æ¯æ18ç§ä¸å¡å¯¹è±¡", "upstream": ["å
¥åºåæ®"], "downstream": ["åºåå°è´¦"], "keywords": "æ¹æ¬¡ batch SN æ¡ç 追溯"}, |
| | | {"name": "IQCæ¥ææ£éª", "module": "è´¨é", "table": "mes_qc_iqc", "doc": "å°è´§éç¥/å¤åå
¥åºè§¦åï¼è稿0â宿4ï¼ç»è®ºå忥æºåæ®", "upstream": ["å°è´§éç¥", "å¤åå
¥åº"], "downstream": ["éè´å
¥åº", "ä¾åºåéè´§", "NCR"], "keywords": "IQC æ¥ææ£éª"}, |
| | | {"name": "IPQCè¿ç¨æ£éª", "module": "è´¨é", "table": "mes_qc_ipqc", "doc": "æ¥å·¥è´¨æ£å·¥åºäº§åºè¡è§¦åï¼å®æåè°æ¨è¿æ¥å·¥ä¸äº§åºå
¥åº", "upstream": ["æ¥å·¥"], "downstream": ["产åºå
¥åº", "NCR"], "keywords": "IPQC è¿ç¨æ£éª å·¡æ£"}, |
| | | {"name": "OQCåºè´§æ£éª", "module": "è´¨é", "table": "mes_qc_oqc", "doc": "éå®åºåºæäº¤è§¦åï¼å®ææ¨è¿åºåºåå¾
æ£è´§", "upstream": ["éå®åºåºå"], "downstream": ["éå®åºåºå(æ¨è¿)"], "keywords": "OQC åºè´§æ£éª åºåæ£éª"}, |
| | | {"name": "IPQCè¿ç¨æ£éª", "module": "è´¨é", "table": "mes_qc_ipqc", "doc": "æ¥å·¥è´¨æ£å·¥åºäº§åºè¡è§¦åï¼å®æåè°æ¨è¿æ¥å·¥ä¸äº§åºå
¥åºï¼è¡¨å¤´=æ¥æºåæ®(åªè¯»)+产åç©æ(MDM,å¿
å¡«)+æ¹å·(å¿
å¡«)+æ°é+æ£éªä¿¡æ¯ï¼å·²å»æç产订å/å·¥ä½/ç产任å¡/å·¥åº", "upstream": ["æ¥å·¥"], "downstream": ["产åºå
¥åº", "NCR"], "keywords": "IPQC è¿ç¨æ£éª å·¡æ£ æ¹å·"}, |
| | | {"name": "OQCåºè´§æ£éª", "module": "è´¨é", "table": "mes_qc_oqc", "doc": "éå®åºåºæäº¤è§¦åï¼è稿0â宿4ï¼æ£æµç»ææäº§åç级å¤å®(1å/2å/åºåï¼å¿
å¡«)ï¼1å/2åå¤è¡åæ ¼å¹¶æ¨è¿åºåºåå¾
æ£è´§ï¼åºåå¤è¡ä¸åæ ¼å¹¶åæ¶éå®åºåºåï¼åè´§æ°é/åºè´§æ¥æå¯ç©º", "upstream": ["éå®åºåºå"], "downstream": ["éå®åºåºå(æ¨è¿æåæ¶)"], "keywords": "OQC åºè´§æ£éª åºåæ£éª 1å 2å åºå"}, |
| | | {"name": "RQCéè´§æ£éª", "module": "è´¨é", "table": "mes_qc_rqc", "doc": "ç产éæ/éå®éè´§/å®åé货触åï¼ç»è®ºåè°å®åï¼åç±»æ£éªå忝æéæ ·å°ç¹/è¯ä¹¦ç¼å·/æ§è¡æ å表头ä¸å¤æ ¸Â·å®¡æ ¸äººï¼å¹¶å¯æå°æ£éªæ¥å", "upstream": ["éæ", "éè´§"], "downstream": ["éè´§å
¥åº", "å®ååè°", "æ£éªæ¥åæå°"], "keywords": "RQC éè´§æ£éª"}, |
| | | {"name": "æ£éªææ ", "module": "è´¨é", "table": "mes_qc_indicator", "doc": "æ¯æä¸¤çº§åç»æ (itemTypeå½å
¥/åç»+parentId)ãå
¬å¼ææ¬å±ç¤ºãå使æ¬ãå级æåºï¼åç»é¡¹ä¸å½å¼ï¼æå项ç¦å ï¼åå±çº§åç§°å¯éå¤", "upstream": [], "downstream": ["è´¨æ£æ¹æ¡", "æ£éªæ¥åæå°"], "keywords": "æ£éªææ indicator åç» å
¬å¼ åå·¥"}, |
| | | {"name": "æ£éªæ¥åæå°", "module": "è´¨é", "table": "mes_qc_indicator_result_detail", "doc": "åå·¥æ¥åèå¼ï¼å¹³è¡æµéæ¹æ¬¡(measure_no)+åç»ç©éµ+å
¬å¼å+ç¾ååºï¼/mes/qc/indicator-result/report èåï¼å端æµè§å¨æå°", "upstream": ["IQCæ¥ææ£éª", "IPQCè¿ç¨æ£éª", "OQCåºè´§æ£éª", "RQCéè´§æ£éª", "æ£éªææ "], "downstream": [], "keywords": "æå° æ¥å æµéæ¹æ¬¡ ç¾å æ£ä¸é GB/T6027"}, |
| | |
| | | }, |
| | | { |
| | | "name": "ç产é£é©é¢æµ", |
| | | "flow": "IPQC 缺é·ç+设å¤ä¿å
»ç¹æ£+ç©æå¯ç¨ç<20%+å
³é®å·¥åº â chat â 综åé£é©+å ç´ ", |
| | | "flow": "设å¤ä¿å
»ç¹æ£+ç©æå¯ç¨ç<20%+å
³é®å·¥åº â chat â 综åé£é©+å ç´ ", |
| | | "callsApis": [ |
| | | "MdmItemApi" |
| | | ] |
| | |
| | | {"key": "qc", "name": "è´¨é管ç", "color": "#e06c6c", "tag": "MES-QC", "flow": "quality", |
| | | "positioning": "å鿣éªé¸å£ + ä¸åæ ¼åéç¯å¤ç½®", |
| | | "problem": "æ¥æ/è¿ç¨/åºè´§/éè´§æ£éªæ ååï¼ä¸åæ ¼å¯è¿½æº¯å¤ç½®", |
| | | "features": ["IQC æ¥æ(å°è´§/å¤å)", "IPQC è¿ç¨(è卿¥å·¥)", "OQC åºè´§(èå¨éå®åºåº)", "RQC éè´§(èå¨éæ/å®å)", "è´¨æ£æ¹æ¡Â·ææ ·缺é·åº", "æ£æµç»æ:åæ ¼/ç¹é/éè´§/æ¥åº", "NCR:è¯å®¡âå¤ç½®(éè´§/æ¥åº/è¿å·¥/让æ¥/é级)âå
³é", "AI å¤å®å»ºè®®"], |
| | | "features": ["IQC æ¥æ(å°è´§/å¤å)", "IPQC è¿ç¨(è卿¥å·¥)", "OQC åºè´§(èå¨éå®åºåº)", "RQC éè´§(èå¨éæ/å®å)", "è´¨æ£æ¹æ¡Â·ææ ·缺é·åº", "æ£æµç»æ:IQC/IPQC/RQC åæ ¼Â·ç¹é·é货·æ¥åº / OQC 1å·2å·åºå", "NCR:è¯å®¡âå¤ç½®(éè´§/æ¥åº/è¿å·¥/让æ¥/é级)âå
³é", "AI å¤å®å»ºè®®"], |
| | | "objects": ["IQC", "IPQC", "OQC", "RQC", "è´¨æ£æ¹æ¡", "NCR", "缺é·è®°å½"], |
| | | "roles": ["è´¨æ£å(IQC/IPQC/OQC)", "è´¨éå·¥ç¨å¸"], |
| | | "upstream": ["ä»å¨(å°è´§)", "ç产(æ¥å·¥)", "éå®(åºåº)", "å®å(éè´§)"], "downstream": ["ä»å¨(åæ ¼å
¥åº/æ¥åºåºåº)", "ç产(NCRè¿å·¥)"], |
| | |
| | | {"name": "è系人", "module": "éå®ç®¡ç", "table": "crm_contact", "doc": "客æ·ä¸è系人ï¼ä¸åæºå¤å¯¹å¤", "upstream": ["客æ·"], "downstream": ["åæº"], "keywords": "è系人 contact"}, |
| | | {"name": "åæº", "module": "éå®ç®¡ç", "table": "crm_business", "doc": "é宿ºä¼ï¼DB é
ç½®å¼é¶æ®µæ¨è¿ï¼ç»ææ: èµ¢/è¾/æ æ", "upstream": ["客æ·"], "downstream": ["æ¥ä»·å", "åå"], "keywords": "åæº business èµ¢å è¾å é¶æ®µ"}, |
| | | {"name": "æ¥ä»·å", "module": "éå®ç®¡ç", "table": "crm_sale_quotation", "doc": "QTç¼å·ï¼é MDM ç©ææ¥ä»·ï¼AI OCR å½å
¥ï¼è稿â已转åå", "upstream": ["åæº"], "downstream": ["åå"], "keywords": "æ¥ä»· quotation QT"}, |
| | | {"name": "åå", "module": "éå®ç®¡ç", "table": "crm_contract", "doc": "HTç¼å·ï¼BPM 审æ¹(0è稿/10审æ¹ä¸/20éè¿/30驳å/40åæ¶/50ä½åº)ï¼éè¿åå¯çæéå®è®¢å", "upstream": ["æ¥ä»·å"], "downstream": ["éå®è®¢å", "忬¾è®¡å", "å¼ç¥¨"], "keywords": "åå contract 审æ¹"}, |
| | | {"name": "åå", "module": "éå®ç®¡ç", "table": "crm_contract", "doc": "HTç¼å·(æ°å¢/ç¼è¾åå¯èªå®ä¹ï¼çç©ºåæ°å¢èªå¨çæãç¼è¾ä¿æåç¼å·)ï¼BPM 审æ¹(0è稿/10审æ¹ä¸/20éè¿/30驳å/40åæ¶/50ä½åº)ï¼éè¿åå¯çæéå®è®¢å", "upstream": ["æ¥ä»·å"], "downstream": ["éå®è®¢å", "忬¾è®¡å", "å¼ç¥¨"], "keywords": "åå contract 审æ¹"}, |
| | | {"name": "å票", "module": "éå®ç®¡ç", "table": "crm_invoice", "doc": "KPç¼å·ï¼BPM 审æ¹ï¼ç´¯è®¡å¼ç¥¨â¤ååé¢ï¼éä»¶å¿
ä¼ ", "upstream": ["åå"], "downstream": ["忬¾"], "keywords": "å¼ç¥¨ å票 invoice"}, |
| | | {"name": "忬¾", "module": "éå®ç®¡ç", "table": "crm_receivable", "doc": "HKç¼å·ï¼å建å³å®¡æ¹ä¸(æå¨å®¡æ ¸)ï¼å¼ºå¶å
å¼ç¥¨ï¼éé¢åæ ¡éª", "upstream": ["åå", "å票"], "downstream": ["æ¶æ¬¾å(å
³è)"], "keywords": "忬¾ æ¶æ¬¾è®¡å receivable"}, |
| | | {"name": "éå®ç®æ ", "module": "éå®ç®¡ç", "table": "crm_sales_target", "doc": "å¹´/å£/æÃ个人/é¨é¨/产å维度çåå忬¾çç®æ ", "upstream": [], "downstream": ["ä¸ç»©ç»è®¡"], "keywords": "ç®æ target ä¸ç»©"}, |
| | |
| | | {"name": "å°è´§éç¥å", "module": "ä»å¨", "table": "mes_wm_arrival_notice", "doc": "éè´è®¢å确认æ¶è´§çæï¼è稿0âå¾
è´¨æ£2âå¾
å
¥åº3â宿4", "upstream": ["éè´è®¢å"], "downstream": ["IQC", "éè´å
¥åº"], "keywords": "å°è´§ æ¶è´§ arrival"}, |
| | | {"name": "éè´å
¥åºå", "module": "ä»å¨", "table": "mes_wm_item_receipt", "doc": "è稿0âå¾
䏿¶2âå¾
æ§è¡3â宿4ï¼å®æååºå+å¹¶åå ERP inCount/inStatus", "upstream": ["å°è´§éç¥"], "downstream": ["åºåå°è´¦", "éè´è®¢å(åå)"], "keywords": "éè´å
¥åº æ¶è´§å
¥åº receipt"}, |
| | | {"name": "çäº§é¢æå", "module": "ä»å¨", "table": "mes_wm_product_issue", "doc": "è稿0âå¾
æ£è´§2âå¾
æ§è¡3â宿4ï¼åºå-", "upstream": ["ç产工å"], "downstream": ["åºåå°è´¦"], "keywords": "颿 issue"}, |
| | | {"name": "éå®åºåºå", "module": "ä»å¨", "table": "mes_wm_product_sales", "doc": "åè´§éç¥å®¡æ ¸åçæï¼æäº¤âOQCæ£æµâæ£è´§âåè¿10âå¾
æ§è¡3â宿4ï¼ååéå®è®¢ååºåºæ°ä¸ç¶æ", "upstream": ["åè´§éç¥", "éå®è®¢å"], "downstream": ["åºåå°è´¦", "OQC"], "keywords": "éå®åºåº åè´§ åºåºå sales"}, |
| | | {"name": "éå®åºåºå", "module": "ä»å¨", "table": "mes_wm_product_sales", "doc": "åè´§éç¥å®¡æ ¸åçæï¼æäº¤âOQCæ£æµâæ£è´§âåè¿10âå¾
æ§è¡3â宿4ï¼ååéå®è®¢ååºåºæ°ä¸ç¶æï¼ä»»ä¸ OQC è¡å¤åºååæ´ååæ¶", "upstream": ["åè´§éç¥", "éå®è®¢å"], "downstream": ["åºåå°è´¦", "OQC"], "keywords": "éå®åºåº åè´§ åºåºå sales"}, |
| | | {"name": "éå®éè´§å", "module": "ä»å¨", "table": "mes_wm_return_sales", "doc": "è稿âå¾
æ£éª(RQC)âå¾
䏿¶âå¾
å
¥åºâ宿ï¼å®åä¸æå·¥ä¸¤æ¥æº", "upstream": ["å®åéè´§ç³è¯·"], "downstream": ["åºåå°è´¦", "RQC"], "keywords": "éå®éè´§ éè´§å
¥åº"}, |
| | | {"name": "ä¾åºåéè´§å", "module": "ä»å¨", "table": "mes_wm_return_vendor", "doc": "IQC ä¸åæ ¼éè´§åèµ·ï¼å¾
æ£è´§âå¾
æ§è¡â宿ï¼åºå-", "upstream": ["IQC"], "downstream": ["åºåå°è´¦", "éè´è®¢å(returnCount)"], "keywords": "ä¾åºåéè´§ éæ éè´§ vendor"}, |
| | | {"name": "è°æ¨å", "module": "ä»å¨", "table": "mes_wm_transfer", "doc": "å
é¨/å¤é¨è°æ¨ï¼æå¯¹ MOVE_OUT+MOVE_IN äºå¡ï¼å¨éæ°é", "upstream": [], "downstream": ["åºåå°è´¦"], "keywords": "è°æ¨ ç§»åº transfer"}, |
| | |
| | | {"name": "åºåå°è´¦", "module": "ä»å¨", "table": "mes_wm_material_stock", "doc": "ç©æÃä»åºÃåºåºÃåºä½Ãæ¹æ¬¡Ãä¾åºåå
å
ç»ï¼æ°é/å»ç»/å ç¨/å¨éåé", "upstream": ["å
¨é¨å
¥åºå"], "downstream": ["å
¨é¨åºåºå", "äºå¡æµæ°´"], "keywords": "åºå å°è´¦ stock å¯ç¨é"}, |
| | | {"name": "æ¹æ¬¡", "module": "ä»å¨", "table": "mes_wm_batch", "doc": "å
³èç©æ/å·¥å/ä¾åºå/客æ·/è´¨éç¶æï¼SN ç 嫿¹æ¬¡ uuidï¼æ¡ç æ¯æ18ç§ä¸å¡å¯¹è±¡", "upstream": ["å
¥åºåæ®"], "downstream": ["åºåå°è´¦"], "keywords": "æ¹æ¬¡ batch SN æ¡ç 追溯"}, |
| | | {"name": "IQCæ¥ææ£éª", "module": "è´¨é", "table": "mes_qc_iqc", "doc": "å°è´§éç¥/å¤åå
¥åºè§¦åï¼è稿0â宿4ï¼ç»è®ºå忥æºåæ®", "upstream": ["å°è´§éç¥", "å¤åå
¥åº"], "downstream": ["éè´å
¥åº", "ä¾åºåéè´§", "NCR"], "keywords": "IQC æ¥ææ£éª"}, |
| | | {"name": "IPQCè¿ç¨æ£éª", "module": "è´¨é", "table": "mes_qc_ipqc", "doc": "æ¥å·¥è´¨æ£å·¥åºäº§åºè¡è§¦åï¼å®æåè°æ¨è¿æ¥å·¥ä¸äº§åºå
¥åº", "upstream": ["æ¥å·¥"], "downstream": ["产åºå
¥åº", "NCR"], "keywords": "IPQC è¿ç¨æ£éª å·¡æ£"}, |
| | | {"name": "OQCåºè´§æ£éª", "module": "è´¨é", "table": "mes_qc_oqc", "doc": "éå®åºåºæäº¤è§¦åï¼å®ææ¨è¿åºåºåå¾
æ£è´§", "upstream": ["éå®åºåºå"], "downstream": ["éå®åºåºå(æ¨è¿)"], "keywords": "OQC åºè´§æ£éª åºåæ£éª"}, |
| | | {"name": "IPQCè¿ç¨æ£éª", "module": "è´¨é", "table": "mes_qc_ipqc", "doc": "æ¥å·¥è´¨æ£å·¥åºäº§åºè¡è§¦åï¼å®æåè°æ¨è¿æ¥å·¥ä¸äº§åºå
¥åºï¼è¡¨å¤´=æ¥æºåæ®(åªè¯»)+产åç©æ(MDM,å¿
å¡«)+æ¹å·(å¿
å¡«)+æ°é+æ£éªä¿¡æ¯ï¼å·²å»æç产订å/å·¥ä½/ç产任å¡/å·¥åº", "upstream": ["æ¥å·¥"], "downstream": ["产åºå
¥åº", "NCR"], "keywords": "IPQC è¿ç¨æ£éª å·¡æ£ æ¹å·"}, |
| | | {"name": "OQCåºè´§æ£éª", "module": "è´¨é", "table": "mes_qc_oqc", "doc": "éå®åºåºæäº¤è§¦åï¼è稿0â宿4ï¼æ£æµç»ææäº§åç级å¤å®(1å/2å/åºåï¼å¿
å¡«)ï¼1å/2åå¤è¡åæ ¼å¹¶æ¨è¿åºåºåå¾
æ£è´§ï¼åºåå¤è¡ä¸åæ ¼å¹¶åæ¶éå®åºåºåï¼åè´§æ°é/åºè´§æ¥æå¯ç©º", "upstream": ["éå®åºåºå"], "downstream": ["éå®åºåºå(æ¨è¿æåæ¶)"], "keywords": "OQC åºè´§æ£éª åºåæ£éª 1å 2å åºå"}, |
| | | {"name": "RQCéè´§æ£éª", "module": "è´¨é", "table": "mes_qc_rqc", "doc": "ç产éæ/éå®éè´§/å®åé货触åï¼ç»è®ºåè°å®åï¼åç±»æ£éªå忝æéæ ·å°ç¹/è¯ä¹¦ç¼å·/æ§è¡æ å表头ä¸å¤æ ¸Â·å®¡æ ¸äººï¼å¹¶å¯æå°æ£éªæ¥å", "upstream": ["éæ", "éè´§"], "downstream": ["éè´§å
¥åº", "å®ååè°", "æ£éªæ¥åæå°"], "keywords": "RQC éè´§æ£éª"}, |
| | | {"name": "æ£éªææ ", "module": "è´¨é", "table": "mes_qc_indicator", "doc": "æ¯æä¸¤çº§åç»æ (itemTypeå½å
¥/åç»+parentId)ãå
¬å¼ææ¬å±ç¤ºãå使æ¬ãå级æåºï¼åç»é¡¹ä¸å½å¼ï¼æå项ç¦å ï¼åå±çº§åç§°å¯éå¤", "upstream": [], "downstream": ["è´¨æ£æ¹æ¡", "æ£éªæ¥åæå°"], "keywords": "æ£éªææ indicator åç» å
¬å¼ åå·¥"}, |
| | | {"name": "æ£éªæ¥åæå°", "module": "è´¨é", "table": "mes_qc_indicator_result_detail", "doc": "åå·¥æ¥åèå¼ï¼å¹³è¡æµéæ¹æ¬¡(measure_no)+åç»ç©éµ+å
¬å¼å+ç¾ååºï¼/mes/qc/indicator-result/report èåï¼å端æµè§å¨æå°ï¼å¦æäº§åæ£éªåWordå¯¼åº /mes/qc/indicator-result/export-product-wordï¼çº¸è´¨æ£éªåçå¼ï¼æ ææ¯ææ åï¼å¤å®ç»è®º/è´¨æ£ä¸ç¨ç« ç空æå¡«ï¼å¹³è¡æµéé¡¿å·åå¹¶ï¼ç产åä½åæ»ãç产æ¶é´=åæ®å建æ¶é´ï¼ä¸è½½åWordæå°ï¼", "upstream": ["IQCæ¥ææ£éª", "IPQCè¿ç¨æ£éª", "OQCåºè´§æ£éª", "RQCéè´§æ£éª", "æ£éªææ "], "downstream": [], "keywords": "æå° æ¥å æµéæ¹æ¬¡ ç¾å æ£ä¸é GB/T6027 Word äº§åæ£éªå"}, |
| | | {"name": "æ£éªæ¥åæå°", "module": "è´¨é", "table": "mes_qc_indicator_result_detail", "doc": "åå·¥æ¥åèå¼ï¼å¹³è¡æµéæ¹æ¬¡(measure_no)+åç»ç©éµ+å
¬å¼å+ç¾ååºï¼/mes/qc/indicator-result/report èåï¼å端æµè§å¨æå°", "upstream": ["IQCæ¥ææ£éª", "IPQCè¿ç¨æ£éª", "OQCåºè´§æ£éª", "RQCéè´§æ£éª", "æ£éªææ "], "downstream": [], "keywords": "æå° æ¥å æµéæ¹æ¬¡ ç¾å æ£ä¸é GB/T6027"}, |
| | | {"name": "NCRä¸åæ ¼å", "module": "è´¨é", "table": "mes_qc_ncr", "doc": "å¾
è¯å®¡0âå·²è¯å®¡6âå·²å¤ç½®7âå·²å
³é8ï¼å¤ç½®:éè´§/æ¥åº/è¿å·¥/è®©æ¥æ¥æ¶/é级", "upstream": ["IQC/IPQC/OQC/RQC"], "downstream": ["éè´§/æ¥åº/è¿å·¥(å°è´¦)"], "keywords": "NCR ä¸åæ ¼ å¤ç½® ç¹é æ¥åº"}, |
| | | {"name": "设å¤", "module": "设å¤", "table": "mes_dv_machinery", "doc": "å°è´¦ç¶æ:åæº/ç产ä¸/ä¿å
»ä¸ï¼ç¹æ£Â·ä¿å
»Â·ç»´ä¿®å·¥åï¼AI é£é©é¢æµæ¶è´¹å
¶æ°æ®", "upstream": [], "downstream": ["ç¹æ£", "ç»´ä¿®", "ç产é£é©é¢æµ"], "keywords": "è®¾å¤ ç¹æ£ ä¿å
» ç»´ä¿® machinery"}, |
| | | {"name": "å®åå·¥å", "module": "å®å", "table": "after_sale_ticket", "doc": "è稿0âå¤çä¸10âå¾
å
¥åº30âå¾
鿬¾40âå®ç»50âå
³é60/åæ¶99ï¼å¤å®:ä¸è¬/ç»´ä¿®/éè´§", "upstream": ["客æ·åé¦(人工å½å
¥)"], "downstream": ["维修记å½", "éè´§ç³è¯·"], "keywords": "å®å å·¥å ticket ç»´ä¿®"}, |
| | |
| | | {"stage": "èå¨", "action": "审æ¹éè¿æå·¥åºæ è®°: åå²âèªå¨ç©ææ¶èæ£çº¿è¾¹åº(å
许è´åºå)ï¼è´¨æ£â产åºå¾
æ£è¡ç IPQCï¼å
³é®éæ£âç´æ¥äº§åºå
¥åº", "roles": ["ç³»ç»èªå¨"]}, |
| | | {"stage": "å®å·¥", "action": "ä»
æ«éå·¥åºååå·¥åå·²ç产æ°éï¼è¾¾æ èªå¨å®æï¼MPS ç´¯è®¡å¤æå®æå¹¶åäºä»¶ç»éå®è®¢å", "roles": ["ç³»ç»èªå¨"]}]}, |
| | | {"id": "quality", "name": "è´¨éæµç¨", "mermaid": "mermaid/05-quality-flow.mmd", "color": "#e06c6c", |
| | | "summary": "å鿣éªé¸å£(IQC/IPQC/OQC/RQCï¼äºæ 0â4) + å¤å®åæ(åæ ¼/ç¹é/éè´§/æ¥åº) + NCR è¯å®¡å¤ç½®å
³éï¼AI æä¾å¤å®å»ºè®®ï¼NCR å½åä»
å°è´¦ä¸è§¦åè¿å·¥åãæ¯æåå·¥æ¥åèå¼ï¼åç»ææ æ +å
¬å¼ææ¬+å¹³è¡æµéæ¹æ¬¡+éæ ·è¡¨å¤´+ç¾ååºï¼æµè§å¨æå°æ£éªæ¥åï¼å¹¶å¯å¯¼åºäº§åæ£éªå Wordï¼çº¸è´¨çå¼ï¼å¤å®ç»è®º/è´¨æ£ç« /æ£éªÂ·å¤æ ¸Â·æ¹åç¾åç空æå¡«ï¼Word æå°ï¼ã", |
| | | "summary": "å鿣éªé¸å£(IQC/IPQC/OQC/RQCï¼äºæ 0â4) + å¤å®åæ(åæ ¼/ç¹é/éè´§/æ¥åºï¼OQC æ¹æäº§åç级 1å/2å/åºåï¼ä»
åºåå¤ä¸åæ ¼) + NCR è¯å®¡å¤ç½®å
³éï¼AI æä¾å¤å®å»ºè®®ï¼NCR å½åä»
å°è´¦ä¸è§¦åè¿å·¥åãæ¯æåå·¥æ¥åèå¼ï¼åç»ææ æ +å
¬å¼ææ¬+å¹³è¡æµéæ¹æ¬¡+éæ ·è¡¨å¤´+ç¾ååºï¼æµè§å¨æå°æ£éªæ¥åï¼å¹¶å¯å¯¼åºäº§åæ£éªå Wordï¼çº¸è´¨æ£éªåçå¼ï¼å¤å®ç»è®º/è´¨æ£ç« /æ£éªÂ·å¤æ ¸Â·æ¹åç¾åç空æå¡«ï¼Word æå°ï¼ã", |
| | | "steps": [ |
| | | {"stage": "æ¥æ", "action": "å°è´§éç¥/å¤åå
¥åºâIQCï¼ç»è®ºå忍è¿å¾
å
¥åºæè§¦åéè´§", "roles": ["IQC è´¨æ£å"]}, |
| | | {"stage": "è¿ç¨", "action": "æ¥å·¥è´¨æ£å·¥åºäº§åºè¡âIPQCï¼åæ ¼æè¡å
¥åºãä¸åæ ¼çæ NCR", "roles": ["IPQC è´¨æ£å"]}, |
| | | {"stage": "åºè´§", "action": "éå®åºåºæäº¤âOQCï¼å®æååºåºåè¿å
¥å¾
æ£è´§", "roles": ["OQC è´¨æ£å"]}, |
| | | {"stage": "åºè´§", "action": "éå®åºåºæäº¤âOQC(æ£æµç»ææäº§åç级 1å/2å/åºåå¿
å¡«ï¼1å/2åå¤è¡åæ ¼ï¼åºåå¤è¡ä¸åæ ¼)ï¼å
¨é¨åæ ¼ååºåºåè¿å
¥å¾
æ£è´§ï¼åºç°åºååæ´ååæ¶", "roles": ["OQC è´¨æ£å"]}, |
| | | {"stage": "éè´§", "action": "éæ/éå®éè´§/å®åéè´§âRQCï¼ç»è®ºåè°åæ®ä¸å®å", "roles": ["RQC è´¨æ£å"]}, |
| | | {"stage": "æ¥å", "action": "æ£éªç»ææåç»æ +æµéæ¹æ¬¡å½å
¥ï¼/indicator-result/report èååå端æå°æ£éªæ¥å(å«éæ ·å°ç¹/è¯ä¹¦ç¼å·/æ§è¡æ å/夿 ¸Â·å®¡æ ¸ç¾ååº)ï¼/indicator-result/export-product-word 导åºäº§åæ£éªåWord(æ ææ¯ææ å·å¤å®ç»è®º/è´¨æ£ç« /æ£éªÂ·å¤æ ¸Â·æ¹åç¾åç空æå¡«Â·Wordæå°ï¼è¯¦æ
æ£æµç»æTabå¯ææ ·åæ¥çåªè¯»æç»)", "roles": ["è´¨æ£å", "夿 ¸äºº", "å®¡æ ¸äºº"]}, |
| | | {"stage": "æ¥å", "action": "æ£éªç»ææåç»æ +æµéæ¹æ¬¡å½å
¥ï¼/indicator-result/report èååå端æå°æ£éªæ¥å(å«éæ ·å°ç¹/è¯ä¹¦ç¼å·/æ§è¡æ å/å¤å®ç»è®ºÂ·è´¨æ£ä¸ç¨ç« /夿 ¸Â·å®¡æ ¸ç¾ååºï¼å¤å®ç»è®ºå¸¦åºæ£éªç»æÂ·è´¨æ£ç« ç空çç« Â·æ å¹³è¡æµéæ¶å头称æµéå¼)ï¼/indicator-result/export-product-word 导åºäº§åæ£éªåWord(æ ææ¯ææ å·å¤å®ç»è®ºå¸¦åºæ£éªç»æÂ·è´¨æ£ç« /æ£éªÂ·å¤æ ¸Â·æ¹åç¾åç空æå¡«Â·å¹³è¡æµéé¡¿å·å并·ä¸è½½åWordæå°ï¼è´¨æ£å详æ
æ£æµç»æTabå¯ææ ·åæ¥çåªè¯»æ£æµå¼æç»)", "roles": ["è´¨æ£å", "夿 ¸äºº", "å®¡æ ¸äºº"]}, |
| | | {"stage": "ä¸åæ ¼", "action": "NCR: å¾
è¯å®¡âè¯å®¡âå¤ç½®(éè´§/æ¥åº/è¿å·¥/è®©æ¥æ¥æ¶/é级)âå
³é", "roles": ["è´¨éå·¥ç¨å¸"]}]}, |
| | | {"id": "warehouse", "name": "ä»å¨æµç¨", "mermaid": "mermaid/06-warehouse-flow.mmd", "color": "#7e6bd6", |
| | | "summary": "15 ç±»åæ®é©±å¨åºåå°è´¦(å
å
ç»ãåé)åå¨ï¼å
¨é¨ç»äºå¡æµæ°´ççï¼æ¯æè°æ¨å¨éãçç¹è°æ´ãæ¹æ¬¡/SN 追溯ãåºåå ç¨ä¸å级å»ç»ã线边èæåºè´åºåï¼å¯¹å¤ WmsStockApi ä¾ ERP æ¶åã", |
| | |
| | | T4[ç产éæå æ éå®éè´§å æ å®åéè´§] --> A4[RQC éè´§æ£éªÂ·è稿0â宿4] |
| | | A1 --> R{æ£éªå¤å® MesQcCheckResultEnum} |
| | | A2 --> R |
| | | A3 --> R |
| | | A4 --> R |
| | | R -->|1 åæ ¼| Q1[å
许å
¥åºÂ·å忥æºåæ®æ¨è¿ç¶æ] |
| | | R -->|2 ç¹é| Q2[å
许å
¥åºÂ·å¹¶çæNCRçç] |
| | | R -->|3 ä¸åæ ¼éè´§| Q3[çæNCR·走ä¾åºåéè´§æéå®éè´§] |
| | | R -->|4 ä¸åæ ¼æ¥åº| Q4[çæNCR·走æ¥åºåºåº] |
| | | A3 --> R2{åºè´§å¤å® MesQcOqcCheckResultEnum·å¿
å¡«} |
| | | R2 -->|1å/2å| S1[åºåºè¡å¤åæ ¼Â·æ¨è¿åºåºåå¾
æ£è´§] |
| | | R2 -->|åºå| S2[åºåºè¡å¤ä¸åæ ¼Â·åæ¶éå®åºåºå] |
| | | A3 -.-> N5[表头:åè´§æ°é/åºè´§æ¥æéå¿
å¡«Â·æ£æµç»æå¿
å¡«] |
| | | A2 -.-> N6[表头:æ¥æºåæ®åªè¯»Â·äº§åç©æ(MDM)å¿
填·æ¹å·å¿
å¡«Â·å·²å»æç产订å/å·¥ä½/ç产任å¡/å·¥åº] |
| | | A2 -->|åæ ¼æ°é| Q5[æ¥å·¥è½¬å®æÂ·äº§åºæè¡å
¥åº] |
| | | A3 -->|宿| Q6[éå®åºåºåæ¨è¿å¾
æ£è´§] |
| | | A4 -->|宿| Q7[éè´§åæ¨è¿ä¸æ¶æå
¥åºÂ·å®ååè°ç»è®º] |
| | | N1[NCR å¾
è¯å®¡0] -->|è¯å®¡| N2[å·²è¯å®¡6] |
| | | N2 -->|å¤ç½®æ¹å¼:éè´§1æ¥åº2è¿å·¥3è®©æ¥æ¥æ¶4é级使ç¨5| N3[å·²å¤ç½®7] |
| | | N3 -->|å
³é| N4[å·²å
³é8] |
| | | Q8[æ¯ææ°æ®:è´¨æ£æ¹æ¡Â·æ£éªææ ·缺é·åºÂ·ææ ç»æ] --- A1 |
| | | Q9[åå·¥æ¥åå¢å¼º:ææ åç»æ +å
¬å¼ææ¬Â·å¹³è¡æµéæ¹æ¬¡Â·éæ ·å°ç¹/è¯ä¹¦ç¼å·/æ§è¡æ åè¡¨å¤´Â·å¤æ ¸äºº/å®¡æ ¸äºº] --- Q8 |
| | | A1 & A2 & A3 & A4 --> P1[æ£éªæ¥ååæå°Â·å端æµè§å¨æå°Â·å¤å®ç»è®ºå¸¦åºæ£éªç»æ+è´¨æ£ä¸ç¨ç« ç空çç« +ç¾ååºÂ·æ å¹³è¡æµéæ¶å头称æµéå¼] |
| | | A1 & A2 & A3 & A4 --> P2[äº§åæ£éªåWord导åºÂ·export-product-wordÂ·æ ææ¯ææ å·å¤å®ç»è®ºå¸¦åºæ£éªç»æ/è´¨æ£ç« ç空çç« Â·Wordæå°] |
| | | </pre> |
| | | <pre style="display:none" class="mmd-src" data-mmd="06-warehouse-flow"> |
| | | flowchart LR |
| | |
| | | J4 --> J5[è´¨æ£ååèå¤å®Â·AIä¸å¯ç¨æ¶æç¤ºäººå·¥å¤å®] |
| | | R1[å·¥åBOM+åºåå¯ç¨é+å·²ææ] --> R2[ç©æçç¼ºé¢æµÂ·é£é©ç级ä¸ç¼ºå£æ¸
å] |
| | | R3[å·¥åºæ åå·¥æ¶+è®¾å¤æ¯å°æ¶äº§é+ä¼ éåç] --> R4[ç产æ¶é¿é¢æµ] |
| | | R5[IPQC缺é·ç+设å¤ä¿å
»ç¹æ£+ç©æå¯ç¨ç+å
³é®å·¥åº] --> R6[ç产é£é©é¢æµ] |
| | | R5[设å¤ä¿å
»ç¹æ£+ç©æå¯ç¨ç+å
³é®å·¥åº] --> R6[ç产é£é©é¢æµ] |
| | | R7[è¿åº¦+å©ä½å¤©æ°+ä»»å¡å®æç¶æ+客æ·äº¤æ] --> R8[交ä»é¢æµÂ·è½å¦ææ¶+置信度+延误å ç´ ] |
| | | KB1[ç¥è¯åºææ¡£ä¸ä¼ URL] --> KB2[POI/Tikaæåææ¬] --> KB3[åç约800tokensâåéåâMilvus] |
| | | KB3 --> KB4[åæ®µæ£ç´¢æ¥å£ topK+ç¸ä¼¼åº¦éå¼] |
| | |
| | | T4[ç产éæå æ éå®éè´§å æ å®åéè´§] --> A4[RQC éè´§æ£éªÂ·è稿0â宿4] |
| | | A1 --> R{æ£éªå¤å® MesQcCheckResultEnum} |
| | | A2 --> R |
| | | A3 --> R |
| | | A4 --> R |
| | | R -->|1 åæ ¼| Q1[å
许å
¥åºÂ·å忥æºåæ®æ¨è¿ç¶æ] |
| | | R -->|2 ç¹é| Q2[å
许å
¥åºÂ·å¹¶çæNCRçç] |
| | | R -->|3 ä¸åæ ¼éè´§| Q3[çæNCR·走ä¾åºåéè´§æéå®éè´§] |
| | | R -->|4 ä¸åæ ¼æ¥åº| Q4[çæNCR·走æ¥åºåºåº] |
| | | A3 --> R2{åºè´§å¤å® MesQcOqcCheckResultEnum·å¿
å¡«} |
| | | R2 -->|1å/2å| S1[åºåºè¡å¤åæ ¼Â·æ¨è¿åºåºåå¾
æ£è´§] |
| | | R2 -->|åºå| S2[åºåºè¡å¤ä¸åæ ¼Â·åæ¶éå®åºåºå] |
| | | A3 -.-> N5[表头:åè´§æ°é/åºè´§æ¥æéå¿
å¡«Â·æ£æµç»æå¿
å¡«] |
| | | A2 -.-> N6[表头:æ¥æºåæ®åªè¯»Â·äº§åç©æ(MDM)å¿
填·æ¹å·å¿
å¡«Â·å·²å»æç产订å/å·¥ä½/ç产任å¡/å·¥åº] |
| | | A2 -->|åæ ¼æ°é| Q5[æ¥å·¥è½¬å®æÂ·äº§åºæè¡å
¥åº] |
| | | A3 -->|宿| Q6[éå®åºåºåæ¨è¿å¾
æ£è´§] |
| | | A4 -->|宿| Q7[éè´§åæ¨è¿ä¸æ¶æå
¥åºÂ·å®ååè°ç»è®º] |
| | | N1[NCR å¾
è¯å®¡0] -->|è¯å®¡| N2[å·²è¯å®¡6] |
| | | N2 -->|å¤ç½®æ¹å¼:éè´§1æ¥åº2è¿å·¥3è®©æ¥æ¥æ¶4é级使ç¨5| N3[å·²å¤ç½®7] |
| | | N3 -->|å
³é| N4[å·²å
³é8] |
| | | Q8[æ¯ææ°æ®:è´¨æ£æ¹æ¡Â·æ£éªææ ·缺é·åºÂ·ææ ç»æ] --- A1 |
| | | Q9[åå·¥æ¥åå¢å¼º:ææ åç»æ +å
¬å¼ææ¬Â·å¹³è¡æµéæ¹æ¬¡Â·éæ ·å°ç¹/è¯ä¹¦ç¼å·/æ§è¡æ åè¡¨å¤´Â·å¤æ ¸äºº/å®¡æ ¸äºº] --- Q8 |
| | | A1 & A2 & A3 & A4 --> P1[æ£éªæ¥ååæå°Â·å端æµè§å¨æå°Â·å«ç¾ååº] |
| | | A1 & A2 & A3 & A4 --> P2[äº§åæ£éªåWord导åºÂ·export-product-wordÂ·æ ææ¯ææ å·å¤å®ç»è®º/è´¨æ£ç« ç空æå¡«Â·Wordæå°] |
| | | A1 & A2 & A3 & A4 --> P1[æ£éªæ¥ååæå°Â·å端æµè§å¨æå°Â·å¤å®ç»è®ºå¸¦åºæ£éªç»æ+è´¨æ£ä¸ç¨ç« ç空çç« +ç¾ååºÂ·æ å¹³è¡æµéæ¶å头称æµéå¼] |
| | | A1 & A2 & A3 & A4 --> P2[äº§åæ£éªåWord导åºÂ·export-product-wordÂ·æ ææ¯ææ å·å¤å®ç»è®ºå¸¦åºæ£éªç»æ/è´¨æ£ç« ç空çç« Â·Wordæå°] |
| | |
| | | J4 --> J5[è´¨æ£ååèå¤å®Â·AIä¸å¯ç¨æ¶æç¤ºäººå·¥å¤å®] |
| | | R1[å·¥åBOM+åºåå¯ç¨é+å·²ææ] --> R2[ç©æçç¼ºé¢æµÂ·é£é©ç级ä¸ç¼ºå£æ¸
å] |
| | | R3[å·¥åºæ åå·¥æ¶+è®¾å¤æ¯å°æ¶äº§é+ä¼ éåç] --> R4[ç产æ¶é¿é¢æµ] |
| | | R5[IPQC缺é·ç+设å¤ä¿å
»ç¹æ£+ç©æå¯ç¨ç+å
³é®å·¥åº] --> R6[ç产é£é©é¢æµ] |
| | | R5[设å¤ä¿å
»ç¹æ£+ç©æå¯ç¨ç+å
³é®å·¥åº] --> R6[ç产é£é©é¢æµ] |
| | | R7[è¿åº¦+å©ä½å¤©æ°+ä»»å¡å®æç¶æ+客æ·äº¤æ] --> R8[交ä»é¢æµÂ·è½å¦ææ¶+置信度+延误å ç´ ] |
| | | KB1[ç¥è¯åºææ¡£ä¸ä¼ URL] --> KB2[POI/Tikaæåææ¬] --> KB3[åç约800tokensâåéåâMilvus] |
| | | KB3 --> KB4[åæ®µæ£ç´¢æ¥å£ topK+ç¸ä¼¼åº¦éå¼] |
| | |
| | | "samplingTime": "2026-08-30T01:00:00", |
| | | "batchQuantity": 30, |
| | | "checkResult": 1, |
| | | "checkResultText": "æ ¡éªéè¿", |
| | | "inspectorName": "æ°è³", |
| | | "auditName": "海丽", |
| | | "approveName": "çäº", |
| | |
| | | | è¯ä¹¦ç¼å· / éæ ·å°ç¹ / æ¹é / éæ ·æ¶é´ / æ§è¡æ å | report åååæ®µ | |
| | | | åç»è¡ï¼æ°´å/é
¸å«éâ¦ï¼ | itemType=2 èç¹ï¼åç§°è¡ + å
¬å¼ææ¬(formulaText) | |
| | | | åæ°è¡/ç»æè¡ | åç» children å½å
¥é¡¹ï¼æ sortOrder æåº | |
| | | | å¹³è¡æµé两å | measureNos æ°ç»é©±å¨åå¤´ï¼æ¯ measureNo ä¸å | |
| | | | å¹³è¡æµéå头 | measureNos æ°ç»é©±å¨ï¼ä»
ä¸åæ¶å头æ¾ç¤ºãæµéå¼ãï¼å¤åæ¶æ¾ç¤ºãæµé1ããæµé2ã⦠| |
| | | | å¤è§ç宿§é¡¹ | resultType=ææ¬/åå
¸ çå½å
¥é¡¹ç´æ¥æ¾ç¤º value | |
| | | | å¤å®ç»è®º | `checkResultText`ï¼å端æ qcType 对åºåå
¸è§£æï¼ | |
| | | | è´¨æ£ä¸ç¨ç« | æ æ°æ®æ¥æºï¼çåºç©ºç½åå
æ ¼ä¾æå°å人工çç« | |
| | | | åæè
/夿 ¸äºº/å®¡æ ¸äºº | inspectorName / auditName / approveName | |
| | | |
| | | ## ä¸å¡è§å |
| | |
| | | |
| | | - æå°ä¸ºæµè§å¨ `window.print()`ï¼å»ºè®®å¨ Chrome ä¸é¢è§ï¼éèæå°å¤å
¶ä»å
ç´ ç±ç»ä»¶å
`@media print` æ§å¶ã |
| | | - `/report` ç `qcType`ï¼1=IQCã2=IPQCã3=OQCã4=RQCï¼ä¸ `MesQcTypeEnum` ä¸è´ã |
| | | - å¤å®ç»è®ºææ¡ç±å端æ `qcType` éåå
¸è§£æï¼OQC èµ° `mes_oqc_check_result`ï¼1å/2å/åºåï¼ï¼IQC/IPQC/RQC èµ° `mes_qc_check_result`ï¼æ ¡éªéè¿/æ ¡éªä¸éè¿ï¼ãæªå¤å®ï¼`checkResult` ä¸ºç©ºï¼æ¶æå°ä¸ºã-ãï¼å端å¯åéæ `checkResult` èªè¡ååå
¸æ ç¾ã |
| | | - 夿 ¸äºº/å®¡æ ¸äººä»
ä½ä¸ºè®°å½ä¸æå°ç¾ååºï¼ä¸å¼å
¥å®¡æ¹æµè½¬ã |
| | | - æä»¶éä»¶ç±»ææ ï¼resultType=æä»¶ï¼æ²¿ç¨åæºå¶ï¼æªå¨æ¬æ¬¡èå´ã |
| | | - åå½ç¹ï¼æ¢ææå¹³ææ çèæ£éªåï¼å½å
¥/宿/Excel 导åºï¼è¡ä¸ºä¸åï¼`measure_no` é»è®¤ 1 å¯¹èæ°æ®éæã |
| | |
| | | ('2046', 'MES 维修工åç¶æ', 'mes_dv_repair_status', '0', 'MES 设å¤ç®¡ç - 维修工åç¶æï¼10=å¾
ç»´ä¿®ï¼20=ç»´ä¿®ä¸ï¼30=已宿ï¼40=å·²éªæ¶ï¼', '1', '2026-02-20 10:56:24', '1', '2026-02-20 10:56:24', X'00', NULL), |
| | | ('2047', 'MES ç»´ä¿®ç»æ', 'mes_dv_repair_result', '0', 'MES 设å¤ç®¡ç - ç»´ä¿®ç»æï¼1=ä¿®å¤æåï¼2=æ¥åºï¼', '1', '2026-02-20 10:56:24', '1', '2026-02-20 10:56:24', X'00', NULL), |
| | | ('2049', 'MES æ£æµç»æ', 'mes_qc_check_result', '0', 'æ¥ææ£éªçæç»ç»æå¤å®', '1', '2026-02-20 11:23:35', '1', '2026-02-20 11:23:35', X'00', NULL), |
| | | ('1065400', 'MES åºè´§æ£éªæ£æµç»æ', 'mes_oqc_check_result', '0', 'åºè´§æ£éªå(OQC)å¤å®ç»æï¼1å/2å为å¯åè´§ç级ï¼åºå䏿¾è¡', '1', '2026-09-22 00:00:00', '1', '2026-09-22 00:00:00', X'00', NULL), |
| | | ('2050', 'MES æ¥æºåæ®ç±»å', 'mes_qc_source_doc_type', '0', 'IQC æ¥ææ£éªçæ¥æºåæ®ç±»å', '1', '2026-02-20 11:23:35', '1', '2026-02-20 11:23:35', X'00', NULL), |
| | | ('2051', 'MES å®ç¯å¤ç½®ç¶æ', 'mes_pro_andon_status', '0', 'MES ç产管ç - å®ç¯å¤ç½®ç¶æï¼0=æªå¤ç½®ï¼1=å·²å¤ç½®ï¼', '1', '2026-02-21 00:08:38', '1', '2026-02-21 00:08:38', X'00', NULL), |
| | | ('2052', 'MES å®ç¯çº§å«', 'mes_pro_andon_level', '0', 'MES ç产管ç - å®ç¯çº§å«ï¼1=ä¸çº§ï¼2=äºçº§ï¼3=ä¸çº§ï¼', '1', '2026-02-21 00:08:38', '1', '2026-02-21 00:08:38', X'00', NULL), |
| | |
| | | ('3158', '2', 'æ¥åº', '2', 'mes_dv_repair_result', '0', 'danger', '', '', '1', '2026-02-20 10:56:24', '1', '2026-02-20 10:56:24', X'00'), |
| | | ('3161', '1', 'æ ¡éªéè¿', '1', 'mes_qc_check_result', '0', 'success', '', '', '1', '2026-02-20 11:23:35', '1', '2026-02-20 16:15:54', X'00'), |
| | | ('3162', '2', 'æ ¡éªä¸éè¿', '2', 'mes_qc_check_result', '0', 'danger', '', '', '1', '2026-02-20 11:23:35', '1', '2026-02-20 16:15:52', X'00'), |
| | | ('1065401', '1', '1å', '1', 'mes_oqc_check_result', '0', 'success', '', '', '1', '2026-09-22 00:00:00', '1', '2026-09-22 00:00:00', X'00'), |
| | | ('1065402', '2', '2å', '2', 'mes_oqc_check_result', '0', 'primary', '', '', '1', '2026-09-22 00:00:00', '1', '2026-09-22 00:00:00', X'00'), |
| | | ('1065403', '3', 'åºå', '3', 'mes_oqc_check_result', '0', 'danger', '', '', '1', '2026-09-22 00:00:00', '1', '2026-09-22 00:00:00', X'00'), |
| | | ('3166', '0', 'æªå¤ç½®', '0', 'mes_pro_andon_status', '0', 'danger', '', '', '1', '2026-02-21 00:08:38', '1', '2026-02-21 00:08:38', X'00'), |
| | | ('3167', '1', 'å·²å¤ç½®', '1', 'mes_pro_andon_status', '0', 'success', '', '', '1', '2026-02-21 00:08:38', '1', '2026-02-21 00:08:38', X'00'), |
| | | ('3168', '1', 'ä¸çº§', '1', 'mes_pro_andon_level', '0', 'danger', '', '', '1', '2026-02-21 00:08:38', '1', '2026-02-21 00:08:38', X'00'), |
| | |
| | | `source_doc_id` bigint DEFAULT NULL COMMENT 'æ¥æºåæ®ç¼å·', |
| | | `source_line_id` bigint DEFAULT NULL COMMENT 'æ¥æºåæ®è¡ç¼å·', |
| | | `source_doc_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'æ¥æºåæ®ç¼å·', |
| | | `work_order_id` bigint DEFAULT NULL COMMENT 'ç产工åç¼å·', |
| | | `task_id` bigint DEFAULT NULL COMMENT 'ç产任å¡ç¼å·', |
| | | `workstation_id` bigint DEFAULT NULL COMMENT 'å·¥ä½ç¼å·', |
| | | `process_id` bigint DEFAULT NULL COMMENT 'å·¥åºç¼å·', |
| | | `batch_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'æ¹å·', |
| | | `item_id` bigint DEFAULT NULL COMMENT '产åç©æç¼å·', |
| | | `check_quantity` decimal(24,6) DEFAULT NULL COMMENT 'æ£æµæ°é', |
| | | `qualified_quantity` decimal(24,6) DEFAULT NULL COMMENT 'åæ ¼åæ°é', |
| | |
| | | import com.mzt.logapi.starter.annotation.DiffLogField; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import jakarta.validation.constraints.Size; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | |
| | | @NotNull(message = "åååç§°ä¸è½ä¸ºç©º") |
| | | private String name; |
| | | |
| | | @Schema(description = "ååç¼å·ï¼ç空åèªå¨çæï¼æ°å¢åæ´æ°åå¯èªå®ä¹ï¼æ´æ°æ¶ç空åä¿æåç¼å·", example = "HT20260921001") |
| | | @DiffLogField(name = "ååç¼å·") |
| | | @Size(max = 100, message = "ååç¼å·é¿åº¦ä¸è½è¶
è¿ 100 个å符") |
| | | private String no; |
| | | |
| | | @Schema(description = "客æ·ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "18336") |
| | | @DiffLogField(name = "客æ·", function = CrmCustomerParseFunction.NAME) |
| | | @NotNull(message = "客æ·ç¼å·ä¸è½ä¸ºç©º") |
| | |
| | | ErrorCode CONTRACT_GENERATE_ORDER_FAIL_EXISTS_ORDER = new ErrorCode(1_020_000_007, "çæéå®è®¢å失败ï¼åå ï¼å·²å
³èéå®è®¢åã{}ã"); |
| | | ErrorCode CONTRACT_GENERATE_ORDER_FAIL_NO_PRODUCT = new ErrorCode(1_020_000_008, "çæéå®è®¢å失败ï¼åå ï¼ååæ²¡æäº§åä¿¡æ¯"); |
| | | ErrorCode CONTRACT_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_020_000_009, "ååå®¡æ¹æµç¨ä¸åå¨ææªæ¿æ´»ï¼è¯·æ£æ¥ BPM é
ç½®"); |
| | | ErrorCode CONTRACT_NO_DUPLICATE = new ErrorCode(1_020_000_010, "ååç¼å·ã{}ãå·²åå¨ï¼è¯·æ´æ¢åéè¯"); |
| | | |
| | | // ========== 线索管ç 1-020-001-000 ========== |
| | | ErrorCode CLUE_NOT_EXISTS = new ErrorCode(1_020_001_000, "线索ä¸åå¨"); |
| | |
| | | List<CrmContractProductDO> contractProducts = validateContractProducts(createReqVO.getProducts()); |
| | | // 1.2 æ ¡éªå
³èåæ®µ |
| | | validateRelationDataExists(createReqVO); |
| | | // 1.3 çæåºå· |
| | | String no = noRedisDAO.generate(CrmNoRedisDAO.CONTRACT_NO_PREFIX); |
| | | // 1.3 çæææ ¡éªååç¼å·ï¼æ¯æèªå®ä¹ç¼å·ï¼æªå¡«åæ¶èªå¨çæ |
| | | String no = StrUtil.trimToNull(createReqVO.getNo()); |
| | | if (no == null) { |
| | | no = noRedisDAO.generate(CrmNoRedisDAO.CONTRACT_NO_PREFIX); |
| | | if (contractMapper.selectByNo(no) != null) { |
| | | throw exception(CONTRACT_NO_EXISTS); |
| | | } |
| | | } else if (contractMapper.selectByNo(no) != null) { |
| | | throw exception(CONTRACT_NO_DUPLICATE, no); |
| | | } |
| | | |
| | | // 2.1 æå
¥åå |
| | |
| | | updateReqVO.setOwnerUserId(null); // ä¸å
è®¸æ´æ°çåæ®µ |
| | | // 1.1 æ ¡éªåå¨ |
| | | CrmContractDO oldContract = validateContractExists(updateReqVO.getId()); |
| | | // 1.2 åªæè稿ã审æ¹ä¸ï¼å¯ä»¥ç¼è¾ï¼ |
| | | // 1.2 ååç¼å·ï¼ç空åä¿æåç¼å·ï¼å¡«ååæ ¡éªå¯ä¸æ§ï¼æé¤èªèº«ï¼ |
| | | // ç空æ¶åå¡«åç¼å·èé置空ï¼é¿å
æä½æ¥å¿ diff åºç°âç¼å·è¢«æ¸
空â |
| | | String no = StrUtil.trimToNull(updateReqVO.getNo()); |
| | | if (no == null) { |
| | | no = oldContract.getNo(); |
| | | } else { |
| | | CrmContractDO noContract = contractMapper.selectByNo(no); |
| | | if (noContract != null && !ObjUtil.equal(noContract.getId(), updateReqVO.getId())) { |
| | | throw exception(CONTRACT_NO_DUPLICATE, no); |
| | | } |
| | | } |
| | | updateReqVO.setNo(no); |
| | | // 1.3 åªæè稿ã审æ¹ä¸ï¼å¯ä»¥ç¼è¾ï¼ |
| | | if (!ObjectUtils.equalsAny(oldContract.getAuditStatus(), CrmAuditStatusEnum.DRAFT.getStatus(), |
| | | CrmAuditStatusEnum.PROCESS.getStatus())) { |
| | | throw exception(CONTRACT_UPDATE_FAIL_NOT_DRAFT); |
| | | } |
| | | // 1.3 æ ¡éªäº§åé¡¹çæææ§ |
| | | // 1.4 æ ¡éªäº§åé¡¹çæææ§ |
| | | List<CrmContractProductDO> contractProducts = validateContractProducts(updateReqVO.getProducts()); |
| | | // 1.4 æ ¡éªå
³èåæ®µ |
| | | // 1.5 æ ¡éªå
³èåæ®µ |
| | | validateRelationDataExists(updateReqVO); |
| | | |
| | | // 2.1 æ´æ°åå |
| | |
| | | } |
| | | |
| | | @GetMapping("/export-product-word") |
| | | @Operation(summary = "导åºäº§åæ£éªå Wordï¼çº¸è´¨æ£éªåçå¼ï¼æ ææ¯ææ åï¼å¤å®ç»è®º/è´¨æ£ä¸ç¨ç« ç空æå¡«ï¼æå°ç¨ Word æå¼ï¼") |
| | | @Operation(summary = "导åºäº§åæ£éªå Wordï¼çº¸è´¨æ£éªåçå¼ï¼æ ææ¯ææ åï¼å¤å®ç»è®ºèªå¨å¸¦åºæ£éªç»æãè´¨æ£ä¸ç¨ç« ç空çç« ï¼æå°ç¨ Word æå¼ï¼") |
| | | @Parameters({ |
| | | @Parameter(name = "qcId", description = "è´¨æ£åID", required = true, example = "1"), |
| | | @Parameter(name = "qcType", description = "è´¨æ£ç±»å", required = true, example = "1"), |
| | |
| | | @Schema(description = "æ¹éï¼æ¥æ=æ¥æ¶æ°éï¼è¿ç¨/éè´§=æ£æµæ°éï¼åºè´§=åºè´§æ°éï¼", example = "30") |
| | | private BigDecimal batchQuantity; |
| | | |
| | | @Schema(description = "æ£æµç»æï¼åå
¸ mes_qc_check_resultï¼", example = "1") |
| | | @Schema(description = "æ£æµç»æï¼IQC/IPQC/RQC=åå
¸ mes_qc_check_resultï¼OQC=åå
¸ mes_oqc_check_resultï¼", example = "1") |
| | | private Integer checkResult; |
| | | |
| | | @Schema(description = "æ£æµç»æææ¡ï¼æè´¨æ£ç±»å对åºåå
¸è§£æï¼ä¾å¤å®ç»è®ºå±ç¤ºï¼æªå¤å®æ¶ä¸ºç©ºï¼", example = "æ ¡éªéè¿") |
| | | private String checkResultText; |
| | | |
| | | @Schema(description = "æ£éªæ¥æ", example = "2026-08-30T01:00:00") |
| | | private LocalDateTime inspectDate; |
| | | |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.vo.MesQcQualityExportVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO; |
| | |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; |
| | | import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; |
| | | import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.ipqc.MesQcIpqcService; |
| | |
| | | |
| | | @Resource |
| | | private MesQcIpqcService ipqcService; |
| | | @Resource |
| | | private MesProWorkOrderService workOrderService; |
| | | @Resource |
| | | private MesMdWorkstationService workstationService; |
| | | @Resource |
| | | private MesProProcessService processService; |
| | | @Resource |
| | | private MesMdItemService itemService; |
| | | @Resource |
| | |
| | | if (CollUtil.isEmpty(list)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | // æ¹éæ¥è¯¢å·¥å |
| | | Map<Long, MesProWorkOrderDO> workOrderMap = workOrderService.getWorkOrderMap( |
| | | convertSet(list, MesQcIpqcDO::getWorkOrderId)); |
| | | // æ¹éæ¥è¯¢å·¥ä½ |
| | | Map<Long, MesMdWorkstationDO> workstationMap = workstationService.getWorkstationMap( |
| | | convertSet(list, MesQcIpqcDO::getWorkstationId)); |
| | | // æ¹éæ¥è¯¢å·¥åº |
| | | Map<Long, MesProProcessDO> processMap = processService.getProcessMap( |
| | | convertSet(list, MesQcIpqcDO::getProcessId)); |
| | | // æ¹éæ¥è¯¢ç©æ |
| | | Map<Long, MesMdItemDO> itemMap = itemService.getItemMap( |
| | | convertSet(list, MesQcIpqcDO::getItemId)); |
| | |
| | | Map<Long, String> indicatorSummaryMap = buildIndicatorSummaryMap(list); |
| | | // æ¼è£
VO |
| | | return BeanUtils.toBean(list, MesQcIpqcRespVO.class, vo -> { |
| | | findAndThen(workOrderMap, vo.getWorkOrderId(), workOrder -> vo |
| | | .setWorkOrderCode(workOrder.getCode()).setWorkOrderName(workOrder.getName())); |
| | | findAndThen(workstationMap, vo.getWorkstationId(), |
| | | ws -> vo.setWorkstationName(ws.getName())); |
| | | findAndThen(processMap, vo.getProcessId(), |
| | | process -> vo.setProcessName(process.getName())); |
| | | findAndThen(itemMap, vo.getItemId(), item -> { |
| | | vo.setItemCode(item.getCode()).setItemName(item.getName()).setItemSpecification(item.getSpecification()); |
| | | findAndThen(unitMeasureMap, item.getUnitMeasureId(), |
| | |
| | | vo.setDocName(ipqc.getName()); |
| | | MesMdItemDO item = itemMap.get(ipqc.getItemId()); |
| | | vo.setItemName(item != null ? item.getName() : ""); |
| | | // IPQC æ æ¹æ¬¡å·åæ®µï¼æç¨æ¥æºåæ®ç¼å·ï¼ä¸è¬ä¸ºç产工åå·ï¼ä½ä¸ºæ¹å· |
| | | vo.setBatchNo(ipqc.getSourceDocCode()); |
| | | vo.setBatchNo(ipqc.getBatchCode()); |
| | | vo.setInspectDate(MesQcQualityExportVO.formatDateTime(ipqc.getInspectDate())); |
| | | List<String> indicatorNames = new ArrayList<>(); |
| | | List<String> judgementSegments = new ArrayList<>(); |
| | |
| | | @Schema(description = "IPQC æ£éªç±»å", example = "1") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "ç产工å ID", example = "10") |
| | | private Long workOrderId; |
| | | @Schema(description = "æ¹å·", example = "BC20250101") |
| | | private String batchCode; |
| | | |
| | | @Schema(description = "产åç©æ ID", example = "50") |
| | | private Long itemId; |
| | |
| | | @Schema(description = "æ¥æºåæ®ç¼å·", example = "FB20250101001") |
| | | private String sourceDocCode; |
| | | |
| | | // ========== ç产å
³è ========== |
| | | |
| | | @Schema(description = "ç产工å ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | private Long workOrderId; |
| | | |
| | | @Schema(description = "å·¥åç¼å·", example = "WO20250101001") |
| | | @ExcelProperty("å·¥åç¼å·") |
| | | private String workOrderCode; |
| | | |
| | | @Schema(description = "å·¥ååç§°", example = "ç产工åA") |
| | | private String workOrderName; |
| | | |
| | | @Schema(description = "çäº§ä»»å¡ ID", example = "20") |
| | | private Long taskId; |
| | | |
| | | @Schema(description = "å·¥ä½ ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30") |
| | | private Long workstationId; |
| | | |
| | | @Schema(description = "å·¥ä½åç§°", example = "å·¥ä½A") |
| | | @ExcelProperty("å·¥ä½åç§°") |
| | | private String workstationName; |
| | | |
| | | @Schema(description = "å·¥åº ID", example = "40") |
| | | private Long processId; |
| | | |
| | | @Schema(description = "å·¥åºåç§°", example = "ç»è£
") |
| | | @ExcelProperty("å·¥åºåç§°") |
| | | private String processName; |
| | | @Schema(description = "æ¹å·", example = "BC20250101") |
| | | @ExcelProperty("æ¹å·") |
| | | private String batchCode; |
| | | |
| | | // ========== ç©æ ========== |
| | | |
| | |
| | | @Schema(description = "æ¥æºåæ®è¡ ID", example = "300") |
| | | private Long sourceLineId; |
| | | |
| | | // ========== ç产å
³è ========== |
| | | |
| | | @Schema(description = "ç产工å ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | @NotNull(message = "ç产工åä¸è½ä¸ºç©º") |
| | | private Long workOrderId; |
| | | |
| | | @Schema(description = "çäº§ä»»å¡ ID", example = "20") |
| | | private Long taskId; |
| | | |
| | | @Schema(description = "å·¥ä½ ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30") |
| | | @NotNull(message = "å·¥ä½ä¸è½ä¸ºç©º") |
| | | private Long workstationId; |
| | | |
| | | @Schema(description = "å·¥åº ID", example = "40") |
| | | private Long processId; |
| | | @Schema(description = "æ¹å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "BC20250101") |
| | | @NotEmpty(message = "æ¹å·ä¸è½ä¸ºç©º") |
| | | private String batchCode; |
| | | |
| | | // ========== ç©æ ========== |
| | | |
| | | @Schema(description = "产åç©æ ID", example = "50") |
| | | @Schema(description = "产åç©æ ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "50") |
| | | @NotNull(message = "产åç©æä¸è½ä¸ºç©º") |
| | | private Long itemId; |
| | | |
| | | @Schema(description = "è´¨æ£æ¹æ¡ ID", example = "5") |
| | |
| | | return ""; |
| | | } |
| | | return DictFrameworkUtils.parseDictDataLabel( |
| | | DictTypeConstants.MES_QC_CHECK_RESULT, String.valueOf(checkResult)); |
| | | DictTypeConstants.MES_OQC_CHECK_RESULT, String.valueOf(checkResult)); |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | @Schema(description = "æ£æµç»æ", example = "1") |
| | | @ExcelProperty(value = "æ£æµç»æ", converter = DictConvert.class) |
| | | @DictFormat(DictTypeConstants.MES_QC_CHECK_RESULT) |
| | | @DictFormat(DictTypeConstants.MES_OQC_CHECK_RESULT) |
| | | private Integer checkResult; |
| | | |
| | | // ========== æ£éªé¡¹ææ ========== |
| | |
| | | |
| | | // ========== å®¢æ· ========== |
| | | |
| | | @Schema(description = "å®¢æ· ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | @NotNull(message = "客æ·ä¸è½ä¸ºç©º") |
| | | @Schema(description = "å®¢æ· IDï¼å¯ä¸ºç©º", example = "10") |
| | | private Long clientId; |
| | | |
| | | // ========== ç©æ ========== |
| | |
| | | |
| | | // ========== æ°é ========== |
| | | |
| | | @Schema(description = "æ¬æ¬¡åºè´§æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") |
| | | @NotNull(message = "æ¬æ¬¡åºè´§æ°éä¸è½ä¸ºç©º") |
| | | @Schema(description = "æ¬æ¬¡åºè´§æ°é", example = "100") |
| | | @DecimalMin(value = "0", message = "æ¬æ¬¡åºè´§æ°éä¸è½å°äº 0") |
| | | private BigDecimal outQuantity; |
| | | |
| | |
| | | |
| | | // ========== æ£éª ========== |
| | | |
| | | @Schema(description = "æ£æµç»æ", example = "1") |
| | | @Schema(description = "æ£æµç»æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "æ£æµç»æä¸è½ä¸ºç©º") |
| | | private Integer checkResult; |
| | | |
| | | @Schema(description = "åºè´§æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "åºè´§æ¥æä¸è½ä¸ºç©º") |
| | | @Schema(description = "åºè´§æ¥æ") |
| | | private LocalDateTime outDate; |
| | | |
| | | @Schema(description = "æ£æµæ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | |
| | | @Schema(description = "åä½åç§°", example = "个") |
| | | private String unitName; |
| | | |
| | | @Schema(description = "æ¹å·ï¼å½åä»
IPQC æ¥æºæä¾ï¼", example = "BC20250101") |
| | | private String batchCode; |
| | | |
| | | // ========== æ°é ========== |
| | | |
| | | @Schema(description = "å¾
æ£æ°é", example = "100.00") |
| | |
| | | |
| | | 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.feedback.MesProFeedbackDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateDO; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcSourceDocTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcStatusEnum; |
| | |
| | | */ |
| | | private String sourceDocCode; |
| | | |
| | | // ========== ç产å
³è ========== |
| | | |
| | | /** |
| | | * ç产工å ID |
| | | * |
| | | * å
³è {@link MesProWorkOrderDO#getId()} |
| | | * æ¹å· |
| | | */ |
| | | private Long workOrderId; |
| | | /** |
| | | * çäº§ä»»å¡ ID |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO#getId()} |
| | | */ |
| | | private Long taskId; |
| | | /** |
| | | * å·¥ä½ ID |
| | | * |
| | | * å
³è {@link MesMdWorkstationDO#getId()} |
| | | */ |
| | | private Long workstationId; |
| | | /** |
| | | * å·¥åº ID |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO#getId()} |
| | | */ |
| | | private Long processId; |
| | | private String batchCode; |
| | | |
| | | // ========== ç©æ ========== |
| | | |
| | |
| | | /** |
| | | * æ£æµç»æ |
| | | * |
| | | * åå
¸ {@link DictTypeConstants#MES_QC_CHECK_RESULT} |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum} |
| | | * åå
¸ {@link DictTypeConstants#MES_OQC_CHECK_RESULT} |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcOqcCheckResultEnum} |
| | | */ |
| | | private Integer checkResult; |
| | | /** |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.dataobject.qc.template; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | |
| | | /** |
| | | * 产åç©æç¼å· |
| | | * |
| | | * å
³è {@link MesMdItemDO#getId()} |
| | | * å
³è MDM ç©æç¼å·ï¼mdm_item.idï¼ï¼é MES ç©æ |
| | | */ |
| | | private Long itemId; |
| | | /** |
| | |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesQcIpqcDO>() |
| | | .likeIfPresent(MesQcIpqcDO::getCode, reqVO.getCode()) |
| | | .eqIfPresent(MesQcIpqcDO::getType, reqVO.getType()) |
| | | .eqIfPresent(MesQcIpqcDO::getWorkOrderId, reqVO.getWorkOrderId()) |
| | | .likeIfPresent(MesQcIpqcDO::getBatchCode, reqVO.getBatchCode()) |
| | | .eqIfPresent(MesQcIpqcDO::getItemId, reqVO.getItemId()) |
| | | .eqIfPresent(MesQcIpqcDO::getCheckResult, reqVO.getCheckResult()) |
| | | .eqIfPresent(MesQcIpqcDO::getStatus, reqVO.getStatus()) |
| | |
| | | .orderByDesc(MesQcOqcDO::getId); |
| | | if (permittedClientIds != null) { |
| | | if (CollUtil.isEmpty(permittedClientIds)) { |
| | | return PageResult.empty(); |
| | | wrapper.isNull(MesQcOqcDO::getClientId); |
| | | } else { |
| | | // å
许 client_id 为空çè®°å½ï¼æªå¡«å®¢æ·çæ£éªåå¯¹ææææéç¨æ·å¯è§ï¼ |
| | | wrapper.and(w -> w.in(MesQcOqcDO::getClientId, permittedClientIds) |
| | | .or().isNull(MesQcOqcDO::getClientId)); |
| | | } |
| | | wrapper.in(MesQcOqcDO::getClientId, permittedClientIds); |
| | | } |
| | | return selectPage(reqVO, wrapper); |
| | | } |
| | |
| | | String MES_IPQC_TYPE = "mes_ipqc_type"; // MES IPQC æ£éªç±»å |
| | | String MES_RQC_TYPE = "mes_rqc_type"; // MES éè´§æ£éªç±»å |
| | | String MES_ORDER_STATUS = "mes_order_status"; // MES åæ®ç¶æï¼IQC/IPQC/OQC/RQC éç¨ï¼ |
| | | String MES_QC_CHECK_RESULT = "mes_qc_check_result"; // MES æ£æµç»æ |
| | | String MES_QC_CHECK_RESULT = "mes_qc_check_result"; // MES æ£æµç»æï¼IQC/IPQC/RQC å
±ç¨ï¼ |
| | | String MES_OQC_CHECK_RESULT = "mes_oqc_check_result"; // MES åºè´§æ£éªæ£æµç»æï¼OQC ä¸ç¨ï¼ |
| | | String MES_QC_SOURCE_DOC_TYPE = "mes_qc_source_doc_type"; // MES æ¥æºåæ®ç±»å |
| | | String MES_NCR_STATUS = "mes_ncr_status"; // MES NCR ç¶æ |
| | | String MES_NCR_DISPOSITION = "mes_ncr_disposition"; // MES NCR å¤ç½®æ¹å¼ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.enums.qc; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * MES åºè´§æ£éªåæ£æµç»ææä¸¾ï¼OQC ä¸ç¨ï¼ |
| | | * |
| | | * <p>ä¸ IQC/IPQC/RQC å
±ç¨ç {@link MesQcCheckResultEnum} ä¸åï¼åºè´§æ£éªæäº§åç级å¤å®ï¼ |
| | | * åå
¸ {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_OQC_CHECK_RESULT}</p> |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum MesQcOqcCheckResultEnum implements ArrayValuable<Integer> { |
| | | |
| | | TYPE_1(1, "1å"), |
| | | TYPE_2(2, "2å"), |
| | | SCRAP(3, "åºå"); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesQcOqcCheckResultEnum::getType).toArray(Integer[]::new); |
| | | |
| | | /** |
| | | * ç»æå¼ |
| | | */ |
| | | private final Integer type; |
| | | /** |
| | | * ç»æå |
| | | */ |
| | | private final String name; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | /** |
| | | * 夿æ¯å¦å¯ä»¥æ¾è¡åè´§ |
| | | * |
| | | * <p>1 åã2 åå为å¯åè´§ç级ï¼ä»
åºå䏿¾è¡</p> |
| | | * |
| | | * @param type æ£æµç»æ |
| | | * @return true å¯ä»¥æ¾è¡ |
| | | */ |
| | | public static boolean canShip(Integer type) { |
| | | return type != null && !SCRAP.getType().equals(type); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ipqc.MesQcIpqcDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.dv.machinery.MesDvMachineryMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.md.workstation.MesMdWorkstationMachineMapper; |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.task.MesProTaskIssueMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.task.MesProTaskMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderBomMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.qc.ipqc.MesQcIpqcMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockMapper; |
| | | import cn.iocoder.yudao.module.mes.service.pro.mps.MesProMpsService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; |
| | |
| | | ä½ éè¦ç»¼ååæä»¥ä¸ä¿¡æ¯ï¼ç»åºä¸ä¸çé£é©è¯ä¼°ï¼ |
| | | |
| | | ## åæç»´åº¦ |
| | | 1. è´¨éé£é©ï¼è¿ç¨æ£éª(IPQC)ç缺é·çæ°æ®ï¼è´å½/严é/轻微缺é·çï¼ |
| | | 2. 设å¤é£é©ï¼è®¾å¤ç¶æã䏿¬¡ä¿å
»æ¶é´ã䏿¬¡ç¹æ£æ¶é´ãç产æç |
| | | 3. ç©æé£é©ï¼ç©æåºåå¯ç¨éä¸éæ±éçå¯¹æ¯ |
| | | 4. å·¥èºç¶é¢ï¼å
³é®å·¥åºç设å¤äº§è½ã任塿éæ
åµ |
| | | 1. 设å¤é£é©ï¼è®¾å¤ç¶æã䏿¬¡ä¿å
»æ¶é´ã䏿¬¡ç¹æ£æ¶é´ãç产æç |
| | | 2. ç©æé£é©ï¼ç©æåºåå¯ç¨éä¸éæ±éçå¯¹æ¯ |
| | | 3. å·¥èºç¶é¢ï¼å
³é®å·¥åºç设å¤äº§è½ã任塿éæ
åµ |
| | | |
| | | ## é£é©ç级å®ä¹ |
| | | - é«ï¼åå¨è´å½ç¼ºé·ç>5% æ è®¾å¤æ
é æ å
³é®ç©æç缺>50% æ å
³é®å·¥åºä¸¥é积å |
| | | - ä¸ï¼åå¨ä¸¥é缺é·ç>10% æ 设å¤é¿ææªä¿å
» æ ç©æç´§å¼ |
| | | - é«ï¼åå¨è®¾å¤æ
é æ å
³é®ç©æç缺>50% æ å
³é®å·¥åºä¸¥é积å |
| | | - ä¸ï¼åå¨è®¾å¤é¿ææªä¿å
» æ ç©æç´§å¼ |
| | | - ä½ï¼åé¡¹ææ æ£å¸¸ |
| | | |
| | | ## è¾åºæ ¼å¼ |
| | |
| | | overallRiskLevel åå¼ï¼1=ä½é£é© 2=ä¸é£é© 3=é«é£é© |
| | | riskLevel åå¼ï¼å
è¶³/ç´§å¼ /ç缺 |
| | | severity åå¼ï¼é«/ä¸/ä½ |
| | | category åå¼ï¼è´¨é/设å¤/ç©æ/å·¥èºç¶é¢ |
| | | category åå¼ï¼è®¾å¤/ç©æ/å·¥èºç¶é¢ |
| | | """; |
| | | |
| | | private static final String SYSTEM_PROMPT_DELIVERY = """ |
| | |
| | | private MesProTaskIssueMapper taskIssueMapper; |
| | | @Resource |
| | | private MesProFeedbackMapper feedbackMapper; |
| | | @Resource |
| | | private MesQcIpqcMapper ipqcMapper; |
| | | @Resource |
| | | private MesWmMaterialStockMapper materialStockMapper; |
| | | @Resource |
| | |
| | | data.put("è®¡åæ°é", workOrder.getQuantity()); |
| | | data.put("å·²ç产æ°é", workOrder.getQuantityProduced()); |
| | | fillItemInfo(data, workOrder.getProductId()); |
| | | |
| | | // è´¨éé£é© - IPQC |
| | | List<MesQcIpqcDO> ipqcList = ipqcMapper.selectList( |
| | | new LambdaQueryWrapper<MesQcIpqcDO>() |
| | | .eq(MesQcIpqcDO::getWorkOrderId, workOrderId)); |
| | | if (CollUtil.isNotEmpty(ipqcList)) { |
| | | List<Map<String, Object>> qcData = ipqcList.stream().map(ipqc -> { |
| | | Map<String, Object> item = new LinkedHashMap<>(); |
| | | item.put("æ£éªåç¼å·", ipqc.getCode()); |
| | | item.put("è´å½ç¼ºé·ç", ipqc.getCriticalRate() != null ? ipqc.getCriticalRate() + "%" : "0%"); |
| | | item.put("严é缺é·ç", ipqc.getMajorRate() != null ? ipqc.getMajorRate() + "%" : "0%"); |
| | | item.put("轻微缺é·ç", ipqc.getMinorRate() != null ? ipqc.getMinorRate() + "%" : "0%"); |
| | | item.put("è´å½ç¼ºé·æ°", ipqc.getCriticalQuantity() != null ? ipqc.getCriticalQuantity() : 0); |
| | | item.put("严éç¼ºé·æ°", ipqc.getMajorQuantity() != null ? ipqc.getMajorQuantity() : 0); |
| | | item.put("è½»å¾®ç¼ºé·æ°", ipqc.getMinorQuantity() != null ? ipqc.getMinorQuantity() : 0); |
| | | item.put("æ£éªç»æ", ipqc.getCheckResult()); |
| | | return item; |
| | | }).collect(Collectors.toList()); |
| | | data.put("è¿ç¨æ£éª(IPQC)è®°å½", qcData); |
| | | } |
| | | |
| | | // 设å¤é£é© |
| | | List<MesProTaskDO> tasks = taskMapper.selectListByWorkOrderId(workOrderId); |
| | |
| | | data.put("æ£æµæ°é", ipqc.getCheckQuantity()); |
| | | data.put("åæ ¼æ°é", ipqc.getQualifiedQuantity()); |
| | | data.put("ä¸åæ ¼æ°é", ipqc.getUnqualifiedQuantity()); |
| | | data.put("å·¥åID", ipqc.getWorkOrderId()); |
| | | data.put("å·¥åºID", ipqc.getProcessId()); |
| | | data.put("æ¹å·", ipqc.getBatchCode()); |
| | | fillItemInfo(data, ipqc.getItemId()); |
| | | } else if (MesBizTypeConstants.QC_OQC == qcType) { |
| | | data.put("è´¨æ£ç±»å", "åºè´§æ£éª"); |
| | |
| | | * äº§åæ£éªåï¼çº¸è´¨"ÃÃ产åè´¨éæ£éªå"çå¼ï¼Word æå»ºå¨ |
| | | * |
| | | * çå¼ï¼æ é¢ï¼å
¬å¸ + äº§åæ£éªåï¼â è¡¨å¤´ä¿¡æ¯ 5 è¡ â æ£éªé¡¹ç®/æ£éªç»æ 两åç©éµ â |
| | | * å¤å®ç»è®º/è´¨æ£ä¸ç¨ç« ï¼çç©ºï¼æå°åæå¡«ï¼â 夿³¨ â æ£éª/夿 ¸/æ¹åç¾åè¡ã |
| | | * å¤å®ç»è®ºï¼èªå¨å¸¦åºæ£éªç»æï¼/è´¨æ£ä¸ç¨ç« ï¼ç空çç« ï¼â 夿³¨ â æ£éª/夿 ¸/æ¹åç¾åè¡ã |
| | | * ä¸å«ææ¯ææ åï¼åç»é¡¹ä¸å±ç¤ºï¼å½å
¥é¡¹å¹³éºï¼å¹³è¡æµéå¤å¼é¡¿å·åå¹¶ã |
| | | */ |
| | | public class MesQcProductReportWordBuilder { |
| | |
| | | writeTitle(doc, report); |
| | | writeHeaderTable(doc, report); |
| | | writeItemTable(doc, report); |
| | | writeConclusionTable(doc); |
| | | writeConclusionTable(doc, report); |
| | | writeRemarkTable(doc, report); |
| | | writeSignLine(doc); |
| | | doc.write(out); |
| | |
| | | .orElse(EMPTY); |
| | | } |
| | | |
| | | // ========== å¤å®ç»è®º / è´¨æ£ä¸ç¨ç« ï¼ç空åå¡«ï¼ ========== |
| | | // ========== å¤å®ç»è®º / è´¨æ£ä¸ç¨ç« ========== |
| | | |
| | | private static XWPFTable writeConclusionTable(XWPFDocument doc) { |
| | | /** å¤å®ç»è®ºèªå¨å¸¦åºæ£éªç»æææ¡ï¼è´¨æ£ä¸ç¨ç« çç©ºï¼æå°å人工çç« */ |
| | | private static XWPFTable writeConclusionTable(XWPFDocument doc, MesQcQcReportRespVO report) { |
| | | XWPFTable table = createTable(doc); |
| | | XWPFTableRow row = addRow(table, valueLeftSpan("å¤å®ç»è®ºï¼", 2), valueLeftSpan("è´¨æ£ä¸ç¨ç« ï¼", 2)); |
| | | // é¢çæå/çç« é«åº¦ |
| | | String conclusion = notBlank(report.getCheckResultText()) ? report.getCheckResultText() : ""; |
| | | XWPFTableRow row = addRow(table, valueLeftSpan("å¤å®ç»è®ºï¼" + conclusion, 2), valueLeftSpan("è´¨æ£ä¸ç¨ç« ï¼", 2)); |
| | | // é¢ççç« é«åº¦ |
| | | setRowHeight(row, 2550); |
| | | return table; |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.mes.service.qc.indicatorresult; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcQcReportRespVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcLineDO; |
| | | import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcIndicatorItemTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; |
| | |
| | | report.setApproveName(userMap.get(report.getApproveUserId()).getNickname()); |
| | | } |
| | | } |
| | | report.setCheckResultText(resolveCheckResultText(qcType, report.getCheckResult())); |
| | | return report; |
| | | } |
| | | |
| | | /** |
| | | * æ£æµç»æææ¡ï¼OQC æäº§åç级å¤å®ï¼mes_oqc_check_resultï¼ï¼å
¶ä½èµ°éç¨æ£æµç»æåå
¸ï¼mes_qc_check_resultï¼ |
| | | */ |
| | | private String resolveCheckResultText(Integer qcType, Integer checkResult) { |
| | | if (checkResult == null) { |
| | | return null; |
| | | } |
| | | String dictType = Objects.equals(qcType, MesQcTypeEnum.OQC.getType()) |
| | | ? DictTypeConstants.MES_OQC_CHECK_RESULT : DictTypeConstants.MES_QC_CHECK_RESULT; |
| | | return DictFrameworkUtils.parseDictDataLabel(dictType, String.valueOf(checkResult)); |
| | | } |
| | | |
| | | /** |
| | | * ç»è£
æ¥åæ£éªé¡¹æ ï¼é¡ºå¸¦æ¶éå
¨å± measureNos å头 |
| | | */ |
| | | private List<MesQcQcReportRespVO.ReportItem> buildReportItems( |
| | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO; |
| | | 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.pro.feedback.MesProFeedbackDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ipqc.MesQcIpqcDO; |
| | |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; |
| | | import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.feedback.MesProFeedbackService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.ncr.vo.MesQcNcrSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.service.qc.ncr.MesQcNcrService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | @Slf4j |
| | | public class MesQcIpqcServiceImpl implements MesQcIpqcService { |
| | | |
| | | /** |
| | | * IPQC ä¿åæ°æ®æ ¡éªä¸ä¸æ |
| | | * |
| | | * @param workstation å·¥ä½ |
| | | * @param task ç产任å¡ï¼å¯éï¼æå® taskId æ¶éç©ºï¼ |
| | | */ |
| | | private record SaveDataContext(MesMdWorkstationDO workstation, MesProTaskDO task) {} |
| | | |
| | | @Resource |
| | | private MesQcIpqcMapper ipqcMapper; |
| | | |
| | |
| | | private MesQcIpqcLineService ipqcLineService; |
| | | @Resource |
| | | @Lazy |
| | | private MesProWorkOrderService workOrderService; |
| | | @Resource |
| | | @Lazy |
| | | private MesMdWorkstationService workstationService; |
| | | @Resource |
| | | @Lazy |
| | | private MesMdItemService itemService; |
| | | @Resource |
| | | @Lazy |
| | | private MesQcDefectRecordService defectRecordService; |
| | | @Resource |
| | | @Lazy |
| | | private MesProRouteProductService routeProductService; |
| | | @Resource |
| | | @Lazy |
| | | private MesProRouteProcessService routeProcessService; |
| | | @Resource |
| | | @Lazy |
| | | private MesProTaskService taskService; |
| | | @Resource |
| | | @Lazy |
| | | private MesProFeedbackService feedbackService; |
| | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @Resource |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createIpqc(MesQcIpqcSaveReqVO createReqVO) { |
| | | // 1.1 æ ¡éªæ°æ® |
| | | SaveDataContext ctx = validateIpqcSaveData(createReqVO); |
| | | // 1.2 æ ¡éªå·¥ååå¨ |
| | | MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId()); |
| | | // 1.3 ç¡®å®æ£éªç©æï¼æä»»å¡æ¶åä»»å¡çç©æï¼æ 任塿¶åå·¥åç产å |
| | | Long itemId = (ctx.task() != null) ? ctx.task().getItemId() : workOrder.getProductId(); |
| | | // 1.4 æ ¹æ®ç©æ + IPQC ç±»åæ¥æ¾å¯ç¨è´¨æ£æ¹æ¡ï¼æ¯æå端æ¾å¼æå®ï¼ |
| | | validateIpqcSaveData(createReqVO); |
| | | // 1.2 æ ¹æ®äº§åç©æ + IPQC ç±»åæ¥æ¾å¯ç¨è´¨æ£æ¹æ¡ï¼æ¯æå端æ¾å¼æå®ï¼ |
| | | // ç©æ ID æ¥èª MDMï¼æ¨¡æ¿æå¡ç´æ¥æ MDM ç©æå¹é
|
| | | List<MesQcTemplateItemDO> templateItems = templateItemService.getTemplateItemList( |
| | | itemId, MesQcTypeEnum.IPQC.getType(), null, null); |
| | | createReqVO.getItemId(), MesQcTypeEnum.IPQC.getType(), null, null); |
| | | if (CollUtil.isEmpty(templateItems)) { |
| | | throw exception(QC_NO_TEMPLATE); |
| | | } |
| | |
| | | } |
| | | } |
| | | Long templateId = templateItem.getTemplateId(); |
| | | // 1.5 è·åæ¥æºåæ®ç¼å· |
| | | // 1.3 è·åæ¥æºåæ®ç¼å· |
| | | String sourceDocCode = validateAndGetSourceDocCode( |
| | | createReqVO.getSourceDocType(), createReqVO.getSourceDocId(), createReqVO.getSourceLineId()); |
| | | |
| | | // 2. æå
¥ä¸»è¡¨ |
| | | MesQcIpqcDO ipqc = BeanUtils.toBean(createReqVO, MesQcIpqcDO.class) |
| | | .setItemId(itemId) |
| | | .setProcessId(getProcessId(itemId, ctx.workstation().getProcessId())) |
| | | .setTemplateId(templateId) |
| | | .setSourceDocCode(sourceDocCode) |
| | | .setStatus(MesQcStatusEnum.DRAFT.getStatus()); |
| | |
| | | // 1.1 æ ¡éªåå¨ + èç¨¿ç¶æ |
| | | validateIpqcStatusPrepare(updateReqVO.getId()); |
| | | // 1.2 æ ¡éªæ°æ® |
| | | SaveDataContext ctx = validateIpqcSaveData(updateReqVO); |
| | | validateIpqcSaveData(updateReqVO); |
| | | |
| | | // 2. æ´æ°ä¸»è¡¨ |
| | | MesQcIpqcDO existIpqc = validateIpqcExists(updateReqVO.getId()); |
| | | MesQcIpqcDO updateObj = BeanUtils.toBean(updateReqVO, MesQcIpqcDO.class); |
| | | updateObj.setSourceDocType(null).setSourceDocId(null).setSourceLineId(null); // ä¸å
è®¸ä¿®æ¹æ¥æºåæ® |
| | | updateObj.setTemplateId(null); // ä¸å
è®¸ä¿®æ¹æ¨¡æ¿ |
| | | updateObj.setItemId(null); // ä¸å
许修æ¹ç©æ |
| | | updateObj.setWorkOrderId(null); // ä¸å
许修æ¹å·¥å |
| | | updateObj.setProcessId(getProcessId(existIpqc.getItemId(), ctx.workstation().getProcessId())); |
| | | ipqcMapper.updateById(updateObj); |
| | | } |
| | | |
| | | private SaveDataContext validateIpqcSaveData(MesQcIpqcSaveReqVO reqVO) { |
| | | private void validateIpqcSaveData(MesQcIpqcSaveReqVO reqVO) { |
| | | // æ ¡éªç¼å·å¯ä¸ |
| | | validateIpqcCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | // æ ¡éªå·¥ä½ãæ£æµäººååå¨ |
| | | MesMdWorkstationDO workstation = workstationService.validateWorkstationExists(reqVO.getWorkstationId()); |
| | | // æ ¡éªç©æãæ£æµäººååå¨ |
| | | // 注ï¼ç©æ ID æ¥èª MDM |
| | | mdmItemApi.validateItemExists(reqVO.getItemId()); |
| | | adminUserApi.validateUser(reqVO.getInspectorUserId()); |
| | | // æ ¡éªå·¥ååå¨ |
| | | MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); |
| | | if (reqVO.getProcessId() != null && ObjUtil.notEqual(workstation.getProcessId(), reqVO.getProcessId())) { |
| | | throw exception(PRO_WORKSTATION_PROCESS_MISMATCH); |
| | | } |
| | | // æ ¡éªä»»å¡å
³ç³»ï¼å¦ææå®äºä»»å¡ï¼ |
| | | MesProTaskDO task = null; |
| | | if (reqVO.getTaskId() != null) { |
| | | task = taskService.validateTaskNotFinished(reqVO.getTaskId()); |
| | | validateTaskRelation(task, workstation, workOrder, reqVO); |
| | | } else { |
| | | // æ 任塿¶ï¼itemId ä»éä¸å·¥å产åä¸è´ |
| | | if (reqVO.getItemId() != null && ObjUtil.notEqual(reqVO.getItemId(), workOrder.getProductId())) { |
| | | throw exception(PRO_WORK_ORDER_PRODUCT_MISMATCH); |
| | | } |
| | | } |
| | | return new SaveDataContext(workstation, task); |
| | | } |
| | | |
| | | private void validateTaskRelation(MesProTaskDO task, MesMdWorkstationDO workstation, |
| | | MesProWorkOrderDO workOrder, MesQcIpqcSaveReqVO reqVO) { |
| | | if (ObjUtil.notEqual(task.getWorkOrderId(), workOrder.getId())) { |
| | | throw exception(PRO_TASK_WORK_ORDER_MISMATCH); |
| | | } |
| | | if (ObjUtil.notEqual(task.getWorkstationId(), workstation.getId())) { |
| | | throw exception(PRO_TASK_WORKSTATION_MISMATCH); |
| | | } |
| | | Long expectedProcessId = reqVO.getProcessId() != null ? reqVO.getProcessId() : workstation.getProcessId(); |
| | | if (expectedProcessId != null && ObjUtil.notEqual(task.getProcessId(), expectedProcessId)) { |
| | | throw exception(PRO_TASK_ROUTE_PROCESS_MISMATCH); |
| | | } |
| | | // æ ¡éªæ£éªç©æä¸ä»»å¡ç©æä¸è´ï¼æä»»å¡æ¶ï¼IPQC æ£éªçç©æåºä¸ä»»å¡å å·¥çç©æä¸è´ï¼ |
| | | if (reqVO.getItemId() != null && ObjUtil.notEqual(reqVO.getItemId(), task.getItemId())) { |
| | | throw exception(PRO_TASK_ITEM_MISMATCH); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | // 1. ç¡®å® sourceDocType/sourceDocId |
| | | Long sourceDocId = ipqc.getSourceDocId(); |
| | | Long sourceLineId = ipqc.getSourceLineId(); |
| | | |
| | | // 妿 IPQC åæ²¡æè®¾ç½®æ¥æºï¼å°è¯éè¿ taskId æ¥æ¾å
³èçå¾
æ£éªæ¥å·¥ |
| | | if (sourceDocId == null && ipqc.getTaskId() != null) { |
| | | MesProFeedbackDO feedback = feedbackService.getFeedbackListByTaskId(ipqc.getTaskId()).stream() |
| | | .filter(f -> MesProFeedbackStatusEnum.UNCHECK.getStatus().equals(f.getStatus())) |
| | | .findFirst().orElse(null); |
| | | if (feedback != null) { |
| | | sourceDocId = feedback.getId(); |
| | | log.info("[writeBackSourceDoc] IPQC({}) æªè®¾ç½®æ¥æºåæ®ï¼éè¿ taskId({}) æ¾å°å¾
æ£éªæ¥å·¥({})", |
| | | ipqc.getId(), ipqc.getTaskId(), feedback.getId()); |
| | | } |
| | | } |
| | | |
| | | if (sourceDocId == null) { |
| | | log.warn("[writeBackSourceDoc] IPQC({}) æ æ³ç¡®å®æ¥æºæ¥å·¥ï¼è·³è¿åå", ipqc.getId()); |
| | | log.warn("[writeBackSourceDoc] IPQC({}) æªè®¾ç½®æ¥æºæ¥å·¥ï¼è·³è¿åå", ipqc.getId()); |
| | | return; |
| | | } |
| | | |
| | |
| | | } |
| | | // æªç¥æ¥æºç±»ååºæ¥éï¼è䏿¯éé»å¿½ç¥ |
| | | throw exception(QC_IPQC_SOURCE_DOC_TYPE_UNKNOWN); |
| | | } |
| | | |
| | | /** |
| | | * æ¨å¯¼å·¥åº ID |
| | | * |
| | | * <p>éè¿äº§å â å·¥èºè·¯çº¿äº§å â å·¥èºè·¯çº¿ â æ ¡éªå·¥ä½å·¥åºæ¯å¦å¨è¯¥è·¯çº¿ä¸ |
| | | * <p>妿工ä½çå·¥åºå¨è·¯çº¿ä¸ï¼åè¿å该 processIdï¼å¦åè¿å null |
| | | * |
| | | * @param productId 产å IDï¼å·¥å产åï¼ |
| | | * @param workstationProcessId å·¥ä½å
³èçå·¥åº ID |
| | | * @return æ¨å¯¼åºçå·¥åº IDï¼æ æ³æ¨å¯¼æ¶è¿å null |
| | | */ |
| | | private Long getProcessId(Long productId, Long workstationProcessId) { |
| | | if (productId == null || workstationProcessId == null) { |
| | | return null; |
| | | } |
| | | // 1. 产å â å·¥èºè·¯çº¿ |
| | | MesProRouteProductDO routeProduct = routeProductService.getRouteProductByItemId(productId); |
| | | if (routeProduct == null) { |
| | | return null; |
| | | } |
| | | // 2. æ ¡éªå·¥ä½çå·¥åºæ¯å¦å¨è¯¥è·¯çº¿ä¸ |
| | | if (routeProcessService.getRouteProcessByRouteIdAndProcessId( |
| | | routeProduct.getRouteId(), workstationProcessId) == null) { |
| | | return null; |
| | | } |
| | | return workstationProcessId; |
| | | } |
| | | |
| | | @Override |
| | |
| | | /** |
| | | * æ ¹æ®äº§åç©æ ID å QC ç±»åæ¥æ¾æ£éªæ¨¡æ¿ç产åå
³èï¼å¿
é¡»åå¨ï¼å¦åæå¼å¸¸ï¼ |
| | | * |
| | | * @param itemId 产åç©æ ID |
| | | * @param mdmItemId MDM 产åç©æ IDï¼mdm_item.idï¼ |
| | | * @param qcType æ£æµç§ç±»ï¼æä¸¾ {@link MesQcTypeEnum}ï¼ |
| | | * @return å¹é
ç产åå
³è |
| | | */ |
| | | MesQcTemplateItemDO getRequiredTemplateByItemIdAndType(Long itemId, Integer qcType); |
| | | MesQcTemplateItemDO getRequiredTemplateByItemIdAndType(Long mdmItemId, Integer qcType); |
| | | |
| | | /** |
| | | * æ ¹æ®äº§åç©æï¼æå·¥å/ä»»å¡ï¼å QC ç±»åï¼è·åææå¯ç¨çè´¨æ£æ¹æ¡äº§åå
³èå表 |
| | | * |
| | | * @param itemId 产åç©æ IDï¼mes_md_item.idï¼ï¼ä¸ workOrderId/taskId è³å°å
¶ä¸ |
| | | * @param mdmItemId MDM 产åç©æ IDï¼mdm_item.idï¼ï¼ä¸ workOrderId/taskId è³å°å
¶ä¸ |
| | | * @param qcType æ£æµç§ç±»ï¼æä¸¾ {@link MesQcTypeEnum}ï¼ |
| | | * @param workOrderId ç产工å IDï¼å¯éï¼IPQC åºæ¯ç¨äºè§£æäº§åç©æï¼ |
| | | * @param taskId çäº§ä»»å¡ IDï¼å¯éï¼ä¼å
ç¨äºè§£æäº§åç©æï¼ |
| | | * @param workOrderId ç产工å IDï¼å¯éï¼IPQC åºæ¯ç¨äºè§£æäº§åç©æï¼å·¥å产å为 MES ç©æï¼å
é¨è½¬æ¢ä¸º MDM ç©æï¼ |
| | | * @param taskId çäº§ä»»å¡ IDï¼å¯éï¼ä¼å
ç¨äºè§£æäº§åç©æï¼ä»»å¡ç©æä¸º MES ç©æï¼å
é¨è½¬æ¢ä¸º MDM ç©æï¼ |
| | | * @return å¹é
ç产åå
³èå表ï¼ä¿æå顺åºï¼ï¼æ å¹é
è¿å空å表 |
| | | */ |
| | | List<MesQcTemplateItemDO> getTemplateItemList(Long itemId, Integer qcType, Long workOrderId, Long taskId); |
| | | List<MesQcTemplateItemDO> getTemplateItemList(Long mdmItemId, Integer qcType, Long workOrderId, Long taskId); |
| | | |
| | | } |
| | |
| | | } |
| | | |
| | | @Override |
| | | public MesQcTemplateItemDO getRequiredTemplateByItemIdAndType(Long itemId, Integer qcType) { |
| | | List<MesQcTemplateItemDO> templateItems = getTemplateItemList(itemId, qcType, null, null); |
| | | public MesQcTemplateItemDO getRequiredTemplateByItemIdAndType(Long mdmItemId, Integer qcType) { |
| | | List<MesQcTemplateItemDO> templateItems = getTemplateItemList(mdmItemId, qcType, null, null); |
| | | if (CollUtil.isEmpty(templateItems)) { |
| | | throw exception(QC_NO_TEMPLATE); |
| | | } |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<MesQcTemplateItemDO> getTemplateItemList(Long itemId, Integer qcType, Long workOrderId, Long taskId) { |
| | | // 1. è§£æçå®äº§åç©æ IDï¼ä»»å¡ä¼å
ï¼å
¶æ¬¡å·¥åï¼æåç´æ¥ç¨å
¥å |
| | | Long resolvedItemId = itemId; |
| | | public List<MesQcTemplateItemDO> getTemplateItemList(Long mdmItemId, Integer qcType, Long workOrderId, Long taskId) { |
| | | // 1. è§£æ MDM 产åç©æ IDï¼ä»»å¡ä¼å
ï¼å
¶æ¬¡å·¥åï¼ä¸¤è
åçæ¯ MES ç©æ IDï¼é转æ¢ä¸º MDM ç©æ IDã |
| | | // æªä¼ å·¥å/任塿¶ï¼å
¥åæ¬èº«å³ MDM ç©æ IDï¼è´¨æ£ååç«¯éæ©çå°±æ¯ MDM ç©æï¼ |
| | | Long resolvedMdmItemId; |
| | | if (taskId != null) { |
| | | resolvedItemId = proTaskService.validateTaskExists(taskId).getItemId(); |
| | | resolvedMdmItemId = convertMesItemIdToMdmItemId(proTaskService.validateTaskExists(taskId).getItemId()); |
| | | } else if (workOrderId != null) { |
| | | resolvedItemId = proWorkOrderService.validateWorkOrderExists(workOrderId).getProductId(); |
| | | resolvedMdmItemId = convertMesItemIdToMdmItemId( |
| | | proWorkOrderService.validateWorkOrderExists(workOrderId).getProductId()); |
| | | } else { |
| | | resolvedMdmItemId = mdmItemId; |
| | | } |
| | | if (resolvedItemId == null) { |
| | | if (resolvedMdmItemId == null) { |
| | | return Collections.emptyList(); |
| | | } |
| | | // 2. mes_md_item.id 转 mdm_item.idï¼äº§åå
³è表åçæ¯ mdm ç©æï¼ |
| | | MesMdItemDO item = mesMdItemService.getItem(resolvedItemId); |
| | | if (item == null || item.getMdmItemId() == null) { |
| | | return Collections.emptyList(); |
| | | } |
| | | // 3. æ¥åºè¯¥ç©æå
³èçææäº§åå
³è |
| | | List<MesQcTemplateItemDO> templateItems = templateItemMapper.selectListByItemId(item.getMdmItemId()); |
| | | // 2. æ¥åºè¯¥ç©æå
³èçææäº§åå
³è |
| | | List<MesQcTemplateItemDO> templateItems = templateItemMapper.selectListByItemId(resolvedMdmItemId); |
| | | if (CollUtil.isEmpty(templateItems)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | // 4. è¿æ»¤ï¼æ¹æ¡å¯ç¨ä¸æ£æµç§ç±»å
å« qcTypeï¼è¿åå
¨é¨å¹é
项 |
| | | // 3. è¿æ»¤ï¼æ¹æ¡å¯ç¨ä¸æ£æµç§ç±»å
å« qcTypeï¼è¿åå
¨é¨å¹é
项 |
| | | List<MesQcTemplateDO> templates = templateService.getTemplateList( |
| | | convertSet(templateItems, MesQcTemplateItemDO::getTemplateId)); |
| | | Set<Long> matchedTemplateIds = templates.stream() |
| | |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | /** |
| | | * MES ç©æ ID 转 MDM ç©æ ID |
| | | * |
| | | * @param mesItemId MES ç©æ IDï¼mes_md_item.idï¼ |
| | | * @return MDM ç©æ IDï¼mdm_item.idï¼ï¼MES ç©æä¸å卿æªå
³è MDM ç©ææ¶è¿å null |
| | | */ |
| | | private Long convertMesItemIdToMdmItemId(Long mesItemId) { |
| | | if (mesItemId == null) { |
| | | return null; |
| | | } |
| | | MesMdItemDO item = mesMdItemService.getItem(mesItemId); |
| | | return item != null ? item.getMdmItemId() : null; |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesLineMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcOqcCheckResultEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateProductSalesLineWhenOqcFinish(Long id, Long oqcId, Integer checkResult) { |
| | | // 1. æ´æ°è¡ç oqcId + qualityStatus |
| | | Integer qualityStatus = Objects.equals(checkResult, MesQcCheckResultEnum.QUALIFIED.getType()) |
| | | // 1. æ´æ°è¡ç oqcId + qualityStatusï¼1å/2åæ¾è¡ï¼åºåå¤ä¸åæ ¼ï¼ |
| | | Integer qualityStatus = MesQcOqcCheckResultEnum.canShip(checkResult) |
| | | ? MesWmQualityStatusEnum.PASS.getStatus() : MesWmQualityStatusEnum.FAIL.getStatus(); |
| | | productSalesLineMapper.updateById(new MesWmProductSalesLineDO() |
| | | .setId(id).setOqcId(oqcId).setQualityStatus(qualityStatus)); |
| | |
| | | n.arrival_date AS recordTime, |
| | | ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@IQC.type} AS qcType, |
| | | l.item_id AS itemId, |
| | | NULL AS batchCode, |
| | | l.arrival_quantity AS quantity, |
| | | n.vendor_id AS vendorId, |
| | | NULL AS workOrderId, |
| | |
| | | r.receipt_date AS recordTime, |
| | | ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@IQC.type} AS qcType, |
| | | rl.item_id AS itemId, |
| | | NULL AS batchCode, |
| | | rl.quantity AS quantity, |
| | | r.vendor_id AS vendorId, |
| | | NULL AS workOrderId, |
| | |
| | | pf.feedback_time AS recordTime, |
| | | ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@IPQC.type} AS qcType, |
| | | ppl.item_id AS itemId, |
| | | ppl.batch_code AS batchCode, |
| | | ppl.quantity AS quantity, |
| | | NULL AS vendorId, |
| | | pf.work_order_id AS workOrderId, |
| | |
| | | s.sales_date AS recordTime, |
| | | ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@OQC.type} AS qcType, |
| | | sl.item_id AS itemId, |
| | | NULL AS batchCode, |
| | | sl.quantity AS quantity, |
| | | NULL AS vendorId, |
| | | NULL AS workOrderId, |
| | |
| | | ri.return_date AS recordTime, |
| | | ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@RQC.type} AS qcType, |
| | | ril.item_id AS itemId, |
| | | NULL AS batchCode, |
| | | ril.quantity AS quantity, |
| | | NULL AS vendorId, |
| | | ri.work_order_id AS workOrderId, |
| | |
| | | r.return_date AS recordTime, |
| | | ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@RQC.type} AS qcType, |
| | | rl.item_id AS itemId, |
| | | NULL AS batchCode, |
| | | rl.quantity AS quantity, |
| | | NULL AS vendorId, |
| | | NULL AS workOrderId, |
| | |
| | | assertEquals("10.023ã10.115", itemTable.getRow(2).getCell(1).getText().trim()); |
| | | assertEquals("/", itemTable.getRow(3).getCell(1).getText().trim()); |
| | | |
| | | // å¤å®ç»è®º/è´¨æ£ä¸ç¨ç« ç空 |
| | | // å¤å®ç»è®ºå¸¦åºæ£éªç»æï¼è´¨æ£ä¸ç¨ç« ç空å¾
çç« |
| | | assertTrue(itemTable.getRow(2).getCell(0).getText().contains("è¯æ ·è´¨é m /g")); |
| | | assertEquals("å¤å®ç»è®ºï¼", tables.get(2).getRow(0).getCell(0).getText().trim()); |
| | | assertEquals("å¤å®ç»è®ºï¼1å", tables.get(2).getRow(0).getCell(0).getText().trim()); |
| | | assertEquals("è´¨æ£ä¸ç¨ç« ï¼", tables.get(2).getRow(0).getCell(1).getText().trim()); |
| | | |
| | | // 夿³¨é»è®¤ææ¡ |
| | |
| | | .setSamplingTime(LocalDateTime.of(2026, 1, 6, 9, 0)) |
| | | .setInspectDate(LocalDateTime.of(2026, 1, 6, 15, 0)) |
| | | .setDocCreateTime(LocalDateTime.of(2026, 1, 6, 8, 0)) |
| | | .setInspectorName("æå").setAuditName("å¨äºæ´").setApproveName("å
ç¿ è"); |
| | | .setInspectorName("æå").setAuditName("å¨äºæ´").setApproveName("å
ç¿ è") |
| | | .setCheckResult(1).setCheckResultText("1å"); |
| | | |
| | | MesQcQcReportRespVO.ReportItem appearance = new MesQcQcReportRespVO.ReportItem(); |
| | | appearance.setIndicatorName("å¤è§").setItemType(1).setSortOrder(10); |
| | |
| | | import cn.iocoder.yudao.framework.common.exception.ServiceException; |
| | | import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO; |
| | | 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.qc.ipqc.MesQcIpqcDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.qc.ipqc.MesQcIpqcMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; |
| | | import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.feedback.MesProFeedbackService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.ncr.MesQcNcrService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | | import org.junit.jupiter.api.Test; |
| | |
| | | import org.springframework.test.context.bean.override.mockito.MockitoBean; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; |
| | | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; |
| | | import static org.junit.jupiter.api.Assertions.*; |
| | | import static org.mockito.ArgumentMatchers.any; |
| | | import static org.mockito.ArgumentMatchers.eq; |
| | | import static org.mockito.ArgumentMatchers.isNull; |
| | | import static org.mockito.Mockito.*; |
| | | |
| | | /** |
| | |
| | | @MockitoBean |
| | | private MesQcTemplateItemService templateItemService; |
| | | @MockitoBean |
| | | private MesQcTemplateService templateService; |
| | | @MockitoBean |
| | | private MesQcIpqcLineService ipqcLineService; |
| | | @MockitoBean |
| | | private MesProWorkOrderService workOrderService; |
| | | @MockitoBean |
| | | private MesMdWorkstationService workstationService; |
| | | @MockitoBean |
| | | private MesMdItemService itemService; |
| | | @MockitoBean |
| | | private MesQcDefectRecordService defectRecordService; |
| | | @MockitoBean |
| | |
| | | @MockitoBean |
| | | private MesProFeedbackService feedbackService; |
| | | @MockitoBean |
| | | private MesProRouteProductService routeProductService; |
| | | @MockitoBean |
| | | private MesProRouteProcessService routeProcessService; |
| | | @MockitoBean |
| | | private MesProTaskService taskService; |
| | | @MockitoBean |
| | | private MesQcIndicatorResultService indicatorResultService; |
| | | @MockitoBean |
| | | private MesWmProductProduceLineService productProduceLineService; |
| | | @MockitoBean |
| | | private MesQcNcrService ncrService; |
| | | @MockitoBean |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | // ==================== finishIpqc å忥æºåæ® ==================== |
| | | |
| | | @Test |
| | | public void testFinishIpqc_writeBack_feedback() { |
| | |
| | | Long sourceLineId = randomLongId(); |
| | | BigDecimal qualifiedQty = BigDecimal.valueOf(80); |
| | | BigDecimal unqualifiedQty = BigDecimal.valueOf(20); |
| | | BigDecimal laborScrapQty = BigDecimal.valueOf(5); |
| | | BigDecimal materialScrapQty = BigDecimal.valueOf(10); |
| | | BigDecimal otherScrapQty = BigDecimal.valueOf(5); |
| | | |
| | | MesQcIpqcDO ipqc = randomPojo(MesQcIpqcDO.class, o -> { |
| | | o.setStatus(MesQcStatusEnum.DRAFT.getStatus()); |
| | |
| | | o.setSourceLineId(sourceLineId); |
| | | o.setQualifiedQuantity(qualifiedQty); |
| | | o.setUnqualifiedQuantity(unqualifiedQty); |
| | | o.setLaborScrapQuantity(laborScrapQty); |
| | | o.setMaterialScrapQuantity(materialScrapQty); |
| | | o.setOtherScrapQuantity(otherScrapQty); |
| | | o.setLaborScrapQuantity(BigDecimal.valueOf(5)); |
| | | o.setMaterialScrapQuantity(BigDecimal.valueOf(10)); |
| | | o.setOtherScrapQuantity(BigDecimal.valueOf(5)); |
| | | }); |
| | | ipqcMapper.insert(ipqc); |
| | | |
| | |
| | | any(BigDecimal.class), |
| | | any(BigDecimal.class), |
| | | any(BigDecimal.class)); |
| | | // æè¨ 3ï¼ä¸åæ ¼æ°é > 0ï¼èªå¨å建 NCR |
| | | verify(ncrService).createNcr(any()); |
| | | } |
| | | |
| | | @Test |
| | |
| | | |
| | | @Test |
| | | public void testFinishIpqc_writeBack_noSourceDoc() { |
| | | // å夿°æ®ï¼sourceDocType 为空ï¼ä¸éè¦åå |
| | | // å夿°æ®ï¼æ æ¥æºåæ®ï¼æå·¥å建ç IPQCï¼ï¼ç´æ¥å®æï¼ä¸åå |
| | | MesQcIpqcDO ipqc = randomPojo(MesQcIpqcDO.class, o -> { |
| | | o.setStatus(MesQcStatusEnum.DRAFT.getStatus()); |
| | | o.setCheckResult(1); |
| | | o.setSourceDocType(null); |
| | | o.setSourceDocId(null); |
| | | o.setSourceLineId(null); |
| | | o.setUnqualifiedQuantity(BigDecimal.ZERO); |
| | | }); |
| | | ipqcMapper.insert(ipqc); |
| | | |
| | |
| | | // æè¨ 2ï¼ä¸åºè¯¥è°ç¨ feedbackService |
| | | verify(feedbackService, never()).updateProFeedbackWhenIpqcFinish( |
| | | anyLong(), anyLong(), any(), any(), any(), any(), any()); |
| | | } |
| | | |
| | | @Test |
| | | public void testFinishIpqc_writeBack_sourceDocTypeDirtyData() { |
| | | // å夿°æ®ï¼sourceDocType éç©ºä½ sourceDocId 为空ï¼åºè¯¥æå¼å¸¸ |
| | | MesQcIpqcDO ipqc = randomPojo(MesQcIpqcDO.class, o -> { |
| | | o.setStatus(MesQcStatusEnum.DRAFT.getStatus()); |
| | | o.setCheckResult(1); |
| | | o.setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK); |
| | | o.setSourceDocId(null); // èæ°æ® |
| | | o.setSourceLineId(null); |
| | | }); |
| | | ipqcMapper.insert(ipqc); |
| | | |
| | | // è°ç¨ï¼å¹¶æè¨å¼å¸¸ |
| | | assertThrows(IllegalArgumentException.class, () -> ipqcService.finishIpqc(ipqc.getId())); |
| | | } |
| | | |
| | | @Test |
| | | public void testFinishIpqc_writeBack_unknownSourceDocType() { |
| | | // å夿°æ®ï¼sourceDocType æ æ³è¯å« |
| | | MesQcIpqcDO ipqc = randomPojo(MesQcIpqcDO.class, o -> { |
| | | o.setStatus(MesQcStatusEnum.DRAFT.getStatus()); |
| | | o.setCheckResult(1); |
| | | o.setSourceDocType(99999); // æ æ³è¯å«çç±»å |
| | | o.setSourceDocId(randomLongId()); |
| | | o.setSourceLineId(null); |
| | | }); |
| | | ipqcMapper.insert(ipqc); |
| | | |
| | | // è°ç¨ï¼å¹¶æè¨å¼å¸¸ |
| | | assertThrows(IllegalArgumentException.class, () -> ipqcService.finishIpqc(ipqc.getId())); |
| | | } |
| | | |
| | | @Test |
| | |
| | | assertThrows(Exception.class, () -> ipqcService.finishIpqc(ipqc.getId())); |
| | | } |
| | | |
| | | // ==================== processId æ¨å¯¼è¡ä¸ºæµè¯ ==================== |
| | | // ==================== createIpqc ç©æ / æ¹å· / 模æ¿å¹é
==================== |
| | | |
| | | /** |
| | | * å·¥ä½æå·¥åº + 该工åºå¨äº§åå·¥èºè·¯çº¿ä¸ â processId åºè¯¥è¢«è®¾ç½®ä¸ºå·¥ä½å·¥åº |
| | | * æå·¥å建ï¼ç©ææ¥èª MDMï¼æ¨¡æ¿æ MDM ç©æ ID å¹é
ï¼æ¹å·ãç©æåè½åº |
| | | */ |
| | | @Test |
| | | public void testCreateIpqc_processId_workstationHasProcess() { |
| | | public void testCreateIpqc_success() { |
| | | // åå¤åæ° |
| | | Long workstationId = randomLongId(); |
| | | Long workOrderId = randomLongId(); |
| | | Long productId = randomLongId(); |
| | | Long processId = randomLongId(); |
| | | Long routeId = randomLongId(); |
| | | Long itemId = randomLongId(); |
| | | Long templateId = randomLongId(); |
| | | MesQcIpqcSaveReqVO reqVO = buildReqVO("IPQC-TEST-001"); |
| | | reqVO.setItemId(itemId); |
| | | reqVO.setBatchCode("BC20250101"); |
| | | |
| | | MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); |
| | | reqVO.setCode("IPQC-TEST-001"); |
| | | reqVO.setWorkstationId(workstationId); |
| | | reqVO.setWorkOrderId(workOrderId); |
| | | reqVO.setInspectorUserId(randomLongId()); |
| | | |
| | | // mock å·¥ä½è¿åæå·¥åº |
| | | MesMdWorkstationDO workstation = new MesMdWorkstationDO(); |
| | | workstation.setId(workstationId); |
| | | workstation.setProcessId(processId); |
| | | when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); |
| | | // mock å·¥å |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | // mock 模æ¿å¹é
|
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | // mock å·¥èºè·¯çº¿ |
| | | MesProRouteProductDO routeProduct = new MesProRouteProductDO(); |
| | | routeProduct.setRouteId(routeId); |
| | | when(routeProductService.getRouteProductByItemId(productId)).thenReturn(routeProduct); |
| | | // mock å·¥åºå¨è·¯çº¿ä¸ |
| | | when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, processId)) |
| | | .thenReturn(new MesProRouteProcessDO()); |
| | | // mockï¼æ MDM ç©æ ID å¹é
å°è´¨æ£æ¹æ¡ |
| | | mockTemplate(templateId); |
| | | |
| | | // è°ç¨ |
| | | Long ipqcId = ipqcService.createIpqc(reqVO); |
| | | |
| | | // æè¨ï¼processId åºè¯¥æ¯å·¥ä½å·¥åº |
| | | // æè¨ 1ï¼æ¹å·ãç©æãæ¹æ¡åè½åº |
| | | MesQcIpqcDO ipqc = ipqcMapper.selectById(ipqcId); |
| | | assertEquals(processId, ipqc.getProcessId()); |
| | | assertNotNull(ipqc); |
| | | assertEquals("BC20250101", ipqc.getBatchCode()); |
| | | assertEquals(itemId, ipqc.getItemId()); |
| | | assertEquals(templateId, ipqc.getTemplateId()); |
| | | assertEquals(MesQcStatusEnum.DRAFT.getStatus(), ipqc.getStatus()); |
| | | assertNull(ipqc.getSourceDocCode()); |
| | | |
| | | // æè¨ 2ï¼æ¨¡æ¿æ MDM ç©æ ID å¹é
ï¼ä¸åä¾èµå·¥å/ä»»å¡ |
| | | verify(templateItemService).getTemplateItemList( |
| | | eq(itemId), eq(MesQcTypeEnum.IPQC.getType()), isNull(), isNull()); |
| | | // æè¨ 3ï¼ç©æå卿§æ ¡éªèµ° MDM |
| | | verify(mdmItemApi).validateItemExists(itemId); |
| | | } |
| | | |
| | | /** |
| | | * 工使²¡æå·¥åºï¼processId=nullï¼â processId åºè¯¥ç nullï¼ä¸åéå°ä»»å¡å·¥åºï¼ |
| | | * ç©ææªå¹é
å°ä»»ä½è´¨æ£æ¹æ¡ â å建失败 |
| | | */ |
| | | @Test |
| | | public void testCreateIpqc_processId_workstationNoProcess_shouldBeNull() { |
| | | public void testCreateIpqc_noTemplate() { |
| | | // åå¤åæ° |
| | | Long workstationId = randomLongId(); |
| | | Long workOrderId = randomLongId(); |
| | | Long productId = randomLongId(); |
| | | Long taskId = randomLongId(); |
| | | Long templateId = randomLongId(); |
| | | MesQcIpqcSaveReqVO reqVO = buildReqVO("IPQC-TEST-002"); |
| | | reqVO.setItemId(randomLongId()); |
| | | |
| | | MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); |
| | | reqVO.setCode("IPQC-TEST-002"); |
| | | reqVO.setWorkstationId(workstationId); |
| | | reqVO.setWorkOrderId(workOrderId); |
| | | reqVO.setTaskId(taskId); // æ
æä¼ å
¥ taskIdï¼éªè¯ä¸ä¼åé |
| | | reqVO.setInspectorUserId(randomLongId()); |
| | | // mockï¼æ å¹é
æ¹æ¡ |
| | | when(templateItemService.getTemplateItemList(any(), any(), any(), any())) |
| | | .thenReturn(Collections.emptyList()); |
| | | |
| | | // mock 工使²¡æå·¥åº |
| | | MesMdWorkstationDO workstation = new MesMdWorkstationDO(); |
| | | workstation.setId(workstationId); |
| | | workstation.setProcessId(null); // æ å·¥åº |
| | | when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); |
| | | // mock å·¥å |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | // mock ä»»å¡ |
| | | MesProTaskDO task = new MesProTaskDO(); |
| | | task.setId(taskId); |
| | | task.setWorkOrderId(workOrderId); |
| | | task.setWorkstationId(workstationId); |
| | | task.setItemId(productId); |
| | | when(taskService.validateTaskNotFinished(taskId)).thenReturn(task); |
| | | // mock 模æ¿å¹é
|
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | |
| | | // è°ç¨ |
| | | Long ipqcId = ipqcService.createIpqc(reqVO); |
| | | |
| | | // æè¨ï¼processId åºè¯¥æ¯ nullï¼å³ä½¿ä¼ å
¥äº taskId ä¹ä¸åºè¯¥åé |
| | | MesQcIpqcDO ipqc = ipqcMapper.selectById(ipqcId); |
| | | assertNull(ipqc.getProcessId(), |
| | | "工使 å·¥åºæ¶ processId åºä¸º nullï¼ä¸åºåéå°ä»»å¡å·¥åº"); |
| | | // æè¨ï¼ä¸åºè¯¥è¯»åä»»å¡ç processId |
| | | verify(routeProductService, never()).getRouteProductByItemId(any()); |
| | | // è°ç¨ï¼æè¨å¼å¸¸ |
| | | ServiceException ex = assertThrows(ServiceException.class, () -> ipqcService.createIpqc(reqVO)); |
| | | assertEquals(QC_NO_TEMPLATE.getCode(), ex.getCode()); |
| | | } |
| | | |
| | | /** |
| | | * 工使工åºä½è¯¥å·¥åºä¸å¨äº§åå·¥èºè·¯çº¿ä¸ â processId åºè¯¥ç null |
| | | */ |
| | | @Test |
| | | public void testCreateIpqc_processId_processNotInRoute() { |
| | | // åå¤åæ° |
| | | Long workstationId = randomLongId(); |
| | | Long workOrderId = randomLongId(); |
| | | Long productId = randomLongId(); |
| | | Long processId = randomLongId(); |
| | | Long routeId = randomLongId(); |
| | | Long templateId = randomLongId(); |
| | | |
| | | MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); |
| | | reqVO.setCode("IPQC-TEST-003"); |
| | | reqVO.setWorkstationId(workstationId); |
| | | reqVO.setWorkOrderId(workOrderId); |
| | | reqVO.setInspectorUserId(randomLongId()); |
| | | |
| | | // mock å·¥ä½æå·¥åº |
| | | MesMdWorkstationDO workstation = new MesMdWorkstationDO(); |
| | | workstation.setId(workstationId); |
| | | workstation.setProcessId(processId); |
| | | when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); |
| | | // mock å·¥å |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | // mock 模æ¿å¹é
|
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | // mock å·¥èºè·¯çº¿åå¨ |
| | | MesProRouteProductDO routeProduct = new MesProRouteProductDO(); |
| | | routeProduct.setRouteId(routeId); |
| | | when(routeProductService.getRouteProductByItemId(productId)).thenReturn(routeProduct); |
| | | // mock å·¥åºä¸å¨è·¯çº¿ä¸ |
| | | when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, processId)) |
| | | .thenReturn(null); |
| | | |
| | | // è°ç¨ |
| | | Long ipqcId = ipqcService.createIpqc(reqVO); |
| | | |
| | | // æè¨ï¼processId åºè¯¥æ¯ null |
| | | MesQcIpqcDO ipqc = ipqcMapper.selectById(ipqcId); |
| | | assertNull(ipqc.getProcessId()); |
| | | } |
| | | |
| | | // ==================== sourceLineId æ ¡éªæµè¯ ==================== |
| | | // ==================== createIpqc sourceLineId æ ¡éª ==================== |
| | | |
| | | /** |
| | | * sourceDocType=PRO_FEEDBACK æ¶ sourceLineId 为空 â å建失败 |
| | |
| | | @Test |
| | | public void testCreateIpqc_sourceLineId_required() { |
| | | // åå¤åæ° |
| | | Long workstationId = randomLongId(); |
| | | Long workOrderId = randomLongId(); |
| | | Long productId = randomLongId(); |
| | | Long feedbackId = randomLongId(); |
| | | Long templateId = randomLongId(); |
| | | |
| | | MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); |
| | | reqVO.setCode("IPQC-SL-001"); |
| | | reqVO.setWorkstationId(workstationId); |
| | | reqVO.setWorkOrderId(workOrderId); |
| | | reqVO.setInspectorUserId(randomLongId()); |
| | | MesQcIpqcSaveReqVO reqVO = buildReqVO("IPQC-SL-001"); |
| | | reqVO.setItemId(randomLongId()); |
| | | reqVO.setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK); |
| | | reqVO.setSourceDocId(feedbackId); |
| | | reqVO.setSourceLineId(null); // ä¸ä¼ sourceLineId |
| | | |
| | | // mock |
| | | MesMdWorkstationDO workstation = new MesMdWorkstationDO(); |
| | | workstation.setId(workstationId); |
| | | workstation.setProcessId(null); |
| | | when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | mockTemplate(randomLongId()); |
| | | when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(new MesProFeedbackDO()); |
| | | |
| | | // è°ç¨ï¼æè¨å¼å¸¸ |
| | |
| | | @Test |
| | | public void testCreateIpqc_sourceLineId_notBelong() { |
| | | // åå¤åæ° |
| | | Long workstationId = randomLongId(); |
| | | Long workOrderId = randomLongId(); |
| | | Long productId = randomLongId(); |
| | | Long feedbackId = randomLongId(); |
| | | Long sourceLineId = randomLongId(); |
| | | Long templateId = randomLongId(); |
| | | |
| | | MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); |
| | | reqVO.setCode("IPQC-SL-002"); |
| | | reqVO.setWorkstationId(workstationId); |
| | | reqVO.setWorkOrderId(workOrderId); |
| | | reqVO.setInspectorUserId(randomLongId()); |
| | | MesQcIpqcSaveReqVO reqVO = buildReqVO("IPQC-SL-002"); |
| | | reqVO.setItemId(randomLongId()); |
| | | reqVO.setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK); |
| | | reqVO.setSourceDocId(feedbackId); |
| | | reqVO.setSourceLineId(sourceLineId); |
| | | |
| | | // mock |
| | | MesMdWorkstationDO workstation = new MesMdWorkstationDO(); |
| | | workstation.setId(workstationId); |
| | | workstation.setProcessId(null); |
| | | when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | mockTemplate(randomLongId()); |
| | | when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(new MesProFeedbackDO()); |
| | | // mockï¼äº§åºè¡åå¨ä½ feedbackId ä¸å¹é
|
| | | MesWmProductProduceLineDO line = new MesWmProductProduceLineDO(); |
| | |
| | | @Test |
| | | public void testCreateIpqc_sourceLineId_notPending() { |
| | | // åå¤åæ° |
| | | Long workstationId = randomLongId(); |
| | | Long workOrderId = randomLongId(); |
| | | Long productId = randomLongId(); |
| | | Long feedbackId = randomLongId(); |
| | | Long sourceLineId = randomLongId(); |
| | | Long templateId = randomLongId(); |
| | | |
| | | MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); |
| | | reqVO.setCode("IPQC-SL-003"); |
| | | reqVO.setWorkstationId(workstationId); |
| | | reqVO.setWorkOrderId(workOrderId); |
| | | reqVO.setInspectorUserId(randomLongId()); |
| | | MesQcIpqcSaveReqVO reqVO = buildReqVO("IPQC-SL-003"); |
| | | reqVO.setItemId(randomLongId()); |
| | | reqVO.setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK); |
| | | reqVO.setSourceDocId(feedbackId); |
| | | reqVO.setSourceLineId(sourceLineId); |
| | | |
| | | // mock |
| | | MesMdWorkstationDO workstation = new MesMdWorkstationDO(); |
| | | workstation.setId(workstationId); |
| | | workstation.setProcessId(null); |
| | | when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | mockTemplate(randomLongId()); |
| | | when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(new MesProFeedbackDO()); |
| | | // mockï¼äº§åºè¡åå¨ä¸å½å±æ£ç¡®ï¼ä½ä¸æ¯ PENDING ç¶æ |
| | | MesWmProductProduceLineDO line = new MesWmProductProduceLineDO(); |
| | |
| | | } |
| | | |
| | | /** |
| | | * sourceLineId æ ¡éªå
¨é¨éè¿ â å建æå |
| | | * sourceLineId æ ¡éªå
¨é¨éè¿ â å建æåï¼æ¥æºåæ®ç¼å·åå |
| | | */ |
| | | @Test |
| | | public void testCreateIpqc_sourceLineId_success() { |
| | | // åå¤åæ° |
| | | Long workstationId = randomLongId(); |
| | | Long workOrderId = randomLongId(); |
| | | Long productId = randomLongId(); |
| | | Long itemId = randomLongId(); |
| | | Long feedbackId = randomLongId(); |
| | | Long sourceLineId = randomLongId(); |
| | | Long templateId = randomLongId(); |
| | | |
| | | MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); |
| | | reqVO.setCode("IPQC-SL-004"); |
| | | reqVO.setWorkstationId(workstationId); |
| | | reqVO.setWorkOrderId(workOrderId); |
| | | reqVO.setInspectorUserId(randomLongId()); |
| | | MesQcIpqcSaveReqVO reqVO = buildReqVO("IPQC-SL-004"); |
| | | reqVO.setItemId(itemId); |
| | | reqVO.setBatchCode("BC20250101"); |
| | | reqVO.setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK); |
| | | reqVO.setSourceDocId(feedbackId); |
| | | reqVO.setSourceLineId(sourceLineId); |
| | | |
| | | // mock |
| | | MesMdWorkstationDO workstation = new MesMdWorkstationDO(); |
| | | workstation.setId(workstationId); |
| | | workstation.setProcessId(null); |
| | | when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | mockTemplate(templateId); |
| | | MesProFeedbackDO feedback = new MesProFeedbackDO(); |
| | | feedback.setId(feedbackId); |
| | | feedback.setCode("FB-001"); |
| | |
| | | // è°ç¨ |
| | | Long ipqcId = ipqcService.createIpqc(reqVO); |
| | | |
| | | // æè¨ï¼å建æåï¼sourceDocCode åå |
| | | // æè¨ï¼å建æåï¼æ¥æºåæ®å段è½åº |
| | | MesQcIpqcDO ipqc = ipqcMapper.selectById(ipqcId); |
| | | assertNotNull(ipqc); |
| | | assertEquals(feedbackId, ipqc.getSourceDocId()); |
| | | assertEquals(sourceLineId, ipqc.getSourceLineId()); |
| | | assertEquals("FB-001", ipqc.getSourceDocCode()); |
| | | assertEquals("BC20250101", ipqc.getBatchCode()); |
| | | assertEquals(itemId, ipqc.getItemId()); |
| | | } |
| | | |
| | | /** |
| | | * æªç¥æ¥æºåæ®ç±»å â å建失败 |
| | | */ |
| | | @Test |
| | | public void testCreateIpqc_sourceDocTypeUnknown() { |
| | | // åå¤åæ° |
| | | MesQcIpqcSaveReqVO reqVO = buildReqVO("IPQC-SL-005"); |
| | | reqVO.setItemId(randomLongId()); |
| | | reqVO.setSourceDocType(99999); // æ æ³è¯å«çç±»å |
| | | reqVO.setSourceDocId(randomLongId()); |
| | | |
| | | // mock |
| | | mockTemplate(randomLongId()); |
| | | |
| | | // è°ç¨ï¼æè¨å¼å¸¸ |
| | | ServiceException ex = assertThrows(ServiceException.class, () -> ipqcService.createIpqc(reqVO)); |
| | | assertEquals(QC_IPQC_SOURCE_DOC_TYPE_UNKNOWN.getCode(), ex.getCode()); |
| | | } |
| | | |
| | | // ==================== è¾
婿¹æ³ ==================== |
| | | |
| | | /** |
| | | * æé ä¸ä¸ªæ»¡è¶³å¿
填项çè¿ç¨æ£éªå请æ±ï¼ä¸å«æ¥æºåæ®ï¼ |
| | | */ |
| | | private MesQcIpqcSaveReqVO buildReqVO(String code) { |
| | | MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); |
| | | reqVO.setCode(code); |
| | | reqVO.setName(code + "-åç§°"); |
| | | reqVO.setType(1); |
| | | reqVO.setBatchCode("BC-" + code); |
| | | reqVO.setCheckQuantity(BigDecimal.valueOf(100)); |
| | | reqVO.setQualifiedQuantity(BigDecimal.valueOf(95)); |
| | | reqVO.setUnqualifiedQuantity(BigDecimal.valueOf(5)); |
| | | reqVO.setLaborScrapQuantity(BigDecimal.ZERO); |
| | | reqVO.setMaterialScrapQuantity(BigDecimal.ZERO); |
| | | reqVO.setOtherScrapQuantity(BigDecimal.ZERO); |
| | | reqVO.setInspectorUserId(randomLongId()); |
| | | return reqVO; |
| | | } |
| | | |
| | | /** |
| | | * mockï¼æ MDM ç©æ ID + IPQC ç±»åå¹é
å°æå®è´¨æ£æ¹æ¡ |
| | | */ |
| | | private void mockTemplate(Long templateId) { |
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | List<MesQcTemplateItemDO> templateItems = Collections.singletonList(templateItem); |
| | | when(templateItemService.getTemplateItemList(any(), eq(MesQcTypeEnum.IPQC.getType()), isNull(), isNull())) |
| | | .thenReturn(templateItems); |
| | | } |
| | | |
| | | } |
| | |
| | | "source_doc_id" bigint DEFAULT NULL, |
| | | "source_line_id" bigint DEFAULT NULL, |
| | | "source_doc_code" varchar(64) DEFAULT NULL, |
| | | "work_order_id" bigint DEFAULT NULL, |
| | | "task_id" bigint DEFAULT NULL, |
| | | "workstation_id" bigint DEFAULT NULL, |
| | | "process_id" bigint DEFAULT NULL, |
| | | "batch_code" varchar(100) DEFAULT NULL, |
| | | "item_id" bigint DEFAULT NULL, |
| | | "check_quantity" decimal(14,2) DEFAULT NULL, |
| | | "qualified_quantity" decimal(14,2) DEFAULT NULL, |
| | |
| | | "inspect_date" timestamp DEFAULT NULL, |
| | | "inspector_user_id" bigint DEFAULT NULL, |
| | | "status" tinyint DEFAULT NULL, |
| | | "sampling_location" varchar(255) DEFAULT NULL, |
| | | "certificate_no" varchar(100) DEFAULT NULL, |
| | | "execute_standard" varchar(100) DEFAULT NULL, |
| | | "audit_user_id" bigint DEFAULT NULL, |
| | | "approve_user_id" bigint DEFAULT NULL, |
| | | "remark" varchar(500) DEFAULT NULL, |
| | | "creator" varchar(64) DEFAULT '', |
| | | "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, |