生产环节优化
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user