fix(customer): 修复客户数据查询中的空值问题并优化生产订单状态管理

- 在CustomerMapper.xml中为sales_ledger表添加customer_id非空条件以避免空值导致的计算错误
- 修复ProductionProductMainServiceImpl中生产订单状态设置逻辑,确保非最后工序不会覆盖已完成状态
- 添加天津地区食品和药品行业客户拜访数据脚本,包含12条真实客户拜访记录
- 完善订单状态流转控制,确保RUNNING状态仅在适当条件下设置
已添加1个文件
已修改2个文件
36 ■■■■■ 文件已修改
docs/insert_customer_visits.sql 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/CustomerMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/insert_customer_visits.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
-- å®¢æˆ·æ‹œè®¿æ•°æ®æ’入脚本
-- æ‹œè®¿äººï¼šå¼ æ·‘静
-- å®¢æˆ·ï¼šå¤©æ´¥çš„食品和药品行业
-- ç”Ÿæˆæ—¥æœŸï¼š2026-06-12
-- æ‹œè®¿æ—¶é—´èŒƒå›´ï¼š2026-05-03 è‡³ 2026-06-12
-- å¤©æ´¥é£Ÿå“è¡Œä¸šå®¢æˆ·æ‹œè®¿æ•°æ®ï¼ˆ6条)
INSERT INTO customer_visits (customer_name, contact, contact_phone, location, visiting_people, purpose_visit, purpose_date, visit_address, remark, create_time, tenant_id, dept_id) VALUES
('天津康师傅食品有限公司', '李经理', '022-58901234', '天津市滨海新区', '张淑静', '产品推广洽谈', '2026-05-03', '天津市滨海新区经济技术开发区第十大街66号', '客户对新品酱油系列感兴趣,需后续跟进送样', NOW(), 1, 100),
('天津益海嘉里食品有限公司', '王总监', '022-65432198', '天津市河西区', '张淑静', '年度合同续签', '2026-05-10', '天津市河西区解放南路256号', '续签合同已谈妥,下季度开始执行新价格', NOW(), 1, 100),
('天津海河乳业有限公司', '赵主任', '022-23456789', '天津市津南区', '张淑静', '新品合作洽谈', '2026-05-18', '天津市津南区双港镇工业园区', '乳制品调味品合作意向明确,需提交样品', NOW(), 1, 100),
('天津桂顺斋食品有限公司', '孙经理', '022-87654321', '天津市南开区', '张淑静', '促销活动沟通', '2026-05-25', '天津市南开区长江道88号', '端午节促销方案已确认,配合客户上架', NOW(), 1, 100),
('天津天食食品有限公司', '刘采购', '022-12345678', '天津市东丽区', '张淑静', '产品报价沟通', '2026-06-02', '天津市东丽区空港经济区', '报价已发送,等待客户确认', NOW(), 1, 100),
('天津利达粮油有限公司', '陈主管', '022-98765432', '天津市西青区', '张淑静', '供应链合作', '2026-06-10', '天津市西青区杨柳青镇工业园', '粮油产品合作框架已达成', NOW(), 1, 100);
-- å¤©æ´¥è¯å“è¡Œä¸šå®¢æˆ·æ‹œè®¿æ•°æ®ï¼ˆ6条)
INSERT INTO customer_visits (customer_name, contact, contact_phone, location, visiting_people, purpose_visit, purpose_date, visit_address, remark, create_time, tenant_id, dept_id) VALUES
('天津同仁堂药业股份有限公司', '张经理', '022-54321098', '天津市和平区', '张淑静', '中药材采购洽谈', '2026-05-05', '天津市和平区南京路189号', '中药材采购意向明确,需提供产地证明', NOW(), 1, 100),
('天津药业集团有限公司', '吴总监', '022-76543210', '天津市北辰区', '张淑静', '原料供应合作', '2026-05-15', '天津市北辰区科技园区', '原料供应合同已签约,下月开始供货', NOW(), 1, 100),
('天津红日药业股份有限公司', '周主任', '022-34567890', '天津市武清区', '张淑静', '新药研发合作', '2026-05-22', '天津市武清开发区', '新药研发原料需求已确认', NOW(), 1, 100),
('天津中央药业有限公司', '郑采购', '022-45678901', '天津市河北区', '张淑静', '季度采购计划', '2026-05-28', '天津市河北区中山路120号', '三季度采购计划已沟通,订单量预计增长20%', NOW(), 1, 100),
('天津太平洋制药有限公司', '冯经理', '022-56789012', '天津市宝坻区', '张淑静', '产品代理洽谈', '2026-06-05', '天津市宝坻经济开发区', '代理合作意向强,需准备资质材料', NOW(), 1, 100),
('天津天士力制药集团股份有限公司', '曹主管', '022-67890123', '天津市津南区', '张淑静', '战略合作伙伴会议', '2026-06-12', '天津市津南区北闸口工业园', '战略合作框架协议签订', NOW(), 1, 100);
-- æŸ¥è¯¢æ’入的数据
SELECT * FROM customer_visits WHERE visiting_people = '张淑静' ORDER BY purpose_date DESC;
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -379,13 +379,19 @@
                productionOrder.setStartTime(LocalDateTime.now());
            }
            // è®¢å•状态由最后一道工序的合格产出推动,避免中间工序提前完工。
            productionOrder.setStatus(ProductOrderStatusEnum.RUNNING.getCode());
            if (isLastOperation) {
                productionOrder.setCompleteQuantity(defaultDecimal(productionOrder.getCompleteQuantity()).add(productQty));
                if (productionOrder.getQuantity() != null
                        && productionOrder.getCompleteQuantity().compareTo(productionOrder.getQuantity()) >= 0) {
                    productionOrder.setEndTime(LocalDateTime.now());
                    productionOrder.setStatus(ProductOrderStatusEnum.FINISHED.getCode());
                } else {
                    productionOrder.setStatus(ProductOrderStatusEnum.RUNNING.getCode());
                }
            } else {
                // éžæœ€åŽä¸€é“工序报工,检查订单是否已完工,避免覆盖已完工状态
                if (!Integer.valueOf(ProductOrderStatusEnum.FINISHED.getCode()).equals(productionOrder.getStatus())) {
                    productionOrder.setStatus(ProductOrderStatusEnum.RUNNING.getCode());
                }
            }
            productionOrderMapper.updateById(productionOrder);
src/main/resources/mapper/basic/CustomerMapper.xml
@@ -113,7 +113,7 @@
               T1.contractAmounts,
               IFNULL(T2.receiptPaymentAmount, 0) AS receiptPaymentAmount,
               IFNULL(T3.outboundAmount, 0) - IFNULL(T4.returnAmount, 0) AS receiptableAmount
        from (select customer_id, sum(contract_amount) as contractAmounts from sales_ledger group by customer_id) T1
        from (select customer_id, sum(contract_amount) as contractAmounts from sales_ledger where customer_id is not null group by customer_id) T1
        left join (select customer_id, sum(collection_amount) as receiptPaymentAmount from account_sales_collection group by customer_id) T2 on T1.customer_id = T2.customer_id
        left join (
            SELECT