diff --git a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java index 4a0807530..c01a1b8f9 100644 --- a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java +++ b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java @@ -1,6 +1,7 @@ package com.klp.crm.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.domain.PageQuery; @@ -9,7 +10,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.klp.common.utils.StringUtils; import com.klp.crm.domain.vo.CrmOrderOperationTraceVo; -import com.klp.mapper.WmsCoilContractRelMapper; +import com.klp.domain.*; +import com.klp.mapper.*; +import com.klp.wms.enums.CoilChangeType; import com.klp.system.service.ISysUserService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -18,15 +21,10 @@ import com.klp.crm.domain.vo.CrmOrderVo; import com.klp.crm.domain.CrmOrder; import com.klp.crm.mapper.CrmOrderMapper; import com.klp.crm.service.ICrmOrderService; -import com.klp.domain.WmsCoilContractRel; import com.klp.domain.bo.WmsMaterialCoilBo; import com.klp.domain.vo.WmsMaterialCoilVo; import com.klp.service.IWmsCoilContractRelService; import com.klp.service.IWmsMaterialCoilService; -import com.klp.domain.WmsDeliveryWaybill; -import com.klp.domain.WmsDeliveryWaybillDetail; -import com.klp.mapper.WmsDeliveryWaybillDetailMapper; -import com.klp.mapper.WmsDeliveryWaybillMapper; import java.util.*; import java.util.stream.Collectors; @@ -47,6 +45,10 @@ public class CrmOrderServiceImpl implements ICrmOrderService { private final WmsCoilContractRelMapper coilContractRelMapper; + private final WmsMaterialCoilMapper coilMapper; + + private final WmsCoilChangeLogMapper changeLogMapper; + private final IWmsMaterialCoilService materialCoilService; private final WmsDeliveryWaybillDetailMapper wmsDeliveryWaybillDetailMapper; @@ -332,10 +334,62 @@ public class CrmOrderServiceImpl implements ICrmOrderService { boolean salesmanChanged = !Objects.equals(oldSalesman, newSalesman); boolean contractCodeChanged = !Objects.equals(oldContractCode, newContractCode); if (salesmanChanged || contractCodeChanged) { + // 查询受影响的钢卷,抓取变更前快照 + Map> oldSnapshots = new LinkedHashMap<>(); + try { + LambdaQueryWrapper relQw = Wrappers.lambdaQuery(); + relQw.eq(WmsCoilContractRel::getContractId, bo.getOrderId()); + List rels = coilContractRelMapper.selectList(relQw); + for (WmsCoilContractRel rel : rels) { + WmsMaterialCoil oldCoil = coilMapper.selectById(rel.getCoilId()); + if (oldCoil != null) { + oldSnapshots.put(rel.getCoilId(), BeanUtil.beanToMap(oldCoil, false, true)); + } + } + } catch (Exception e) { + // 快照失败不影响主流程 + } + coilContractRelMapper.updateCoilSaleNameByOrderId( bo.getOrderId(), StringUtils.isNotBlank(newSalesman) ? newSalesman : oldSalesman, StringUtils.isNotBlank(newContractCode) ? newContractCode : oldContractCode); + + // 抓取变更后快照,计算差异并记录日志 + try { + for (Map.Entry> entry : oldSnapshots.entrySet()) { + Long coilId = entry.getKey(); + Map oldSnapshot = entry.getValue(); + WmsMaterialCoil newCoil = coilMapper.selectById(coilId); + Map newSnapshot = newCoil != null ? BeanUtil.beanToMap(newCoil, false, true) : new LinkedHashMap<>(); + + // 计算变更字段差异 + Map> diff = new LinkedHashMap<>(); + for (Map.Entry fieldEntry : newSnapshot.entrySet()) { + String field = fieldEntry.getKey(); + Object oldVal = oldSnapshot.get(field); + Object newVal = fieldEntry.getValue(); + if (!Objects.equals(oldVal, newVal)) { + Map change = new LinkedHashMap<>(); + change.put("old", oldVal); + change.put("new", newVal); + diff.put(field, change); + } + } + + WmsCoilChangeLog log = new WmsCoilChangeLog(); + log.setChangeType(CoilChangeType.UPDATE.name()); + log.setOldCoilId(coilId); + log.setNewCoilId(coilId); + log.setOldCoilNo(oldSnapshot.get("currentCoilNo") != null ? String.valueOf(oldSnapshot.get("currentCoilNo")) : null); + log.setNewCoilNo(newSnapshot.get("currentCoilNo") != null ? String.valueOf(newSnapshot.get("currentCoilNo")) : null); + log.setChangedFields(diff.isEmpty() ? null : JSONUtil.toJsonStr(diff)); + log.setOperationDesc("订单变更-同步销售员/合同号"); + changeLogMapper.insert(log); + } + } catch (Exception e) { + // 日志记录失败不影响主流程 + } } } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java index 1b3ef6b3c..c9c701b5a 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java @@ -2,11 +2,14 @@ package com.klp.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.klp.common.exception.ServiceException; import com.klp.common.utils.StringUtils; +import com.klp.domain.WmsCoilChangeLog; +import com.klp.mapper.WmsCoilChangeLogMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,6 +25,7 @@ import com.klp.mapper.WmsActualWarehouseMapper; import com.klp.service.IWmsActualWarehouseService; import com.klp.domain.WmsMaterialCoil; import com.klp.mapper.WmsMaterialCoilMapper; +import com.klp.wms.enums.CoilChangeType; import java.util.*; import java.util.regex.Matcher; @@ -40,6 +44,7 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService private final WmsActualWarehouseMapper baseMapper; private final WmsMaterialCoilMapper wmsMaterialCoilMapper; + private final WmsCoilChangeLogMapper changeLogMapper; /** * 查询实际库区/库位自关联 @@ -72,6 +77,19 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService } // 2) 清空钢卷绑定(仅现存且未删除)- 使用UpdateWrapper进行更新 + // 更新前查询受影响的钢卷(全字段,用于快照) + LambdaQueryWrapper affectedQw = Wrappers.lambdaQuery(); + affectedQw.eq(WmsMaterialCoil::getActualWarehouseId, actualWarehouseId) + .eq(WmsMaterialCoil::getDataType, 1) + .eq(WmsMaterialCoil::getDelFlag, 0); + List affectedCoils = wmsMaterialCoilMapper.selectList(affectedQw); + + // 保存旧快照 + Map> oldSnapshots = new LinkedHashMap<>(); + for (WmsMaterialCoil coil : affectedCoils) { + oldSnapshots.put(coil.getCoilId(), BeanUtil.beanToMap(coil, false, true)); + } + UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("actual_warehouse_id", actualWarehouseId) .eq("data_type", 1) @@ -79,6 +97,41 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService .set("actual_warehouse_id", null); wmsMaterialCoilMapper.update(null, updateWrapper); + + // 更新后抓快照,计算差异并记录日志 + try { + for (Map.Entry> entry : oldSnapshots.entrySet()) { + Long coilId = entry.getKey(); + Map oldSnapshot = entry.getValue(); + WmsMaterialCoil newCoil = wmsMaterialCoilMapper.selectById(coilId); + Map newSnapshot = newCoil != null ? BeanUtil.beanToMap(newCoil, false, true) : new LinkedHashMap<>(); + + Map> diff = new LinkedHashMap<>(); + for (Map.Entry fieldEntry : newSnapshot.entrySet()) { + String field = fieldEntry.getKey(); + Object oldVal = oldSnapshot.get(field); + Object newVal = fieldEntry.getValue(); + if (!Objects.equals(oldVal, newVal)) { + Map change = new LinkedHashMap<>(); + change.put("old", oldVal); + change.put("new", newVal); + diff.put(field, change); + } + } + + WmsCoilChangeLog log = new WmsCoilChangeLog(); + log.setChangeType(CoilChangeType.UPDATE.name()); + log.setOldCoilId(coilId); + log.setNewCoilId(coilId); + log.setOldCoilNo(oldSnapshot.get("currentCoilNo") != null ? String.valueOf(oldSnapshot.get("currentCoilNo")) : null); + log.setNewCoilNo(newSnapshot.get("currentCoilNo") != null ? String.valueOf(newSnapshot.get("currentCoilNo")) : null); + log.setChangedFields(diff.isEmpty() ? null : JSONUtil.toJsonStr(diff)); + log.setOperationDesc("释放实际库位"); + changeLogMapper.insert(log); + } + } catch (Exception e) { + // 日志记录失败不影响主流程 + } } @Override diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsCoilContractRelServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsCoilContractRelServiceImpl.java index d1c336a0d..113494460 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsCoilContractRelServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsCoilContractRelServiceImpl.java @@ -1,6 +1,7 @@ package com.klp.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.json.JSONUtil; import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.domain.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -8,6 +9,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.klp.common.utils.StringUtils; +import com.klp.domain.WmsCoilChangeLog; +import com.klp.mapper.WmsCoilChangeLogMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.klp.domain.bo.WmsCoilContractRelBo; @@ -18,13 +21,11 @@ import com.klp.domain.WmsCoilContractRel; import com.klp.domain.WmsMaterialCoil; import com.klp.mapper.WmsCoilContractRelMapper; import com.klp.mapper.WmsMaterialCoilMapper; +import com.klp.wms.enums.CoilChangeType; import com.klp.service.IWmsCoilContractRelService; import com.klp.common.exception.ServiceException; -import java.util.List; -import java.util.Map; -import java.util.Collection; -import java.util.Collections; +import java.util.*; import java.util.stream.Collectors; /** @@ -40,6 +41,7 @@ public class WmsCoilContractRelServiceImpl implements IWmsCoilContractRelService private final WmsCoilContractRelMapper baseMapper; private final WmsMaterialCoilMapper coilMapper; + private final WmsCoilChangeLogMapper changeLogMapper; /** * 查询钢卷与合同关联关系 @@ -115,7 +117,45 @@ public class WmsCoilContractRelServiceImpl implements IWmsCoilContractRelService } if (needUpdate) { updateWrapper.eq(WmsMaterialCoil::getCoilId, coilId); + + // 更新前抓快照 + WmsMaterialCoil oldCoil = coilMapper.selectById(coilId); + Map oldSnapshot = oldCoil != null ? BeanUtil.beanToMap(oldCoil, false, true) : null; + coilMapper.update(null, updateWrapper); + + // 更新后抓快照,计算差异 + try { + WmsMaterialCoil newCoil = coilMapper.selectById(coilId); + Map newSnapshot = newCoil != null ? BeanUtil.beanToMap(newCoil, false, true) : new LinkedHashMap<>(); + + Map> diff = new LinkedHashMap<>(); + if (oldSnapshot != null) { + for (Map.Entry entry : newSnapshot.entrySet()) { + String field = entry.getKey(); + Object oldVal = oldSnapshot.get(field); + Object newVal = entry.getValue(); + if (!Objects.equals(oldVal, newVal)) { + Map change = new LinkedHashMap<>(); + change.put("old", oldVal); + change.put("new", newVal); + diff.put(field, change); + } + } + } + + WmsCoilChangeLog log = new WmsCoilChangeLog(); + log.setChangeType(CoilChangeType.UPDATE.name()); + log.setOldCoilId(coilId); + log.setNewCoilId(coilId); + log.setOldCoilNo(oldSnapshot != null ? String.valueOf(oldSnapshot.get("currentCoilNo")) : null); + log.setNewCoilNo(newSnapshot.get("currentCoilNo") != null ? String.valueOf(newSnapshot.get("currentCoilNo")) : null); + log.setChangedFields(diff.isEmpty() ? null : JSONUtil.toJsonStr(diff)); + log.setOperationDesc("同步销售员/合同号"); + changeLogMapper.insert(log); + } catch (Exception e) { + // 日志记录失败不影响主流程 + } } } } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java index 896ba4808..7ed9042ba 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java @@ -88,6 +88,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { private final WmsCoilContractRelMapper coilContractRelMapper; private final WmsCoilQualityRejudgeMapper wmsCoilQualityRejudgeMapper; private final WmsCoilAbnormalMapper coilAbnormalMapper; +// private final WmsCoilChangeLogMapper changeLogMapper; /** * 查询钢卷物料表 @@ -5811,6 +5812,19 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { .set(WmsMaterialCoil::getParentCoilNos, String.join(",", childCoilNos)); // 记录子卷号 baseMapper.update(null, parentUpdateWrapper); +// // 记录母卷变更日志 +// try { +// WmsCoilChangeLog log = new WmsCoilChangeLog(); +// log.setChangeType(CoilChangeType.SPLIT.name()); +// log.setOldCoilId(parentCoilId); +// log.setNewCoilId(parentCoilId); +// log.setOldCoilNo(parentCoil.getCurrentCoilNo()); +// log.setOperationDesc("完成分卷-母卷变历史"); +// changeLogMapper.insert(log); +// } catch (Exception e) { +// // 日志记录失败不影响主流程 +// } + // 4.1 将母卷的二维码标记为失效 if (parentCoil.getQrcodeRecordId() != null) { WmsGenerateRecordBo parentQrBo = new WmsGenerateRecordBo(); diff --git a/klp-wms/src/main/java/com/klp/wms/aspect/CoilChangeLogAspect.java b/klp-wms/src/main/java/com/klp/wms/aspect/CoilChangeLogAspect.java index bfa7ca853..ebd7baf78 100644 --- a/klp-wms/src/main/java/com/klp/wms/aspect/CoilChangeLogAspect.java +++ b/klp-wms/src/main/java/com/klp/wms/aspect/CoilChangeLogAspect.java @@ -2,8 +2,8 @@ package com.klp.wms.aspect; import cn.hutool.core.bean.BeanUtil; import cn.hutool.json.JSONUtil; -import com.klp.domain.WmsMaterialCoil; import com.klp.domain.WmsCoilChangeLog; +import com.klp.domain.WmsMaterialCoil; import com.klp.mapper.WmsCoilChangeLogMapper; import com.klp.mapper.WmsMaterialCoilMapper; import com.klp.wms.annotation.CoilChangeLog;