生产环节优化

This commit is contained in:
2026-06-11 10:06:26 +08:00
parent b9be88ae3f
commit 3431cc6b17
32 changed files with 2237 additions and 52 deletions

View File

@@ -0,0 +1,141 @@
package org.jeecg.modules.xslmes.test;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jakarta.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import org.jeecg.JeecgSystemApplication;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.modules.mes.material.entity.MesMaterial;
import org.jeecg.modules.mes.material.mapper.MesMaterialMapper;
import org.jeecg.modules.xslmes.entity.MesXslFinalBatchPlan;
import org.jeecg.modules.xslmes.entity.MesXslMasterBatchPlan;
import org.jeecg.modules.xslmes.entity.MesXslMixingSpec;
import org.jeecg.modules.xslmes.entity.MesXslProductionOrder;
import org.jeecg.modules.xslmes.mapper.MesXslFinalBatchPlanMapper;
import org.jeecg.modules.xslmes.mapper.MesXslMasterBatchPlanMapper;
import org.jeecg.modules.xslmes.mapper.MesXslMixingSpecMapper;
import org.jeecg.modules.xslmes.mapper.MesXslProductionOrderMapper;
import org.jeecg.modules.xslmes.service.IMesXslProductionOrderService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
classes = JeecgSystemApplication.class)
@Transactional
class MesXslProductionOrderSplitIntegrationTest {
@Resource private IMesXslProductionOrderService productionOrderService;
@Resource private MesXslProductionOrderMapper productionOrderMapper;
@Resource private MesXslMasterBatchPlanMapper masterBatchPlanMapper;
@Resource private MesXslFinalBatchPlanMapper finalBatchPlanMapper;
@Resource private MesMaterialMapper materialMapper;
@Resource private MesXslMixingSpecMapper mixingSpecMapper;
@Test
void splitShouldGenerateB1B2AndFWhenSegmentCountIs3() {
String base = "UT" + System.currentTimeMillis();
MesXslProductionOrder order = createOrder(base, 3);
createMaterial("B1" + base + "SA01", "B1-" + base);
createMaterial("B2" + base + "SA01", "B2-" + base);
createMaterial("F" + base + "SA01", "F-" + base);
createMixingSpec("B1" + base + "SA01");
createMixingSpec("B2" + base + "SA01");
createMixingSpec("F" + base + "SA01");
List<MesXslMasterBatchPlan> masters = productionOrderService.splitToMasterBatchPlan(order.getId());
Assertions.assertEquals(2, masters.size(), "段数=3时应生成2条母胶计划");
List<MesXslMasterBatchPlan> dbMasters =
masterBatchPlanMapper.selectList(
new LambdaQueryWrapper<MesXslMasterBatchPlan>()
.eq(MesXslMasterBatchPlan::getSourceOrderId, order.getId())
.orderByAsc(MesXslMasterBatchPlan::getMaterialCode));
Assertions.assertEquals(2, dbMasters.size());
Assertions.assertEquals("B1" + base, dbMasters.get(0).getMaterialCode());
Assertions.assertEquals("B2" + base, dbMasters.get(1).getMaterialCode());
MesXslFinalBatchPlan finalPlan =
finalBatchPlanMapper.selectOne(
new LambdaQueryWrapper<MesXslFinalBatchPlan>()
.eq(MesXslFinalBatchPlan::getSourceOrderId, order.getId())
.last("LIMIT 1"));
Assertions.assertNotNull(finalPlan, "应生成1条终胶计划");
Assertions.assertEquals("F" + base, finalPlan.getMaterialCode());
MesXslProductionOrder updated = productionOrderMapper.selectById(order.getId());
Assertions.assertEquals(1, updated.getSplitStatus());
}
@Test
void splitShouldFailWhenAnyMixingSpecMissing() {
String base = "UT" + (System.currentTimeMillis() + 7);
MesXslProductionOrder order = createOrder(base, 3);
createMaterial("B1" + base + "SA01", "B1-" + base);
createMaterial("B2" + base + "SA01", "B2-" + base);
createMaterial("F" + base + "SA01", "F-" + base);
// 故意缺少 FxxxSA01
createMixingSpec("B1" + base + "SA01");
createMixingSpec("B2" + base + "SA01");
JeecgBootException ex =
Assertions.assertThrows(
JeecgBootException.class,
() -> productionOrderService.splitToMasterBatchPlan(order.getId()));
Assertions.assertEquals("对应物料的混炼示方不存在,请先生成混炼示方!", ex.getMessage());
List<MesXslMasterBatchPlan> dbMasters =
masterBatchPlanMapper.selectList(
new LambdaQueryWrapper<MesXslMasterBatchPlan>()
.eq(MesXslMasterBatchPlan::getSourceOrderId, order.getId()));
Assertions.assertTrue(dbMasters.isEmpty(), "失败后母胶计划应回滚");
MesXslFinalBatchPlan finalPlan =
finalBatchPlanMapper.selectOne(
new LambdaQueryWrapper<MesXslFinalBatchPlan>()
.eq(MesXslFinalBatchPlan::getSourceOrderId, order.getId())
.last("LIMIT 1"));
Assertions.assertNull(finalPlan, "失败后终胶计划应回滚");
MesXslProductionOrder unchanged = productionOrderMapper.selectById(order.getId());
Assertions.assertTrue(
unchanged.getSplitStatus() == null || unchanged.getSplitStatus() == 0, "失败后拆分状态不应置为已拆分");
}
private MesXslProductionOrder createOrder(String baseCode, int segmentCount) {
MesXslProductionOrder order = new MesXslProductionOrder();
order.setProductionOrderNo("PO-" + baseCode);
order.setOrderDate(new Date());
order.setProcessSegmentCount(segmentCount);
order.setMesMaterialName(baseCode);
order.setMaterialCode(baseCode);
order.setPlanQty(new BigDecimal("100.00"));
order.setSplitStatus(0);
order.setDelFlag(0);
productionOrderMapper.insert(order);
return order;
}
private void createMaterial(String code, String name) {
MesMaterial material = new MesMaterial();
material.setMaterialCode(code);
material.setMaterialName(name);
material.setDelFlag(0);
materialMapper.insert(material);
}
private void createMixingSpec(String specName) {
MesXslMixingSpec spec = new MesXslMixingSpec();
spec.setSpecName(specName);
spec.setDelFlag(0);
mixingSpecMapper.insert(spec);
}
}