huminmin
4 天以前 7591ba21194595cc8d9a1293dfdbfa945bc9948f
Merge branch 'dev_business' of http://114.132.189.42:9002/r/mom-pro2-after into dev_business
已修改6个文件
已添加3个文件
509 ■■■■■ 文件已修改
docs/clean_business_data.sql 330 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/mdm_item_sync_switch.md 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/quotation/CrmSaleQuotationController.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/item/MdmItemController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/item/vo/MdmItemSyncUpdateReqVO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/clean_business_data.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,330 @@
-- =============================================
-- ä¸šåŠ¡æ•°æ®æ¸…ç†å­˜å‚¨è¿‡ç¨‹
-- è¯´æ˜Žï¼š
--   1. ä»…清理【业务单据/运行数据】,保留【基础数据/配置/主数据】
--   2. ä¿ç•™èŒƒå›´ï¼šBPM é…ç½®ã€BI å¤§å±ã€GoView å¤§å±ã€å­—å…¸/菜单/角色/用户、
--      ç‰©æ–™/分类/单位/仓库/库位/车间/工作站/设备/工具/工序/工艺/质检方案/缺陷/指标、
--      ç¼–码规则、条码配置、安灯配置、班组排班、BOM/SOP/SIP、
--      CRM å®¢æˆ·/联系人/商机状态/合同配置/客户限制/公海配置、
--      ERP ä¾›åº”商/结算账户、SRM ä¾›åº”商主表/分类/招投标配置、
--      HRM å‘˜å·¥æ¡£æ¡ˆåŠè€ƒå‹¤/薪资/社保/税率配置、AI æ¨¡åž‹/工具/角色/知识库/工作流、
--      IM æ•æ„Ÿè¯/表情包、通知公告内容、系统权限用户体系等
--   3. è‹¥å­˜å‚¨è¿‡ç¨‹å·²å­˜åœ¨ï¼Œè¯·å…ˆæ‰§è¡Œ DROP PROCEDURE sp_clean_business_data; å†æ‰§è¡Œæœ¬è„šæœ¬
-- =============================================
CREATE DEFINER=`root`@`%` PROCEDURE `sp_clean_business_data`()
BEGIN
    SET FOREIGN_KEY_CHECKS = 0;
    -- ============================================================
    -- 1. ç³»ç»Ÿè¿è¡Œæ•°æ®ï¼ˆæ—¥å¿— / Token / éªŒè¯ç  / ç«™å†…ä¿¡ / ç¤¾äº¤ç»‘定)
    -- ============================================================
    TRUNCATE TABLE system_login_log;
    TRUNCATE TABLE system_operate_log;
    TRUNCATE TABLE system_notify_message;
    TRUNCATE TABLE system_oauth2_access_token;
    TRUNCATE TABLE system_oauth2_refresh_token;
    TRUNCATE TABLE system_oauth2_code;
    TRUNCATE TABLE system_oauth2_approve;
    TRUNCATE TABLE system_sms_code;
    TRUNCATE TABLE system_sms_log;
    TRUNCATE TABLE system_mail_log;
    TRUNCATE TABLE system_social_user;
    TRUNCATE TABLE system_social_user_bind;
    TRUNCATE TABLE infra_api_access_log;
    TRUNCATE TABLE infra_api_error_log;
    TRUNCATE TABLE infra_job_log;
    -- ============================================================
    -- 2. æ–‡ä»¶ä¸Žé™„ä»¶
    -- ============================================================
    TRUNCATE TABLE system_storage_attachment;
    TRUNCATE TABLE system_storage_blob;
    TRUNCATE TABLE storage_attachment;
    TRUNCATE TABLE storage_blob;
    TRUNCATE TABLE infra_file;
    TRUNCATE TABLE infra_file_content;
    -- ============================================================
    -- 3. BPM æµç¨‹å®žä¾‹ä¸Žå®¡æ‰¹åŽ†å²
    --    ä¿ç•™ï¼šæµç¨‹å®šä¹‰/表单/分类/表达式/监听器/用户组/业务附件配置
    -- ============================================================
    TRUNCATE TABLE bpm_oa_leave;
    TRUNCATE TABLE bpm_process_instance_copy;
    TRUNCATE TABLE act_hi_procinst;
    TRUNCATE TABLE act_hi_taskinst;
    TRUNCATE TABLE act_hi_actinst;
    TRUNCATE TABLE act_hi_varinst;
    TRUNCATE TABLE act_hi_identitylink;
    TRUNCATE TABLE act_hi_comment;
    TRUNCATE TABLE act_hi_detail;
    TRUNCATE TABLE act_hi_attachment;
    TRUNCATE TABLE act_hi_entitylink;
    TRUNCATE TABLE act_hi_tsk_log;
    TRUNCATE TABLE act_ru_task;
    TRUNCATE TABLE act_ru_execution;
    TRUNCATE TABLE act_ru_actinst;
    TRUNCATE TABLE act_ru_variable;
    TRUNCATE TABLE act_ru_identitylink;
    TRUNCATE TABLE act_ru_job;
    TRUNCATE TABLE act_ru_timer_job;
    TRUNCATE TABLE act_ru_deadletter_job;
    TRUNCATE TABLE act_ru_suspended_job;
    TRUNCATE TABLE act_ru_external_job;
    TRUNCATE TABLE act_ru_history_job;
    TRUNCATE TABLE act_ru_event_subscr;
    TRUNCATE TABLE act_ru_entitylink;
    TRUNCATE TABLE act_evt_log;
    -- ============================================================
    -- 4. MES ç”Ÿäº§æ¨¡å— â€” ä¸šåŠ¡å•æ®
    -- ============================================================
    TRUNCATE TABLE mes_pro_work_order_param_record_detail;
    TRUNCATE TABLE mes_pro_work_order_param_record;
    TRUNCATE TABLE mes_pro_work_order_process;
    TRUNCATE TABLE mes_pro_work_order_bom;
    TRUNCATE TABLE mes_pro_work_order;
    TRUNCATE TABLE mes_pro_task_issue;
    TRUNCATE TABLE mes_pro_task;
    TRUNCATE TABLE mes_pro_feedback;
    TRUNCATE TABLE mes_pro_mps_merge_item;
    TRUNCATE TABLE mes_pro_mps;
    TRUNCATE TABLE mes_pro_card_process;
    TRUNCATE TABLE mes_pro_card;
    TRUNCATE TABLE mes_pro_work_record_log;
    TRUNCATE TABLE mes_pro_work_record;
    TRUNCATE TABLE mes_pro_andon_record;
    -- ============================================================
    -- 5. MES ä»“库模块 â€” ä¸šåŠ¡å•æ®
    -- ============================================================
    TRUNCATE TABLE mes_wm_transaction;
    TRUNCATE TABLE mes_wm_stock_reserve;
    TRUNCATE TABLE mes_wm_material_stock;
    TRUNCATE TABLE mes_wm_sn;
    TRUNCATE TABLE mes_wm_batch;
    TRUNCATE TABLE mes_wm_barcode;
    TRUNCATE TABLE mes_wm_stock_taking_task_result;
    TRUNCATE TABLE mes_wm_stock_taking_task_line;
    TRUNCATE TABLE mes_wm_stock_taking_task;
    TRUNCATE TABLE mes_wm_stock_taking_plan_param;
    TRUNCATE TABLE mes_wm_stock_taking_plan;
    TRUNCATE TABLE mes_wm_package_line;
    TRUNCATE TABLE mes_wm_package;
    TRUNCATE TABLE mes_wm_item_receipt_detail;
    TRUNCATE TABLE mes_wm_item_receipt_line;
    TRUNCATE TABLE mes_wm_item_receipt;
    TRUNCATE TABLE mes_wm_item_consume_detail;
    TRUNCATE TABLE mes_wm_item_consume_line;
    TRUNCATE TABLE mes_wm_item_consume;
    TRUNCATE TABLE mes_wm_product_produce_detail;
    TRUNCATE TABLE mes_wm_product_produce_line;
    TRUNCATE TABLE mes_wm_product_produce;
    TRUNCATE TABLE mes_wm_product_issue_detail;
    TRUNCATE TABLE mes_wm_product_issue_line;
    TRUNCATE TABLE mes_wm_product_issue;
    TRUNCATE TABLE mes_wm_product_receipt_detail;
    TRUNCATE TABLE mes_wm_product_receipt_line;
    TRUNCATE TABLE mes_wm_product_receipt;
    TRUNCATE TABLE mes_wm_product_sales_detail;
    TRUNCATE TABLE mes_wm_product_sales_line;
    TRUNCATE TABLE mes_wm_product_sales;
    TRUNCATE TABLE mes_wm_misc_receipt_detail;
    TRUNCATE TABLE mes_wm_misc_receipt_line;
    TRUNCATE TABLE mes_wm_misc_receipt;
    TRUNCATE TABLE mes_wm_misc_issue_detail;
    TRUNCATE TABLE mes_wm_misc_issue_line;
    TRUNCATE TABLE mes_wm_misc_issue;
    TRUNCATE TABLE mes_wm_outsource_receipt_detail;
    TRUNCATE TABLE mes_wm_outsource_receipt_line;
    TRUNCATE TABLE mes_wm_outsource_receipt;
    TRUNCATE TABLE mes_wm_outsource_issue_detail;
    TRUNCATE TABLE mes_wm_outsource_issue_line;
    TRUNCATE TABLE mes_wm_outsource_issue;
    TRUNCATE TABLE mes_wm_return_vendor_detail;
    TRUNCATE TABLE mes_wm_return_vendor_line;
    TRUNCATE TABLE mes_wm_return_vendor;
    TRUNCATE TABLE mes_wm_return_issue_detail;
    TRUNCATE TABLE mes_wm_return_issue_line;
    TRUNCATE TABLE mes_wm_return_issue;
    TRUNCATE TABLE mes_wm_return_sales_detail;
    TRUNCATE TABLE mes_wm_return_sales_line;
    TRUNCATE TABLE mes_wm_return_sales;
    TRUNCATE TABLE mes_wm_sales_notice_line;
    TRUNCATE TABLE mes_wm_sales_notice;
    TRUNCATE TABLE mes_wm_transfer_detail;
    TRUNCATE TABLE mes_wm_transfer_line;
    TRUNCATE TABLE mes_wm_transfer;
    TRUNCATE TABLE mes_wm_arrival_notice_line;
    TRUNCATE TABLE mes_wm_arrival_notice;
    -- ============================================================
    -- 6. MES è´¨æ£€æ¨¡å— â€” ä¸šåŠ¡å•æ®
    -- ============================================================
    TRUNCATE TABLE mes_qc_indicator_result_detail;
    TRUNCATE TABLE mes_qc_indicator_result;
    TRUNCATE TABLE mes_qc_defect_record;
    TRUNCATE TABLE mes_qc_ncr;
    TRUNCATE TABLE mes_qc_iqc_line;
    TRUNCATE TABLE mes_qc_iqc;
    TRUNCATE TABLE mes_qc_ipqc_line;
    TRUNCATE TABLE mes_qc_ipqc;
    TRUNCATE TABLE mes_qc_oqc_line;
    TRUNCATE TABLE mes_qc_oqc;
    TRUNCATE TABLE mes_qc_rqc_line;
    TRUNCATE TABLE mes_qc_rqc;
    -- ============================================================
    -- 7. MES è®¾å¤‡æ¨¡å— â€” ç‚¹æ£€/保养/ç»´ä¿®/计量检测记录
    -- ============================================================
    TRUNCATE TABLE mes_dv_check_record_line;
    TRUNCATE TABLE mes_dv_check_record;
    TRUNCATE TABLE mes_dv_mainten_record_line;
    TRUNCATE TABLE mes_dv_mainten_record;
    TRUNCATE TABLE mes_dv_repair_line;
    TRUNCATE TABLE mes_dv_repair;
    TRUNCATE TABLE mes_dv_metering_check;
    -- ============================================================
    -- 8. MES å·¥è‰º/设计模块 â€” ä¸šåŠ¡å•æ®ï¼ˆç¼–ç ç”Ÿæˆè®°å½•ä¸ºæµæ°´æ•°æ®ï¼‰
    -- ============================================================
    TRUNCATE TABLE mes_pd_archive;
    TRUNCATE TABLE mes_pd_document_audit;
    TRUNCATE TABLE mes_pd_document;
    TRUNCATE TABLE mes_pd_project;
    TRUNCATE TABLE mes_md_auto_code_record;
    -- ============================================================
    -- 9. CRM æ¨¡å— â€” ä¸šåŠ¡å•æ®
    --    ä¿ç•™ï¼šcrm_customer / crm_contact / crm_business_status(_type)
    --          / crm_contract_config / crm_customer_limit_config / crm_customer_pool_config
    -- ============================================================
    TRUNCATE TABLE crm_receivable_plan;
    TRUNCATE TABLE crm_receivable;
    TRUNCATE TABLE crm_contract_product;
    TRUNCATE TABLE crm_contract;
    TRUNCATE TABLE crm_sale_quotation_product;
    TRUNCATE TABLE crm_sale_quotation;
    TRUNCATE TABLE crm_business_product;
    TRUNCATE TABLE crm_contact_business;
    TRUNCATE TABLE crm_business;
    TRUNCATE TABLE crm_clue;
    TRUNCATE TABLE crm_follow_up_record;
    TRUNCATE TABLE crm_invoice;
    TRUNCATE TABLE crm_sales_target;
    TRUNCATE TABLE crm_permission;
    -- ============================================================
    -- 10. å”®åŽæ¨¡å— â€” ä¸šåŠ¡å•æ®
    -- ============================================================
    TRUNCATE TABLE after_sale_return_item;
    TRUNCATE TABLE after_sale_return;
    TRUNCATE TABLE after_sale_ticket_item;
    TRUNCATE TABLE after_sale_ticket;
    TRUNCATE TABLE after_sale_repair;
    TRUNCATE TABLE after_sale_permission;
    -- ============================================================
    -- 11. ERP æ¨¡å— â€” ä¸šåŠ¡å•æ®
    --    ä¿ç•™ï¼šerp_supplier / erp_account
    -- ============================================================
    TRUNCATE TABLE erp_finance_payment_item;
    TRUNCATE TABLE erp_finance_payment;
    TRUNCATE TABLE erp_finance_receipt_item;
    TRUNCATE TABLE erp_finance_receipt;
    TRUNCATE TABLE erp_purchase_order_items;
    TRUNCATE TABLE erp_purchase_order;
    TRUNCATE TABLE erp_purchase_request_items;
    TRUNCATE TABLE erp_purchase_request;
    TRUNCATE TABLE erp_sale_order_items;
    TRUNCATE TABLE erp_sale_order;
    TRUNCATE TABLE erp_purchase_invoice;
    -- ============================================================
    -- 12. SRM æ¨¡å— â€” ä¸šåŠ¡å•æ®
    --    ä¿ç•™ï¼šsrm_supplier / srm_supplier_contact / srm_supplier_category
    --          / srm_tender_config
    -- ============================================================
    TRUNCATE TABLE srm_bid_award;
    TRUNCATE TABLE srm_bid_evaluation;
    TRUNCATE TABLE srm_bid_open;
    TRUNCATE TABLE srm_tender_bid;
    TRUNCATE TABLE srm_tender_material;
    TRUNCATE TABLE srm_tender_project;
    TRUNCATE TABLE srm_delivery_plan;
    TRUNCATE TABLE srm_purchase_collaboration;
    TRUNCATE TABLE srm_supplier_quote;
    TRUNCATE TABLE srm_supplier_evaluation;
    TRUNCATE TABLE srm_supplier_certificate;
    TRUNCATE TABLE srm_supplier_apply;
    -- ============================================================
    -- 13. HRM æ¨¡å— â€” ä¸šåŠ¡å•æ®
    --    ä¿ç•™ï¼šhrm_employee åŠæ¡£æ¡ˆå­è¡¨ï¼ˆæ•™è‚²/工作经历/紧急联系人/
    --          ç¤¾ä¿å…¬ç§¯é‡‘/薪酬档案/合同)、考勤节假日/规则、请假类型配置、
    --          è–ªé…¬ç»“构、社保公积金方案、个税税率配置
    -- ============================================================
    TRUNCATE TABLE hrm_salary_payment_detail;
    TRUNCATE TABLE hrm_salary_payment;
    TRUNCATE TABLE hrm_salary_calculation;
    TRUNCATE TABLE hrm_attendance_summary;
    TRUNCATE TABLE hrm_attendance_record;
    TRUNCATE TABLE hrm_attendance_exception;
    TRUNCATE TABLE hrm_leave_application;
    TRUNCATE TABLE hrm_resignation_application;
    TRUNCATE TABLE hrm_transfer_application;
    -- ============================================================
    -- 14. AI æ¨¡å— â€” å¯¹è¯ä¸Žç”Ÿæˆå†…容
    --    ä¿ç•™ï¼šai_api_key / ai_model / ai_tool / ai_chat_role
    --          / ai_knowledge(_document/_segment) / ai_workflow
    -- ============================================================
    TRUNCATE TABLE ai_chat_message;
    TRUNCATE TABLE ai_chat_conversation;
    TRUNCATE TABLE ai_image;
    TRUNCATE TABLE ai_mind_map;
    TRUNCATE TABLE ai_music;
    TRUNCATE TABLE ai_write;
    -- ============================================================
    -- 15. IM æ¨¡å— â€” ä¼šè¯ä¸Žæ¶ˆæ¯
    --    ä¿ç•™ï¼šim_sensitive_word / im_face_pack / im_face_pack_item
    -- ============================================================
    TRUNCATE TABLE im_group_message_receipt;
    TRUNCATE TABLE im_group_message;
    TRUNCATE TABLE im_private_message;
    TRUNCATE TABLE im_message_file;
    TRUNCATE TABLE im_group_request;
    TRUNCATE TABLE im_group_member;
    TRUNCATE TABLE im_group;
    TRUNCATE TABLE im_friend_request;
    TRUNCATE TABLE im_friend;
    TRUNCATE TABLE im_conversation_read;
    TRUNCATE TABLE im_conversation;
    TRUNCATE TABLE im_channel_message;
    TRUNCATE TABLE im_channel_material;
    TRUNCATE TABLE im_channel;
    TRUNCATE TABLE im_rtc_participant;
    TRUNCATE TABLE im_rtc_call;
    TRUNCATE TABLE im_user_online;
    TRUNCATE TABLE im_face_user_item;
    -- ============================================================
    -- 16. OA å·²è¯»/指定人关联(保留通知公告内容 oa_notice / system_notice)
    -- ============================================================
    TRUNCATE TABLE oa_notice_read;
    TRUNCATE TABLE oa_notice_user;
    -- ============================================================
    -- 17. ç¤ºä¾‹æ•°æ®
    -- ============================================================
    TRUNCATE TABLE yudao_demo01_contact;
    TRUNCATE TABLE yudao_demo02_category;
    TRUNCATE TABLE yudao_demo03_course;
    TRUNCATE TABLE yudao_demo03_grade;
    TRUNCATE TABLE yudao_demo03_student;
    SET FOREIGN_KEY_CHECKS = 1;
    SELECT '业务数据清理完成' AS result;
END
docs/mdm_item_sync_switch.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
# MDM ç‰©æ–™åŒæ­¥çŠ¶æ€å¼€å…³ - å‰ç«¯è”调方案
## æ¶‰åŠé¡µé¢
- åŸºç¡€æ•°æ® â†’ ç‰©æ–™ç®¡ç†ï¼ˆ`basicData/mdm`,MDM ç‰©æ–™ä¸»æ•°æ®åˆ—表页)
- ç‰©æ–™æ–°å¢ž / ç¼–辑弹窗(`basicData/mdm/modules/form.vue`)
## èƒŒæ™¯
物料管理列表页原有的"同步状态"列为只读标签(已同步/未同步),本次改为**可操作的开关(Switch)**,用户可直接在列表中切换物料是否同步到 MES。同时**新增/编辑物料弹窗**中也增加"同步到MES"开关,创建或保存物料时按开关决定是否同步到 MES。
## API
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | /mdm/item/create | åˆ›å»ºç‰©æ–™ï¼Œ`syncMes` ä¸º true æ—¶åŒæ­¥åˆ° MES |
| PUT | /mdm/item/update | ç¼–辑物料,`syncMes` ä¸º true æ—¶åŒæ­¥åˆ° MES,为 false æ—¶å–消同步(从 MES åˆ é™¤ï¼‰ |
| PUT | /mdm/item/update-sync | æ›´æ–°ç‰©æ–™åŒæ­¥çŠ¶æ€ï¼ˆåˆ—è¡¨é¡µå¼€å…³è°ƒç”¨ï¼‰ |
**update-sync è¯·æ±‚参数:**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|------|------|------|------|
| id | Long | æ˜¯ | ç‰©æ–™ç¼–号 |
| sync | Boolean | æ˜¯ | true=同步到 MES;false=取消同步(从 MES åˆ é™¤è¯¥ç‰©æ–™ï¼‰ |
**create / update æ–°å¢žè¯·æ±‚参数:**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|------|------|------|------|
| syncMes | Boolean | å¦ | æ˜¯å¦åŒæ­¥åˆ° MES,默认 true;false=不同步 / å–消同步 |
**响应:** `{ "code": 0, "data": true, "msg": "" }`
**响应字段说明:**
| å­—段 | ç±»åž‹ | è¯´æ˜Ž |
|------|------|------|
| syncedMes | Boolean | åˆ†é¡µæŽ¥å£ `GET /mdm/item/page`、详情接口 `GET /mdm/item/get` å·²è¿”回,表示当前是否已同步(MES è¡¨å­˜åœ¨è¯¥ç‰©æ–™è®°å½•即 true) |
## å­—段展示规则
| å­—段 | å±•示位置 | è¯´æ˜Ž |
|------|----------|------|
| åŒæ­¥çŠ¶æ€ | åˆ—表页固定右列 | Switch å¼€å…³ï¼šæ‰“å¼€=已同步,关闭=未同步;切换中显示 loading |
| åŒæ­¥åˆ°MES | æ–°å¢ž / ç¼–辑弹窗 | Switch å¼€å…³ï¼šæ‰“开则保存时同步到 MES;编辑时默认回显当前同步状态 |
## ä¸šåŠ¡è§„åˆ™è¯´æ˜Ž
| åœºæ™¯ | è§„则 |
|------|------|
| æ‰“开开关(列表) | å°† MDM ç‰©æ–™æ•°æ®ï¼ˆå«æ‰¹æ¬¡é…ç½®ï¼‰é‡æ–°åŒæ­¥åˆ° MES,`syncedMes` å˜ä¸º true |
| å…³é—­å¼€å…³ï¼ˆåˆ—表) | ä»Ž MES åˆ é™¤è¯¥ç‰©æ–™ï¼Œçº§è”删除其 BOM / SOP / SIP / æ‰¹æ¬¡é…ç½®ï¼Œ`syncedMes` å˜ä¸º false |
| æ–°å¢žç‰©æ–™ | è¡¨å•"同步到MES"开关默认打开;关闭则只建 MDM ç‰©æ–™ï¼Œä¸åŒæ­¥åˆ° MES |
| ç¼–辑物料 | å¼€å…³é»˜è®¤å›žæ˜¾å½“前同步状态;打开保存=同步(更新 MES),关闭保存=取消同步(从 MES åˆ é™¤ï¼‰ |
| æ“ä½œæƒé™ | åˆ—表开关依赖权限点 `mdm:item:update` |
## æ³¨æ„äº‹é¡¹
- åˆ—表关闭开关前需弹确认提示,明确告知会从 MES åˆ é™¤ç‰©æ–™åŠå…³è”配置(BOM/SOP/SIP/批次配置),避免误操作。
- è‹¥ MES è¯¥ç‰©æ–™å·²è¢«å·¥å•、BOM ç­‰ä¸šåŠ¡å¼•ç”¨ï¼Œåˆ é™¤åŽç›¸å…³ä¸šåŠ¡æ•°æ®å¯èƒ½å—å½±å“ï¼Œå±žä¸šåŠ¡ä¾§æ—¢æœ‰è¡Œä¸ºã€‚
- ç¼–辑物料时关闭"同步到MES"开关并保存,会从 MES åˆ é™¤è¯¥ç‰©æ–™ï¼ˆå–消同步),列表开关变为"未同步"。
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/quotation/CrmSaleQuotationController.java
@@ -90,10 +90,24 @@
    @DeleteMapping("/delete")
    @Operation(summary = "删除销售报价单")
    @Parameter(name = "ids", description = "编号数组", required = true)
    @Parameter(name = "id", description = "单个编号", required = false)
    @Parameter(name = "ids", description = "编号数组", required = false)
    @PreAuthorize("@ss.hasPermission('crm:sale-quotation:delete')")
    public CommonResult<Boolean> deleteSaleQuotation(@RequestParam("ids") List<Long> ids) {
        saleQuotationService.deleteSaleQuotation(ids);
    public CommonResult<Boolean> deleteSaleQuotation(
            @RequestParam(value = "id", required = false) Long id,
            @RequestParam(value = "ids", required = false) List<Long> ids) {
        // æ”¯æŒå•个id或多个ids
        List<Long> deleteIds = new java.util.ArrayList<>();
        if (id != null) {
            deleteIds.add(id);
        }
        if (ids != null && !ids.isEmpty()) {
            deleteIds.addAll(ids);
        }
        if (deleteIds.isEmpty()) {
            throw new IllegalArgumentException("请求参数缺失:id æˆ– ids");
        }
        saleQuotationService.deleteSaleQuotation(deleteIds);
        return success(true);
    }
yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/item/MdmItemController.java
@@ -7,6 +7,7 @@
import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemRespVO;
import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO;
import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemStatusUpdateReqVO;
import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSyncUpdateReqVO;
import cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO;
import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO;
import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO;
@@ -80,6 +81,14 @@
        return success(true);
    }
    @PutMapping("/update-sync")
    @Operation(summary = "更新物料同步状态")
    @PreAuthorize("@ss.hasPermission('mdm:item:update')")
    public CommonResult<Boolean> updateItemSync(@Valid @RequestBody MdmItemSyncUpdateReqVO reqVO) {
        itemService.updateItemSync(reqVO.getId(), reqVO.getSync());
        return success(true);
    }
    @DeleteMapping("/delete")
    @Operation(summary = "删除物料")
    @Parameter(name = "id", description = "编号", required = true, example = "1")
yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/item/vo/MdmItemSyncUpdateReqVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package cn.iocoder.yudao.module.mdm.controller.admin.item.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Schema(description = "管理后台 - MDM ç‰©æ–™åŒæ­¥çŠ¶æ€æ›´æ–° Request VO")
@Data
public class MdmItemSyncUpdateReqVO {
    @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "物料编号不能为空")
    private Long id;
    @Schema(description = "是否同步到 MES", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
    @NotNull(message = "同步状态不能为空")
    private Boolean sync;
}
yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemService.java
@@ -50,6 +50,14 @@
    void deleteItem(Long id);
    /**
     * æ›´æ–°ç‰©æ–™åŒæ­¥çŠ¶æ€ï¼ˆåŒæ­¥/取消同步到 MES)
     *
     * @param id   ç‰©æ–™ç¼–号
     * @param sync true=同步到 MES,false=取消同步(从 MES åˆ é™¤ï¼‰
     */
    void updateItemSync(Long id, Boolean sync);
    /**
     * æ‰¹é‡åˆ é™¤ç‰©æ–™
     *
     * @param ids ç¼–号列表
yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java
@@ -9,6 +9,7 @@
import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO;
import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO;
import cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO;
import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO;
import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO;
import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO;
import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemBatchConfigMapper;
@@ -77,9 +78,11 @@
        // ä¿å­˜æ‰¹æ¬¡é…ç½®ï¼ˆå¦‚果有)
        saveBatchConfig(item.getId(), createReqVO);
        // å§‹ç»ˆåŒæ­¥åˆ° MES
        // å‹¾é€‰åŒæ­¥æ—¶ï¼ŒåŒæ­¥åˆ° MES
        if (Boolean.TRUE.equals(createReqVO.getSyncMes())) {
        createReqVO.setId(item.getId());
        syncItemToMes(createReqVO);
        }
        return item.getId();
    }
@@ -98,8 +101,12 @@
        // ä¿å­˜æ‰¹æ¬¡é…ç½®ï¼ˆå¦‚果有)
        saveBatchConfig(updateReqVO.getId(), updateReqVO);
        // å§‹ç»ˆåŒæ­¥åˆ° MES
        // æ ¹æ®åŒæ­¥å¼€å…³å†³å®šï¼šæ‰“开则同步到 MES,关闭则取消同步(从 MES åˆ é™¤ï¼‰
        if (Boolean.TRUE.equals(updateReqVO.getSyncMes())) {
        syncItemToMes(updateReqVO);
        } else {
            mesMdItemApi.deleteItem(updateReqVO.getId());
        }
    }
    private void validateItemSaveData(MdmItemSaveReqVO reqVO) {
@@ -185,6 +192,35 @@
        mesMdItemApi.deleteItem(id);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateItemSync(Long id, Boolean sync) {
        // æ ¡éªŒå­˜åœ¨
        MdmItemDO item = validateItemExists(id);
        if (Boolean.TRUE.equals(sync)) {
            // åŒæ­¥åˆ° MES:从 DB è¯»å–完整物料数据组装后走 syncItemToMes
            MdmItemSaveReqVO reqVO = BeanUtils.toBean(item, MdmItemSaveReqVO.class);
            // DO å­—段名为 highValue,与 VO çš„ isHighValue ä¸è‡ªåŠ¨åŒ¹é…ï¼Œæ‰‹åŠ¨è¡¥é½
            reqVO.setIsHighValue(item.getHighValue());
            // è¡¥é½æ‰¹æ¬¡å±žæ€§é…ç½®
            MdmItemBatchConfigDO config = itemBatchConfigMapper.selectOne(
                    MdmItemBatchConfigDO::getItemId, id);
            if (config != null) {
                reqVO.setProduceDateFlag(config.getProduceDateFlag());
                reqVO.setExpireDateFlag(config.getExpireDateFlag());
                reqVO.setReceiptDateFlag(config.getReceiptDateFlag());
                reqVO.setVendorFlag(config.getVendorFlag());
                reqVO.setPurchaseOrderCodeFlag(config.getPurchaseOrderCodeFlag());
                reqVO.setLotNumberFlag(config.getLotNumberFlag());
                reqVO.setQualityStatusFlag(config.getQualityStatusFlag());
            }
            syncItemToMes(reqVO);
        } else {
            // å–消同步:从 MES åˆ é™¤è¯¥ç‰©æ–™ï¼ˆMES æ— æ­¤ç‰©æ–™æ—¶å†…部为空操作)
            mesMdItemApi.deleteItem(id);
        }
    }
    /**
     * æ ¡éªŒç‰©æ–™æœªè¢«ä¸šåŠ¡å¼•ç”¨ï¼ˆé”€å”®ã€é‡‡è´­ã€ç”Ÿäº§ã€è´¨æ£€ã€åº“å­˜ç­‰ï¼‰
     *
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java
@@ -7,6 +7,8 @@
import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemPageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.Collection;
import java.util.Collections;
@@ -55,6 +57,19 @@
    }
    /**
     * æŒ‰ ID æŸ¥è¯¢è®°å½•(不过滤逻辑删除,含已删除行)
     * ç”¨äºŽ"取消同步(逻辑删除)后重新同步"时判断主键是否被占用
     */
    @Select("SELECT * FROM mes_md_item WHERE id = #{id} LIMIT 1")
    MesMdItemDO selectAnyById(Long id);
    /**
     * æ¢å¤é€»è¾‘删除的记录(deleted ç½® 0)
     */
    @Update("UPDATE mes_md_item SET deleted = 0, update_time = NOW() WHERE id = #{id}")
    int restoreById(Long id);
    /**
     * æ‰¹é‡æŸ¥è¯¢å·²å­˜åœ¨çš„ MDM ç‰©æ–™ ID é›†åˆ
     *
     * @param mdmItemIds MDM ç‰©æ–™ ID åˆ—表
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java
@@ -80,6 +80,12 @@
                updateItem(createReqVO);
                return createReqVO.getId();
            }
            // å­˜åœ¨é€»è¾‘删除记录(取消同步后重新同步):恢复该记录后走更新,避免主键冲突
            if (itemMapper.selectAnyById(createReqVO.getId()) != null) {
                itemMapper.restoreById(createReqVO.getId());
                updateItem(createReqVO);
                return createReqVO.getId();
            }
        }
        // æ’å…¥