package com.jeesite.modules.mes.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.jeesite.common.entity.Page; import com.jeesite.common.lang.StringUtils; import com.jeesite.common.mybatis.mapper.query.QueryType; import com.jeesite.common.service.CrudService; import com.jeesite.modules.mes.entity.MesMaterialKcLog; import com.jeesite.modules.mes.dao.MesMaterialKcLogDao; /** * 来料库存记录表Service * @author mes * @version 2024-04-10 */ @Service public class MesMaterialKcLogService extends CrudService { @Autowired private MesMaterialKcLogDao mesMaterialKcLogDao; @Autowired @Lazy private MesMaterialKcTotalService mesMaterialKcTotalService; /** * 获取单条数据 * @param mesMaterialKcLog * @return */ @Override public MesMaterialKcLog get(MesMaterialKcLog mesMaterialKcLog) { return super.get(mesMaterialKcLog); } public MesMaterialKcLog findInfo(MesMaterialKcLog mesMaterialKcLog) { return mesMaterialKcLogDao.findInfo(mesMaterialKcLog); } public MesMaterialKcLog findByErpPickLine(String pickBillNo, String lineKey) { if (StringUtils.isBlank(pickBillNo) || StringUtils.isBlank(lineKey)) { return null; } MesMaterialKcLog query = new MesMaterialKcLog(); query.getSqlMap().getWhere().and("erp_pick_bill_no", QueryType.EQ, pickBillNo.trim()); query.getSqlMap().getWhere().and("erp_pick_line_key", QueryType.EQ, lineKey.trim()); return mesMaterialKcLogDao.findInfo(query); } /** * 查询分页数据 * @param mesMaterialKcLog 查询条件 * @param mesMaterialKcLog.page 分页对象 * @return */ @Override public Page findPage(MesMaterialKcLog mesMaterialKcLog) { applySourceTypeFilter(mesMaterialKcLog); return super.findPage(mesMaterialKcLog); } /** * 来源筛选:ERP_PICK 按 source_type;RK 按有入库单关联的历史来料记录。 */ private void applySourceTypeFilter(MesMaterialKcLog mesMaterialKcLog) { if (mesMaterialKcLog == null) { return; } String sourceType = mesMaterialKcLog.getSourceType(); if (StringUtils.isBlank(sourceType)) { return; } if (MesMaterialKcLog.SOURCE_TYPE_RK.equals(sourceType)) { mesMaterialKcLog.setSourceType(null); mesMaterialKcLog.getSqlMap().getWhere().and("rk_record_id", QueryType.IS_NOT_NULL, null); mesMaterialKcLog.getSqlMap().getWhere().and("rk_record_id", QueryType.NE, ""); return; } if (MesMaterialKcLog.SOURCE_TYPE_ERP_PICK.equals(sourceType)) { mesMaterialKcLog.getSqlMap().getWhere().and("source_type", QueryType.EQ, sourceType); mesMaterialKcLog.setSourceType(null); } } /** * 查询列表数据 * @param mesMaterialKcLog * @return */ @Override public List findList(MesMaterialKcLog mesMaterialKcLog) { return super.findList(mesMaterialKcLog); } /** * 保存数据(插入或更新),并按数量变化同步物料总库存 * @param mesMaterialKcLog */ @Override @Transactional public void save(MesMaterialKcLog mesMaterialKcLog) { long oldNums = 0L; String oldMaterialId = null; boolean isNew = mesMaterialKcLog == null || mesMaterialKcLog.getIsNewRecord(); if (!isNew && mesMaterialKcLog != null && StringUtils.isNotBlank(mesMaterialKcLog.getId())) { MesMaterialKcLog old = super.get(mesMaterialKcLog.getId()); if (old != null) { oldNums = old.getNums() == null ? 0L : old.getNums(); oldMaterialId = old.getMaterialId(); } else { isNew = true; } } super.save(mesMaterialKcLog); if (mesMaterialKcLog == null) { return; } long newNums = mesMaterialKcLog.getNums() == null ? 0L : mesMaterialKcLog.getNums(); String newMaterialId = mesMaterialKcLog.getMaterialId(); syncKcTotal(oldMaterialId, oldNums, newMaterialId, newNums, isNew); } /** * 更新状态 * @param mesMaterialKcLog */ @Override @Transactional public void updateStatus(MesMaterialKcLog mesMaterialKcLog) { super.updateStatus(mesMaterialKcLog); } /** * 删除数据,并扣减物料总库存 * @param mesMaterialKcLog */ @Override @Transactional public void delete(MesMaterialKcLog mesMaterialKcLog) { MesMaterialKcLog old = null; if (mesMaterialKcLog != null && StringUtils.isNotBlank(mesMaterialKcLog.getId())) { old = super.get(mesMaterialKcLog.getId()); } super.delete(mesMaterialKcLog); if (old != null) { long oldNums = old.getNums() == null ? 0L : old.getNums(); mesMaterialKcTotalService.adjustBy(old.getMaterialId(), -oldNums); } } /** * 同步物料总库存:新增按新数量增加;更新按差值调整;物料变更时先减旧再加新。 */ private void syncKcTotal(String oldMaterialId, long oldNums, String newMaterialId, long newNums, boolean isNew) { if (isNew) { mesMaterialKcTotalService.adjustBy(newMaterialId, newNums); return; } boolean materialChanged = StringUtils.isNotBlank(oldMaterialId) && StringUtils.isNotBlank(newMaterialId) && !oldMaterialId.equals(newMaterialId); if (materialChanged) { mesMaterialKcTotalService.adjustBy(oldMaterialId, -oldNums); mesMaterialKcTotalService.adjustBy(newMaterialId, newNums); return; } String materialId = StringUtils.isNotBlank(newMaterialId) ? newMaterialId : oldMaterialId; mesMaterialKcTotalService.adjustBy(materialId, newNums - oldNums); } }