| | |
| | | }, |
| | | { |
| | | "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 å¯¹èæ°æ®éæã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # è´¨æ£äº§åæ£éªå Word å¯¼åº - å端èè°æ¹æ¡ |
| | | |
| | | > 对åºçº¸è´¨"ÃÃ产åè´¨éæ£éªå"çå¼ï¼å¦ï¼å®å¤ä¹æ³åå·¥ç§ææéå
¬å¸ å·¥ä¸ç¨æ£ä¸é产åè´¨éæ£éªåï¼ã |
| | | > æ¯æä¸è½½ Wordï¼.docxï¼ï¼**æå°éè¿ä¸è½½åç¨ Word æå¼æå°**ï¼å端ä¸åæä¾æå°é¡µé¢ã |
| | | > IQC/IPQC/OQC/RQC åç±»æ£éªåéç¨ï¼ä¸ç°æ `/report` èåæ°æ®æ¥å£å
±ç¨åæ°ã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - åç±»æ£éªåå表/详æ
çæä½åï¼æ°å¢ãå¯¼åºæ£éªå(Word)ãå
¥å£ï¼ä¸æ¢æãæå°æ¥åãå¹¶åï¼ |
| | | - 夿 ·åï¼å¤ä¸ªæ£éªç»æï¼çåæ®ï¼å¯¼åºåå
è®¸éæ©æ ·åï¼ä¼ `resultId`ï¼ä¸ä¼ é»è®¤åææ©ä¸ä¸ªæ ·åï¼ |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /mes/qc/indicator-result/export-product-word | 导åºäº§åæ£éªå Wordï¼ååºä¸º docx äºè¿å¶æµ | |
| | | |
| | | **请æ±åæ°ï¼queryï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | qcId | Long | æ¯ | è´¨æ£å ID | |
| | | | qcType | Integer | æ¯ | è´¨æ£ç±»åï¼1=IQCã2=IPQCã3=OQCã4=RQC | |
| | | | resultId | Long | å¦ | æ£éªç»æï¼æ ·åï¼ç¼å·ï¼å¤æ ·åæ¶ç¨äºéæ© | |
| | | |
| | | **ååºï¼** |
| | | |
| | | - Content-Typeï¼`application/vnd.openxmlformats-officedocument.wordprocessingml.document` |
| | | - Content-Dispositionï¼`attachment;filename=<UTF8ç¼ç >`ï¼æä»¶å为 `{ç©æåç§°}产åè´¨éæ£éªå-{æ£éªåå·}.docx` |
| | | - æéæ è¯ï¼`mes:qc-iqc:query`ï¼ä¸ `/report` ä¸è´ï¼ |
| | | |
| | | **å端è°ç¨æ¹å¼ï¼** 䏿¢æ Excel 导åºä¸è´ï¼axios 以 blob 请æ±å触åä¸è½½ï¼é带 tokenï¼ï¼ä¸å¯ç¨ `<a href>` ç´é¾ã |
| | | |
| | | ## æ¥åçå¼ä¸å段带å
¥ |
| | | |
| | | åç«¯ä» `/report` åæºæ°æ®ç»è£
ï¼å段æ å°å¦ä¸ï¼ |
| | | |
| | | | 纸质æ ä½ | æ°æ®æ¥æº | 说æ | |
| | | |----------|----------|------| |
| | | | æ¥åæ é¢å
¬å¸å / ç产åä½ | åæ»ãå®å¤ä¹æ³åå·¥ç§ææéå
¬å¸ã | 第äºè¡ä¸ºã{ç©æåç§°}产åè´¨éæ£éªåã | |
| | | | ç产æ¶é´ | è´¨æ£åå建æ¶é´ï¼`docCreateTime`ï¼æ°å¢ååºåæ®µï¼ | | |
| | | | æ¹å· | `batchNo` | IQC=ä¾åºåæ¹æ¬¡ï¼OQC/RQC/IPQC=åæ®æ¹æ¬¡å· | |
| | | | éæ ·å°ç¹ | `samplingLocation` | | |
| | | | æ¹é | `batchQuantity` | ç©ºå¼æå° `/` | |
| | | | éæ ·è
| `inspectorName`ï¼æ£éªäººï¼ | | |
| | | | åæ ·æ¥æ | `samplingTime` | | |
| | | | æ§è¡æ å | `executeStandard` | | |
| | | | æ£éªæ¥æ | `inspectDate`ï¼æ°å¢ååºåæ®µï¼ | | |
| | | | æ£éªé¡¹ç® | å½å
¥é¡¹åç§° | **ä¸å«ææ¯ææ å**ï¼åç»è¡ä¸å
¬å¼ææ¬ä¸å±ç¤ºï¼åç»ä¸å½å
¥é¡¹å¹³éº | |
| | | | æ£éªç»æ | æµéå¼ | å¹³è¡æµéå¤å¼é¡¿å·åå¹¶ï¼å¦ `10.023ã10.115`ï¼ï¼æ å¼ `/` | |
| | | | å¤å®ç»è®º | `checkResultText` | èªå¨å¸¦åºæ£éªç»æææ¡ï¼æ `qcType` ååå
¸ï¼OQC ç¨ `mes_oqc_check_result`ï¼ï¼æªå¤å®æ¶ç空 | |
| | | | è´¨æ£ä¸ç¨ç« | ç空 | æå°åçç« | |
| | | | 夿³¨ | åæ® `remark`ï¼ä¸ºç©ºæ¶é»è®¤ãæ£éªç»æä»
å¯¹æ ·åæ¬èº«ææ¬æ¹æ¬¡è´è´£ãã | | |
| | | | æ£éª / 夿 ¸ / æ¹å | `inspectorName` / `auditName` / `approveName` | åå«å¯¹åºåæ®çæ£æµäººåã夿 ¸äººãå®¡æ ¸äººï¼æªæå®äººåæ¶è¯¥æ®µç空ãæå°åæå | |
| | | |
| | | ## æ¥å£åæ´ç¹ï¼`/mes/qc/indicator-result/report` ååºï¼ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | inspectDate | DateTime | æ£éªæ¥æï¼æ£éªå inspectDate åæ®µï¼ | |
| | | | docCreateTime | DateTime | è´¨æ£åå建æ¶é´ï¼Word æ¥åæå°ä¸º"ç产æ¶é´" | |
| | | |
| | | æ¢æå端æå°ç»ä»¶ï¼qc-report-print.vueï¼ä¸åå½±åï¼æ°å段ååå
¼å®¹ã |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | 夿 ·å | `resultId` ä¸ä¼ åææ©æ ·åï¼ä¸ `/report` è¡ä¸ºä¸è´ | |
| | | | ææ¯ææ | æ¬çå¼åºå®ä¸è¾åºéå¼/æ åå¼åï¼éè¦ææ¯ææ 对ç
§æ¶ä½¿ç¨æ¢æãæå°æ¥åãåéªè®°å½çå¼ | |
| | | | å¤å®ç»è®º | èªå¨å¸¦åºæ£éªç»æææ¡ï¼åæ®æªå¤å®ï¼`checkResult` ä¸ºç©ºï¼æ¶ç空æå¡« | |
| | | | æ£éª/夿 ¸/æ¹å | åå«åæ£æµäººåã夿 ¸äººãå®¡æ ¸äººå§åæå°ï¼ä¸é¡¹åå¯ä¸ºç©ºï¼æå°åæåï¼ï¼ä¸å 缺人åèæ¥é | |
| | | | ç©ºå¼ | ææ¬ç©ºæå° `/`ï¼æ¹é/æ¥æä¸ºç©ºæå° `/` | |
| | | | åç»ææ | åç»æ¬èº«ä¸å è¡ï¼ä»
å¹³éºå
¶ä¸å½å
¥é¡¹ï¼å«ä¸é´åæ°è¡ï¼å¦"è¯æ ·è´¨é m/g"ï¼ | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - æä»¶åå«ä¸æï¼å端已æ UTF-8 ç¼ç æ¾ headerï¼å端 blob ä¸è½½æ¶å»ºè®®ç´æ¥ç¨å
¥åæ¼æä»¶åæè§£æ Content-Dispositionã |
| | | - 导åºå
容为éæçå¼ï¼4 åç½æ ¼è¡¨ï¼ï¼æ 页ç页èãæ Logo å¾çï¼Logo å¦éå±ç¤ºç±å端确认ååæ©å±ã |
| | | - åå½ç¹ï¼`/report` æ¢æåæ®µä¸æå°ç»ä»¶è¡ä¸ºä¸åï¼æ¬æ¬¡ä»
æ°å¢ä¸¤ä¸ªååºåæ®µä¸æ°å¯¼åºæ¥å£ã |
| | | |
| | | ## å端éªè¯ |
| | | |
| | | - åæµï¼`yudao-module-mes` 模å `MesQcProductReportWordBuilderTest`ï¼çææ ·ä¾å¯è¯»åæè¨ï¼ï¼æ ·ä¾æä»¶ `yudao-module-mes/target/MesQcProductReportWordBuilder-sample.docx` å¯ç¨ Word æå¼æ ¸å¯¹çå¼ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================================== |
| | | -- MES è´¨æ£æ¥åæ¼ç¤ºæ°æ®ï¼IQC/IPQC/OQC/RQC å 3 æ¡å·²å®æåæ® |
| | | -- å«åç»æ£éªé¡¹(æ°´å/é
¸å«é/æ£ä¸éå«éå¹³éº) + å¹³è¡æµé(é¡¿å·åå¹¶) + 空å¼å ä½("/") |
| | | -- ç¾åï¼æ£éª=å¼ ä¸(231) 夿 ¸=å¼ éæ³¢(232) æ¹å=è¶
级管çå(1) |
| | | -- ä»
æ¬å°æ¼ç¤ºåºæ§è¡ï¼é夿§è¡å®å
¨ï¼å
æåºå®ç¼ç æ¸
çï¼ |
| | | -- ===================================================================== |
| | | |
| | | -- ---------- æ¸
ç䏿¬¡æ¼ç¤ºæ°æ® ---------- |
| | | DELETE FROM mes_qc_indicator_result_detail WHERE result_id IN (SELECT id FROM (SELECT id FROM mes_qc_indicator_result WHERE code LIKE 'MIR-DEMO%') t); |
| | | DELETE FROM mes_qc_indicator_result WHERE code LIKE 'MIR-DEMO%'; |
| | | DELETE FROM mes_qc_iqc_line WHERE iqc_id IN (SELECT id FROM (SELECT id FROM mes_qc_iqc WHERE code LIKE 'IQC-DEMO%') t); |
| | | DELETE FROM mes_qc_iqc WHERE code LIKE 'IQC-DEMO%'; |
| | | DELETE FROM mes_qc_ipqc_line WHERE ipqc_id IN (SELECT id FROM (SELECT id FROM mes_qc_ipqc WHERE code LIKE 'IPQC-DEMO%') t); |
| | | DELETE FROM mes_qc_ipqc WHERE code LIKE 'IPQC-DEMO%'; |
| | | DELETE FROM mes_qc_oqc_line WHERE oqc_id IN (SELECT id FROM (SELECT id FROM mes_qc_oqc WHERE code LIKE 'OQC-DEMO%') t); |
| | | DELETE FROM mes_qc_oqc WHERE code LIKE 'OQC-DEMO%'; |
| | | DELETE FROM mes_qc_rqc_line WHERE rqc_id IN (SELECT id FROM (SELECT id FROM mes_qc_rqc WHERE code LIKE 'RQC-DEMO%') t); |
| | | DELETE FROM mes_qc_rqc WHERE code LIKE 'RQC-DEMO%'; |
| | | |
| | | -- ---------- IQC æ¥ææ£éªåï¼qc_type=1ï¼ ---------- |
| | | INSERT INTO mes_qc_iqc (id,code,name,template_id,source_doc_type,source_doc_id,source_line_id,source_doc_code,vendor_id,vendor_batch,item_id,received_quantity,check_quantity,qualified_quantity,unqualified_quantity,check_result,receive_date,inspect_date,inspector_user_id,status,sampling_location,certificate_no,execute_standard,audit_user_id,approve_user_id,remark,creator,create_time,updater,update_time,deleted) |
| | | VALUES |
| | | (9001,'IQC-DEMO-01','ç²¾èæ¥ææ£éª-01',NULL,NULL,NULL,NULL,NULL,NULL,'JN-20260918-A01',2,2000,200,198,2,1,'2026-09-17 08:00:00','2026-09-18 09:30:00',231,4,'åæåºåæ ·å£','CERT-A001','GB/T 6027',232,1,'æ¼ç¤ºæ°æ®','1','2026-09-18 09:00:00','1','2026-09-18 09:30:00',0), |
| | | (9002,'IQC-DEMO-02','ç²¾èæ¥ææ£éª-02',NULL,NULL,NULL,NULL,NULL,NULL,'JN-20260918-A02',2,1500,150,150,0,1,'2026-09-17 08:00:00','2026-09-18 10:15:00',231,4,'ç²¾é¦å¡åæ ·å£','CERT-A002','GB/T 6027',232,1,NULL,'1','2026-09-18 10:00:00','1','2026-09-18 10:15:00',0), |
| | | (9003,'IQC-DEMO-03','å£¬ç¯æ¥ææ£éª-03',NULL,NULL,NULL,NULL,NULL,NULL,'JN-20260918-A03',4,800,80,76,4,3,'2026-09-17 08:00:00','2026-09-18 11:00:00',231,4,'车é´åæ ·å£ A-3','CERT-A003','GB/T 6028',232,1,'ä¸åæ ¼æ¹æ¬¡ï¼å·²èµ°éè´§æµç¨ã','1','2026-09-18 11:00:00','1','2026-09-18 11:00:00',0); |
| | | |
| | | -- ---------- IPQC è¿ç¨æ£éªåï¼qc_type=2ï¼ ---------- |
| | | INSERT INTO mes_qc_ipqc (id,code,name,type,template_id,source_doc_id,source_doc_code,work_order_id,item_id,check_quantity,qualified_quantity,unqualified_quantity,check_result,inspect_date,inspector_user_id,status,sampling_location,certificate_no,execute_standard,audit_user_id,approve_user_id,remark,creator,create_time,updater,update_time,deleted) |
| | | VALUES |
| | | (9011,'IPQC-DEMO-01','磺å䏿§æ£éª-01',NULL,NULL,NULL,'GD-20260918-01',NULL,4,300,298,2,1,'2026-09-18 13:00:00',231,4,'磺åå·¥åºåæ ·é','CERT-P001','Q/JH 02-2026',232,1,'æ¼ç¤ºæ°æ®','1','2026-09-18 13:00:00','1','2026-09-18 13:00:00',0), |
| | | (9012,'IPQC-DEMO-02','ä¸å䏿§æ£éª-02',NULL,NULL,NULL,'GD-20260918-02',NULL,6,260,260,0,1,'2026-09-18 14:00:00',231,4,'ä¸åéåæ ·é','CERT-P002','Q/JH 02-2026',232,1,'æ¼ç¤ºæ°æ®ï¼å¯åº¦/é
¸ç»ææªæµï¼','1','2026-09-18 14:00:00','1','2026-09-18 14:00:00',0), |
| | | (9013,'IPQC-DEMO-03','离å¿ä¸æ§æ£éª-03',NULL,NULL,NULL,'GD-20260918-03',NULL,2,120,120,0,1,'2026-09-18 15:30:00',231,4,'离å¿å·¥åºåæ ·å£','CERT-P003','Q/JH 02-2026',232,1,'æ¼ç¤ºæ°æ®','1','2026-09-18 15:30:00','1','2026-09-18 15:30:00',0); |
| | | |
| | | -- ---------- OQC åºè´§æ£éªåï¼qc_type=3ï¼ ---------- |
| | | INSERT INTO mes_qc_oqc (id,code,name,template_id,source_doc_code,client_id,batch_code,item_id,out_quantity,check_quantity,qualified_quantity,unqualified_quantity,check_result,out_date,inspect_date,inspector_user_id,status,sampling_location,certificate_no,execute_standard,audit_user_id,approve_user_id,remark,creator,create_time,updater,update_time,deleted) |
| | | VALUES |
| | | (9021,'OQC-DEMO-01','ç²¾èåºè´§æ£éª-01',NULL,'CH-20260918-01',NULL,'JH-CH0918-01',2,1000,100,99,1,1,'2026-09-18 16:00:00','2026-09-18 16:30:00',231,4,'æååºåè´§åº','CERT-O001','GB/T 6027',232,1,'æ¼ç¤ºæ°æ®','1','2026-09-18 16:30:00','1','2026-09-18 16:30:00',0), |
| | | (9022,'OQC-DEMO-02','壬ç¯åºè´§æ£éª-02',NULL,'CH-20260918-02',NULL,'JH-CH0918-02',4,500,50,50,0,1,'2026-09-18 17:00:00','2026-09-18 17:30:00',231,4,'æååºåè´§åº','CERT-O002','GB/T 6028',232,1,'å®¢æ·æå®å¤æ£æ¹æ¬¡ã','1','2026-09-18 17:30:00','1','2026-09-18 17:30:00',0), |
| | | (9023,'OQC-DEMO-03','ç²¾èåºè´§æ£éª-03',NULL,'CH-20260918-03',NULL,'JH-CH0918-03',2,300,30,30,0,1,'2026-09-18 18:00:00','2026-09-18 18:30:00',231,4,'æååºåè´§åº','CERT-O003','GB/T 6027',232,1,NULL,'1','2026-09-18 18:30:00','1','2026-09-18 18:30:00',0); |
| | | |
| | | -- ---------- RQC éè´§æ£éªåï¼qc_type=4ï¼ ---------- |
| | | INSERT INTO mes_qc_rqc (id,code,name,type,template_id,source_doc_code,item_id,batch_code,check_quantity,qualified_quantity,unqualified_quantity,check_result,inspect_date,inspector_user_id,status,sampling_location,certificate_no,execute_standard,audit_user_id,approve_user_id,remark,creator,create_time,updater,update_time,deleted) |
| | | VALUES |
| | | (9031,'RQC-DEMO-01','ç²¾èéè´§æ£éª-01',NULL,NULL,'TH-20260918-01',2,'JH-TH0918-01',50,40,10,3,'2026-09-18 19:00:00',231,4,'éè´§æååº','CERT-R001','GB/T 6027',232,1,'æ¼ç¤ºæ°æ®','1','2026-09-18 19:00:00','1','2026-09-18 19:00:00',0), |
| | | (9032,'RQC-DEMO-02','壬ç¯éè´§æ£éª-02',NULL,NULL,'TH-20260918-02',4,'JH-TH0918-02',30,30,0,1,'2026-09-18 19:30:00',231,4,'éè´§æååº','CERT-R002','GB/T 6028',232,1,'éè´§åå ï¼è¿è¾æ±¡æï¼å
¨æ¹å¤æ£ã','1','2026-09-18 19:30:00','1','2026-09-18 19:30:00',0), |
| | | (9033,'RQC-DEMO-03','液碱éè´§æ£éª-03',NULL,NULL,'TH-20260918-03',6,'JH-TH0918-03',20,18,2,2,'2026-09-18 20:00:00',231,4,'éè´§æååº','CERT-R003','GB/T 1119',232,1,NULL,'1','2026-09-18 20:00:00','1','2026-09-18 20:00:00',0); |
| | | |
| | | -- ---------- æ£éªåè¡ï¼ææ å«åç»ï¼21 æ°´å / 26 é
¸å«é / 31 æ£ä¸éå«éï¼å项èªå¨è¡¥å
¨ï¼ ---------- |
| | | INSERT INTO mes_qc_iqc_line (iqc_id,indicator_id,tool,check_method,standard_value,creator,create_time,updater,update_time,deleted) |
| | | SELECT d.id, i.indicator_id, i.tool, i.check_method, i.standard_value, '1','2026-09-18 09:00:00','1','2026-09-18 09:00:00',0 |
| | | FROM (SELECT 9001 id UNION ALL SELECT 9002 UNION ALL SELECT 9003) d |
| | | CROSS JOIN ( |
| | | SELECT 19 AS indicator_id,'ç®æµ' AS tool,'åºæ¾æ¸
éæï¼æ æºæ¢°æè´¨' AS check_method,NULL AS standard_value |
| | | UNION ALL SELECT 20,'éé´æ¯è²ä»ª','è²åº¦ Hazen ⤠10',10.000000 |
| | | UNION ALL SELECT 21,'å¡å°è´¹ä¼æ°´å仪','æ°´åæµå®åç»',NULL |
| | | UNION ALL SELECT 22,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 23,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 24,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 25,NULL,'æå
¬å¼è®¡ç®',NULL |
| | | UNION ALL SELECT 26,'çµä½æ»´å®ä»ª','é
¸å«éæµå®åç»',NULL |
| | | UNION ALL SELECT 27,'èªå¨çµä½æ»´å®ä»ª','æ å®',NULL |
| | | UNION ALL SELECT 28,'èªå¨çµä½æ»´å®ä»ª','æ»´å®',NULL |
| | | UNION ALL SELECT 29,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 30,NULL,'æå
¬å¼è®¡ç®',NULL |
| | | UNION ALL SELECT 31,'æ°ç¸è²è°±ä»ª','æ£ä¸éå«éæµå®åç»',NULL |
| | | UNION ALL SELECT 32,'æ°ç¸è²è°±ä»ª','夿 æ³',NULL |
| | | UNION ALL SELECT 33,'å¯åº¦è®¡','å¯åº¦ (20â) 809~812',810.000000 |
| | | UNION ALL SELECT 34,'é¿è´æå
仪','æå
ç n²â°D',1.399000 |
| | | ) i; |
| | | |
| | | INSERT INTO mes_qc_ipqc_line (ipqc_id,indicator_id,tool,check_method,standard_value,creator,create_time,updater,update_time,deleted) |
| | | SELECT d.id, i.indicator_id, i.tool, i.check_method, i.standard_value, '1','2026-09-18 13:00:00','1','2026-09-18 13:00:00',0 |
| | | FROM (SELECT 9011 id UNION ALL SELECT 9012 UNION ALL SELECT 9013) d |
| | | CROSS JOIN ( |
| | | SELECT 19 AS indicator_id,'ç®æµ' AS tool,'åºæ¾æ¸
éæï¼æ æºæ¢°æè´¨' AS check_method,NULL AS standard_value |
| | | UNION ALL SELECT 20,'éé´æ¯è²ä»ª','è²åº¦ Hazen ⤠10',10.000000 |
| | | UNION ALL SELECT 21,'å¡å°è´¹ä¼æ°´å仪','æ°´åæµå®åç»',NULL |
| | | UNION ALL SELECT 22,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 23,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 24,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 25,NULL,'æå
¬å¼è®¡ç®',NULL |
| | | UNION ALL SELECT 26,'çµä½æ»´å®ä»ª','é
¸å«éæµå®åç»',NULL |
| | | UNION ALL SELECT 27,'èªå¨çµä½æ»´å®ä»ª','æ å®',NULL |
| | | UNION ALL SELECT 28,'èªå¨çµä½æ»´å®ä»ª','æ»´å®',NULL |
| | | UNION ALL SELECT 29,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 30,NULL,'æå
¬å¼è®¡ç®',NULL |
| | | UNION ALL SELECT 31,'æ°ç¸è²è°±ä»ª','æ£ä¸éå«éæµå®åç»',NULL |
| | | UNION ALL SELECT 32,'æ°ç¸è²è°±ä»ª','夿 æ³',NULL |
| | | UNION ALL SELECT 33,'å¯åº¦è®¡','å¯åº¦ (20â) 809~812',810.000000 |
| | | UNION ALL SELECT 34,'é¿è´æå
仪','æå
ç n²â°D',1.399000 |
| | | ) i; |
| | | |
| | | INSERT INTO mes_qc_oqc_line (oqc_id,indicator_id,tool,check_method,standard_value,creator,create_time,updater,update_time,deleted) |
| | | SELECT d.id, i.indicator_id, i.tool, i.check_method, i.standard_value, '1','2026-09-18 16:30:00','1','2026-09-18 16:30:00',0 |
| | | FROM (SELECT 9021 id UNION ALL SELECT 9022 UNION ALL SELECT 9023) d |
| | | CROSS JOIN ( |
| | | SELECT 19 AS indicator_id,'ç®æµ' AS tool,'åºæ¾æ¸
éæï¼æ æºæ¢°æè´¨' AS check_method,NULL AS standard_value |
| | | UNION ALL SELECT 20,'éé´æ¯è²ä»ª','è²åº¦ Hazen ⤠10',10.000000 |
| | | UNION ALL SELECT 21,'å¡å°è´¹ä¼æ°´å仪','æ°´åæµå®åç»',NULL |
| | | UNION ALL SELECT 22,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 23,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 24,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 25,NULL,'æå
¬å¼è®¡ç®',NULL |
| | | UNION ALL SELECT 26,'çµä½æ»´å®ä»ª','é
¸å«éæµå®åç»',NULL |
| | | UNION ALL SELECT 27,'èªå¨çµä½æ»´å®ä»ª','æ å®',NULL |
| | | UNION ALL SELECT 28,'èªå¨çµä½æ»´å®ä»ª','æ»´å®',NULL |
| | | UNION ALL SELECT 29,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 30,NULL,'æå
¬å¼è®¡ç®',NULL |
| | | UNION ALL SELECT 31,'æ°ç¸è²è°±ä»ª','æ£ä¸éå«éæµå®åç»',NULL |
| | | UNION ALL SELECT 32,'æ°ç¸è²è°±ä»ª','夿 æ³',NULL |
| | | UNION ALL SELECT 33,'å¯åº¦è®¡','å¯åº¦ (20â) 809~812',810.000000 |
| | | UNION ALL SELECT 34,'é¿è´æå
仪','æå
ç n²â°D',1.399000 |
| | | ) i; |
| | | |
| | | INSERT INTO mes_qc_rqc_line (rqc_id,indicator_id,tool,check_method,standard_value,creator,create_time,updater,update_time,deleted) |
| | | SELECT d.id, i.indicator_id, i.tool, i.check_method, i.standard_value, '1','2026-09-18 19:00:00','1','2026-09-18 19:00:00',0 |
| | | FROM (SELECT 9031 id UNION ALL SELECT 9032 UNION ALL SELECT 9033) d |
| | | CROSS JOIN ( |
| | | SELECT 19 AS indicator_id,'ç®æµ' AS tool,'åºæ¾æ¸
éæï¼æ æºæ¢°æè´¨' AS check_method,NULL AS standard_value |
| | | UNION ALL SELECT 20,'éé´æ¯è²ä»ª','è²åº¦ Hazen ⤠10',10.000000 |
| | | UNION ALL SELECT 21,'å¡å°è´¹ä¼æ°´å仪','æ°´åæµå®åç»',NULL |
| | | UNION ALL SELECT 22,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 23,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 24,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 25,NULL,'æå
¬å¼è®¡ç®',NULL |
| | | UNION ALL SELECT 26,'çµä½æ»´å®ä»ª','é
¸å«éæµå®åç»',NULL |
| | | UNION ALL SELECT 27,'èªå¨çµä½æ»´å®ä»ª','æ å®',NULL |
| | | UNION ALL SELECT 28,'èªå¨çµä½æ»´å®ä»ª','æ»´å®',NULL |
| | | UNION ALL SELECT 29,'åæå¤©å¹³','ç§°é',NULL |
| | | UNION ALL SELECT 30,NULL,'æå
¬å¼è®¡ç®',NULL |
| | | UNION ALL SELECT 31,'æ°ç¸è²è°±ä»ª','æ£ä¸éå«éæµå®åç»',NULL |
| | | UNION ALL SELECT 32,'æ°ç¸è²è°±ä»ª','夿 æ³',NULL |
| | | UNION ALL SELECT 33,'å¯åº¦è®¡','å¯åº¦ (20â) 809~812',810.000000 |
| | | UNION ALL SELECT 34,'é¿è´æå
仪','æå
ç n²â°D',1.399000 |
| | | ) i; |
| | | |
| | | -- ---------- æ£éªç»æä¸»è¡¨ï¼æ¯åæ® 1 ä¸ªæ ·åï¼ ---------- |
| | | INSERT INTO mes_qc_indicator_result (id,code,qc_id,qc_type,item_id,sn,remark,creator,create_time,updater,update_time,deleted) |
| | | VALUES |
| | | (9001,'MIR-DEMO-01',9001,1,2,'YP-A001',NULL,'1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9002,'MIR-DEMO-02',9002,1,2,'YP-A002',NULL,'1','2026-09-18 10:15:00','1','2026-09-18 10:15:00',0), |
| | | (9003,'MIR-DEMO-03',9003,1,4,'YP-A003',NULL,'1','2026-09-18 11:00:00','1','2026-09-18 11:00:00',0), |
| | | (9004,'MIR-DEMO-04',9011,2,4,'YP-P001',NULL,'1','2026-09-18 13:00:00','1','2026-09-18 13:00:00',0), |
| | | (9005,'MIR-DEMO-05',9012,2,6,'YP-P002',NULL,'1','2026-09-18 14:00:00','1','2026-09-18 14:00:00',0), |
| | | (9006,'MIR-DEMO-06',9013,2,2,'YP-P003',NULL,'1','2026-09-18 15:30:00','1','2026-09-18 15:30:00',0), |
| | | (9007,'MIR-DEMO-07',9021,3,2,'YP-O001',NULL,'1','2026-09-18 16:30:00','1','2026-09-18 16:30:00',0), |
| | | (9008,'MIR-DEMO-08',9022,3,4,'YP-O002',NULL,'1','2026-09-18 17:30:00','1','2026-09-18 17:30:00',0), |
| | | (9009,'MIR-DEMO-09',9023,3,2,'YP-O003',NULL,'1','2026-09-18 18:30:00','1','2026-09-18 18:30:00',0), |
| | | (9010,'MIR-DEMO-10',9031,4,2,'YP-R001',NULL,'1','2026-09-18 19:00:00','1','2026-09-18 19:00:00',0), |
| | | (9011,'MIR-DEMO-11',9032,4,4,'YP-R002',NULL,'1','2026-09-18 19:30:00','1','2026-09-18 19:30:00',0), |
| | | (9012,'MIR-DEMO-12',9033,4,6,'YP-R003',NULL,'1','2026-09-18 20:00:00','1','2026-09-18 20:00:00',0); |
| | | |
| | | -- ---------- æ£éªç»ææç»ï¼ç¬ç«é¡¹ ---------- |
| | | -- 9002 ä¸å½ å¯åº¦33/æå
ç34ï¼9005 ä¸å½ æ£ä¸é32ï¼9008 ä¸å½ é
¸ç»æ30 ââ æ¥å䏿¾ç¤º "/" |
| | | INSERT INTO mes_qc_indicator_result_detail (result_id,indicator_id,measure_no,`value`,creator,create_time,updater,update_time,deleted) |
| | | VALUES |
| | | (9001,19,1,'æ¾æ¸
éææ¶²ä½ï¼æ æºæ¢°æè´¨','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,20,1,'5','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,33,1,'810','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,34,1,'1.3993','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9002,19,1,'æ·¡é»è²éææ¶²ä½','1','2026-09-18 10:15:00','1','2026-09-18 10:15:00',0), |
| | | (9002,20,1,'8','1','2026-09-18 10:15:00','1','2026-09-18 10:15:00',0), |
| | | (9003,19,1,'éææ¶²ä½ï¼æ æ¬æµ®ç©','1','2026-09-18 11:00:00','1','2026-09-18 11:00:00',0), |
| | | (9003,20,1,'3','1','2026-09-18 11:00:00','1','2026-09-18 11:00:00',0), |
| | | (9003,33,1,'795','1','2026-09-18 11:00:00','1','2026-09-18 11:00:00',0), |
| | | (9003,34,1,'1.3985','1','2026-09-18 11:00:00','1','2026-09-18 11:00:00',0), |
| | | (9004,19,1,'å¾®æµ','1','2026-09-18 13:00:00','1','2026-09-18 13:00:00',0), |
| | | (9004,20,1,'12','1','2026-09-18 13:00:00','1','2026-09-18 13:00:00',0), |
| | | (9004,33,1,'812','1','2026-09-18 13:00:00','1','2026-09-18 13:00:00',0), |
| | | (9004,34,1,'1.4001','1','2026-09-18 13:00:00','1','2026-09-18 13:00:00',0), |
| | | (9005,19,1,'æ¾æ¸
éææ¶²ä½','1','2026-09-18 14:00:00','1','2026-09-18 14:00:00',0), |
| | | (9005,20,1,'6','1','2026-09-18 14:00:00','1','2026-09-18 14:00:00',0), |
| | | (9006,19,1,'æ è²æ¶²ä½','1','2026-09-18 15:30:00','1','2026-09-18 15:30:00',0), |
| | | (9006,20,1,'4','1','2026-09-18 15:30:00','1','2026-09-18 15:30:00',0), |
| | | (9006,33,1,'809','1','2026-09-18 15:30:00','1','2026-09-18 15:30:00',0), |
| | | (9006,34,1,'1.3990','1','2026-09-18 15:30:00','1','2026-09-18 15:30:00',0), |
| | | (9007,19,1,'æ¾æ¸
éææ¶²ä½ï¼æ æºæ¢°æè´¨','1','2026-09-18 16:30:00','1','2026-09-18 16:30:00',0), |
| | | (9007,20,1,'5','1','2026-09-18 16:30:00','1','2026-09-18 16:30:00',0), |
| | | (9007,33,1,'811','1','2026-09-18 16:30:00','1','2026-09-18 16:30:00',0), |
| | | (9007,34,1,'1.3992','1','2026-09-18 16:30:00','1','2026-09-18 16:30:00',0), |
| | | (9008,19,1,'éææ¶²ä½','1','2026-09-18 17:30:00','1','2026-09-18 17:30:00',0), |
| | | (9008,33,1,'808','1','2026-09-18 17:30:00','1','2026-09-18 17:30:00',0), |
| | | (9008,34,1,'1.3988','1','2026-09-18 17:30:00','1','2026-09-18 17:30:00',0), |
| | | (9009,19,1,'æ¾æ¸
éææ¶²ä½','1','2026-09-18 18:30:00','1','2026-09-18 18:30:00',0), |
| | | (9009,20,1,'7','1','2026-09-18 18:30:00','1','2026-09-18 18:30:00',0), |
| | | (9009,33,1,'810','1','2026-09-18 18:30:00','1','2026-09-18 18:30:00',0), |
| | | (9009,34,1,'1.3995','1','2026-09-18 18:30:00','1','2026-09-18 18:30:00',0), |
| | | (9010,19,1,'æµæµï¼åºé¨æ²æ·','1','2026-09-18 19:00:00','1','2026-09-18 19:00:00',0), |
| | | (9010,20,1,'18','1','2026-09-18 19:00:00','1','2026-09-18 19:00:00',0), |
| | | (9010,33,1,'815','1','2026-09-18 19:00:00','1','2026-09-18 19:00:00',0), |
| | | (9010,34,1,'1.4005','1','2026-09-18 19:00:00','1','2026-09-18 19:00:00',0), |
| | | (9011,19,1,'éææ¶²ä½','1','2026-09-18 19:30:00','1','2026-09-18 19:30:00',0), |
| | | (9011,20,1,'6','1','2026-09-18 19:30:00','1','2026-09-18 19:30:00',0), |
| | | (9011,34,1,'1.3991','1','2026-09-18 19:30:00','1','2026-09-18 19:30:00',0), |
| | | (9012,19,1,'æ·¡é»è²æ¶²ä½','1','2026-09-18 20:00:00','1','2026-09-18 20:00:00',0), |
| | | (9012,20,1,'9','1','2026-09-18 20:00:00','1','2026-09-18 20:00:00',0), |
| | | (9012,33,1,'810','1','2026-09-18 20:00:00','1','2026-09-18 20:00:00',0), |
| | | (9012,34,1,'1.3993','1','2026-09-18 20:00:00','1','2026-09-18 20:00:00',0); |
| | | |
| | | -- ---------- åç»å项æç»ï¼9001 å«å¹³è¡æµéï¼é
¸ç»æ2æ¹ãæ£ä¸éå«é3æ¹é¡¿å·åå¹¶ï¼ ---------- |
| | | INSERT INTO mes_qc_indicator_result_detail (result_id,indicator_id,measure_no,`value`,creator,create_time,updater,update_time,deleted) |
| | | VALUES |
| | | (9001,22,1,'10.52','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,23,1,'12.35','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,24,1,'1.83','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,25,1,'0.048','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,27,1,'0.1005','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,28,1,'0.15','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,29,1,'10.02','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,30,1,'0.090','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,30,2,'0.095','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,32,1,'99.82','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,32,2,'99.85','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0), |
| | | (9001,32,3,'99.87','1','2026-09-18 09:30:00','1','2026-09-18 09:30:00',0); |
| | | |
| | | -- ---------- åç»å项æç»ï¼å
¶ä½æ ·åï¼åæ¹ï¼ï¼å¹¶ææ³¨éæ
æç¼ºé¡¹ ---------- |
| | | INSERT INTO mes_qc_indicator_result_detail (result_id,indicator_id,measure_no,`value`,creator,create_time,updater,update_time,deleted) |
| | | SELECT r.id, m.indicator_id, 1, m.val, '1','2026-09-18 12:00:00','1','2026-09-18 12:00:00',0 |
| | | FROM ( |
| | | SELECT 9002 AS id UNION ALL SELECT 9003 UNION ALL SELECT 9004 UNION ALL SELECT 9005 UNION ALL |
| | | SELECT 9006 UNION ALL SELECT 9007 UNION ALL SELECT 9008 UNION ALL SELECT 9009 UNION ALL |
| | | SELECT 9010 UNION ALL SELECT 9011 UNION ALL SELECT 9012 |
| | | ) r |
| | | CROSS JOIN ( |
| | | SELECT 22 AS indicator_id,'10.50' AS val |
| | | UNION ALL SELECT 23,'12.30' |
| | | UNION ALL SELECT 24,'1.80' |
| | | UNION ALL SELECT 25,'0.052' |
| | | UNION ALL SELECT 27,'0.1005' |
| | | UNION ALL SELECT 28,'0.14' |
| | | UNION ALL SELECT 29,'10.00' |
| | | UNION ALL SELECT 30,'0.095' |
| | | UNION ALL SELECT 32,'99.78' |
| | | ) m |
| | | WHERE NOT (r.id=9005 AND m.indicator_id=32) |
| | | AND NOT (r.id=9008 AND m.indicator_id=30) |
| | | AND NOT (r.id=9011 AND m.indicator_id=22); |
| | |
| | | ('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); |
| | | if (contractMapper.selectByNo(no) != null) { |
| | | throw exception(CONTRACT_NO_EXISTS); |
| | | // 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.ipqc.vo.MesQcIpqcRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcSaveReqVO; |
| | | 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.dal.mysql.qc.ipqc.MesQcIpqcLineMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; |
| | | 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.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; |
| | | import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.ipqc.MesQcIpqcService; |
| | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; |
| | | |
| | | |
| | | @Tag(name = "管çåå° - MES è¿ç¨æ£éªåï¼IPQCï¼") |
| | | @RestController |
| | | @RequestMapping("/mes/qc/ipqc") |
| | |
| | | @Resource |
| | | private MesQcIpqcService ipqcService; |
| | | @Resource |
| | | private MesProWorkOrderService workOrderService; |
| | | private MdmItemApi mdmItemApi; |
| | | @Resource |
| | | private MesMdWorkstationService workstationService; |
| | | @Resource |
| | | private MesProProcessService processService; |
| | | @Resource |
| | | private MesMdItemService itemService; |
| | | @Resource |
| | | private MesMdUnitMeasureService unitMeasureService; |
| | | private MdmUnitMeasureApi mdmUnitMeasureApi; |
| | | @Resource |
| | | private MesQcIndicatorResultService indicatorResultService; |
| | | @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( |
| | | // æ¹éæ¥è¯¢ç©æï¼MDM ç©æï¼ |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(list, MesQcIpqcDO::getItemId)); |
| | | // æ¹éæ¥è¯¢è®¡éåä½ï¼ |
| | | Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap( |
| | | convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); |
| | | // æ¹éæ¥è¯¢è®¡éåä½ |
| | | Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList( |
| | | convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData() |
| | | .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e)); |
| | | // æ¹éæ¥è¯¢æ£æµ/夿 ¸/å®¡æ ¸äººå |
| | | Set<Long> qcUserIds = new HashSet<>(); |
| | | qcUserIds.addAll(convertSet(list, MesQcIpqcDO::getInspectorUserId)); |
| | |
| | | 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(), |
| | |
| | | // æ¹éæ¥è¯¢æ£æµäººå |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( |
| | | convertSet(list, MesQcIpqcDO::getInspectorUserId)); |
| | | // æ¹éæ¥è¯¢ç©æ |
| | | Map<Long, MesMdItemDO> itemMap = itemService.getItemMap( |
| | | // æ¹éæ¥è¯¢ç©æï¼MDM ç©æï¼ |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(list, MesQcIpqcDO::getItemId)); |
| | | // æ¹éæ¥è¯¢è¡æç» |
| | | List<MesQcIpqcLineDO> lines = ipqcLineMapper.selectListByIpqcIds(convertSet(list, MesQcIpqcDO::getId)); |
| | |
| | | for (MesQcIpqcDO ipqc : list) { |
| | | MesQcQualityExportVO vo = new MesQcQualityExportVO(); |
| | | vo.setDocName(ipqc.getName()); |
| | | MesMdItemDO item = itemMap.get(ipqc.getItemId()); |
| | | MdmItemRespDTO 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") |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.vo.MesQcQualityExportVO; |
| | | import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi; |
| | | import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO; |
| | | 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.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; |
| | | import cn.iocoder.yudao.module.mes.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.dal.dataobject.qc.iqc.MesQcIqcDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.qc.iqc.MesQcIqcLineMapper; |
| | | 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.enums.DictTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; |
| | |
| | | @Resource |
| | | private MesQcIndicatorService indicatorService; |
| | | @Resource |
| | | private MesMdItemService itemService; |
| | | private MdmItemApi mdmItemApi; |
| | | @Resource |
| | | private MesMdUnitMeasureService unitMeasureService; |
| | | private MdmUnitMeasureApi mdmUnitMeasureApi; |
| | | @Resource |
| | | private MesQcIqcLineMapper iqcLineMapper; |
| | | |
| | |
| | | Map<Long, SrmSupplierRespDTO> vendorMap = srmSupplierApi.getSupplierList( |
| | | convertSet(list, MesQcIqcDO::getVendorId)).getCheckedData().stream() |
| | | .collect(java.util.stream.Collectors.toMap(SrmSupplierRespDTO::getId, s -> s)); |
| | | // æ¹éæ¥è¯¢ç©æ |
| | | Map<Long, MesMdItemDO> itemMap = itemService.getItemMap( |
| | | // æ¹éæ¥è¯¢ç©æï¼MDM ç©æï¼ |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(list, MesQcIqcDO::getItemId)); |
| | | // æ¹éæ¥è¯¢è®¡éåä½ï¼éè¿ç©æç unitMeasureIdï¼ |
| | | Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap( |
| | | convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); |
| | | Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList( |
| | | convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData() |
| | | .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e)); |
| | | // æ¹éæ¥è¯¢æ£æµ/夿 ¸/å®¡æ ¸äººå |
| | | Set<Long> qcUserIds = new HashSet<>(); |
| | | qcUserIds.addAll(convertSet(list, MesQcIqcDO::getInspectorUserId)); |
| | |
| | | // æ¹éæ¥è¯¢æ£æµäººå |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( |
| | | convertSet(list, MesQcIqcDO::getInspectorUserId)); |
| | | // æ¹éæ¥è¯¢ç©æ |
| | | Map<Long, MesMdItemDO> itemMap = itemService.getItemMap( |
| | | // æ¹éæ¥è¯¢ç©æï¼MDM ç©æï¼ |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(list, MesQcIqcDO::getItemId)); |
| | | // æ¹éæ¥è¯¢è¡æç» |
| | | List<MesQcIqcLineDO> lines = iqcLineMapper.selectListByIqcIds(convertSet(list, MesQcIqcDO::getId)); |
| | |
| | | for (MesQcIqcDO iqc : list) { |
| | | MesQcQualityExportVO vo = new MesQcQualityExportVO(); |
| | | vo.setDocName(iqc.getName()); |
| | | MesMdItemDO item = itemMap.get(iqc.getItemId()); |
| | | MdmItemRespDTO item = itemMap.get(iqc.getItemId()); |
| | | vo.setItemName(item != null ? item.getName() : ""); |
| | | vo.setBatchNo(iqc.getVendorBatch()); |
| | | vo.setInspectDate(MesQcQualityExportVO.formatDateTime(iqc.getInspectDate())); |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.vo.MesQcQualityExportVO; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO; |
| | | 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.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; |
| | | import cn.iocoder.yudao.module.mes.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.dal.mysql.qc.oqc.MesQcOqcLineMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | 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.qc.indicator.MesQcIndicatorService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcService; |
| | |
| | | @Resource |
| | | private CrmCustomerApi customerApi; |
| | | @Resource |
| | | private MesMdItemService itemService; |
| | | private MdmItemApi mdmItemApi; |
| | | @Resource |
| | | private MesMdUnitMeasureService unitMeasureService; |
| | | private MdmUnitMeasureApi mdmUnitMeasureApi; |
| | | @Resource |
| | | private MesQcIndicatorResultService indicatorResultService; |
| | | @Resource |
| | |
| | | // æ¹éæ¥è¯¢å®¢æ· |
| | | Map<Long, CrmCustomerRespDTO> clientMap = customerApi.getCustomerMap( |
| | | convertSet(list, MesQcOqcDO::getClientId)); |
| | | // æ¹éæ¥è¯¢ç©æ |
| | | Map<Long, MesMdItemDO> itemMap = itemService.getItemMap( |
| | | // æ¹éæ¥è¯¢ç©æï¼MDM ç©æï¼ |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(list, MesQcOqcDO::getItemId)); |
| | | // æ¹éæ¥è¯¢è®¡éåä½ |
| | | Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap( |
| | | convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); |
| | | Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList( |
| | | convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData() |
| | | .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e)); |
| | | // æ¹éæ¥è¯¢æ£æµ/夿 ¸/å®¡æ ¸äººå |
| | | Set<Long> qcUserIds = new HashSet<>(); |
| | | qcUserIds.addAll(convertSet(list, MesQcOqcDO::getInspectorUserId)); |
| | |
| | | // æ¹éæ¥è¯¢æ£æµäººå |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( |
| | | convertSet(list, MesQcOqcDO::getInspectorUserId)); |
| | | // æ¹éæ¥è¯¢ç©æ |
| | | Map<Long, MesMdItemDO> itemMap = itemService.getItemMap( |
| | | // æ¹éæ¥è¯¢ç©æï¼MDM ç©æï¼ |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(list, MesQcOqcDO::getItemId)); |
| | | // æ¹éæ¥è¯¢è¡æç» |
| | | List<MesQcOqcLineDO> lines = oqcLineMapper.selectListByOqcIds(convertSet(list, MesQcOqcDO::getId)); |
| | |
| | | for (MesQcOqcDO oqc : list) { |
| | | MesQcQualityExportVO vo = new MesQcQualityExportVO(); |
| | | vo.setDocName(oqc.getName()); |
| | | MesMdItemDO item = itemMap.get(oqc.getItemId()); |
| | | MdmItemRespDTO item = itemMap.get(oqc.getItemId()); |
| | | vo.setItemName(item != null ? item.getName() : ""); |
| | | vo.setBatchNo(oqc.getBatchCode()); |
| | | vo.setInspectDate(MesQcQualityExportVO.formatDateTime(oqc.getInspectDate())); |
| | |
| | | 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.module.mes.controller.admin.qc.rqc.vo.MesQcRqcRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcSaveReqVO; |
| | | 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.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; |
| | | import cn.iocoder.yudao.module.mes.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.dal.mysql.qc.rqc.MesQcRqcLineMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; |
| | | 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.qc.indicator.MesQcIndicatorService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.rqc.MesQcRqcService; |
| | |
| | | @Resource |
| | | private MesQcRqcService rqcService; |
| | | @Resource |
| | | private MesMdItemService itemService; |
| | | private MdmItemApi mdmItemApi; |
| | | @Resource |
| | | private MesMdUnitMeasureService unitMeasureService; |
| | | private MdmUnitMeasureApi mdmUnitMeasureApi; |
| | | @Resource |
| | | private MesQcIndicatorResultService indicatorResultService; |
| | | @Resource |
| | |
| | | if (CollUtil.isEmpty(list)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | // æ¹éæ¥è¯¢ç©æ |
| | | Map<Long, MesMdItemDO> itemMap = itemService.getItemMap( |
| | | // æ¹éæ¥è¯¢ç©æï¼MDM ç©æï¼ |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(list, MesQcRqcDO::getItemId)); |
| | | // æ¹éæ¥è¯¢è®¡éåä½ |
| | | Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap( |
| | | convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); |
| | | Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList( |
| | | convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData() |
| | | .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e)); |
| | | // æ¹éæ¥è¯¢æ£æµ/夿 ¸/å®¡æ ¸äººå |
| | | Set<Long> qcUserIds = new HashSet<>(); |
| | | qcUserIds.addAll(convertSet(list, MesQcRqcDO::getInspectorUserId)); |
| | |
| | | // æ¹éæ¥è¯¢æ£æµäººå |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( |
| | | convertSet(list, MesQcRqcDO::getInspectorUserId)); |
| | | // æ¹éæ¥è¯¢ç©æ |
| | | Map<Long, MesMdItemDO> itemMap = itemService.getItemMap( |
| | | // æ¹éæ¥è¯¢ç©æï¼MDM ç©æï¼ |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(list, MesQcRqcDO::getItemId)); |
| | | // æ¹éæ¥è¯¢è¡æç» |
| | | List<MesQcRqcLineDO> lines = rqcLineMapper.selectListByRqcIds(convertSet(list, MesQcRqcDO::getId)); |
| | |
| | | for (MesQcRqcDO rqc : list) { |
| | | MesQcQualityExportVO vo = new MesQcQualityExportVO(); |
| | | vo.setDocName(rqc.getName()); |
| | | MesMdItemDO item = itemMap.get(rqc.getItemId()); |
| | | MdmItemRespDTO item = itemMap.get(rqc.getItemId()); |
| | | vo.setItemName(item != null ? item.getName() : ""); |
| | | vo.setBatchNo(rqc.getBatchCode()); |
| | | vo.setInspectDate(MesQcQualityExportVO.formatDateTime(rqc.getInspectDate())); |
| | |
| | | |
| | | 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); |
| | | writeSignLine(doc, report); |
| | | doc.write(out); |
| | | return out.toByteArray(); |
| | | } |
| | |
| | | .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; |
| | | } |
| | |
| | | |
| | | // ========== ç¾åè¡ ========== |
| | | |
| | | /** ç¾åè¡åºå®ç空ï¼ä¸å¤å®ç»è®º/è´¨æ£ä¸ç¨ç« ä¸è´ï¼æå°åæå */ |
| | | private static void writeSignLine(XWPFDocument doc) { |
| | | /** |
| | | * ç¾åè¡ï¼æ£éª/夿 ¸/æ¹ååå«å¸¦åºæ£æµäººï¼inspectorUserIdï¼ã夿 ¸äººï¼auditUserIdï¼ã |
| | | * å®¡æ ¸äººï¼approveUserIdï¼å§åï¼æªæå®äººåæ¶è¯¥æ®µçç©ºï¼æå°åæå |
| | | */ |
| | | private static void writeSignLine(XWPFDocument doc, MesQcQcReportRespVO report) { |
| | | XWPFParagraph paragraph = doc.createParagraph(); |
| | | paragraph.setAlignment(ParagraphAlignment.LEFT); |
| | | paragraph.setSpacingBefore(400); |
| | | addRun(paragraph, "æ£éªï¼ããããããããã夿 ¸ï¼ãããããããããæ¹åï¼ãããããããã", 12, true); |
| | | String text = "æ£éªï¼" + signName(report.getInspectorName()) |
| | | + "ãããã夿 ¸ï¼" + signName(report.getAuditName()) |
| | | + "ããããæ¹åï¼" + signName(report.getApproveName()); |
| | | addRun(paragraph, text, 12, true); |
| | | } |
| | | |
| | | /** ç¾åæ®µï¼æå§ååæå°å§åå¹¶çç¾åä½éï¼æ å§ååæ´æ®µçç©ºä¾¿äºæå */ |
| | | private static String signName(String name) { |
| | | return notBlank(name) ? name + "ããã" : "ããããã"; |
| | | } |
| | | |
| | | // ========== è¡¨æ ¼åºç¡ ========== |
| | |
| | | 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 |
| | |
| | | package cn.iocoder.yudao.module.mes.service.qc.pendinginspect; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.pendinginspect.vo.MesQcPendingInspectPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.pendinginspect.vo.MesQcPendingInspectRespVO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.qc.pendinginspect.MesQcPendingInspectMapper; |
| | |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; |
| | | |
| | | /** |
| | | * MES å¾
æ£ä»»å¡ Service å®ç°ç±» |
| | |
| | | |
| | | @Resource |
| | | private MesQcPendingInspectMapper pendingInspectMapper; |
| | | @Resource |
| | | private MdmItemApi mdmItemApi; |
| | | @Resource |
| | | private MdmUnitMeasureApi mdmUnitMeasureApi; |
| | | |
| | | @Override |
| | | public PageResult<MesQcPendingInspectRespVO> getPendingInspectPage(MesQcPendingInspectPageReqVO pageReqVO) { |
| | |
| | | IPage<MesQcPendingInspectRespVO> page = MyBatisUtils.buildPage(pageReqVO); |
| | | pendingInspectMapper.selectQcPendingPage(page, |
| | | pageReqVO.getSourceDocCode(), pageReqVO.getQcType(), pageReqVO.getItemId()); |
| | | List<MesQcPendingInspectRespVO> list = page.getRecords(); |
| | | // å¡«å
ç©æä¿¡æ¯ï¼æ¥æºåæ®ç item_id 为 MDM ç©æ IDï¼ |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(list, MesQcPendingInspectRespVO::getItemId)); |
| | | Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList( |
| | | convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData() |
| | | .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e)); |
| | | list.forEach(vo -> findAndThen(itemMap, vo.getItemId(), item -> { |
| | | vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); |
| | | findAndThen(unitMeasureMap, item.getUnitMeasureId(), |
| | | unitMeasure -> vo.setUnitName(unitMeasure.getName())); |
| | | })); |
| | | } |
| | | // è¿åç»æ |
| | | return new PageResult<>(page.getRecords(), page.getTotal()); |
| | | return new PageResult<>(list, page.getTotal()); |
| | | } |
| | | |
| | | } |
| | |
| | | /** |
| | | * æ ¹æ®äº§åç©æ ID å QC ç±»åæ¥æ¾æ£éªæ¨¡æ¿ç产åå
³èï¼å¿
é¡»åå¨ï¼å¦åæå¼å¸¸ï¼ |
| | | * |
| | | * @param itemId 产åç©æ ID |
| | | * @param qcType æ£æµç§ç±»ï¼æä¸¾ {@link MesQcTypeEnum}ï¼ |
| | | * @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()); |
| | | |
| | | // 夿³¨é»è®¤ææ¡ |
| | | assertTrue(tables.get(3).getRow(0).getCell(1).getText().contains("æ£éªç»æä»
å¯¹æ ·åæ¬èº«ææ¬æ¹æ¬¡è´è´£")); |
| | | |
| | | // ç¾åè¡çç©ºï¼æå°åæåï¼ï¼ä¸å¾åºç°å§å |
| | | // ç¾åè¡å¸¦åºå§åï¼æ£éª=æ£æµäººã夿 ¸=夿 ¸äººãæ¹å=å®¡æ ¸äºº |
| | | String signLine = doc.getParagraphs().stream() |
| | | .filter(p -> p.getText().contains("æ¹åï¼")) |
| | | .findFirst().orElseThrow().getText(); |
| | | assertTrue(signLine.contains("æ£éªï¼") && signLine.contains("夿 ¸ï¼")); |
| | | assertTrue(!signLine.contains("æå") && !signLine.contains("å¨äºæ´") && !signLine.contains("å
ç¿ è"), |
| | | "ç¾åè¡åºç空ï¼ä¸è¾åºæ£éª/夿 ¸/æ¹åå§å"); |
| | | assertTrue(signLine.contains("æ£éªï¼æå"), "æ£éªåºå¸¦åºæ£æµäººå§åï¼" + signLine); |
| | | assertTrue(signLine.contains("夿 ¸ï¼å¨äºæ´"), "夿 ¸åºå¸¦åºå¤æ ¸äººå§åï¼" + signLine); |
| | | assertTrue(signLine.contains("æ¹åï¼å
ç¿ è"), "æ¹ååºå¸¦åºå®¡æ ¸äººå§åï¼" + signLine); |
| | | } |
| | | } |
| | | |
| | | @Test |
| | | public void testBuildWithoutSigners() throws IOException { |
| | | MesQcQcReportRespVO report = randomReport(); |
| | | report.setInspectorName(null).setAuditName("").setApproveName(null); |
| | | byte[] docx = MesQcProductReportWordBuilder.build(report); |
| | | try (InputStream in = new ByteArrayInputStream(docx); XWPFDocument doc = new XWPFDocument(in)) { |
| | | String signLine = doc.getParagraphs().stream() |
| | | .filter(p -> p.getText().contains("æ¹åï¼")) |
| | | .findFirst().orElseThrow().getText(); |
| | | assertTrue(signLine.contains("æ£éªï¼") && signLine.contains("夿 ¸ï¼") && signLine.contains("æ¹åï¼"), |
| | | "æªæå®äººåæ¶ä»ä¿çä¸ä¸ªæ ä½ä¾æåï¼" + signLine); |
| | | } |
| | | } |
| | | |
| | |
| | | .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, |