package cn.iocoder.yudao.module.mdm.service.item; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemModelPageReqVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemModelSaveReqVO; import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemModelDO; import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemModelMapper; import cn.iocoder.yudao.module.mdm.service.unit.MdmUnitMeasureService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.util.Collection; import java.util.Collections; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mdm.enums.ErrorCodeConstants.*; /** * MDM 物料型号 Service 实现类 * * @author 超级管理员 */ @Service @Validated public class MdmItemModelServiceImpl implements MdmItemModelService { @Resource private MdmItemModelMapper itemModelMapper; @Resource private MdmItemService itemService; @Resource private MdmUnitMeasureService unitMeasureService; @Override public Long createItemModel(MdmItemModelSaveReqVO createReqVO) { validateItemModelSaveData(null, createReqVO); MdmItemModelDO itemModel = BeanUtils.toBean(createReqVO, MdmItemModelDO.class); if (itemModel.getStatus() == null) { itemModel.setStatus(CommonStatusEnum.ENABLE.getStatus()); } itemModelMapper.insert(itemModel); return itemModel.getId(); } @Override public void updateItemModel(MdmItemModelSaveReqVO updateReqVO) { validateItemModelExists(updateReqVO.getId()); validateItemModelSaveData(updateReqVO.getId(), updateReqVO); itemModelMapper.updateById(BeanUtils.toBean(updateReqVO, MdmItemModelDO.class)); } private void validateItemModelSaveData(Long id, MdmItemModelSaveReqVO reqVO) { // 校验物料存在 MdmItemDO item = itemService.validateItemExists(reqVO.getItemId()); // 校验型号单位存在 unitMeasureService.validateUnitMeasureExists(reqVO.getUnitMeasureId()); // 校验换算比率大于 0 if (reqVO.getUnitMeasureRate() == null || reqVO.getUnitMeasureRate().compareTo(BigDecimal.ZERO) <= 0) { throw exception(MDM_ITEM_MODEL_RATE_INVALID, reqVO.getModel(), reqVO.getUnitMeasureRate()); } // 校验同一物料下型号名称唯一 if (StrUtil.isNotBlank(reqVO.getModel())) { MdmItemModelDO exists = itemModelMapper.selectByItemIdAndModel(reqVO.getItemId(), reqVO.getModel()); if (exists != null && ObjUtil.notEqual(exists.getId(), id)) { throw exception(MDM_ITEM_MODEL_NAME_DUPLICATE, reqVO.getModel()); } } // 型号单位与物料主单位一致时,比率必须为 1(否则换算无意义且易误配) if (ObjUtil.equal(item.getUnitMeasureId(), reqVO.getUnitMeasureId()) && reqVO.getUnitMeasureRate().compareTo(BigDecimal.ONE) != 0) { throw exception(MDM_ITEM_MODEL_RATE_MUST_BE_ONE, reqVO.getModel(), unitName(reqVO.getUnitMeasureId()), unitName(item.getUnitMeasureId())); } } private String unitName(Long unitMeasureId) { MdmUnitMeasureDO unit = unitMeasureService.getUnitMeasure(unitMeasureId); return unit != null ? unit.getName() : "ID=" + unitMeasureId; } @Override public void deleteItemModel(Long id) { validateItemModelExists(id); itemModelMapper.deleteById(id); } @Override @Transactional(rollbackFor = Exception.class) public void saveItemModelList(Long itemId, List modelList) { itemService.validateItemExists(itemId); // 第一步,删除旧的型号 itemModelMapper.deleteByItemId(itemId); if (CollUtil.isEmpty(modelList)) { return; } // 第二步,插入新的型号 for (MdmItemModelSaveReqVO reqVO : modelList) { reqVO.setItemId(itemId); reqVO.setId(null); createItemModel(reqVO); } } @Override public MdmItemModelDO getItemModel(Long id) { return itemModelMapper.selectById(id); } @Override public List getItemModelList(Collection ids) { if (CollUtil.isEmpty(ids)) { return Collections.emptyList(); } return itemModelMapper.selectBatchIds(ids); } @Override public List getItemModelListByItemId(Long itemId) { return itemModelMapper.selectListByItemId(itemId); } @Override public List getItemModelListByItemIds(Collection itemIds) { if (CollUtil.isEmpty(itemIds)) { return Collections.emptyList(); } return itemModelMapper.selectListByItemIds(itemIds); } @Override public PageResult getItemModelPage(MdmItemModelPageReqVO pageReqVO) { return itemModelMapper.selectPage(pageReqVO); } @Override public MdmItemModelDO validateItemModelExists(Long id) { MdmItemModelDO itemModel = itemModelMapper.selectById(id); if (itemModel == null) { throw exception(MDM_ITEM_MODEL_NOT_EXISTS); } return itemModel; } @Override public MdmItemModelDO validateItemModelExistsAndEnable(Long id) { MdmItemModelDO itemModel = validateItemModelExists(id); if (CommonStatusEnum.isDisable(itemModel.getStatus())) { throw exception(MDM_ITEM_MODEL_IS_DISABLE); } return itemModel; } @Override public void deleteItemModelListByItemId(Long itemId) { itemModelMapper.deleteByItemId(itemId); } }