From e9295a55a78594504c9ed671845425bcd8c66aef Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Mon, 24 Nov 2025 16:27:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(crm):=20=E5=A2=9E=E5=BC=BA=E6=8A=A5?= =?UTF-8?q?=E4=BB=B7=E5=8D=95=E5=8F=8A=E7=89=A9=E6=96=99=E7=AE=A1=E7=90=86?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E6=B5=81=E7=A8=8B=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E9=9B=86=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在CrmQuoteInfo中新增客户名称字段,支持不落库显示 - 扩展CrmQuoteMaterial及对应Bo,添加标准物料标识和联表查询字段 - 优化报价单物料查询,联表带出物料编码、名称及销售物料名称 - 报价单Vo新增部门名称和客户名称展示字段 - 新增报价单提交接口,支持一键发起审批流程 - 集成远程工作流服务,支持流程状态变更事件监听与业务状态同步 - Mybatis-Plus XML映射文件更新,支持物料新字段及关联查询 - Controller层新增quoteSubmitAndFlowStart接口,增加权限校验和防重复提交 - Service层实现流程启动及流程事件处理,保证流程与业务状态一致 - 优化联表查询结构,提升报价单明细数据完整性与展示效果 --- .../controller/CrmQuoteInfoController.java | 13 +- .../dromara/oa/crm/domain/CrmQuoteInfo.java | 6 + .../oa/crm/domain/CrmQuoteMaterial.java | 27 +++- .../oa/crm/domain/bo/CrmQuoteInfoBo.java | 39 +++++- .../oa/crm/domain/bo/CrmQuoteMaterialBo.java | 6 + .../oa/crm/domain/vo/CrmQuoteInfoVo.java | 11 ++ .../service/impl/CrmQuoteInfoServiceImpl.java | 122 ++++++++++++++++-- .../impl/CrmQuoteMaterialServiceImpl.java | 16 ++- .../mapper/oa/crm/CrmQuoteInfoMapper.xml | 2 + .../mapper/oa/crm/CrmQuoteMaterialMapper.xml | 32 ++++- 10 files changed, 246 insertions(+), 28 deletions(-) diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/controller/CrmQuoteInfoController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/controller/CrmQuoteInfoController.java index 44948354..851f747a 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/controller/CrmQuoteInfoController.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/controller/CrmQuoteInfoController.java @@ -91,6 +91,17 @@ public class CrmQuoteInfoController extends BaseController { return toAjax(crmQuoteInfoService.insertByBo(bo)); } + /** + * 提交报价单并发起审批流程 + */ + @SaCheckPermission("oa/crm:crmQuoteInfo:add") + @Log(title = "报价单信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/quoteSubmitAndFlowStart") + public R quoteSubmitAndFlowStart(@Validated(AddGroup.class) @RequestBody CrmQuoteInfoBo bo) { + return R.ok(crmQuoteInfoService.quoteSubmitAndFlowStart(bo)); + } + /** * 修改报价单信息 */ @@ -204,7 +215,7 @@ public class CrmQuoteInfoController extends BaseController { materialList.add(new QuoteTemplateMaterialDto()); } - // 方案A: 主表数据直接放入,占位符用{key} + // 主表数据直接放入,占位符用{key} Map exportData = new LinkedHashMap<>(); // 将主表数据作为一个整体Map放入,这样ExcelUtil遍历时会调用fill(map),从而匹配模板中的{key} exportData.put("mainInfo", templateData); diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/CrmQuoteInfo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/CrmQuoteInfo.java index 7af899dd..530f0fae 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/CrmQuoteInfo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/CrmQuoteInfo.java @@ -212,6 +212,12 @@ public class CrmQuoteInfo extends TenantEntity { private String delFlag; + /** + * 客户名称(从 CrmCustomerInfo 关联得到,不落库) + */ + @TableField(exist = false) + private String customerName; + /** * 客户方联系人真实名称(从 CrmCustomerContact 关联得到,不落库) */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/CrmQuoteMaterial.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/CrmQuoteMaterial.java index 8730cf1e..15d32139 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/CrmQuoteMaterial.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/CrmQuoteMaterial.java @@ -1,9 +1,6 @@ package org.dromara.oa.crm.domain; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; import org.dromara.common.tenant.core.TenantEntity; @@ -41,6 +38,11 @@ public class CrmQuoteMaterial extends TenantEntity { */ private Long itemNo; + /** + * 标准物料标识(1标准物料 2非标物料) + */ + private String materialFlag; + /** * 产品/服务名称 */ @@ -112,5 +114,22 @@ public class CrmQuoteMaterial extends TenantEntity { @TableLogic private String delFlag; + /** + * 物料编号(SAP物料编码,联表 base_material_info 获取) + */ + @TableField(exist = false) + private String materialCode; + + /** + * SAP物料名称(联表 base_material_info 获取) + */ + @TableField(exist = false) + private String materialName; + + /** + * 销售物料名称(联表 base_relation_material 获取) + */ + @TableField(exist = false) + private String saleMaterialName; } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/bo/CrmQuoteInfoBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/bo/CrmQuoteInfoBo.java index 70e0f13c..0b8c6fc4 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/bo/CrmQuoteInfoBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/bo/CrmQuoteInfoBo.java @@ -1,5 +1,6 @@ package org.dromara.oa.crm.domain.bo; +import cn.hutool.core.util.ObjectUtil; import io.github.linpeilie.annotations.AutoMapper; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -7,10 +8,10 @@ import lombok.EqualsAndHashCode; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.oa.crm.domain.CrmQuoteInfo; +import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt; -import java.util.Date; import java.math.BigDecimal; -import java.util.List; +import java.util.*; /** * 报价单信息业务对象 crm_quote_info @@ -209,4 +210,38 @@ public class CrmQuoteInfoBo extends BaseEntity { */ private List itemsBo; + /** + * 流程定义编码 + */ + private String flowCode; + + /** + * 办理人(可不填 用于覆盖当前节点办理人) + */ + private String handler; + + /** + * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}} + */ + private Map variables; + + /** + * 流程业务扩展信息 + */ + private RemoteFlowInstanceBizExt bizExt; + + public Map getVariables() { + if (variables == null) { + return new HashMap<>(16); + } + variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); + return variables; + } + + public RemoteFlowInstanceBizExt getBizExt() { + if (ObjectUtil.isNull(bizExt)) { + bizExt = new RemoteFlowInstanceBizExt(); + } + return bizExt; + } } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/bo/CrmQuoteMaterialBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/bo/CrmQuoteMaterialBo.java index 89e9b33a..21dd2481 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/bo/CrmQuoteMaterialBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/bo/CrmQuoteMaterialBo.java @@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.oa.crm.domain.CrmQuoteMaterial; + import java.math.BigDecimal; /** @@ -36,6 +37,11 @@ public class CrmQuoteMaterialBo extends BaseEntity { */ private Long itemNo; + /** + * 标准物料标识(1标准物料 2非标物料) + */ + private String materialFlag; + /** * 产品/服务名称 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/vo/CrmQuoteInfoVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/vo/CrmQuoteInfoVo.java index 404d17a3..384f05dc 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/vo/CrmQuoteInfoVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/domain/vo/CrmQuoteInfoVo.java @@ -81,6 +81,11 @@ public class CrmQuoteInfoVo implements Serializable { @ExcelProperty(value = "部门") private Long quoteDeptId; + /** + * 部门名称 + */ + private String deptName; + /** * 报价日期 */ @@ -176,6 +181,12 @@ public class CrmQuoteInfoVo implements Serializable { @ExcelProperty(value = "客户方联系人ID") private Long customerContactId; + /** + * 客户名称(通过联系人关联客户得到) + */ + @ExcelProperty(value = "客户名称") + private String customerName; + /** * 客户方联系人 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/service/impl/CrmQuoteInfoServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/service/impl/CrmQuoteInfoServiceImpl.java index 70e7026f..9df12118 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/service/impl/CrmQuoteInfoServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/service/impl/CrmQuoteInfoServiceImpl.java @@ -1,14 +1,25 @@ package org.dromara.oa.crm.service.impl; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.map.MapUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.seata.spring.annotation.GlobalTransactional; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.enums.OAStatusEnum; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.oa.base.domain.BaseMaterialInfo; +import org.dromara.oa.base.domain.BaseRelationMaterial; import org.dromara.oa.crm.domain.*; import org.dromara.oa.crm.domain.bo.CrmQuoteInfoBo; import org.dromara.oa.crm.domain.bo.CrmQuoteMaterialBo; @@ -19,6 +30,10 @@ import org.dromara.oa.crm.mapper.CrmQuoteInfoMapper; import org.dromara.oa.crm.mapper.CrmQuoteMaterialMapper; import org.dromara.oa.crm.service.ICrmCustomerContactService; import org.dromara.oa.crm.service.ICrmQuoteInfoService; +import org.dromara.workflow.api.RemoteWorkflowService; +import org.dromara.workflow.api.domain.RemoteStartProcess; +import org.dromara.workflow.api.event.ProcessEvent; +import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -35,12 +50,18 @@ import java.util.stream.Collectors; */ @RequiredArgsConstructor @Service +@Slf4j public class CrmQuoteInfoServiceImpl implements ICrmQuoteInfoService { + //报价单主子表 private final CrmQuoteInfoMapper baseMapper; private final CrmQuoteMaterialMapper quoteMaterialMapper; + //客户联系人 private final ICrmCustomerContactService customerContactService; + @DubboReference(timeout = 30000) + private RemoteWorkflowService remoteWorkflowService; + /** * 查询报价单信息 * @@ -52,13 +73,20 @@ public class CrmQuoteInfoServiceImpl implements ICrmQuoteInfoService { CrmQuoteInfoVo vo = baseMapper.selectVoById(quoteId); if (vo != null) { // 关联查询子表明细 - List items = quoteMaterialMapper.selectVoList( - JoinWrappers.lambda(CrmQuoteMaterial.class) - .selectAll(CrmQuoteMaterial.class) - .eq("t.del_flag", "0") - .eq(CrmQuoteMaterial::getQuoteId, quoteId) - .orderByAsc(CrmQuoteMaterial::getItemNo) - ); + MPJLambdaWrapper lqw = JoinWrappers.lambda(CrmQuoteMaterial.class) + .selectAll(CrmQuoteMaterial.class) + .eq("t.del_flag", "0") + // 联表基础物料与销售物料,带出物料编码/名称等业务字段 + .select(BaseMaterialInfo::getMaterialCode) + .select(BaseMaterialInfo::getMaterialName) + .select(BaseRelationMaterial::getSaleMaterialName) + .leftJoin(BaseMaterialInfo.class, BaseMaterialInfo::getMaterialId, CrmQuoteMaterial::getMaterialId) + .leftJoin(BaseRelationMaterial.class, BaseRelationMaterial::getRelationMaterialId, CrmQuoteMaterial::getRelationMaterialId) + .eq(CrmQuoteMaterial::getQuoteId, quoteId) + .orderByAsc(CrmQuoteMaterial::getItemNo); + + // 直接使用 MPJ 的联表查询映射到 VO,避免实体中 exist=false 字段无法通过 BaseMapperPlus 自动填充 + List items = quoteMaterialMapper.selectJoinList(CrmQuoteMaterialVo.class, lqw); vo.setItemsVo(items); } return vo; @@ -100,6 +128,10 @@ public class CrmQuoteInfoServiceImpl implements ICrmQuoteInfoService { .selectAs("CustomerContact", CrmCustomerContact::getContactName, CrmQuoteInfo::getCustomerContactRealName) .leftJoin(CrmCustomerContact.class, "CustomerContact", CrmCustomerContact::getContactId, CrmQuoteInfo::getCustomerContactId) + // 客户公司名称(CrmCustomerInfo) + .select(CrmCustomerInfo::getCustomerName) + .leftJoin(CrmCustomerInfo.class, CrmCustomerInfo::getCustomerId, CrmCustomerContact::getCustomerId) + /* // 供货方联系人(CrmCustomerContact,别名:SupplierContact) .selectAs("SupplierContact", CrmCustomerContact::getContactName, CrmQuoteInfo::getSupplierContactRealName) @@ -287,8 +319,10 @@ public class CrmQuoteInfoServiceImpl implements ICrmQuoteInfoService { // 别名连接与派生字段选择 .selectAs("CustomerContact", CrmCustomerContact::getContactName, CrmQuoteInfo::getCustomerContactRealName) .leftJoin(CrmCustomerContact.class, "CustomerContact", CrmCustomerContact::getContactId, CrmQuoteInfo::getCustomerContactId) -// .leftJoin(CrmCustomerContact.class, "SupplierContact", CrmCustomerContact::getContactId, CrmQuoteInfo::getSupplierContactId) + // 客户公司名称 + .select(CrmCustomerInfo::getCustomerName) .leftJoin(CrmCustomerInfo.class, "Customer", CrmCustomerInfo::getCustomerId, CrmCustomerContact::getCustomerId) +// .leftJoin(CrmCustomerContact.class, "SupplierContact", CrmCustomerContact::getContactId, CrmQuoteInfo::getSupplierContactId) //供应商信息 .select(CrmSupplierInfo::getSupplierName) .leftJoin(CrmSupplierInfo.class, CrmSupplierInfo::getSupplierId, CrmQuoteInfo::getSupplierContactId) @@ -345,4 +379,76 @@ public class CrmQuoteInfoServiceImpl implements ICrmQuoteInfoService { update.setTotalPrice(totalPrice.setScale(2, RoundingMode.HALF_UP)); return baseMapper.updateById(update) > 0; } + + /** + * 提交报价单并发起审批流程 + */ + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public CrmQuoteInfoVo quoteSubmitAndFlowStart(CrmQuoteInfoBo bo) { + // 先按当前表单数据进行保存(主子表统一处理) + if (bo.getQuoteId() == null) { + this.insertByBo(bo); + } else { + this.updateByBo(bo); + } + + if (bo.getQuoteId() == null) { + throw new ServiceException("报价单ID为空,无法发起流程"); + } + + // 后端发起流程需忽略节点权限 + bo.getVariables().put("ignore", true); + RemoteStartProcess startProcess = new RemoteStartProcess(); + startProcess.setBusinessId(bo.getQuoteId().toString()); + startProcess.setFlowCode(bo.getFlowCode()); + startProcess.setVariables(bo.getVariables()); + startProcess.setBizExt(bo.getBizExt()); + bo.getBizExt().setBusinessId(startProcess.getBusinessId()); + + boolean flag = remoteWorkflowService.startCompleteTask(startProcess); + if (!flag) { + throw new ServiceException("流程发起异常"); + } + // 返回最新数据 + return this.queryById(bo.getQuoteId()); + } + + /** + * 报价单流程事件监听 + */ + @EventListener(condition = "#processEvent.flowCode =='OACQ'") + public void processHandler(ProcessEvent processEvent) { + TenantHelper.dynamic(processEvent.getTenantId(), () -> { + log.info("报价单流程回调: {}", processEvent); + CrmQuoteInfo quoteInfo = baseMapper.selectById(Convert.toLong(processEvent.getBusinessId())); + if (quoteInfo == null) { + return; + } + // 同步流程状态 + quoteInfo.setFlowStatus(processEvent.getStatus()); + + Map params = processEvent.getParams(); + if (MapUtil.isNotEmpty(params)) { + // 预留:当前节点办理人 + String handler = Convert.toStr(params.get("handler")); + } + + // 按通用规范映射业务状态 + if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) { + quoteInfo.setQuoteStatus(OAStatusEnum.APPROVING.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) { + quoteInfo.setQuoteStatus(OAStatusEnum.COMPLETED.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) { + quoteInfo.setQuoteStatus(OAStatusEnum.INVALID.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) { + // 退回或撤销回到草稿 + quoteInfo.setQuoteStatus(OAStatusEnum.DRAFT.getStatus()); + } + + baseMapper.updateById(quoteInfo); + }); + } } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/service/impl/CrmQuoteMaterialServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/service/impl/CrmQuoteMaterialServiceImpl.java index 1472676c..d5792f31 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/service/impl/CrmQuoteMaterialServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/service/impl/CrmQuoteMaterialServiceImpl.java @@ -73,16 +73,18 @@ public class CrmQuoteMaterialServiceImpl implements ICrmQuoteMaterialService { private MPJLambdaWrapper buildQueryWrapper(CrmQuoteMaterialBo bo) { Map params = bo.getParams(); MPJLambdaWrapper lqw = JoinWrappers.lambda(CrmQuoteMaterial.class) - .selectAll(CrmQuoteMaterial.class) - .eq(CrmQuoteMaterial::getDelFlag, "0") - // 联表选择:SAP物料名称 & 销售物料名称 - .select(BaseMaterialInfo::getMaterialName) - .select(BaseRelationMaterial::getSaleMaterialName) - .leftJoin(BaseMaterialInfo.class, BaseMaterialInfo::getMaterialId, CrmQuoteMaterial::getMaterialId) - .leftJoin(BaseRelationMaterial.class, BaseRelationMaterial::getRelationMaterialId, CrmQuoteMaterial::getRelationMaterialId) + .selectAll(CrmQuoteMaterial.class) + .eq(CrmQuoteMaterial::getDelFlag, "0") + // 联表选择:SAP物料编码/名称、销售物料名称、计量单位名称 + .select(BaseMaterialInfo::getMaterialCode) + .select(BaseMaterialInfo::getMaterialName) + .select(BaseRelationMaterial::getSaleMaterialName) + .leftJoin(BaseMaterialInfo.class, BaseMaterialInfo::getMaterialId, CrmQuoteMaterial::getMaterialId) + .leftJoin(BaseRelationMaterial.class, BaseRelationMaterial::getRelationMaterialId, CrmQuoteMaterial::getRelationMaterialId) .eq(bo.getQuoteId() != null, CrmQuoteMaterial::getQuoteId, bo.getQuoteId()) .eq(bo.getItemNo() != null, CrmQuoteMaterial::getItemNo, bo.getItemNo()) + .eq(StringUtils.isNotBlank(bo.getMaterialFlag()), CrmQuoteMaterial::getMaterialFlag, bo.getMaterialFlag()) .like(StringUtils.isNotBlank(bo.getProductName()), CrmQuoteMaterial::getProductName, bo.getProductName()) .eq(StringUtils.isNotBlank(bo.getSpecificationDescription()), CrmQuoteMaterial::getSpecificationDescription, bo.getSpecificationDescription()) .eq(bo.getMaterialId() != null, CrmQuoteMaterial::getMaterialId, bo.getMaterialId()) diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/crm/CrmQuoteInfoMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/crm/CrmQuoteInfoMapper.xml index dfa4fb35..ab8c7ed8 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/crm/CrmQuoteInfoMapper.xml +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/crm/CrmQuoteInfoMapper.xml @@ -13,10 +13,12 @@ t.total_tax, t.total_including_tax, t.customer_contact_id, t.customer_contact_name, t.customer_contact_phone, t.customer_contact_email, t.supplier_contact_id, t.supplier_contact_name, t.supplier_contact_phone, t.supplier_contact_email, t.project_id, t.template_id, t.oss_id, t.quote_status, t.flow_status, t.remark, + d.dept_name as deptName, u3.nick_name as createName, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time from crm_quote_info t left join sys_user u3 on t.create_by = u3.user_id + left join sys_dept d on d.dept_id = t.quote_dept_id ${ew.getCustomSqlSegment} diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/crm/CrmQuoteMaterialMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/crm/CrmQuoteMaterialMapper.xml index c76a2b86..56d203f7 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/crm/CrmQuoteMaterialMapper.xml +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/crm/CrmQuoteMaterialMapper.xml @@ -7,20 +7,30 @@ - select quote_material_id, tenant_id, quote_id, item_no, product_name, specification_description, material_id, relation_material_id, amount, unit_id, unit_name, before_price, tax_rate, including_price, subtotal, remark, active_flag, del_flag, create_dept, create_by, create_time, update_by, update_time + select t.quote_material_id, t.tenant_id, t.quote_id, t.item_no, t.material_flag, t.product_name, t.specification_description, + t.material_id, t.relation_material_id, t.amount, t.unit_id, t.unit_name, t.before_price, t.tax_rate, + t.including_price, t.subtotal, t.remark, t.active_flag, t.del_flag, t.create_dept, t.create_by, + t.create_time, t.update_by, t.update_time from crm_quote_material t ${ew.getCustomSqlSegment} @@ -50,6 +63,8 @@ item_no, + material_flag, + product_name, specification_description, @@ -98,6 +113,8 @@ #{item.itemNo}, + #{item.materialFlag}, + #{item.productName}, #{item.specificationDescription}, @@ -154,6 +171,9 @@ item_no = #{item.itemNo}, + + material_flag = #{item.materialFlag}, + product_name = #{item.productName}, @@ -224,8 +244,8 @@ - delete from crm_quote_material - where quote_material_id in + delete from crm_quote_material t + where t.quote_material_id in #{id}