|
|
|
@ -1,12 +1,19 @@ |
|
|
|
package com.xujie.sys.modules.erf.service.impl; |
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper; |
|
|
|
import com.xujie.sys.common.exception.XJException; |
|
|
|
import com.xujie.sys.common.utils.ShiroUtils; |
|
|
|
import com.xujie.sys.modules.erf.entity.ErfExpApply; |
|
|
|
import com.xujie.sys.modules.erf.entity.ErfExpRawMaterial; |
|
|
|
import com.xujie.sys.modules.erf.entity.ErfExpRawMaterialChangeLog; |
|
|
|
import com.xujie.sys.modules.erf.mapper.ErfExpApplyMapper; |
|
|
|
import com.xujie.sys.modules.erf.mapper.ErfExpRawMaterialChangeLogMapper; |
|
|
|
import com.xujie.sys.modules.erf.mapper.ErfExpRawMaterialMapper; |
|
|
|
import com.xujie.sys.modules.erf.service.ErfExpRawMaterialService; |
|
|
|
import com.xujie.sys.modules.part.entity.PartInformationEntity; |
|
|
|
import com.xujie.sys.modules.part.mapper.PartInformationMapper; |
|
|
|
import com.xujie.sys.modules.sys.entity.SysUserEntity; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.springframework.beans.BeanUtils; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
@ -14,9 +21,12 @@ import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
import org.springframework.util.StringUtils; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.Arrays; |
|
|
|
import java.util.Date; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.LinkedHashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
@ -47,9 +57,21 @@ import java.util.Map; |
|
|
|
@Transactional |
|
|
|
public class ErfExpRawMaterialServiceImpl implements ErfExpRawMaterialService { |
|
|
|
|
|
|
|
private static final String STATUS_DRAFT = "草稿"; |
|
|
|
private static final String OP_ADD = "新增"; |
|
|
|
private static final String OP_UPDATE = "修改"; |
|
|
|
private static final String OP_DELETE = "删除"; |
|
|
|
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private ErfExpRawMaterialMapper erfExpRawMaterialMapper; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private ErfExpRawMaterialChangeLogMapper erfExpRawMaterialChangeLogMapper; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private ErfExpApplyMapper erfExpApplyMapper; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private PartInformationMapper partInformationMapper; |
|
|
|
|
|
|
|
@ -77,6 +99,28 @@ public class ErfExpRawMaterialServiceImpl implements ErfExpRawMaterialService { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 根据申请单号查询原材料修改记录 |
|
|
|
* |
|
|
|
* @param applyNo 申请单号 |
|
|
|
* @return 修改记录列表(按时间倒序) |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public List<ErfExpRawMaterialChangeLog> getRawMaterialChangeLogList(String applyNo) { |
|
|
|
log.info("查询原材料修改记录,试验单号: {}", applyNo); |
|
|
|
|
|
|
|
if (!StringUtils.hasText(applyNo)) { |
|
|
|
throw new XJException("试验单号不能为空"); |
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
|
return erfExpRawMaterialChangeLogMapper.getChangeLogListByApplyNo(applyNo); |
|
|
|
} catch (Exception e) { |
|
|
|
log.error("查询原材料修改记录失败: " + e.getMessage(), e); |
|
|
|
throw new XJException("查询原材料修改记录失败: " + e.getMessage()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 根据ID查询单条原材料记录 |
|
|
|
* |
|
|
|
@ -114,18 +158,43 @@ public class ErfExpRawMaterialServiceImpl implements ErfExpRawMaterialService { |
|
|
|
validateRawMaterial(rawMaterial); |
|
|
|
|
|
|
|
try { |
|
|
|
if (rawMaterial.getId() == null || rawMaterial.getId() == 0) { |
|
|
|
boolean isNew = (rawMaterial.getId() == null || rawMaterial.getId() == 0); |
|
|
|
ErfExpRawMaterial beforeData = null; |
|
|
|
|
|
|
|
if (!isNew) { |
|
|
|
beforeData = erfExpRawMaterialMapper.getRawMaterialById(rawMaterial.getId()); |
|
|
|
if (beforeData == null) { |
|
|
|
throw new XJException("原材料记录不存在"); |
|
|
|
} |
|
|
|
// 防止前端篡改applyNo,更新时始终使用数据库原值 |
|
|
|
rawMaterial.setApplyNo(beforeData.getApplyNo()); |
|
|
|
} |
|
|
|
|
|
|
|
String applyStatus = getApplyStatus(rawMaterial.getApplyNo()); |
|
|
|
boolean needRecordChangeLog = shouldRecordChangeLog(applyStatus); |
|
|
|
|
|
|
|
if (isNew) { |
|
|
|
// 新增 |
|
|
|
log.info("新增原材料记录"); |
|
|
|
rawMaterial.setIsDeleted("0"); |
|
|
|
erfExpRawMaterialMapper.insert(rawMaterial); |
|
|
|
log.info("新增原材料记录成功,ID: {}", rawMaterial.getId()); |
|
|
|
|
|
|
|
if (needRecordChangeLog) { |
|
|
|
ErfExpRawMaterial afterData = erfExpRawMaterialMapper.getRawMaterialById(rawMaterial.getId()); |
|
|
|
saveAddChangeLog(rawMaterial.getApplyNo(), applyStatus, afterData); |
|
|
|
} |
|
|
|
} else { |
|
|
|
// 修改 |
|
|
|
log.info("修改原材料记录,ID: {}", rawMaterial.getId()); |
|
|
|
rawMaterial.setUpdatedDate(new Date()); |
|
|
|
erfExpRawMaterialMapper.updateById(rawMaterial); |
|
|
|
log.info("修改原材料记录成功"); |
|
|
|
|
|
|
|
if (needRecordChangeLog) { |
|
|
|
ErfExpRawMaterial afterData = erfExpRawMaterialMapper.getRawMaterialById(rawMaterial.getId()); |
|
|
|
saveUpdateChangeLog(rawMaterial.getApplyNo(), applyStatus, beforeData, afterData); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return rawMaterial.getId(); |
|
|
|
@ -176,8 +245,33 @@ public class ErfExpRawMaterialServiceImpl implements ErfExpRawMaterialService { |
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
|
List<ErfExpRawMaterial> deleteTargetList = new ArrayList<>(); |
|
|
|
Map<String, String> applyStatusCache = new HashMap<>(); |
|
|
|
|
|
|
|
for (Integer id : ids) { |
|
|
|
ErfExpRawMaterial dbData = erfExpRawMaterialMapper.getRawMaterialById(id); |
|
|
|
if (dbData == null) { |
|
|
|
throw new XJException("原材料记录不存在,ID: " + id); |
|
|
|
} |
|
|
|
deleteTargetList.add(dbData); |
|
|
|
|
|
|
|
if (!applyStatusCache.containsKey(dbData.getApplyNo())) { |
|
|
|
applyStatusCache.put(dbData.getApplyNo(), getApplyStatus(dbData.getApplyNo())); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int rows = erfExpRawMaterialMapper.batchDeleteByIds(ids, updatedBy); |
|
|
|
log.info("批量删除成功,影响行数: {}", rows); |
|
|
|
|
|
|
|
if (rows > 0) { |
|
|
|
for (ErfExpRawMaterial beforeData : deleteTargetList) { |
|
|
|
String applyStatus = applyStatusCache.get(beforeData.getApplyNo()); |
|
|
|
if (shouldRecordChangeLog(applyStatus)) { |
|
|
|
saveDeleteChangeLog(beforeData.getApplyNo(), applyStatus, beforeData); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return rows > 0; |
|
|
|
} catch (Exception e) { |
|
|
|
log.error("批量删除原材料记录失败: " + e.getMessage(), e); |
|
|
|
@ -263,6 +357,266 @@ public class ErfExpRawMaterialServiceImpl implements ErfExpRawMaterialService { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 保存新增日志 |
|
|
|
*/ |
|
|
|
private void saveAddChangeLog(String applyNo, String applyStatus, ErfExpRawMaterial afterData) { |
|
|
|
if (afterData == null) { |
|
|
|
return; |
|
|
|
} |
|
|
|
ErfExpRawMaterialChangeLog logData = buildBaseChangeLog(applyNo, applyStatus, afterData.getId(), OP_ADD); |
|
|
|
logData.setOperationDesc(buildAddOperationDesc(afterData)); |
|
|
|
logData.setDetailContent(buildAddDetailContent(applyStatus, afterData)); |
|
|
|
logData.setBeforeContent(null); |
|
|
|
logData.setAfterContent(buildMaterialSnapshot(afterData)); |
|
|
|
erfExpRawMaterialChangeLogMapper.insert(logData); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 保存修改日志 |
|
|
|
*/ |
|
|
|
private void saveUpdateChangeLog(String applyNo, String applyStatus, ErfExpRawMaterial beforeData, ErfExpRawMaterial afterData) { |
|
|
|
ErfExpRawMaterialChangeLog logData = buildBaseChangeLog(applyNo, applyStatus, afterData != null ? afterData.getId() : null, OP_UPDATE); |
|
|
|
logData.setOperationDesc(buildUpdateOperationDesc(beforeData, afterData)); |
|
|
|
logData.setDetailContent(buildUpdateDetailContent(applyStatus, beforeData, afterData)); |
|
|
|
logData.setBeforeContent(buildMaterialSnapshot(beforeData)); |
|
|
|
logData.setAfterContent(buildMaterialSnapshot(afterData)); |
|
|
|
erfExpRawMaterialChangeLogMapper.insert(logData); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 保存删除日志 |
|
|
|
*/ |
|
|
|
private void saveDeleteChangeLog(String applyNo, String applyStatus, ErfExpRawMaterial beforeData) { |
|
|
|
ErfExpRawMaterialChangeLog logData = buildBaseChangeLog(applyNo, applyStatus, beforeData != null ? beforeData.getId() : null, OP_DELETE); |
|
|
|
logData.setOperationDesc(buildDeleteOperationDesc(beforeData)); |
|
|
|
logData.setDetailContent(buildDeleteDetailContent(applyStatus, beforeData)); |
|
|
|
logData.setBeforeContent(buildMaterialSnapshot(beforeData)); |
|
|
|
logData.setAfterContent(null); |
|
|
|
erfExpRawMaterialChangeLogMapper.insert(logData); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 构建基础日志对象 |
|
|
|
*/ |
|
|
|
private ErfExpRawMaterialChangeLog buildBaseChangeLog(String applyNo, String applyStatus, Integer rawMaterialId, String operationType) { |
|
|
|
OperatorInfo operatorInfo = getCurrentOperatorInfo(); |
|
|
|
ErfExpRawMaterialChangeLog logData = new ErfExpRawMaterialChangeLog(); |
|
|
|
logData.setApplyNo(applyNo); |
|
|
|
logData.setApplyStatus(applyStatus); |
|
|
|
logData.setRawMaterialId(rawMaterialId); |
|
|
|
logData.setOperationType(operationType); |
|
|
|
logData.setOperatorUserId(operatorInfo.userId); |
|
|
|
logData.setOperatorUserName(operatorInfo.userName); |
|
|
|
logData.setOperatorDisplayName(operatorInfo.userDisplayName); |
|
|
|
logData.setCreatedDate(new Date()); |
|
|
|
return logData; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获取当前操作人 |
|
|
|
*/ |
|
|
|
private OperatorInfo getCurrentOperatorInfo() { |
|
|
|
try { |
|
|
|
SysUserEntity user = ShiroUtils.getUserEntity(); |
|
|
|
if (user != null) { |
|
|
|
String userName = user.getUsername(); |
|
|
|
String userDisplay = StringUtils.hasText(user.getUserDisplay()) ? user.getUserDisplay() : userName; |
|
|
|
return new OperatorInfo(user.getUserId(), userName, userDisplay); |
|
|
|
} |
|
|
|
} catch (Exception e) { |
|
|
|
log.warn("获取当前操作人失败,使用默认值: {}", e.getMessage()); |
|
|
|
} |
|
|
|
return new OperatorInfo(null, "system", "system"); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 判断是否需要记录修改日志(仅非草稿状态) |
|
|
|
*/ |
|
|
|
private boolean shouldRecordChangeLog(String applyStatus) { |
|
|
|
return StringUtils.hasText(applyStatus) && !STATUS_DRAFT.equals(applyStatus.trim()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 查询申请单状态 |
|
|
|
*/ |
|
|
|
private String getApplyStatus(String applyNo) { |
|
|
|
if (!StringUtils.hasText(applyNo)) { |
|
|
|
return ""; |
|
|
|
} |
|
|
|
ErfExpApply apply = erfExpApplyMapper.selectById(applyNo); |
|
|
|
return apply != null && StringUtils.hasText(apply.getStatus()) ? apply.getStatus().trim() : ""; |
|
|
|
} |
|
|
|
|
|
|
|
private String buildAddOperationDesc(ErfExpRawMaterial afterData) { |
|
|
|
return String.format("非草稿状态新增原材料:工序[%s] 物料[%s]", |
|
|
|
formatValue(afterData.getProcessStep()), |
|
|
|
formatValue(afterData.getPartNo())); |
|
|
|
} |
|
|
|
|
|
|
|
private String buildDeleteOperationDesc(ErfExpRawMaterial beforeData) { |
|
|
|
return String.format("非草稿状态删除原材料:工序[%s] 物料[%s]", |
|
|
|
formatValue(beforeData != null ? beforeData.getProcessStep() : null), |
|
|
|
formatValue(beforeData != null ? beforeData.getPartNo() : null)); |
|
|
|
} |
|
|
|
|
|
|
|
private String buildUpdateOperationDesc(ErfExpRawMaterial beforeData, ErfExpRawMaterial afterData) { |
|
|
|
List<String> changedFieldNameList = getChangedFieldNameList(beforeData, afterData); |
|
|
|
if (changedFieldNameList.isEmpty()) { |
|
|
|
return "非草稿状态保存原材料(未检测到字段变化)"; |
|
|
|
} |
|
|
|
String desc = "非草稿状态修改原材料,变更字段:" + String.join("、", changedFieldNameList); |
|
|
|
return desc.length() > 300 ? desc.substring(0, 300) : desc; |
|
|
|
} |
|
|
|
|
|
|
|
private String buildAddDetailContent(String applyStatus, ErfExpRawMaterial afterData) { |
|
|
|
StringBuilder sb = new StringBuilder(); |
|
|
|
//sb.append("操作场景:非草稿状态原材料新增").append("\n"); |
|
|
|
sb.append("申请单状态:").append(formatValue(applyStatus)).append("\n"); |
|
|
|
sb.append("新增内容:"); |
|
|
|
sb.append(buildReadableSnapshot(afterData)); |
|
|
|
return sb.toString(); |
|
|
|
} |
|
|
|
|
|
|
|
private String buildDeleteDetailContent(String applyStatus, ErfExpRawMaterial beforeData) { |
|
|
|
StringBuilder sb = new StringBuilder(); |
|
|
|
//sb.append("操作场景:非草稿状态原材料删除").append("\n"); |
|
|
|
sb.append("申请单状态:").append(formatValue(applyStatus)).append("\n"); |
|
|
|
sb.append("删除前内容:"); |
|
|
|
sb.append(buildReadableSnapshot(beforeData)); |
|
|
|
return sb.toString(); |
|
|
|
} |
|
|
|
|
|
|
|
private String buildUpdateDetailContent(String applyStatus, ErfExpRawMaterial beforeData, ErfExpRawMaterial afterData) { |
|
|
|
List<String> diffList = buildFieldDiffList(beforeData, afterData); |
|
|
|
StringBuilder sb = new StringBuilder(); |
|
|
|
//sb.append("操作场景:非草稿状态原材料修改").append("\n"); |
|
|
|
sb.append("申请单状态:").append(formatValue(applyStatus)).append("\n"); |
|
|
|
sb.append("字段变更数:").append(diffList.size()).append("\n"); |
|
|
|
if (diffList.isEmpty()) { |
|
|
|
sb.append("字段变更明细:未检测到实际字段变化(可能为重复保存)").append("\n"); |
|
|
|
} else { |
|
|
|
sb.append("字段变更明细:").append("\n"); |
|
|
|
for (int i = 0; i < diffList.size(); i++) { |
|
|
|
sb.append(i + 1).append(". ").append(diffList.get(i)).append("\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
sb.append("修改前快照:").append("\n").append(buildReadableSnapshot(beforeData)).append("\n"); |
|
|
|
sb.append("修改后快照:").append("\n").append(buildReadableSnapshot(afterData)); |
|
|
|
return sb.toString(); |
|
|
|
} |
|
|
|
|
|
|
|
private String buildReadableSnapshot(ErfExpRawMaterial data) { |
|
|
|
if (data == null) { |
|
|
|
return "(空)"; |
|
|
|
} |
|
|
|
StringBuilder sb = new StringBuilder(); |
|
|
|
sb.append("工序=").append(formatValue(data.getProcessStep())).append("; "); |
|
|
|
sb.append("物料编码=").append(formatValue(data.getPartNo())).append("; "); |
|
|
|
sb.append("物料描述=").append(formatValue(data.getPartDesc())).append("; "); |
|
|
|
sb.append("数量=").append(formatBigDecimal(data.getQuantity())).append("; "); |
|
|
|
sb.append("单位=").append(formatValue(data.getUmid())).append("; "); |
|
|
|
sb.append("备注=").append(formatValue(data.getRemark())); |
|
|
|
return sb.toString(); |
|
|
|
} |
|
|
|
|
|
|
|
private List<String> buildFieldDiffList(ErfExpRawMaterial beforeData, ErfExpRawMaterial afterData) { |
|
|
|
List<String> diffList = new ArrayList<>(); |
|
|
|
appendDiff(diffList, "工序", beforeData != null ? beforeData.getProcessStep() : null, afterData != null ? afterData.getProcessStep() : null); |
|
|
|
appendDiff(diffList, "物料编码", beforeData != null ? beforeData.getPartNo() : null, afterData != null ? afterData.getPartNo() : null); |
|
|
|
appendDiff(diffList, "物料描述", beforeData != null ? beforeData.getPartDesc() : null, afterData != null ? afterData.getPartDesc() : null); |
|
|
|
appendBigDecimalDiff(diffList, "数量", beforeData != null ? beforeData.getQuantity() : null, afterData != null ? afterData.getQuantity() : null); |
|
|
|
appendDiff(diffList, "单位", beforeData != null ? beforeData.getUmid() : null, afterData != null ? afterData.getUmid() : null); |
|
|
|
appendDiff(diffList, "备注", beforeData != null ? beforeData.getRemark() : null, afterData != null ? afterData.getRemark() : null); |
|
|
|
return diffList; |
|
|
|
} |
|
|
|
|
|
|
|
private List<String> getChangedFieldNameList(ErfExpRawMaterial beforeData, ErfExpRawMaterial afterData) { |
|
|
|
List<String> fieldNameList = new ArrayList<>(); |
|
|
|
appendChangedFieldName(fieldNameList, "工序", beforeData != null ? beforeData.getProcessStep() : null, afterData != null ? afterData.getProcessStep() : null); |
|
|
|
appendChangedFieldName(fieldNameList, "物料编码", beforeData != null ? beforeData.getPartNo() : null, afterData != null ? afterData.getPartNo() : null); |
|
|
|
appendChangedFieldName(fieldNameList, "物料描述", beforeData != null ? beforeData.getPartDesc() : null, afterData != null ? afterData.getPartDesc() : null); |
|
|
|
appendChangedFieldName(fieldNameList, "单位", beforeData != null ? beforeData.getUmid() : null, afterData != null ? afterData.getUmid() : null); |
|
|
|
appendChangedFieldName(fieldNameList, "备注", beforeData != null ? beforeData.getRemark() : null, afterData != null ? afterData.getRemark() : null); |
|
|
|
if (!isBigDecimalSame(beforeData != null ? beforeData.getQuantity() : null, afterData != null ? afterData.getQuantity() : null)) { |
|
|
|
fieldNameList.add("数量"); |
|
|
|
} |
|
|
|
return fieldNameList; |
|
|
|
} |
|
|
|
|
|
|
|
private void appendDiff(List<String> diffList, String fieldName, String oldValue, String newValue) { |
|
|
|
if (!isTextSame(oldValue, newValue)) { |
|
|
|
diffList.add(fieldName + ":" + formatValue(oldValue) + " -> " + formatValue(newValue)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void appendBigDecimalDiff(List<String> diffList, String fieldName, BigDecimal oldValue, BigDecimal newValue) { |
|
|
|
if (!isBigDecimalSame(oldValue, newValue)) { |
|
|
|
diffList.add(fieldName + ":" + formatBigDecimal(oldValue) + " -> " + formatBigDecimal(newValue)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void appendChangedFieldName(List<String> fieldNameList, String fieldName, String oldValue, String newValue) { |
|
|
|
if (!isTextSame(oldValue, newValue)) { |
|
|
|
fieldNameList.add(fieldName); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private boolean isTextSame(String oldValue, String newValue) { |
|
|
|
String oldNormalized = StringUtils.hasText(oldValue) ? oldValue.trim() : ""; |
|
|
|
String newNormalized = StringUtils.hasText(newValue) ? newValue.trim() : ""; |
|
|
|
return oldNormalized.equals(newNormalized); |
|
|
|
} |
|
|
|
|
|
|
|
private boolean isBigDecimalSame(BigDecimal oldValue, BigDecimal newValue) { |
|
|
|
if (oldValue == null && newValue == null) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
if (oldValue == null || newValue == null) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
return oldValue.compareTo(newValue) == 0; |
|
|
|
} |
|
|
|
|
|
|
|
private String buildMaterialSnapshot(ErfExpRawMaterial data) { |
|
|
|
if (data == null) { |
|
|
|
return null; |
|
|
|
} |
|
|
|
Map<String, Object> snapshot = new LinkedHashMap<>(); |
|
|
|
snapshot.put("id", data.getId()); |
|
|
|
snapshot.put("applyNo", data.getApplyNo()); |
|
|
|
snapshot.put("site", data.getSite()); |
|
|
|
snapshot.put("processStep", data.getProcessStep()); |
|
|
|
snapshot.put("partNo", data.getPartNo()); |
|
|
|
snapshot.put("partDesc", data.getPartDesc()); |
|
|
|
snapshot.put("quantity", data.getQuantity()); |
|
|
|
snapshot.put("umid", data.getUmid()); |
|
|
|
snapshot.put("remark", data.getRemark()); |
|
|
|
snapshot.put("updatedBy", data.getUpdatedBy()); |
|
|
|
snapshot.put("updatedDate", data.getUpdatedDate()); |
|
|
|
return toJson(snapshot); |
|
|
|
} |
|
|
|
|
|
|
|
private String toJson(Object data) { |
|
|
|
if (data == null) { |
|
|
|
return null; |
|
|
|
} |
|
|
|
try { |
|
|
|
return OBJECT_MAPPER.writeValueAsString(data); |
|
|
|
} catch (Exception e) { |
|
|
|
log.warn("对象转JSON失败: {}", e.getMessage()); |
|
|
|
return String.valueOf(data); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private String formatValue(String value) { |
|
|
|
return StringUtils.hasText(value) ? value.trim() : "(空)"; |
|
|
|
} |
|
|
|
|
|
|
|
private String formatBigDecimal(BigDecimal value) { |
|
|
|
return value == null ? "(空)" : value.stripTrailingZeros().toPlainString(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 验证原材料数据 |
|
|
|
* |
|
|
|
@ -319,4 +673,19 @@ public class ErfExpRawMaterialServiceImpl implements ErfExpRawMaterialService { |
|
|
|
throw new XJException("复制原材料清单失败: " + e.getMessage()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 操作人信息 |
|
|
|
*/ |
|
|
|
private static class OperatorInfo { |
|
|
|
private final Long userId; |
|
|
|
private final String userName; |
|
|
|
private final String userDisplayName; |
|
|
|
|
|
|
|
private OperatorInfo(Long userId, String userName, String userDisplayName) { |
|
|
|
this.userId = userId; |
|
|
|
this.userName = userName; |
|
|
|
this.userDisplayName = userDisplayName; |
|
|
|
} |
|
|
|
} |
|
|
|
} |