diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/controller/BaseTemplateVariableController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/controller/BaseTemplateVariableController.java index 1af8f103..2e8a2b3d 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/controller/BaseTemplateVariableController.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/controller/BaseTemplateVariableController.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.oa.base.service.ITemplateVariableAssignService; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -18,7 +19,9 @@ import org.dromara.common.core.validate.EditGroup; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.oa.base.domain.vo.BaseTemplateVariableVo; +import org.dromara.oa.base.domain.vo.TemplateVariableAssignVo; import org.dromara.oa.base.domain.bo.BaseTemplateVariableBo; +import org.dromara.oa.base.domain.bo.TemplateVariableAssignRequest; import org.dromara.oa.base.service.IBaseTemplateVariableService; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -36,6 +39,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; public class BaseTemplateVariableController extends BaseController { private final IBaseTemplateVariableService baseTemplateVariableService; + private final ITemplateVariableAssignService templateVariableAssignService; /** * 查询模板变量信息列表 @@ -113,4 +117,17 @@ public class BaseTemplateVariableController extends BaseController { return R.ok(list); } + /** + * 根据合同信息为模板变量赋值 + * + * @param request 赋值请求(包含模板类型、合同ID) + * @return 赋值后的模板变量列表 + */ +// @SaCheckPermission("oa/base:templateVariable:assign") + @PostMapping("/assign") + public R> assignTemplateVariables(@Validated @RequestBody TemplateVariableAssignRequest request) { + List result = templateVariableAssignService.assignTemplateVariables(request); + return R.ok(result); + } + } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/bo/TemplateVariableAssignRequest.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/bo/TemplateVariableAssignRequest.java new file mode 100644 index 00000000..15ac9e6c --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/bo/TemplateVariableAssignRequest.java @@ -0,0 +1,35 @@ +package org.dromara.oa.base.domain.bo; + +import lombok.Data; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 模板变量赋值请求对象 + * + * @author Yinq + * @date 2025-01-XX + */ +@Data +public class TemplateVariableAssignRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 模板类型(1合同 2发货单) + */ + @NotNull(message = "模板类型不能为空") + private String templateType; + + /** + * 合同ID + */ + @NotNull(message = "合同ID不能为空") + private Long contractId; +} + diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/vo/TemplateVariableAssignVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/vo/TemplateVariableAssignVo.java new file mode 100644 index 00000000..76d2e3b2 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/vo/TemplateVariableAssignVo.java @@ -0,0 +1,40 @@ +package org.dromara.oa.base.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 模板变量赋值结果视图对象 + * + * @author Yinq + * @date 2025-01-XX + */ +@Data +public class TemplateVariableAssignVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 变量名称 + */ + private String varName; + + /** + * 变量显示名称 + */ + private String varLabel; + + /** + * 已赋值的变量值 + */ + private Object varValue; + + /** + * 变量类型(1文本 2数值 3时间 4数组) + */ + private String varType; +} + diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/IBaseTemplateVariableService.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/IBaseTemplateVariableService.java index de8132e2..a1b90e53 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/IBaseTemplateVariableService.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/IBaseTemplateVariableService.java @@ -1,6 +1,5 @@ package org.dromara.oa.base.service; -import org.dromara.oa.base.domain.BaseTemplateVariable; import org.dromara.oa.base.domain.vo.BaseTemplateVariableVo; import org.dromara.oa.base.domain.bo.BaseTemplateVariableBo; import org.dromara.common.mybatis.core.page.TableDataInfo; diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/ITemplateVariableAssignService.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/ITemplateVariableAssignService.java new file mode 100644 index 00000000..37f48b7b --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/ITemplateVariableAssignService.java @@ -0,0 +1,25 @@ +package org.dromara.oa.base.service; + +import org.dromara.oa.base.domain.bo.TemplateVariableAssignRequest; +import org.dromara.oa.base.domain.vo.TemplateVariableAssignVo; + +import java.util.List; + +/** + * 模板变量赋值Service接口 + * + * @author Yinq + * @date 2025-01-XX + */ +public interface ITemplateVariableAssignService { + + /** + * 根据模板类型为模板变量赋值 + * 模板类型:1=合同,2=发货单 + * + * @param request 赋值请求(包含变量名称数组、模板类型、业务ID等) + * @return 赋值后的模板变量列表 + */ + List assignTemplateVariables(TemplateVariableAssignRequest request); +} + diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/impl/BaseTemplateVariableServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/impl/BaseTemplateVariableServiceImpl.java index 957162d3..c7c16748 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/impl/BaseTemplateVariableServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/impl/BaseTemplateVariableServiceImpl.java @@ -2,12 +2,11 @@ package org.dromara.oa.base.service.impl; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; - import org.dromara.common.mybatis.core.page.TableDataInfo; - import org.dromara.common.mybatis.core.page.PageQuery; - import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.dromara.oa.base.domain.bo.BaseTemplateVariableBo; @@ -16,9 +15,8 @@ import org.dromara.oa.base.domain.BaseTemplateVariable; import org.dromara.oa.base.mapper.BaseTemplateVariableMapper; import org.dromara.oa.base.service.IBaseTemplateVariableService; -import java.util.List; -import java.util.Map; import java.util.Collection; +import java.util.List; /** * 模板变量信息Service业务层处理 @@ -39,23 +37,23 @@ public class BaseTemplateVariableServiceImpl implements IBaseTemplateVariableSer * @return 模板变量信息 */ @Override - public BaseTemplateVariableVo queryById(Long variableId){ + public BaseTemplateVariableVo queryById(Long variableId) { return baseMapper.selectVoById(variableId); } - /** - * 分页查询模板变量信息列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 模板变量信息分页列表 - */ - @Override - public TableDataInfo queryPageList(BaseTemplateVariableBo bo, PageQuery pageQuery) { - MPJLambdaWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } + /** + * 分页查询模板变量信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 模板变量信息分页列表 + */ + @Override + public TableDataInfo queryPageList(BaseTemplateVariableBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } /** * 查询符合条件的模板变量信息列表 @@ -70,20 +68,18 @@ public class BaseTemplateVariableServiceImpl implements IBaseTemplateVariableSer } private MPJLambdaWrapper buildQueryWrapper(BaseTemplateVariableBo bo) { - Map params = bo.getParams(); MPJLambdaWrapper lqw = JoinWrappers.lambda(BaseTemplateVariable.class) - .selectAll(BaseTemplateVariable.class) - .eq(StringUtils.isNotBlank(bo.getVarLabel()), BaseTemplateVariable::getVarLabel, bo.getVarLabel()) - .like(StringUtils.isNotBlank(bo.getVarName()), BaseTemplateVariable::getVarName, bo.getVarName()) - .eq(StringUtils.isNotBlank(bo.getTemplateType()), BaseTemplateVariable::getTemplateType, bo.getTemplateType()) - .eq(StringUtils.isNotBlank(bo.getDataSource()), BaseTemplateVariable::getDataSource, bo.getDataSource()) - .eq(StringUtils.isNotBlank(bo.getDataField()), BaseTemplateVariable::getDataField, bo.getDataField()) - .eq(StringUtils.isNotBlank(bo.getVarType()), BaseTemplateVariable::getVarType, bo.getVarType()) - .eq(StringUtils.isNotBlank(bo.getDefaultValue()), BaseTemplateVariable::getDefaultValue, bo.getDefaultValue()) - .eq(bo.getSortOrder() != null, BaseTemplateVariable::getSortOrder, bo.getSortOrder()) - .eq(bo.getTemplateId() != null, BaseTemplateVariable::getTemplateId, bo.getTemplateId()) - .eq(StringUtils.isNotBlank(bo.getActiveFlag()), BaseTemplateVariable::getActiveFlag, bo.getActiveFlag()) -; + .selectAll(BaseTemplateVariable.class) + .eq(StringUtils.isNotBlank(bo.getVarLabel()), BaseTemplateVariable::getVarLabel, bo.getVarLabel()) + .like(StringUtils.isNotBlank(bo.getVarName()), BaseTemplateVariable::getVarName, bo.getVarName()) + .eq(StringUtils.isNotBlank(bo.getTemplateType()), BaseTemplateVariable::getTemplateType, bo.getTemplateType()) + .eq(StringUtils.isNotBlank(bo.getDataSource()), BaseTemplateVariable::getDataSource, bo.getDataSource()) + .eq(StringUtils.isNotBlank(bo.getDataField()), BaseTemplateVariable::getDataField, bo.getDataField()) + .eq(StringUtils.isNotBlank(bo.getVarType()), BaseTemplateVariable::getVarType, bo.getVarType()) + .eq(StringUtils.isNotBlank(bo.getDefaultValue()), BaseTemplateVariable::getDefaultValue, bo.getDefaultValue()) + .eq(bo.getSortOrder() != null, BaseTemplateVariable::getSortOrder, bo.getSortOrder()) + .eq(bo.getTemplateId() != null, BaseTemplateVariable::getTemplateId, bo.getTemplateId()) + .eq(StringUtils.isNotBlank(bo.getActiveFlag()), BaseTemplateVariable::getActiveFlag, bo.getActiveFlag()); return lqw; } @@ -120,7 +116,7 @@ public class BaseTemplateVariableServiceImpl implements IBaseTemplateVariableSer /** * 保存前的数据校验 */ - private void validEntityBeforeSave(BaseTemplateVariable entity){ + private void validEntityBeforeSave(BaseTemplateVariable entity) { //TODO 做一些数据校验,如唯一约束 } @@ -133,7 +129,7 @@ public class BaseTemplateVariableServiceImpl implements IBaseTemplateVariableSer */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/impl/TemplateVariableAssignServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/impl/TemplateVariableAssignServiceImpl.java new file mode 100644 index 00000000..f87701de --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/impl/TemplateVariableAssignServiceImpl.java @@ -0,0 +1,403 @@ +package org.dromara.oa.base.service.impl; + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.oa.base.domain.bo.BaseTemplateVariableBo; +import org.dromara.oa.base.domain.bo.TemplateVariableAssignRequest; +import org.dromara.oa.base.domain.vo.BaseTemplateVariableVo; +import org.dromara.oa.base.domain.vo.TemplateVariableAssignVo; +import org.dromara.oa.base.service.IBaseTemplateVariableService; +import org.dromara.oa.base.service.ITemplateVariableAssignService; +import org.dromara.oa.erp.domain.bo.ErpContractInfoBo; +import org.dromara.oa.erp.domain.bo.ErpContractMaterialBo; +import org.dromara.oa.erp.domain.vo.ErpContractInfoVo; +import org.dromara.oa.erp.domain.vo.ErpContractMaterialVo; +import org.dromara.oa.erp.service.IErpContractInfoService; +import org.dromara.oa.erp.service.IErpContractMaterialService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 模板变量赋值Service业务层处理 + * + * @author Yinq + * @date 2025-01-XX + */ +@RequiredArgsConstructor +@Service +public class TemplateVariableAssignServiceImpl implements ITemplateVariableAssignService { + + private final IBaseTemplateVariableService baseTemplateVariableService; + private final IErpContractInfoService erpContractInfoService; + private final IErpContractMaterialService erpContractMaterialService; + + /** + * 根据模板类型为模板变量赋值 + * 模板类型:1=合同,2=发货单 + * + * @param request 赋值请求(包含变量名称数组、模板类型、业务ID等) + * @return 赋值后的模板变量列表 + */ + @Override + public List assignTemplateVariables(TemplateVariableAssignRequest request) { + // 根据模板类型选择不同的处理逻辑 + String templateType = request.getTemplateType(); + if ("1".equals(templateType)) { + // 合同类型 + return assignContractTemplateVariables(request); + } else if ("2".equals(templateType)) { + // 发货单类型 + return assignDeliveryTemplateVariables(request); + } else { + throw new ServiceException("不支持的模板类型:" + templateType); + } + } + + /** + * 为合同模板变量赋值 + * + * @param request 赋值请求 + * @return 赋值后的模板变量列表 + */ + private List assignContractTemplateVariables(TemplateVariableAssignRequest request) { + // 1. 根据模板类型查询所有模板变量配置 + BaseTemplateVariableBo queryBo = new BaseTemplateVariableBo(); + queryBo.setTemplateType(request.getTemplateType()); + List allTemplateVariables = baseTemplateVariableService.queryList(queryBo); + + // 构建变量名到配置的映射 + Map variableMap = buildVariableMap(allTemplateVariables); + + // 2. 查询合同信息 + ErpContractInfoBo bo = new ErpContractInfoBo(); + bo.setContractId(request.getContractId()); + List contractInfoVoList = erpContractInfoService.queryList(bo); + if (contractInfoVoList.isEmpty()) { + throw new ServiceException("合同信息不存在,合同ID:" + request.getContractId()); + } + ErpContractInfoVo contractInfo = contractInfoVoList.get(0); + + // 3. 查询合同物料列表(如果存在需要物料数据的变量) + List contractMaterials = null; + boolean needMaterialData = allTemplateVariables.stream() + .anyMatch(var -> "erp_contract_material".equalsIgnoreCase(var.getDataSource())); + if (needMaterialData) { + ErpContractMaterialBo materialBo = new ErpContractMaterialBo(); + materialBo.setContractId(request.getContractId()); + contractMaterials = erpContractMaterialService.queryList(materialBo); + for (int i = 0; i < contractMaterials.size(); i++) { + contractMaterials.get(i).setSeq(i + 1L); + } + } + + // 4. 为所有模板变量赋值 + return buildAssignResultList(allTemplateVariables, variableMap, contractInfo, contractMaterials); + } + + /** + * 为发货单模板变量赋值 + * + * @param request 赋值请求 + * @return 赋值后的模板变量列表 + */ + private List assignDeliveryTemplateVariables(TemplateVariableAssignRequest request) { + // TODO: 实现发货单模板变量赋值逻辑 + throw new ServiceException("发货单模板变量赋值功能暂未实现"); + } + + /** + * 构建赋值结果列表 + * + * @param allTemplateVariables 所有模板变量配置 + * @param variableMap 变量配置映射 + * @param contractInfo 合同信息 + * @param contractMaterials 合同物料列表 + * @return 赋值结果列表 + */ + private List buildAssignResultList( + List allTemplateVariables, + Map variableMap, + ErpContractInfoVo contractInfo, + List contractMaterials) { + + List resultList = new ArrayList<>(); + for (BaseTemplateVariableVo variable : allTemplateVariables) { + if (variable == null || StringUtils.isBlank(variable.getVarName())) { + continue; + } + + // 根据 dataSource 决定数据源 + Object value = getValueFromDataSource(variable, contractInfo, contractMaterials); + + // 如果获取不到值,使用默认值 + if (value == null && StringUtils.isNotBlank(variable.getDefaultValue())) { + value = variable.getDefaultValue(); + } + + // 根据变量类型决定返回类型(4表示数组类型) + boolean shouldReturnArray = "4".equals(variable.getVarType()); + Object finalValue = convertValueToTargetType(value, shouldReturnArray); + + // 构建返回对象 + TemplateVariableAssignVo assignVo = new TemplateVariableAssignVo(); + assignVo.setVarName(variable.getVarName()); + assignVo.setVarLabel(variable.getVarLabel()); + assignVo.setVarValue(finalValue); + assignVo.setVarType(variable.getVarType()); + resultList.add(assignVo); + } + + return resultList; + } + + /** + * 解析变量名称格式 + * #{变量名} 表示字符串类型 + * ^{变量名} 表示数组类型 + * + * @param varNameWithFormat 带格式的变量名,如 #{客户名称} 或 ^{产品名称} + * @return 变量名信息 + */ + private VariableNameInfo parseVariableName(String varNameWithFormat) { + if (StringUtils.isBlank(varNameWithFormat)) { + return new VariableNameInfo(varNameWithFormat, false); + } + + // 检查是否是 #{变量名} 格式(字符串) + if (varNameWithFormat.startsWith("#{") && varNameWithFormat.endsWith("}")) { + String actualName = varNameWithFormat.substring(2, varNameWithFormat.length() - 1); + return new VariableNameInfo(actualName, false); + } + + // 检查是否是 ^{变量名} 格式(数组) + if (varNameWithFormat.startsWith("^{") && varNameWithFormat.endsWith("}")) { + String actualName = varNameWithFormat.substring(2, varNameWithFormat.length() - 1); + return new VariableNameInfo(actualName, true); + } + + // 默认格式,返回原值 + return new VariableNameInfo(varNameWithFormat, false); + } + + /** + * 变量名信息内部类 + */ + private static class VariableNameInfo { + private final String actualName; + private final boolean arrayType; + + public VariableNameInfo(String actualName, boolean arrayType) { + this.actualName = actualName; + this.arrayType = arrayType; + } + + public String getActualName() { + return actualName; + } + + public boolean isArrayType() { + return arrayType; + } + } + + /** + * 构建变量名到配置的映射 + * 支持带占位符(#{变量名}或^{变量名})和不带占位符的匹配 + * + * @param templateVariables 所有模板变量配置 + * @return 变量名到配置的映射 + */ + private Map buildVariableMap( + List templateVariables) { + Map variableMap = new HashMap<>(); + + for (BaseTemplateVariableVo variable : templateVariables) { + String varName = variable.getVarName(); + if (StringUtils.isBlank(varName)) { + continue; + } + + // 提取变量名(去除占位符) + String normalizedName = normalizeVariableName(varName); + + // 添加到映射中(使用规范化后的变量名作为key) + variableMap.put(normalizedName, variable); + } + + return variableMap; + } + + /** + * 规范化变量名(去除占位符格式) + * + * @param varName 变量名(可能包含#{或^{}) + * @return 规范化后的变量名 + */ + private String normalizeVariableName(String varName) { + if (StringUtils.isBlank(varName)) { + return varName; + } + + // 去除 #{变量名} 或 ^{变量名} 格式 + if ((varName.startsWith("#{") || varName.startsWith("^{")) && varName.endsWith("}")) { + return varName.substring(2, varName.length() - 1); + } + + return varName; + } + + /** + * 根据数据源获取字段值 + * + * @param variable 变量配置 + * @param contractInfo 合同信息 + * @param contractMaterials 合同物料列表(可能为null) + * @return 字段值 + */ + private Object getValueFromDataSource(BaseTemplateVariableVo variable, + ErpContractInfoVo contractInfo, + List contractMaterials) { + if (StringUtils.isBlank(variable.getDataField())) { + return null; + } + + String dataSource = variable.getDataSource(); + + // 根据数据源类型获取值 + if ("erp_contract_material".equalsIgnoreCase(dataSource)) { + // 从合同物料列表中提取字段值 + return getFieldValueFromMaterialList(contractMaterials, variable.getDataField()); + } else { + // 默认从合同信息中获取 + return getFieldValueFromContract(contractInfo, variable.getDataField()); + } + } + + /** + * 从合同物料列表中提取指定字段的值列表 + * + * @param contractMaterials 合同物料列表 + * @param fieldName 字段名 + * @return 字段值列表 + */ + private List getFieldValueFromMaterialList(List contractMaterials, String fieldName) { + if (contractMaterials == null || contractMaterials.isEmpty() || StringUtils.isBlank(fieldName)) { + return new ArrayList<>(); + } + + List values = new ArrayList<>(); + for (ErpContractMaterialVo material : contractMaterials) { + Object value = getFieldValueFromObject(material, fieldName); + // 如果值为null,用空字符串代替 + values.add(value != null ? value : ""); + } + return values; + } + + /** + * 使用反射从对象中根据字段名获取值 + * + * @param obj 对象 + * @param fieldName 字段名 + * @return 字段值 + */ + private Object getFieldValueFromObject(Object obj, String fieldName) { + if (obj == null || StringUtils.isBlank(fieldName)) { + return null; + } + + try { + // 先尝试使用反射获取字段值 + Field field = obj.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + return field.get(obj); + } catch (NoSuchFieldException e) { + // 如果字段不存在,尝试使用 getter 方法 + try { + String methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); + return obj.getClass().getMethod(methodName).invoke(obj); + } catch (Exception ex) { + // 如果都获取不到,返回 null + return null; + } + } catch (Exception e) { + return null; + } + } + + /** + * 使用反射从合同信息中根据字段名获取值 + * + * @param contractInfo 合同信息 + * @param fieldName 字段名 + * @return 字段值 + */ + private Object getFieldValueFromContract(ErpContractInfoVo contractInfo, String fieldName) { + return getFieldValueFromObject(contractInfo, fieldName); + } + + /** + * 将值转换为目标类型 + * + * @param value 原始值 + * @param shouldReturnArray 是否应该返回数组类型 + * @return 转换后的值 + */ + private Object convertValueToTargetType(Object value, boolean shouldReturnArray) { + if (shouldReturnArray) { + // 转换为数组类型 + if (value instanceof List) { + return value; + } else if (value instanceof Collection) { + return new ArrayList<>((Collection) value); + } else if (value != null) { + // 单个值,转换为列表 + List arrayValue = new ArrayList<>(); + arrayValue.add(value); + return arrayValue; + } else { + return new ArrayList<>(); + } + } else { + // 转换为字符串类型 + if (value instanceof List) { + List list = (List) value; + if (!list.isEmpty()) { + return list.get(0).toString(); + } else { + return ""; + } + } else if (value instanceof Collection) { + Collection collection = (Collection) value; + if (!collection.isEmpty()) { + return collection.iterator().next().toString(); + } else { + return ""; + } + } else if (value != null) { + return value.toString(); + } else { + return ""; + } + } + } + + /** + * 根据类型获取默认值 + * + * @param isArrayType 是否为数组类型 + * @return 默认值 + */ + private Object getDefaultValueByType(boolean isArrayType) { + return isArrayType ? new ArrayList<>() : ""; + } +} + diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractMaterialVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractMaterialVo.java index 762350d0..92e3d3cc 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractMaterialVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractMaterialVo.java @@ -160,6 +160,13 @@ public class ErpContractMaterialVo implements Serializable { /** * 计量单位名称 */ - @ExcelProperty(value = "计量单位名称") + @ExcelProperty(value = "单位") private String unitName; + + /** + * 序号 + */ + @ExcelProperty(value = "序号") + private Long seq; + } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractInfoServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractInfoServiceImpl.java index 20c9d5ef..9e0219bc 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractInfoServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractInfoServiceImpl.java @@ -118,6 +118,7 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService { .eq(bo.getSignatureAppendix() != null, ErpContractInfo::getSignatureAppendix, bo.getSignatureAppendix()) .eq(bo.getTaxRate() != null, ErpContractInfo::getTaxRate, bo.getTaxRate()) .eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpContractInfo::getActiveFlag, bo.getActiveFlag()) + .eq("t.del_flag", "0") .orderByDesc(ErpContractInfo::getCreateTime); return lqw; } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractMaterialServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractMaterialServiceImpl.java index 823534b3..7af08b78 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractMaterialServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractMaterialServiceImpl.java @@ -66,7 +66,7 @@ public class ErpContractMaterialServiceImpl implements IErpContractMaterialServi @Override public List queryList(ErpContractMaterialBo bo) { MPJLambdaWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); + return baseMapper.selectCustomErpContractMaterialVoList(lqw); } private MPJLambdaWrapper buildQueryWrapper(ErpContractMaterialBo bo) { @@ -86,6 +86,7 @@ public class ErpContractMaterialServiceImpl implements IErpContractMaterialServi .eq(bo.getIncludingPrice() != null, ErpContractMaterial::getIncludingPrice, bo.getIncludingPrice()) .eq(bo.getSubtotal() != null, ErpContractMaterial::getSubtotal, bo.getSubtotal()) .eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpContractMaterial::getActiveFlag, bo.getActiveFlag()) + .eq("t.del_flag", "0") .orderByAsc(ErpContractMaterial::getContractMaterialId); return lqw; } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectInfoServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectInfoServiceImpl.java index 797868ef..d116b31f 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectInfoServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectInfoServiceImpl.java @@ -97,7 +97,9 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService { .eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpProjectInfo::getFlowStatus, bo.getFlowStatus()) .eq(bo.getSortOrder() != null, ErpProjectInfo::getSortOrder, bo.getSortOrder()) .eq(bo.getContractId() != null, ErpProjectInfo::getContractId, bo.getContractId()) - .eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpProjectInfo::getActiveFlag, bo.getActiveFlag()); + .eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpProjectInfo::getActiveFlag, bo.getActiveFlag()) + .eq("t.del_flag", "0") + .orderByDesc(ErpProjectInfo::getCreateTime); return lqw; }