diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpProjectPurchaseController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpProjectPurchaseController.java index f4a94024..cb847201 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpProjectPurchaseController.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpProjectPurchaseController.java @@ -18,6 +18,7 @@ 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.erp.domain.vo.ErpProjectPurchaseVo; +import org.dromara.oa.erp.domain.vo.ErpProjectPurchaseMaterialVo; import org.dromara.oa.erp.domain.bo.ErpProjectPurchaseBo; import org.dromara.oa.erp.service.IErpProjectPurchaseService; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -124,4 +125,18 @@ public class ErpProjectPurchaseController extends BaseController { return R.ok(list); } + /** + * 根据项目ID和备件标识查询物料信息 + * 备件标识1:返回合同物料;0:返回预算物料 + */ + @SaCheckPermission("oa/erp:projectPurchase:query") + @GetMapping("/getContractMaterialsByProjectId/{projectId}/{spareFlag}") + public R> getContractMaterialsByProjectId(@NotNull(message = "项目ID不能为空") + @PathVariable("projectId") Long projectId, + @NotBlank(message = "备件标识不能为空") + @PathVariable("spareFlag") String spareFlag) { + List materials = erpProjectPurchaseService.getProjectMaterialsByProjectId(projectId, spareFlag); + return R.ok(materials); + } + } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectPurchase.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectPurchase.java index ed9daa0e..43308622 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectPurchase.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectPurchase.java @@ -24,7 +24,7 @@ public class ErpProjectPurchase extends TenantEntity { /** * 项目采购ID */ - @TableId(value = "project_purchase_id", type = IdType.AUTO) + @TableId(value = "project_purchase_id", type = IdType.ASSIGN_ID) private Long projectPurchaseId; /** @@ -37,6 +37,11 @@ public class ErpProjectPurchase extends TenantEntity { */ private String projectCode; + /** + * 采购编号 + */ + private String purchaseCode; + /** * 项目经理 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectPurchaseMaterial.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectPurchaseMaterial.java index ca5bc9de..2f47f3c3 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectPurchaseMaterial.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectPurchaseMaterial.java @@ -27,7 +27,7 @@ public class ErpProjectPurchaseMaterial extends TenantEntity { /** * 项目采购ID */ - @TableId(value = "purchase_material_id", type = IdType.AUTO) + @TableId(value = "purchase_material_id", type = IdType.ASSIGN_ID) private Long purchaseMaterialId; /** diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectPurchaseBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectPurchaseBo.java index ae2f6b60..fe77892c 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectPurchaseBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectPurchaseBo.java @@ -9,7 +9,9 @@ import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt; +import org.dromara.oa.erp.domain.ErpProjectPurchaseMaterial; +import java.util.List; import java.util.Map; /** @@ -39,6 +41,11 @@ public class ErpProjectPurchaseBo extends BaseEntity { @NotBlank(message = "项目号不能为空", groups = { AddGroup.class, EditGroup.class }) private String projectCode; + /** + * 采购编号 + */ + private String purchaseCode; + /** * 项目经理 */ @@ -126,5 +133,9 @@ public class ErpProjectPurchaseBo extends BaseEntity { */ private RemoteFlowInstanceBizExt bizExt; + /** + * 采购物料列表 + */ + private List purchaseMaterialList; } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectPurchaseMaterialVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectPurchaseMaterialVo.java index 0a802768..79cce41d 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectPurchaseMaterialVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectPurchaseMaterialVo.java @@ -143,5 +143,19 @@ public class ErpProjectPurchaseMaterialVo implements Serializable { @ExcelDictFormat(dictType = "active_flag") private String activeFlag; + /** + * 关联物料编号 + */ + private String relationMaterialCode; + + /** + * 关联物料名称 + */ + private String relationMaterialName; + + /** + * 采购物料名称 + */ + private String purchaseMaterialName; } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectPurchaseVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectPurchaseVo.java index 9e1058a2..45843b51 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectPurchaseVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectPurchaseVo.java @@ -46,30 +46,66 @@ public class ErpProjectPurchaseVo implements Serializable { @ExcelProperty(value = "项目号") private String projectCode; + /** + * 采购编号 + */ + @ExcelProperty(value = "采购编号") + private String purchaseCode; + + /** + * 项目名称 + */ + @ExcelProperty(value = "项目名称") + private String projectName; + /** * 项目经理 */ @ExcelProperty(value = "项目经理") private Long managerId; + /** + * 项目经理名称 + */ + @ExcelProperty(value = "项目经理名称") + private String managerName; + /** * 部门负责人 */ @ExcelProperty(value = "部门负责人") private Long chargeId; + /** + * 部门负责人名称 + */ + @ExcelProperty(value = "部门负责人名称") + private String chargeName; + /** * 分管副总 */ @ExcelProperty(value = "分管副总") private Long deputyId; + /** + * 分管副总名称 + */ + @ExcelProperty(value = "分管副总名称") + private String deputyName; + /** * 提报人 */ @ExcelProperty(value = "提报人") private Long reporterId; + /** + * 提报人名称 + */ + @ExcelProperty(value = "提报人名称") + private String reporterName; + /** * 收货人 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpProjectPurchaseMapper.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpProjectPurchaseMapper.java index 8ecb8194..29c03529 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpProjectPurchaseMapper.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpProjectPurchaseMapper.java @@ -5,6 +5,8 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.oa.erp.domain.ErpProjectPurchase; import org.dromara.oa.erp.domain.vo.ErpProjectPurchaseVo; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; @@ -24,6 +26,10 @@ public interface ErpProjectPurchaseMapper extends BaseMapperPlus selectCustomErpProjectPurchaseVoList(@Param("page") Page page, @Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); /** @@ -32,6 +38,10 @@ public interface ErpProjectPurchaseMapper extends BaseMapperPlus selectCustomErpProjectPurchaseVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpProjectPurchaseMaterialMapper.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpProjectPurchaseMaterialMapper.java index 7c2cfc65..7b2b138a 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpProjectPurchaseMaterialMapper.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpProjectPurchaseMaterialMapper.java @@ -34,4 +34,20 @@ public interface ErpProjectPurchaseMaterialMapper extends BaseMapperPlus selectCustomErpProjectPurchaseMaterialVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + /** + * 根据项目ID查询预算材料费列表 + * + * @param projectId 项目ID + * @return 预算材料费集合 + */ + List selectBudgetMaterialsByProjectId(@Param("projectId") Long projectId, @Param("spareFlag") String spareFlag); + + /** + * 根据项目ID查询合同物料信息 + * + * @param projectId 项目ID + * @return 合同物料信息集合 + */ + List selectContractMaterialsByProjectId(@Param("projectId") Long projectId, @Param("spareFlag") String spareFlag); + } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpProjectPurchaseService.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpProjectPurchaseService.java index 4e58cf47..99314c0b 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpProjectPurchaseService.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpProjectPurchaseService.java @@ -2,6 +2,7 @@ package org.dromara.oa.erp.service; import org.dromara.oa.erp.domain.ErpProjectPurchase; import org.dromara.oa.erp.domain.vo.ErpProjectPurchaseVo; +import org.dromara.oa.erp.domain.vo.ErpProjectPurchaseMaterialVo; import org.dromara.oa.erp.domain.bo.ErpProjectPurchaseBo; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; @@ -74,4 +75,9 @@ public interface IErpProjectPurchaseService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据项目ID和备件标识查询物料信息 + */ + List getProjectMaterialsByProjectId(Long projectId, String spareFlag); } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectPurchaseMaterialServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectPurchaseMaterialServiceImpl.java index 427f8caa..becfc56f 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectPurchaseMaterialServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectPurchaseMaterialServiceImpl.java @@ -53,7 +53,7 @@ public class ErpProjectPurchaseMaterialServiceImpl implements IErpProjectPurchas @Override public TableDataInfo queryPageList(ErpProjectPurchaseMaterialBo bo, PageQuery pageQuery) { MPJLambdaWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + Page result = baseMapper.selectCustomErpProjectPurchaseMaterialVoList(pageQuery.build(), lqw); return TableDataInfo.build(result); } @@ -66,7 +66,7 @@ public class ErpProjectPurchaseMaterialServiceImpl implements IErpProjectPurchas @Override public List queryList(ErpProjectPurchaseMaterialBo bo) { MPJLambdaWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); + return baseMapper.selectCustomErpProjectPurchaseMaterialVoList(lqw); } private MPJLambdaWrapper buildQueryWrapper(ErpProjectPurchaseMaterialBo bo) { diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectPurchaseServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectPurchaseServiceImpl.java index c03c1ee7..ffffbf5c 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectPurchaseServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectPurchaseServiceImpl.java @@ -17,22 +17,24 @@ 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.erp.domain.ErpProjectPurchase; +import org.dromara.oa.erp.domain.ErpProjectPurchaseMaterial; import org.dromara.oa.erp.domain.bo.ErpProjectPurchaseBo; import org.dromara.oa.erp.domain.vo.ErpProjectPurchaseVo; +import org.dromara.oa.erp.domain.vo.ErpProjectPurchaseMaterialVo; import org.dromara.oa.erp.mapper.ErpProjectPurchaseMapper; +import org.dromara.oa.erp.mapper.ErpProjectPurchaseMaterialMapper; import org.dromara.oa.erp.service.IErpProjectPurchaseService; +import org.dromara.system.api.RemoteCodeRuleService; import org.dromara.workflow.api.RemoteWorkflowService; import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt; 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; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; +import java.util.stream.Collectors; /** * 项目采购信息Service业务层处理 @@ -47,9 +49,14 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService private final ErpProjectPurchaseMapper baseMapper; + private final ErpProjectPurchaseMaterialMapper purchaseMaterialMapper; + @DubboReference(timeout = 30000) private RemoteWorkflowService remoteWorkflowService; + @DubboReference() + private RemoteCodeRuleService remoteCodeRuleService; + /** * 查询项目采购信息 * @@ -117,12 +124,24 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService * @return 是否新增成功 */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(ErpProjectPurchaseBo bo) { ErpProjectPurchase add = MapstructUtils.convert(bo, ErpProjectPurchase.class); + assert add != null; validEntityBeforeSave(add); + String purchaseCode = remoteCodeRuleService.selectCodeRuleCode("1007"); + add.setPurchaseCode(purchaseCode); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setProjectPurchaseId(add.getProjectPurchaseId()); + // 保存物料列表 + List purchaseMaterialList = bo.getPurchaseMaterialList(); + if (purchaseMaterialList != null && !purchaseMaterialList.isEmpty()) { + for (ErpProjectPurchaseMaterial material : purchaseMaterialList) { + material.setProjectPurchaseId(add.getProjectPurchaseId()); + purchaseMaterialMapper.insert(material); + } + } } return flag; } @@ -181,10 +200,39 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService * @return 是否修改成功 */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean updateByBo(ErpProjectPurchaseBo bo) { ErpProjectPurchase update = MapstructUtils.convert(bo, ErpProjectPurchase.class); validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; + boolean flag = baseMapper.updateById(update) > 0; + if (flag) { + List purchaseMaterialList = bo.getPurchaseMaterialList(); + MPJLambdaWrapper lqwRecord = JoinWrappers.lambda(ErpProjectPurchaseMaterial.class); + lqwRecord.eq(ErpProjectPurchaseMaterial::getProjectPurchaseId, bo.getProjectPurchaseId()); + List oldMaterialList = purchaseMaterialMapper.selectList(lqwRecord); + if (purchaseMaterialList != null && !purchaseMaterialList.isEmpty()) { + for (ErpProjectPurchaseMaterial material : purchaseMaterialList) { + material.setProjectPurchaseId(bo.getProjectPurchaseId()); + purchaseMaterialMapper.insertOrUpdate(material); + } + Set existingMaterialIds = purchaseMaterialList.stream() + .map(ErpProjectPurchaseMaterial::getPurchaseMaterialId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + List toDeleteList = oldMaterialList.stream() + .filter(material -> !existingMaterialIds.contains(material.getPurchaseMaterialId())) + .toList(); + for (ErpProjectPurchaseMaterial toDelete : toDeleteList) { + purchaseMaterialMapper.deleteById(toDelete.getPurchaseMaterialId()); + } + } else { + // 如果新列表为空,删除所有旧物料 + for (ErpProjectPurchaseMaterial oldMaterial : oldMaterialList) { + purchaseMaterialMapper.deleteById(oldMaterial.getPurchaseMaterialId()); + } + } + } + return flag; } /** @@ -209,6 +257,29 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService return baseMapper.deleteByIds(ids) > 0; } + /** + * 根据项目ID和备件标识查询物料信息 + * + * @param projectId 项目ID + * @param spareFlag 备件标识(1备件-合同物料,0非备件-预算物料) + * @return 物料列表 + */ + @Override + public List getProjectMaterialsByProjectId(Long projectId, String spareFlag) { + if (projectId == null) { + return Collections.emptyList(); + } + List list = new ArrayList<>(); + if ("0".equals(spareFlag)) { + // 非备件-预算物料 + list = purchaseMaterialMapper.selectBudgetMaterialsByProjectId(projectId, spareFlag); + } else if ("1".equals(spareFlag)) { + // 备件-合同物料 + list = purchaseMaterialMapper.selectContractMaterialsByProjectId(projectId, spareFlag); + } + return list; + } + /** * 项目采购流程事件监听 * @@ -225,10 +296,10 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) { purchase.setProjectPurchaseStatus(OAStatusEnum.COMPLETED.getStatus()); } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus()) - || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) { + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) { purchase.setProjectPurchaseStatus(OAStatusEnum.INVALID.getStatus()); } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus()) - || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) { + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) { purchase.setProjectPurchaseStatus(OAStatusEnum.DRAFT.getStatus()); } baseMapper.updateById(purchase); diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectPurchaseMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectPurchaseMapper.xml index d9fe6da5..ca156f1b 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectPurchaseMapper.xml +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectPurchaseMapper.xml @@ -7,32 +7,43 @@ diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectPurchaseMaterialMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectPurchaseMaterialMapper.xml index 5691509c..1e81efe1 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectPurchaseMaterialMapper.xml +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectPurchaseMaterialMapper.xml @@ -1,14 +1,102 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + +