diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpProjectAcceptanceController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpProjectAcceptanceController.java new file mode 100644 index 00000000..19d6e656 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpProjectAcceptanceController.java @@ -0,0 +1,136 @@ +package org.dromara.oa.erp.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +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.ErpProjectAcceptanceVo; +import org.dromara.oa.erp.domain.bo.ErpProjectAcceptanceBo; +import org.dromara.oa.erp.service.IErpProjectAcceptanceService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 项目验收确认 + * 前端访问路由地址为:/oa/erp/projectAcceptance + * + * @author Yinq + * @date 2025-11-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/erp/projectAcceptance") +public class ErpProjectAcceptanceController extends BaseController { + + private final IErpProjectAcceptanceService erpProjectAcceptanceService; + + /** + * 查询项目验收确认列表 + */ + @SaCheckPermission("oa/erp:projectAcceptance:list") + @GetMapping("/list") + public TableDataInfo list(ErpProjectAcceptanceBo bo, PageQuery pageQuery) { + return erpProjectAcceptanceService.queryPageList(bo, pageQuery); + } + + /** + * 导出项目验收确认列表 + */ + @SaCheckPermission("oa/erp:projectAcceptance:export") + @Log(title = "项目验收确认", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ErpProjectAcceptanceBo bo, HttpServletResponse response) { + List list = erpProjectAcceptanceService.queryList(bo); + ExcelUtil.exportExcel(list, "项目验收确认", ErpProjectAcceptanceVo.class, response); + } + + /** + * 获取项目验收确认详细信息 + * + * @param acceptanceId 主键 + */ + @SaCheckPermission("oa/erp:projectAcceptance:query") + @GetMapping("/{acceptanceId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("acceptanceId") Long acceptanceId) { + return R.ok(erpProjectAcceptanceService.queryById(acceptanceId)); + } + + /** + * 新增项目验收确认 + */ + @SaCheckPermission("oa/erp:projectAcceptance:add") + @Log(title = "项目验收确认", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ErpProjectAcceptanceBo bo) { + return toAjax(erpProjectAcceptanceService.insertByBo(bo)); + } + + /** + * 修改项目验收确认 + */ + @SaCheckPermission("oa/erp:projectAcceptance:edit") + @Log(title = "项目验收确认", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ErpProjectAcceptanceBo bo) { + return toAjax(erpProjectAcceptanceService.updateByBo(bo)); + } + + /** + * 删除项目验收确认 + * + * @param acceptanceIds 主键串 + */ + @SaCheckPermission("oa/erp:projectAcceptance:remove") + @Log(title = "项目验收确认", businessType = BusinessType.DELETE) + @DeleteMapping("/{acceptanceIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] acceptanceIds) { + return toAjax(erpProjectAcceptanceService.deleteWithValidByIds(java.util.Arrays.asList(acceptanceIds), true)); + } + + /** + * 根据项目ID准备验收信息 + */ + @SaCheckPermission("oa/erp:projectAcceptance:query") + @GetMapping("/prepareByProjectId/{projectId}") + public R prepareByProjectId(@PathVariable Long projectId) { + return R.ok(erpProjectAcceptanceService.prepareByProjectId(projectId)); + } + + /** + * 提交项目验收确认并发起流程 + */ + @SaCheckPermission("oa/erp:projectAcceptance:add") + @Log(title = "项目验收确认", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/submitAndFlowStart") + public R submitAndFlowStart(@Validated(AddGroup.class) @RequestBody ErpProjectAcceptanceBo bo) { + return R.ok(erpProjectAcceptanceService.submitAndFlowStart(bo)); + } + + /** + * 下拉框查询项目验收确认列表 + */ + @GetMapping("/getErpProjectAcceptanceList") + public R> getErpProjectAcceptanceList(ErpProjectAcceptanceBo bo) { + List list = erpProjectAcceptanceService.queryList(bo); + return R.ok(list); + } + +} 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/controller/ErpProjectReceivingController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpProjectReceivingController.java new file mode 100644 index 00000000..11877e1c --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpProjectReceivingController.java @@ -0,0 +1,136 @@ +package org.dromara.oa.erp.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +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.ErpProjectReceivingVo; +import org.dromara.oa.erp.domain.bo.ErpProjectReceivingBo; +import org.dromara.oa.erp.service.IErpProjectReceivingService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 项目收货确认 + * 前端访问路由地址为:/oa/erp/projectReceiving + * + * @author Yinq + * @date 2025-11-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/erp/projectReceiving") +public class ErpProjectReceivingController extends BaseController { + + private final IErpProjectReceivingService erpProjectReceivingService; + + /** + * 查询项目收货确认列表 + */ + @SaCheckPermission("oa/erp:projectReceiving:list") + @GetMapping("/list") + public TableDataInfo list(ErpProjectReceivingBo bo, PageQuery pageQuery) { + return erpProjectReceivingService.queryPageList(bo, pageQuery); + } + + /** + * 导出项目收货确认列表 + */ + @SaCheckPermission("oa/erp:projectReceiving:export") + @Log(title = "项目收货确认", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ErpProjectReceivingBo bo, HttpServletResponse response) { + List list = erpProjectReceivingService.queryList(bo); + ExcelUtil.exportExcel(list, "项目收货确认", ErpProjectReceivingVo.class, response); + } + + /** + * 获取项目收货确认详细信息 + * + * @param receivingId 主键 + */ + @SaCheckPermission("oa/erp:projectReceiving:query") + @GetMapping("/{receivingId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("receivingId") Long receivingId) { + return R.ok(erpProjectReceivingService.queryById(receivingId)); + } + + /** + * 新增项目收货确认 + */ + @SaCheckPermission("oa/erp:projectReceiving:add") + @Log(title = "项目收货确认", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ErpProjectReceivingBo bo) { + return toAjax(erpProjectReceivingService.insertByBo(bo)); + } + + /** + * 修改项目收货确认 + */ + @SaCheckPermission("oa/erp:projectReceiving:edit") + @Log(title = "项目收货确认", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ErpProjectReceivingBo bo) { + return toAjax(erpProjectReceivingService.updateByBo(bo)); + } + + /** + * 删除项目收货确认 + * + * @param receivingIds 主键串 + */ + @SaCheckPermission("oa/erp:projectReceiving:remove") + @Log(title = "项目收货确认", businessType = BusinessType.DELETE) + @DeleteMapping("/{receivingIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] receivingIds) { + return toAjax(erpProjectReceivingService.deleteWithValidByIds(java.util.Arrays.asList(receivingIds), true)); + } + + /** + * 根据项目ID准备收货信息 + */ + @SaCheckPermission("oa/erp:projectReceiving:query") + @GetMapping("/prepareByProjectId/{projectId}") + public R prepareByProjectId(@PathVariable Long projectId) { + return R.ok(erpProjectReceivingService.prepareByProjectId(projectId)); + } + + /** + * 提交项目收货确认并发起流程 + */ + @SaCheckPermission("oa/erp:projectReceiving:add") + @Log(title = "项目收货确认", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/submitAndFlowStart") + public R submitAndFlowStart(@Validated(AddGroup.class) @RequestBody ErpProjectReceivingBo bo) { + return R.ok(erpProjectReceivingService.submitAndFlowStart(bo)); + } + + /** + * 下拉框查询项目收货确认列表 + */ + @GetMapping("/getErpProjectReceivingList") + public R> getErpProjectReceivingList(ErpProjectReceivingBo bo) { + List list = erpProjectReceivingService.queryList(bo); + return R.ok(list); + } + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpBudgetDetail.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpBudgetDetail.java index 9d5a24d2..4086037a 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpBudgetDetail.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpBudgetDetail.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serial; +import java.math.BigDecimal; /** * 项目预算详情对象 erp_budget_detail @@ -44,12 +45,12 @@ public class ErpBudgetDetail{ /** * 预算成本(元) */ - private Long budgetCost; + private BigDecimal budgetCost; /** * 降成本预算成本(元) */ - private Long reduceBudgetCost; + private BigDecimal reduceBudgetCost; /** * 参考项目ID diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpBudgetInfo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpBudgetInfo.java index 0732c065..e2dadefb 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpBudgetInfo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpBudgetInfo.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serial; +import java.math.BigDecimal; /** * 项目预算对象 erp_budget_info @@ -90,32 +91,32 @@ public class ErpBudgetInfo extends TenantEntity { /** * 合同额(元) */ - private Long contractAmount; + private BigDecimal contractAmount; /** * 合同净额(元) */ - private Long netContractAmount; + private BigDecimal netContractAmount; /** * 预算成本(元) */ - private Long budgetCost; + private BigDecimal budgetCost; /** * 预算毛利率,乘以100保存(如1%,保存1) */ - private Long budgetRate; + private BigDecimal budgetRate; /** * 降成本后预算成本(元) */ - private Long reduceBudgetCost; + private BigDecimal reduceBudgetCost; /** * 降成本后预算毛利率 */ - private Long reduceBudgetRate; + private BigDecimal reduceBudgetRate; /** * 项目预算期间 diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpBudgetMaterialCost.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpBudgetMaterialCost.java index 039cd3d4..44c0f4ec 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpBudgetMaterialCost.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpBudgetMaterialCost.java @@ -40,22 +40,22 @@ public class ErpBudgetMaterialCost extends TenantEntity { /** * 物料ID,关联base_material_info */ - private Long materielId; + private Long materialId; /** * SAP物料编码 */ - private String materielCode; + private String materialCode; /** * SAP物料名称 */ - private String materielName; + private String materialName; /** * 销售物料ID? */ - private Long relationMaterielId; + private Long relationMaterialId; /** * 单位,关联base_unit_info diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpContractInfo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpContractInfo.java index 82884eda..d083541f 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpContractInfo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpContractInfo.java @@ -42,6 +42,11 @@ public class ErpContractInfo extends TenantEntity { */ private String contractCode; + /** + * 客户合同编号 + */ + private String customerContractCode; + /** * 合同名称 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectAcceptance.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectAcceptance.java new file mode 100644 index 00000000..1e9cfef7 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectAcceptance.java @@ -0,0 +1,118 @@ +package org.dromara.oa.erp.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 项目验收确认对象 erp_project_acceptance + * + * @author Yinq + * @date 2025-11-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("erp_project_acceptance") +public class ErpProjectAcceptance extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 验收确认ID + */ + @TableId(value = "acceptance_id", type = IdType.ASSIGN_ID) + private Long acceptanceId; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 项目号 + */ + private String projectCode; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目经理 + */ + private Long managerId; + + /** + * 项目经理姓名(关联查询) + */ + @TableField(exist = false) + private String projectManagerName; + + /** + * 验收日期 + */ + private Date acceptanceDate; + + /** + * 验收单附件 + */ + private String ossId; + + /** + * 部门负责人 + */ + private Long chargeId; + + /** + * 分管副总 + */ + private Long deputyId; + + /** + * 部门负责人姓名(关联查询) + */ + @TableField(exist = false) + private String chargeName; + + /** + * 分管副总姓名(关联查询) + */ + @TableField(exist = false) + private String deputyName; + + /** + * 备注 + */ + private String remark; + + /** + * 流程状态 + */ + private String flowStatus; + + /** + * 项目状态(1暂存 2审批中 3可用) + */ + private String acceptanceStatus; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 验收确认编号(acceptance_code) + */ + @TableField("acceptance_code") + private String acceptanceCode; + + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectChange.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectChange.java index 74a25485..7921a1d5 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectChange.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectChange.java @@ -31,6 +31,11 @@ public class ErpProjectChange extends TenantEntity { @TableId(value = "project_change_id", type = IdType.ASSIGN_ID) private Long projectChangeId; + /** + * 项目变更编号 + */ + private String projectChangeCode; + /** * 项目ID */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectPlan.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectPlan.java index 6211b8ae..98878859 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectPlan.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectPlan.java @@ -32,6 +32,11 @@ public class ErpProjectPlan extends TenantEntity { */ private Long projectId; + /** + * 项目计划编号 + */ + private String projectPlanCode; + /** * 项目经理 */ @@ -67,6 +72,11 @@ public class ErpProjectPlan extends TenantEntity { */ private Long contractId; + /** + * 附件ID + */ + private String ossId; + /** * 备注 */ @@ -89,4 +99,22 @@ public class ErpProjectPlan extends TenantEntity { @TableField(exist = false ) private String createName; + /** + * 项目经理名称 + */ + @TableField(exist = false ) + private String managerName; + + /** + * 部门负责人名称 + */ + @TableField(exist = false ) + private String chargeName; + + /** + * 项目经理部门名称 + */ + @TableField(exist = false ) + private String managerDeptName; + } 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/ErpProjectReceiving.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectReceiving.java new file mode 100644 index 00000000..d94ec792 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectReceiving.java @@ -0,0 +1,118 @@ +package org.dromara.oa.erp.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 项目收货确认对象 erp_project_receiving + * + * @author Yinq + * @date 2025-11-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("erp_project_receiving") +public class ErpProjectReceiving extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 收货确认ID + */ + @TableId(value = "receiving_id", type = IdType.ASSIGN_ID) + private Long receivingId; + + /** + * 项目号 + */ + private String projectCode; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 项目经理 + */ + private Long managerId; + + /** + * 到货日期 + */ + private Date arrivalDate; + + /** + * 收货单附件 + */ + private String ossId; + + /** + * 项目经理姓名(关联查询) + */ + @TableField(exist = false) + private String projectManagerName; + + /** + * 部门负责人 + */ + private Long chargeId; + + /** + * 分管副总 + */ + private Long deputyId; + + /** + * 部门负责人姓名(关联查询) + */ + @TableField(exist = false) + private String chargeName; + + /** + * 分管副总姓名(关联查询) + */ + @TableField(exist = false) + private String deputyName; + + /** + * 备注 + */ + private String remark; + + /** + * 流程状态 + */ + private String flowStatus; + + /** + * 项目状态(1暂存 2审批中 3可用) + */ + private String receivingStatus; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 收货确认编号(receiving_code) + */ + @TableField("receiving_code") + private String receivingCode; + +} + diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpBudgetDetailBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpBudgetDetailBo.java index dbdff61d..2839bdcd 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpBudgetDetailBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpBudgetDetailBo.java @@ -9,6 +9,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; +import java.math.BigDecimal; + /** * 项目预算详情业务对象 erp_budget_detail * @@ -46,12 +48,12 @@ public class ErpBudgetDetailBo { /** * 预算成本(元) */ - private Long budgetCost; + private BigDecimal budgetCost; /** * 降成本预算成本(元) */ - private Long reduceBudgetCost; + private BigDecimal reduceBudgetCost; /** * 参考项目ID diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpBudgetInfoBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpBudgetInfoBo.java index 4c4a2b28..fae5386e 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpBudgetInfoBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpBudgetInfoBo.java @@ -1,7 +1,6 @@ package org.dromara.oa.erp.domain.bo; -import org.dromara.oa.erp.domain.ErpBudgetDetail; -import org.dromara.oa.erp.domain.ErpBudgetInfo; +import org.dromara.oa.erp.domain.*; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; @@ -9,8 +8,8 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; -import org.dromara.oa.erp.domain.ErpBudgetMaterialCost; +import java.math.BigDecimal; import java.util.List; /** @@ -97,32 +96,32 @@ public class ErpBudgetInfoBo extends BaseEntity { /** * 合同额(元) */ - private Long contractAmount; + private BigDecimal contractAmount; /** * 合同净额(元) */ - private Long netContractAmount; + private BigDecimal netContractAmount; /** * 预算成本(元) */ - private Long budgetCost; + private BigDecimal budgetCost; /** * 预算毛利率,乘以100保存(如1%,保存1) */ - private Long budgetRate; + private BigDecimal budgetRate; /** * 降成本后预算成本(元) */ - private Long reduceBudgetCost; + private BigDecimal reduceBudgetCost; /** * 降成本后预算毛利率 */ - private Long reduceBudgetRate; + private BigDecimal reduceBudgetRate; /** * 项目预算期间 @@ -168,4 +167,11 @@ public class ErpBudgetInfoBo extends BaseEntity { private List erpBudgetMaterialCostList; + private List erpBudgetLaborCostList; + + private List erpBudgetInstallCostList; + + private List erpBudgetTravelCostList; + + private List erpBudgetOtherCostList; } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpBudgetMaterialCostBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpBudgetMaterialCostBo.java index a62d7ef2..08574252 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpBudgetMaterialCostBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpBudgetMaterialCostBo.java @@ -40,22 +40,22 @@ public class ErpBudgetMaterialCostBo extends BaseEntity { /** * 物料ID,关联base_material_info */ - private Long materielId; + private Long materialId; /** * SAP物料编码 */ - private String materielCode; + private String materialCode; /** * SAP物料名称 */ - private String materielName; + private String materialName; /** * 销售物料ID? */ - private Long relationMaterielId; + private Long relationMaterialId; /** * 单位,关联base_unit_info diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpContractInfoBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpContractInfoBo.java index a41afda7..1b09ea0b 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpContractInfoBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpContractInfoBo.java @@ -44,6 +44,11 @@ public class ErpContractInfoBo extends BaseEntity { */ private String contractCode; + /** + * 客户合同编号 + */ + private String customerContractCode; + /** * 合同名称 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectAcceptanceBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectAcceptanceBo.java new file mode 100644 index 00000000..5a4903e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectAcceptanceBo.java @@ -0,0 +1,125 @@ +package org.dromara.oa.erp.domain.bo; + +import cn.hutool.core.util.ObjectUtil; +import org.dromara.oa.erp.domain.ErpProjectAcceptance; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt; + + +/** + * 项目验收确认业务对象 erp_project_acceptance + * + * @author Yinq + * @date 2025-11-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ErpProjectAcceptance.class, reverseConvertGenerate = false) +public class ErpProjectAcceptanceBo extends BaseEntity { + + /** + * 验收确认ID + */ + @NotNull(message = "验收确认ID不能为空", groups = { EditGroup.class }) + private Long acceptanceId; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 项目号 + */ + private String projectCode; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目经理 + */ + private Long managerId; + + /** + * 验收日期 + */ + private Date acceptanceDate; + + /** + * 验收单附件 + */ + private String ossId; + + /** + * 验收确认编号(acceptance_code) + */ + private String acceptanceCode; + + /** + * 部门负责人 + */ + private Long chargeId; + + /** + * 分管副总 + */ + private Long deputyId; + + /** + * 备注 + */ + private String remark; + + /** + * 流程编码 + */ + private String flowCode; + + /** + * 审批人 + */ + private String handler; + + /** + * 流程变量 + */ + private Map variables; + + /** + * 业务扩展字段 + */ + private RemoteFlowInstanceBizExt bizExt; + /** + * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}} + */ + + 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/erp/domain/bo/ErpProjectChangeBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectChangeBo.java index 209fb1d1..e47ceaa0 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectChangeBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectChangeBo.java @@ -34,6 +34,11 @@ public class ErpProjectChangeBo extends BaseEntity { @NotNull(message = "项目变更ID不能为空", groups = { EditGroup.class }) private Long projectChangeId; + /** + * 项目变更编号 + */ + private String projectChangeCode; + /** * 项目ID */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectPlanBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectPlanBo.java index 04bd18bb..2d4e1f24 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectPlanBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectPlanBo.java @@ -37,6 +37,11 @@ public class ErpProjectPlanBo extends BaseEntity { */ private Long projectId; + /** + * 项目计划编号 + */ + private String projectPlanCode; + /** * 项目经理 */ @@ -72,6 +77,11 @@ public class ErpProjectPlanBo extends BaseEntity { */ private Long contractId; + /** + * 附件ID + */ + private String ossId; + /** * 备注 */ 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/bo/ErpProjectReceivingBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectReceivingBo.java new file mode 100644 index 00000000..eb6e1f6a --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectReceivingBo.java @@ -0,0 +1,122 @@ +package org.dromara.oa.erp.domain.bo; + +import cn.hutool.core.util.ObjectUtil; +import org.dromara.oa.erp.domain.ErpProjectReceiving; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt; + +/** + * 项目收货确认业务对象 erp_project_receiving + * + * @author Yinq + * @date 2025-11-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ErpProjectReceiving.class, reverseConvertGenerate = false) +public class ErpProjectReceivingBo extends BaseEntity { + + /** + * 收货确认ID + */ + private Long receivingId; + + /** + * 项目号 + */ + private String projectCode; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目ID(仅传递,不落库) + */ + private Long projectId; + + /** + * 项目经理 + */ + private Long managerId; + + /** + * 到货日期 + */ + private Date arrivalDate; + + /** + * 收货单附件 + */ + private String ossId; + + /** + * 收货确认编号(receiving_code) + */ + private String receivingCode; + + /** + * 部门负责人 + */ + private Long chargeId; + + /** + * 分管副总 + */ + private Long deputyId; + + /** + * 备注 + */ + private String remark; + + /** + * 流程编码 + */ + private String flowCode; + + /** + * 审批人 + */ + private String handler; + + /** + * 流程变量 + */ + private Map variables; + + /** + * 业务扩展字段 + */ + private RemoteFlowInstanceBizExt bizExt; + /** + * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}} + */ + + 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/erp/domain/vo/ErpBudgetDetailVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpBudgetDetailVo.java index 30499440..43b9f8c7 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpBudgetDetailVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpBudgetDetailVo.java @@ -10,6 +10,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; @@ -56,13 +57,13 @@ public class ErpBudgetDetailVo implements Serializable { * 预算成本(元) */ @ExcelProperty(value = "预算成本(元)") - private Long budgetCost; + private BigDecimal budgetCost; /** * 降成本预算成本(元) */ @ExcelProperty(value = "降成本预算成本(元)") - private Long reduceBudgetCost; + private BigDecimal reduceBudgetCost; /** * 参考项目ID diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpBudgetInfoVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpBudgetInfoVo.java index dbbeda0b..8011bc8c 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpBudgetInfoVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpBudgetInfoVo.java @@ -10,6 +10,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; @@ -112,38 +113,38 @@ public class ErpBudgetInfoVo implements Serializable { * 合同额(元) */ @ExcelProperty(value = "合同额(元)") - private Long contractAmount; + private BigDecimal contractAmount; /** * 合同净额(元) */ @ExcelProperty(value = "合同净额(元)") - private Long netContractAmount; + private BigDecimal netContractAmount; /** * 预算成本(元) */ @ExcelProperty(value = "预算成本(元)") - private Long budgetCost; + private BigDecimal budgetCost; /** * 预算毛利率,乘以100保存(如1%,保存1) */ @ExcelProperty(value = "预算毛利率,乘以100保存", converter = ExcelDictConvert.class) @ExcelDictFormat(readConverterExp = "如=1%,保存1") - private Long budgetRate; + private BigDecimal budgetRate; /** * 降成本后预算成本(元) */ @ExcelProperty(value = "降成本后预算成本(元)") - private Long reduceBudgetCost; + private BigDecimal reduceBudgetCost; /** * 降成本后预算毛利率 */ @ExcelProperty(value = "降成本后预算毛利率") - private Long reduceBudgetRate; + private BigDecimal reduceBudgetRate; /** * 项目预算期间 diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpBudgetMaterialCostVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpBudgetMaterialCostVo.java index 57f5487c..d44327e7 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpBudgetMaterialCostVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpBudgetMaterialCostVo.java @@ -50,25 +50,25 @@ public class ErpBudgetMaterialCostVo implements Serializable { * 物料ID,关联base_material_info */ @ExcelProperty(value = "物料ID,关联base_material_info") - private Long materielId; + private Long materialId; /** * SAP物料编码 */ @ExcelProperty(value = "SAP物料编码") - private String materielCode; + private String materialCode; /** * SAP物料名称 */ @ExcelProperty(value = "SAP物料名称") - private String materielName; + private String materialName; /** * 销售物料ID? */ @ExcelProperty(value = "销售物料ID?") - private Long relationMaterielId; + private Long relationMaterialId; /** * 单位,关联base_unit_info diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractInfoVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractInfoVo.java index e8dcf729..d34534b1 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractInfoVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractInfoVo.java @@ -51,6 +51,12 @@ public class ErpContractInfoVo implements Serializable { @ExcelProperty(value = "合同编号") private String contractCode; + /** + * 客户合同编号 + */ + @ExcelProperty(value = "客户合同编号") + private String customerContractCode; + /** * 合同名称 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectAcceptanceVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectAcceptanceVo.java new file mode 100644 index 00000000..8365fe5d --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectAcceptanceVo.java @@ -0,0 +1,130 @@ +package org.dromara.oa.erp.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.oa.erp.domain.ErpProjectAcceptance; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 项目验收确认视图对象 erp_project_acceptance + * + * @author Yinq + * @date 2025-11-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ErpProjectAcceptance.class) +public class ErpProjectAcceptanceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 验收确认ID + */ + @ExcelProperty(value = "验收确认ID") + private Long acceptanceId; + + /** + * 项目ID + */ + @ExcelProperty(value = "项目ID") + private Long projectId; + + /** + * 项目号 + */ + @ExcelProperty(value = "项目号") + private String projectCode; + + /** + * 项目名称 + */ + @ExcelProperty(value = "项目名称") + private String projectName; + + /** + * 验收确认编号 + */ + @ExcelProperty(value = "验收确认编号") + private String acceptanceCode; + + /** + * 项目经理 + */ + @ExcelProperty(value = "项目经理") + private Long managerId; + + /** + * 项目经理姓名 + */ + @ExcelProperty(value = "项目经理姓名") + private String projectManagerName; + + /** + * 验收日期 + */ + @ExcelProperty(value = "验收日期") + private Date acceptanceDate; + + /** + * 验收单附件 + */ + @ExcelProperty(value = "验收单附件") + private String ossId; + + /** + * 部门负责人 + */ + @ExcelProperty(value = "部门负责人") + private Long chargeId; + + /** + * 分管副总 + */ + @ExcelProperty(value = "分管副总") + private Long deputyId; + + /** + * 部门负责人姓名 + */ + @ExcelProperty(value = "部门负责人姓名") + private String chargeName; + + /** + * 分管副总姓名 + */ + @ExcelProperty(value = "分管副总姓名") + private String deputyName; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 项目状态(1暂存 2审批中 3可用) + */ + @ExcelProperty(value = "项目状态") + private String acceptanceStatus; + + /** + * 流程状态 + */ + @ExcelProperty(value = "流程状态") + private String flowStatus; + + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectChangeVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectChangeVo.java index c548b6ca..c2a65f33 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectChangeVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectChangeVo.java @@ -41,6 +41,12 @@ public class ErpProjectChangeVo implements Serializable { @ExcelProperty(value = "项目变更ID") private Long projectChangeId; + /** + * 项目变更编号 + */ + @ExcelProperty(value = "项目变更编号") + private String projectChangeCode; + /** * 项目ID */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectPlanVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectPlanVo.java index 10b77d62..ee3509af 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectPlanVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectPlanVo.java @@ -43,6 +43,12 @@ public class ErpProjectPlanVo implements Serializable { @ExcelProperty(value = "项目ID") private Long projectId; + /** + * 项目计划编号 + */ + @ExcelProperty(value = "项目计划编号") + private String projectPlanCode; + /** * 项目经理 */ @@ -86,6 +92,12 @@ public class ErpProjectPlanVo implements Serializable { @ExcelProperty(value = "合同ID(预留)") private Long contractId; + /** + * 附件ID + */ + @ExcelProperty(value = "附件ID") + private String ossId; + /** * 备注 */ @@ -116,6 +128,12 @@ public class ErpProjectPlanVo implements Serializable { @ExcelProperty(value = "项目经理名称") private String managerName; + /** + * 项目经理部门名称 + */ + @ExcelProperty(value = "项目经理部门名称") + private String managerDeptName; + /** * 部门负责人名称 */ 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..6d2d437b 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,72 @@ 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; + + /** + * 部门ID + */ + @ExcelProperty(value = "部门ID") + private Long deptId; + /** * 提报人 */ @ExcelProperty(value = "提报人") private Long reporterId; + /** + * 提报人名称 + */ + @ExcelProperty(value = "提报人名称") + private String reporterName; + /** * 收货人 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectReceivingVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectReceivingVo.java new file mode 100644 index 00000000..c6141959 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectReceivingVo.java @@ -0,0 +1,130 @@ +package org.dromara.oa.erp.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.oa.erp.domain.ErpProjectReceiving; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 项目收货确认视图对象 erp_project_receiving + * + * @author Yinq + * @date 2025-11-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ErpProjectReceiving.class) +public class ErpProjectReceivingVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 收货确认ID + */ + @ExcelProperty(value = "收货确认ID") + private Long receivingId; + + /** + * 项目号 + */ + @ExcelProperty(value = "项目号") + private String projectCode; + + /** + * 项目名称 + */ + @ExcelProperty(value = "项目名称") + private String projectName; + + /** + * 项目ID + */ + @ExcelProperty(value = "项目ID") + private Long projectId; + + /** + * 项目经理 + */ + @ExcelProperty(value = "项目经理") + private Long managerId; + + /** + * 到货日期 + */ + @ExcelProperty(value = "到货日期") + private Date arrivalDate; + + /** + * 收货单附件 + */ + @ExcelProperty(value = "收货单附件") + private String ossId; + + /** + * 项目经理姓名 + */ + @ExcelProperty(value = "项目经理姓名") + private String projectManagerName; + + /** + * 部门负责人 + */ + @ExcelProperty(value = "部门负责人") + private Long chargeId; + + /** + * 分管副总 + */ + @ExcelProperty(value = "分管副总") + private Long deputyId; + + /** + * 部门负责人姓名 + */ + @ExcelProperty(value = "部门负责人姓名") + private String chargeName; + + /** + * 分管副总姓名 + */ + @ExcelProperty(value = "分管副总姓名") + private String deputyName; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 项目状态(1暂存 2审批中 3可用) + */ + @ExcelProperty(value = "项目状态") + private String receivingStatus; + + /** + * 流程状态 + */ + @ExcelProperty(value = "流程状态") + private String flowStatus; + + /** + * 收货确认编号 + */ + @ExcelProperty(value = "收货确认编号") + private String receivingCode; + +} + diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpProjectAcceptanceMapper.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpProjectAcceptanceMapper.java new file mode 100644 index 00000000..1e17c393 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpProjectAcceptanceMapper.java @@ -0,0 +1,131 @@ +package org.dromara.oa.erp.mapper; + +import java.util.List; +import java.util.Collection; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.oa.erp.domain.ErpProjectAcceptance; +import org.dromara.oa.erp.domain.vo.ErpProjectAcceptanceVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.annotation.DataColumn; + +/** + * 项目验收确认Mapper接口 + * + * @author Yinq + * @date 2025-11-12 + */ +public interface ErpProjectAcceptanceMapper extends BaseMapperPlus { + + /** + * 查询项目验收确认列表 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 项目验收确认集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "t.create_dept"), + @DataColumn(key = "userName", value = "t.create_by") + }) + public Page selectCustomErpProjectAcceptanceVoList(@Param("page") Page page, @Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 查询项目验收确认列表 + * + * @param queryWrapper 条件 + * @return 项目验收确认集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "t.create_dept"), + @DataColumn(key = "userName", value = "t.create_by") + }) + public List selectCustomErpProjectAcceptanceVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 根据ID查询项目验收确认详情 + * + * @param acceptanceId 主键ID + * @return 项目验收确认对象 + */ + ErpProjectAcceptanceVo selectCustomErpProjectAcceptanceVoById(@Param("acceptanceId") Long acceptanceId); + + /** + * 根据ID列表批量查询项目验收确认 + * + * @param ids ID集合 + * @return 项目验收确认集合 + */ + List selectCustomErpProjectAcceptanceVoByIds(@Param("ids") Collection ids); + + /** + * 统计项目验收确认记录数 + * + * @param queryWrapper 查询条件 + * @return 记录总数 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "t.create_dept"), + @DataColumn(key = "userName", value = "t.create_by") + }) + Long countCustomErpProjectAcceptance(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 分页查询项目验收确认(自定义条件) + * + * @param page 分页对象 + * @param queryWrapper 查询条件 + * @return 分页结果 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "t.create_dept"), + @DataColumn(key = "userName", value = "t.create_by") + }) + Page selectCustomErpProjectAcceptanceVoPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 批量插入项目验收确认 + * + * @param list 项目验收确认对象集合 + * @return 影响行数 + */ + int batchInsertErpProjectAcceptance(@Param("list") List list); + + /** + * 批量更新项目验收确认 + * + * @param list 项目验收确认对象集合 + * @return 影响行数 + */ + int batchUpdateErpProjectAcceptance(@Param("list") List list); + + /** + * 根据自定义条件删除项目验收确认 + * + * @param queryWrapper 删除条件 + * @return 影响行数 + */ + int deleteCustomErpProjectAcceptance(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据ID列表批量删除项目验收确认 + * + * @param ids ID集合 + * @return 影响行数 + */ + int deleteCustomErpProjectAcceptanceByIds(@Param("ids") Collection ids); + + /** + * 检查项目验收确认是否存在 + * + * @param queryWrapper 查询条件 + * @return 是否存在 + */ + Boolean existsErpProjectAcceptance(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + +} 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/mapper/ErpProjectReceivingMapper.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpProjectReceivingMapper.java new file mode 100644 index 00000000..3b27a8e2 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpProjectReceivingMapper.java @@ -0,0 +1,131 @@ +package org.dromara.oa.erp.mapper; + +import java.util.List; +import java.util.Collection; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.oa.erp.domain.ErpProjectReceiving; +import org.dromara.oa.erp.domain.vo.ErpProjectReceivingVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.annotation.DataColumn; + +/** + * 项目收货确认Mapper接口 + * + * @author Yinq + * @date 2025-11-12 + */ +public interface ErpProjectReceivingMapper extends BaseMapperPlus { + + /** + * 查询项目收货确认列表 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 项目收货确认集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "t.create_dept"), + @DataColumn(key = "userName", value = "t.create_by") + }) + public Page selectCustomErpProjectReceivingVoList(@Param("page") Page page, @Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 查询项目收货确认列表 + * + * @param queryWrapper 条件 + * @return 项目收货确认集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "t.create_dept"), + @DataColumn(key = "userName", value = "t.create_by") + }) + public List selectCustomErpProjectReceivingVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 根据ID查询项目收货确认详情 + * + * @param receivingId 主键ID + * @return 项目收货确认对象 + */ + ErpProjectReceivingVo selectCustomErpProjectReceivingVoById(@Param("receivingId") Long receivingId); + + /** + * 根据ID列表批量查询项目收货确认 + * + * @param ids ID集合 + * @return 项目收货确认集合 + */ + List selectCustomErpProjectReceivingVoByIds(@Param("ids") Collection ids); + + /** + * 统计项目收货确认记录数 + * + * @param queryWrapper 查询条件 + * @return 记录总数 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "t.create_dept"), + @DataColumn(key = "userName", value = "t.create_by") + }) + Long countCustomErpProjectReceiving(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 分页查询项目收货确认(自定义条件) + * + * @param page 分页对象 + * @param queryWrapper 查询条件 + * @return 分页结果 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "t.create_dept"), + @DataColumn(key = "userName", value = "t.create_by") + }) + Page selectCustomErpProjectReceivingVoPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 批量插入项目收货确认 + * + * @param list 项目收货确认对象集合 + * @return 影响行数 + */ + int batchInsertErpProjectReceiving(@Param("list") List list); + + /** + * 批量更新项目收货确认 + * + * @param list 项目收货确认对象集合 + * @return 影响行数 + */ + int batchUpdateErpProjectReceiving(@Param("list") List list); + + /** + * 根据自定义条件删除项目收货确认 + * + * @param queryWrapper 删除条件 + * @return 影响行数 + */ + int deleteCustomErpProjectReceiving(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据ID列表批量删除项目收货确认 + * + * @param ids ID集合 + * @return 影响行数 + */ + int deleteCustomErpProjectReceivingByIds(@Param("ids") Collection ids); + + /** + * 检查项目收货确认是否存在 + * + * @param queryWrapper 查询条件 + * @return 是否存在 + */ + Boolean existsErpProjectReceiving(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpProjectAcceptanceService.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpProjectAcceptanceService.java new file mode 100644 index 00000000..72c7fe2b --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpProjectAcceptanceService.java @@ -0,0 +1,85 @@ +package org.dromara.oa.erp.service; + +import org.dromara.oa.erp.domain.ErpProjectAcceptance; +import org.dromara.oa.erp.domain.vo.ErpProjectAcceptanceVo; +import org.dromara.oa.erp.domain.bo.ErpProjectAcceptanceBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 项目验收确认Service接口 + * + * @author Yinq + * @date 2025-11-12 + */ +public interface IErpProjectAcceptanceService { + + /** + * 查询项目验收确认 + * + * @param acceptanceId 主键 + * @return 项目验收确认 + */ + ErpProjectAcceptanceVo queryById(Long acceptanceId); + + /** + * 分页查询项目验收确认列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 项目验收确认分页列表 + */ + TableDataInfo queryPageList(ErpProjectAcceptanceBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的项目验收确认列表 + * + * @param bo 查询条件 + * @return 项目验收确认列表 + */ + List queryList(ErpProjectAcceptanceBo bo); + + /** + * 新增项目验收确认 + * + * @param bo 项目验收确认 + * @return 是否新增成功 + */ + Boolean insertByBo(ErpProjectAcceptanceBo bo); + + /** + * 修改项目验收确认 + * + * @param bo 项目验收确认 + * @return 是否修改成功 + */ + Boolean updateByBo(ErpProjectAcceptanceBo bo); + + /** + * 校验并批量删除项目验收确认信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据项目ID准备验收信息 + * + * @param projectId 项目ID + * @return 项目验收确认信息 + */ + ErpProjectAcceptanceVo prepareByProjectId(Long projectId); + + /** + * 提交项目验收确认并发起流程 + * + * @param bo 项目验收确认 + * @return 项目验收确认信息 + */ + ErpProjectAcceptanceVo submitAndFlowStart(ErpProjectAcceptanceBo bo); +} 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/IErpProjectReceivingService.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpProjectReceivingService.java new file mode 100644 index 00000000..3367f1a4 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpProjectReceivingService.java @@ -0,0 +1,85 @@ +package org.dromara.oa.erp.service; + +import org.dromara.oa.erp.domain.ErpProjectReceiving; +import org.dromara.oa.erp.domain.vo.ErpProjectReceivingVo; +import org.dromara.oa.erp.domain.bo.ErpProjectReceivingBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 项目收货确认Service接口 + * + * @author Yinq + * @date 2025-11-12 + */ +public interface IErpProjectReceivingService { + + /** + * 查询项目收货确认 + * + * @param receivingId 主键 + * @return 项目收货确认 + */ + ErpProjectReceivingVo queryById(Long receivingId); + + /** + * 分页查询项目收货确认列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 项目收货确认分页列表 + */ + TableDataInfo queryPageList(ErpProjectReceivingBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的项目收货确认列表 + * + * @param bo 查询条件 + * @return 项目收货确认列表 + */ + List queryList(ErpProjectReceivingBo bo); + + /** + * 新增项目收货确认 + * + * @param bo 项目收货确认 + * @return 是否新增成功 + */ + Boolean insertByBo(ErpProjectReceivingBo bo); + + /** + * 修改项目收货确认 + * + * @param bo 项目收货确认 + * @return 是否修改成功 + */ + Boolean updateByBo(ErpProjectReceivingBo bo); + + /** + * 校验并批量删除项目收货确认信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据项目ID准备收货信息 + * + * @param projectId 项目ID + * @return 项目收货确认信息 + */ + ErpProjectReceivingVo prepareByProjectId(Long projectId); + + /** + * 提交项目收货确认并发起流程 + * + * @param bo 项目收货确认 + * @return 项目收货确认信息 + */ + ErpProjectReceivingVo submitAndFlowStart(ErpProjectReceivingBo bo); +} 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 95dedf68..3cdf70a3 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 @@ -103,6 +103,7 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService { .selectAll(ErpContractInfo.class) .eq(StringUtils.isNotBlank(bo.getContractFlag()), ErpContractInfo::getContractFlag, bo.getContractFlag()) .eq(StringUtils.isNotBlank(bo.getContractCode()), ErpContractInfo::getContractCode, bo.getContractCode()) + .eq(StringUtils.isNotBlank(bo.getCustomerContractCode()), ErpContractInfo::getCustomerContractCode, bo.getCustomerContractCode()) .like(StringUtils.isNotBlank(bo.getContractName()), ErpContractInfo::getContractName, bo.getContractName()) .eq(StringUtils.isNotBlank(bo.getContractCategory()), ErpContractInfo::getContractCategory, bo.getContractCategory()) .eq(StringUtils.isNotBlank(bo.getContractType()), ErpContractInfo::getContractType, bo.getContractType()) @@ -250,10 +251,16 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService { // 办理人 String handler = Convert.toStr(params.get("handler")); } - if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) { + if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) { + contractInfo.setContractStatus(OAStatusEnum.APPROVING.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) { contractInfo.setContractStatus(OAStatusEnum.COMPLETED.getStatus()); - } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())){ + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) { contractInfo.setContractStatus(OAStatusEnum.INVALID.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) { + contractInfo.setContractStatus(OAStatusEnum.DRAFT.getStatus()); } baseMapper.updateById(contractInfo); }); diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectAcceptanceServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectAcceptanceServiceImpl.java new file mode 100644 index 00000000..0413a29b --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectAcceptanceServiceImpl.java @@ -0,0 +1,370 @@ +package org.dromara.oa.erp.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.map.MapUtil; +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.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.oa.erp.domain.ErpProjectAcceptance; +import org.dromara.oa.erp.domain.ErpProjectInfo; +import org.dromara.oa.erp.domain.bo.ErpProjectAcceptanceBo; +import org.dromara.oa.erp.domain.vo.ErpProjectAcceptanceVo; +import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo; +import org.dromara.oa.erp.mapper.ErpProjectAcceptanceMapper; +import org.dromara.oa.erp.mapper.ErpProjectInfoMapper; +import org.dromara.oa.erp.service.IErpProjectAcceptanceService; +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 java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 项目验收确认Service业务层处理 + * + * @author Yinq + * @date 2025-11-12 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class ErpProjectAcceptanceServiceImpl implements IErpProjectAcceptanceService { + + private static final String ACCEPTANCE_CODE_RULE = "1008"; + + private final ErpProjectAcceptanceMapper baseMapper; + private final ErpProjectInfoMapper projectInfoMapper; + + @DubboReference(timeout = 30000) + private RemoteWorkflowService remoteWorkflowService; + @DubboReference(timeout = 30000) + private RemoteCodeRuleService remoteCodeRuleService; + + + /** + * 查询项目验收确认 + * + * @param acceptanceId 主键 + * @return 项目验收确认 + */ + @Override + public ErpProjectAcceptanceVo queryById(Long acceptanceId){ + return baseMapper.selectCustomErpProjectAcceptanceVoById(acceptanceId); + } + + /** + * 分页查询项目验收确认列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 项目验收确认分页列表 + */ + @Override + public TableDataInfo queryPageList(ErpProjectAcceptanceBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectCustomErpProjectAcceptanceVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的项目验收确认列表 + * + * @param bo 查询条件 + * @return 项目验收确认列表 + */ + @Override + public List queryList(ErpProjectAcceptanceBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectCustomErpProjectAcceptanceVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(ErpProjectAcceptanceBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(ErpProjectAcceptance.class) + .selectAll(ErpProjectAcceptance.class) + .eq(ErpProjectAcceptance::getDelFlag, "0") + .eq(bo.getProjectId() != null, ErpProjectAcceptance::getProjectId, bo.getProjectId()) + .eq(StringUtils.isNotBlank(bo.getProjectCode()), ErpProjectAcceptance::getProjectCode, bo.getProjectCode()) + .like(StringUtils.isNotBlank(bo.getProjectName()), ErpProjectAcceptance::getProjectName, bo.getProjectName()) + .eq(bo.getManagerId() != null, ErpProjectAcceptance::getManagerId, bo.getManagerId()) + .eq(bo.getAcceptanceDate() != null, ErpProjectAcceptance::getAcceptanceDate, bo.getAcceptanceDate()) + .eq(StringUtils.isNotBlank(bo.getOssId()), ErpProjectAcceptance::getOssId, bo.getOssId()) + .eq(bo.getChargeId() != null, ErpProjectAcceptance::getChargeId, bo.getChargeId()) + .eq(bo.getDeputyId() != null, ErpProjectAcceptance::getDeputyId, bo.getDeputyId()); + if (params != null) { + String beginTime = Convert.toStr(params.get("beginTime")); + String endTime = Convert.toStr(params.get("endTime")); + lqw.ge(StringUtils.isNotBlank(beginTime), ErpProjectAcceptance::getAcceptanceDate, beginTime) + .le(StringUtils.isNotBlank(endTime), ErpProjectAcceptance::getAcceptanceDate, endTime); + } + return lqw; + } + + /** + * 新增项目验收确认 + * + * @param bo 项目验收确认 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(ErpProjectAcceptanceBo bo) { + // 权限校验:只有项目经理才能提交 + validateProjectManager(bo.getManagerId()); + + ErpProjectAcceptance add = MapstructUtils.convert(bo, ErpProjectAcceptance.class); + fillAcceptanceCode(add); + validEntityBeforeSave(add); + // 默认业务状态:暂存 + if (StringUtils.isBlank(add.getAcceptanceStatus())) { + add.setAcceptanceStatus(OAStatusEnum.DRAFT.getStatus()); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setAcceptanceId(add.getAcceptanceId()); + bo.setAcceptanceCode(add.getAcceptanceCode()); + } + return flag; + } + + /** + * 修改项目验收确认 + * + * @param bo 项目验收确认 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(ErpProjectAcceptanceBo bo) { + // 权限校验:只有项目经理才能修改 + ErpProjectAcceptance existing = baseMapper.selectById(bo.getAcceptanceId()); + if (existing == null) { + throw new ServiceException("项目验收确认不存在"); + } + validateProjectManager(existing.getManagerId()); + + ErpProjectAcceptance update = MapstructUtils.convert(bo, ErpProjectAcceptance.class); + if (StringUtils.isBlank(update.getAcceptanceCode())) { + update.setAcceptanceCode(existing.getAcceptanceCode()); + } + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ErpProjectAcceptance entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 首次保存时自动生成验收确认编号 + */ + private void fillAcceptanceCode(ErpProjectAcceptance entity) { + if (StringUtils.isNotBlank(entity.getAcceptanceCode())) { + return; + } + String code = remoteCodeRuleService.selectCodeRuleCode(ACCEPTANCE_CODE_RULE); + if (StringUtils.isBlank(code)) { + throw new ServiceException("生成验收确认编号失败"); + } + entity.setAcceptanceCode(code); + } + + /** + * 校验项目经理权限:只有项目经理才能提交/修改项目验收确认 + * + * @param managerId 项目经理ID + */ + private void validateProjectManager(Long managerId) { + // 超级管理员跳过校验 + if (LoginHelper.isSuperAdmin()) { + return; + } + // 普通用户判断当前用户ID是否等于项目经理ID + Long currentUserId = LoginHelper.getUserId(); + if (!Objects.equals(currentUserId, managerId)) { + throw new ServiceException("只有项目经理才能提交或修改项目验收确认"); + } + } + + /** + * 校验并批量删除项目验收确认信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 根据项目ID准备验收信息 + * + * @param projectId 项目ID + * @return 项目验收确认信息 + */ + @Override + public ErpProjectAcceptanceVo prepareByProjectId(Long projectId) { + if (projectId == null) { + throw new ServiceException("项目ID不能为空"); + } + + // 查询项目信息 + ErpProjectInfoVo projectInfo = projectInfoMapper.selectVoById(projectId); + if (projectInfo == null) { + throw new ServiceException("项目信息不存在"); + } + + // 构造验收信息 + ErpProjectAcceptanceVo vo = new ErpProjectAcceptanceVo(); + vo.setProjectId(projectId); + vo.setProjectCode(projectInfo.getProjectCode()); + vo.setProjectName(projectInfo.getProjectName()); + vo.setManagerId(projectInfo.getManagerId()); + vo.setProjectManagerName(projectInfo.getManagerName()); + vo.setChargeId(projectInfo.getChargeId()); + vo.setChargeName(projectInfo.getChargeName()); + vo.setDeputyId(projectInfo.getDeputyId()); + vo.setDeputyName(projectInfo.getDeputyName()); + + return vo; + } + + /** + * 提交项目验收确认并发起流程 + * + * @param bo 项目验收确认 + * @return 项目验收确认信息 + */ + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public ErpProjectAcceptanceVo submitAndFlowStart(ErpProjectAcceptanceBo bo) { + // 权限校验:只有项目经理才能提交 + validateProjectManager(bo.getManagerId()); + + ErpProjectAcceptance add = MapstructUtils.convert(bo, ErpProjectAcceptance.class); + validEntityBeforeSave(add); + + // 保存或更新 + if (StringUtils.isNull(bo.getAcceptanceId())) { + this.insertByBo(bo); + } else { + this.updateByBo(bo); + } + + // 发起流程(空值保护) + if (bo.getVariables() == null) { + bo.setVariables(new java.util.HashMap<>()); + } + bo.getVariables().put("ignore", true); + RemoteStartProcess startProcess = new RemoteStartProcess(); + startProcess.setBusinessId(bo.getAcceptanceId().toString()); + startProcess.setFlowCode(bo.getFlowCode()); + startProcess.setVariables(bo.getVariables()); + if (bo.getBizExt() == null) { + bo.setBizExt(new RemoteFlowInstanceBizExt()); + } + if (StringUtils.isNotEmpty(bo.getAcceptanceCode())) { + bo.getBizExt().setBusinessCode(bo.getAcceptanceCode()); + } + startProcess.setBizExt(bo.getBizExt()); + bo.getBizExt().setBusinessId(startProcess.getBusinessId()); + + boolean flagOne = remoteWorkflowService.startCompleteTask(startProcess); + if (!flagOne) { + throw new ServiceException("流程发起异常"); + } + + return MapstructUtils.convert(add, ErpProjectAcceptanceVo.class); + } + + /** + * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成等) + * + * @param processEvent 参数 + */ + @EventListener(condition = "#processEvent.flowCode =='OAPA'") + public void processHandler(ProcessEvent processEvent) { + TenantHelper.dynamic(processEvent.getTenantId(), () -> { + log.info("项目验收流程执行:{}", processEvent.toString()); + ErpProjectAcceptance acceptance = baseMapper.selectById(Convert.toLong(processEvent.getBusinessId())); + if (acceptance != null) { + // 更新流程状态 + acceptance.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())) { + acceptance.setAcceptanceStatus(OAStatusEnum.APPROVING.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) { + acceptance.setAcceptanceStatus(OAStatusEnum.COMPLETED.getStatus()); + + // 审批完成后,更新项目信息的项目状态为 7(已验收) + Long projectId = acceptance.getProjectId(); + if (projectId != null) { + ErpProjectInfo projectInfo = projectInfoMapper.selectById(projectId); + if (projectInfo != null) { + String currentStatus = projectInfo.getProjectStatus(); + boolean needUpdate = false; + if (StringUtils.isBlank(currentStatus)) { + needUpdate = true; + } else { + try { + /**若项目当前状态为空或“小于 7”(比如 1 暂存、3 可用、5 已收货),则升级为 "7"(已验收); +不会把状态从更高值回退(如果以后有 8 之类更高状态,也不会被强制降级到 7)。 */ + needUpdate = Integer.parseInt(currentStatus) < 7; + } catch (NumberFormatException e) { + // 非数字状态直接覆盖为已验收 + needUpdate = true; + } + } + if (needUpdate) { + projectInfo.setProjectStatus("7"); // 7:已验收 + projectInfoMapper.updateById(projectInfo); + } + } + } + + log.info("项目验收确认完成: acceptanceId={}", acceptance.getAcceptanceId()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) { + acceptance.setAcceptanceStatus(OAStatusEnum.INVALID.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) { + // 流程驳回:业务状态还原为草稿,允许重新编辑和提交 + acceptance.setAcceptanceStatus(OAStatusEnum.DRAFT.getStatus());//暂存 + } + baseMapper.updateById(acceptance); + } + }); + } + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectChangeServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectChangeServiceImpl.java index b29a493b..156b36a9 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectChangeServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectChangeServiceImpl.java @@ -2,6 +2,12 @@ package org.dromara.oa.erp.service.impl; import cn.hutool.core.convert.Convert; import cn.hutool.core.map.MapUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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; @@ -13,32 +19,25 @@ import org.dromara.common.core.utils.ObjectUtils; 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.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.oa.erp.domain.*; import org.dromara.oa.erp.domain.bo.ErpProjectChangeBo; import org.dromara.oa.erp.domain.vo.ErpProjectChangeVo; import org.dromara.oa.erp.mapper.*; import org.dromara.oa.erp.service.IErpProjectChangeService; +import org.dromara.system.api.RemoteCodeRuleService; 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; -import org.dromara.common.satoken.utils.LoginHelper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import lombok.RequiredArgsConstructor; - -import java.util.*; -import java.util.stream.Collectors; +import java.math.BigDecimal; import java.time.LocalDate; import java.time.ZoneId; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import com.github.yulichang.toolkit.JoinWrappers; -import java.math.BigDecimal; +import java.util.*; /** * 项目变更申请Service业务层处理 @@ -51,6 +50,8 @@ import java.math.BigDecimal; @Slf4j public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { + private static final String PROJECT_CHANGE_CODE_RULE = "1011"; + // 计划变更主子表 private final ErpProjectChangeMapper baseMapper; private final ErpProjectChangeBudgetMapper changeBudgetMapper; @@ -66,6 +67,8 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { @DubboReference(timeout = 30000) private RemoteWorkflowService remoteWorkflowService; + @DubboReference(timeout = 30000) + private RemoteCodeRuleService remoteCodeRuleService; /** * 查询项目变更申请 @@ -152,6 +155,7 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { .selectAll(ErpProjectChange.class) .eq(ErpProjectChange::getDelFlag, "0") .eq(bo.getProjectId() != null, ErpProjectChange::getProjectId, bo.getProjectId()) + .eq(StringUtils.isNotBlank(bo.getProjectChangeCode()), ErpProjectChange::getProjectChangeCode, bo.getProjectChangeCode()) .eq(StringUtils.isNotBlank(bo.getProjectCode()), ErpProjectChange::getProjectCode, bo.getProjectCode()) .like(StringUtils.isNotBlank(bo.getProjectName()), ErpProjectChange::getProjectName, bo.getProjectName()) .eq(StringUtils.isNotBlank(bo.getProjectCategory()), ErpProjectChange::getProjectCategory, bo.getProjectCategory()) @@ -202,6 +206,7 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { */ ErpProjectChange add = MapstructUtils.convert(bo, ErpProjectChange.class); + fillProjectChangeCode(add); validEntityBeforeSave(add); // 设置默认状态 @@ -215,6 +220,7 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setProjectChangeId(add.getProjectChangeId()); + bo.setProjectChangeCode(add.getProjectChangeCode()); // 保存预算变更明细 if (bo.getBudgetList() != null && !bo.getBudgetList().isEmpty()) { @@ -260,6 +266,9 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { } ErpProjectChange update = MapstructUtils.convert(bo, ErpProjectChange.class); + if (StringUtils.isBlank(update.getProjectChangeCode())) { + update.setProjectChangeCode(existing.getProjectChangeCode()); + } validEntityBeforeSave(update); boolean flag = baseMapper.updateById(update) > 0; @@ -305,12 +314,17 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { if (projectId == null) { throw new ServiceException("项目ID不能为空"); } + // 查询项目信息 + ErpProjectChangeVo vo = baseMapper.prepareByProjectId(projectId); + if (vo == null) { + throw new ServiceException("项目信息不存在"); + } // 检查是否有未完成的变更(状态1或2) List existingChanges = baseMapper.selectList( Wrappers.lambdaQuery() .eq(ErpProjectChange::getProjectId, projectId) - .in(ErpProjectChange::getProjectChangeStatus, Arrays.asList("1", "2")) + .in(ErpProjectChange::getProjectChangeStatus, Arrays.asList("1", "2"))//项目变更状态(1暂存 2审批中 3可用) .orderByDesc(ErpProjectChange::getCreateTime) ); @@ -325,17 +339,12 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { throw new ServiceException("该项目存在未完成的变更申请,请先完成或取消后再发起新的变更"); } - // 查询项目信息 - ErpProjectChangeVo vo = baseMapper.prepareByProjectId(projectId); - if (vo == null) { - throw new ServiceException("项目信息不存在"); - } // 计算变更次数(已完成的变更数量) Long changeCount = baseMapper.selectCount( Wrappers.lambdaQuery() .eq(ErpProjectChange::getProjectId, projectId) - .eq(ErpProjectChange::getProjectChangeStatus, "3") + .eq(ErpProjectChange::getProjectChangeStatus, "3")//项目变更状态(1暂存 2审批中 3可用) ); vo.setChangeNumber(changeCount.intValue() + 1); @@ -344,8 +353,8 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { ErpProjectChange lastChange = baseMapper.selectOne( Wrappers.lambdaQuery() .eq(ErpProjectChange::getProjectId, projectId) - .eq(ErpProjectChange::getProjectChangeStatus, "3") - .orderByDesc(ErpProjectChange::getCreateTime) + .eq(ErpProjectChange::getProjectChangeStatus, "3")// 项目变更状态(1暂存 2审批中 3可用) + .orderByDesc(ErpProjectChange::getChangeNumber)// 按变更次数降序 .last("limit 1") ); @@ -376,12 +385,8 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { } vo.setBudgetList(budgetList); - // 查询上一次变更的进度变更明细作为参考 - List lastProgressList = changeProgressMapper.selectList( - Wrappers.lambdaQuery() - .eq(ErpProjectChangeProgress::getProjectChangeId, lastChange.getProjectChangeId()) - .orderByAsc(ErpProjectChangeProgress::getSortOrder) - ); + // 查询上一次变更的进度变更明细作为参考(连表查询项目计划阶段,带出 projectPhases 字段) + List lastProgressList = changeProgressMapper.selectProgressWithStageInfo(lastChange.getProjectChangeId()); List progressList = new ArrayList<>(); // 将上一次的变更后时间作为本次的原计划时间 @@ -453,8 +458,7 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { ErpProjectChangeBudget budget = new ErpProjectChangeBudget(); budget.setBudgetDetailId(detail.getBudgetDetailId()); budget.setSubjectName(detail.getBudgetItem()); - //xins的预算表数据库是decimal,实体类ErpBudgetDetail却是Long,所以这里需要转换一下 - BigDecimal budgetCost = BigDecimal.valueOf(detail.getBudgetCost()); + BigDecimal budgetCost = detail.getBudgetCost(); budget.setBudgetBefore(budgetCost); budget.setBudgetAfter(budgetCost); // 默认值 budget.setAmountUsed(BigDecimal.ZERO); // 默认已使用金额为0 @@ -467,7 +471,7 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { // 设置默认状态 vo.setProjectChangeStatus("1"); // 暂存 - vo.setActiveFlag("1"); + vo.setActiveFlag("1");//默认激活 return vo; } @@ -570,6 +574,20 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { //TODO 做一些数据校验,如唯一约束 } + /** + * 首次保存时自动生成项目变更编号 + */ + private void fillProjectChangeCode(ErpProjectChange entity) { + if (StringUtils.isNotBlank(entity.getProjectChangeCode())) { + return; + } + String code = remoteCodeRuleService.selectCodeRuleCode(PROJECT_CHANGE_CODE_RULE); + if (StringUtils.isBlank(code)) { + throw new ServiceException("生成项目变更编号失败"); + } + entity.setProjectChangeCode(code); + } + /** * 查询指定项目计划的所有变更记录 * 注意:ErpProjectChange 绑定的是 project_id 而非 project_plan_id @@ -640,8 +658,19 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService { // 办理人 String handler = Convert.toStr(params.get("handler")); } - if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())){ + if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) { + projectChange.setProjectChangeStatus(OAStatusEnum.APPROVING.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())){ + // 流程完成:业务状态置为可用 projectChange.setProjectChangeStatus(OAStatusEnum.COMPLETED.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) { + // 流程作废:业务状态置为作废 + projectChange.setProjectChangeStatus(OAStatusEnum.INVALID.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) { + // 流程驳回:业务状态还原为草稿,允许重新编辑和提交 + projectChange.setProjectChangeStatus(OAStatusEnum.DRAFT.getStatus());//暂存 } baseMapper.updateById(projectChange); }); 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 6c5e9299..caf5f6da 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 @@ -90,7 +90,7 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService { MPJLambdaWrapper lqw = JoinWrappers.lambda(ErpProjectInfo.class) .selectAll(ErpProjectInfo.class) .eq(StringUtils.isNotBlank(bo.getContractFlag()), ErpProjectInfo::getContractFlag, bo.getContractFlag()) - .eq(StringUtils.isNotBlank(bo.getProjectCode()), ErpProjectInfo::getProjectCode, bo.getProjectCode()) + .like(StringUtils.isNotBlank(bo.getProjectCode()), ErpProjectInfo::getProjectCode, bo.getProjectCode()) .like(StringUtils.isNotBlank(bo.getProjectName()), ErpProjectInfo::getProjectName, bo.getProjectName()) .eq(StringUtils.isNotBlank(bo.getBusinessDirection()), ErpProjectInfo::getBusinessDirection, bo.getBusinessDirection()) .eq(StringUtils.isNotBlank(bo.getProjectCategory()), ErpProjectInfo::getProjectCategory, bo.getProjectCategory()) @@ -212,10 +212,16 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService { // 办理人 String handler = Convert.toStr(params.get("handler")); } - if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) { + if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) { + projectInfo.setProjectStatus(OAStatusEnum.APPROVING.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) { projectInfo.setProjectStatus(OAStatusEnum.COMPLETED.getStatus()); - } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())) { + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) { projectInfo.setProjectStatus(OAStatusEnum.INVALID.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) { + projectInfo.setProjectStatus(OAStatusEnum.DRAFT.getStatus()); } baseMapper.updateById(projectInfo); }); diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectPlanServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectPlanServiceImpl.java index c7c2c4d5..563a57c4 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectPlanServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectPlanServiceImpl.java @@ -2,6 +2,11 @@ package org.dromara.oa.erp.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; @@ -11,29 +16,25 @@ import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.ObjectUtils; 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 com.github.yulichang.toolkit.JoinWrappers; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.oa.erp.domain.ErpProjectInfo; +import org.dromara.oa.erp.domain.ErpProjectPlan; import org.dromara.oa.erp.domain.ErpProjectPlanStage; +import org.dromara.oa.erp.domain.bo.ErpProjectPlanBo; import org.dromara.oa.erp.domain.vo.ErpProjectPlanStageVo; +import org.dromara.oa.erp.domain.vo.ErpProjectPlanVo; +import org.dromara.oa.erp.mapper.ErpProjectPlanMapper; import org.dromara.oa.erp.mapper.ErpProjectPlanStageMapper; +import org.dromara.oa.erp.service.IErpProjectPlanService; +import org.dromara.system.api.RemoteCodeRuleService; 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.dromara.common.satoken.utils.LoginHelper; import org.springframework.stereotype.Service; -import org.dromara.oa.erp.domain.bo.ErpProjectPlanBo; -import org.dromara.oa.erp.domain.vo.ErpProjectPlanVo; -import org.dromara.oa.erp.domain.ErpProjectPlan; -import org.dromara.oa.erp.mapper.ErpProjectPlanMapper; -import org.dromara.oa.erp.service.IErpProjectPlanService; import org.springframework.transaction.annotation.Transactional; import java.util.*; @@ -50,12 +51,16 @@ import java.util.stream.Collectors; @Slf4j public class ErpProjectPlanServiceImpl implements IErpProjectPlanService { + private static final String PROJECT_PLAN_CODE_RULE = "1010"; + private final ErpProjectPlanMapper baseMapper; private final ErpProjectPlanStageMapper planStageMapper; @DubboReference(timeout = 30000) private RemoteWorkflowService remoteWorkflowService; + @DubboReference(timeout = 30000) + private RemoteCodeRuleService remoteCodeRuleService; /** * 查询项目计划 @@ -117,6 +122,7 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService { .select(ErpProjectInfo::getProjectName) .leftJoin(ErpProjectInfo.class,ErpProjectInfo::getProjectId, ErpProjectPlan::getProjectId) .eq(bo.getProjectId() != null, ErpProjectPlan::getProjectId, bo.getProjectId()) + .eq(StringUtils.isNotBlank(bo.getProjectPlanCode()), ErpProjectPlan::getProjectPlanCode, bo.getProjectPlanCode()) .eq(bo.getManagerId() != null, ErpProjectPlan::getManagerId, bo.getManagerId()) .eq(bo.getChargeId() != null, ErpProjectPlan::getChargeId, bo.getChargeId()) .eq(StringUtils.isNotBlank(bo.getPaymentMethod()), ErpProjectPlan::getPaymentMethod, bo.getPaymentMethod()) @@ -124,6 +130,7 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService { .eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpProjectPlan::getFlowStatus, bo.getFlowStatus()) .eq(bo.getSortOrder() != null, ErpProjectPlan::getSortOrder, bo.getSortOrder()) .eq(bo.getContractId() != null, ErpProjectPlan::getContractId, bo.getContractId()) + .eq(StringUtils.isNotBlank(bo.getOssId()), ErpProjectPlan::getOssId, bo.getOssId()) .eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpProjectPlan::getActiveFlag, bo.getActiveFlag()); return lqw; } @@ -138,6 +145,7 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService { @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(ErpProjectPlanBo bo) { ErpProjectPlan add = MapstructUtils.convert(bo, ErpProjectPlan.class); + fillProjectPlanCode(add); validEntityBeforeSave(add); // 权限校验:只有项目经理才能提交 validateProjectManager(bo.getManagerId()); @@ -145,6 +153,7 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService { boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setProjectPlanId(add.getProjectPlanId()); + bo.setProjectPlanCode(add.getProjectPlanCode()); if ( ObjectUtils.isNotEmpty(planStageList)) { for (ErpProjectPlanStage planStage : planStageList) { planStage.setProjectPlanId(add.getProjectPlanId()); @@ -181,12 +190,14 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService { if (planStageList != null && !planStageList.isEmpty()) { for (ErpProjectPlanStage newStage : planStageList) { if (newStage.getPlanStageId() != null) { - // 只更新delayDay、scheduleRemark和receivableDate + // 只更新delayDay、scheduleRemark、receivableDate、realStartTime、realEndTime字段 ErpProjectPlanStage existingStage = planStageMapper.selectById(newStage.getPlanStageId()); if (existingStage != null) { existingStage.setDelayDay(newStage.getDelayDay()); existingStage.setScheduleRemark(newStage.getScheduleRemark()); existingStage.setReceivableDate(newStage.getReceivableDate()); + existingStage.setRealStartTime(newStage.getRealStartTime());// 实际开始时间 + existingStage.setRealEndTime(newStage.getRealEndTime());//实际结束时间 planStageMapper.updateById(existingStage); } } @@ -198,6 +209,9 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService { // 草稿状态,允许全面更新 ErpProjectPlan update = MapstructUtils.convert(bo, ErpProjectPlan.class); + if (StringUtils.isBlank(update.getProjectPlanCode())) { + update.setProjectPlanCode(existingPlan.getProjectPlanCode()); + } validEntityBeforeSave(update); List planStageList = bo.getPlanStageList(); MPJLambdaWrapper lqwRecord = JoinWrappers.lambda(ErpProjectPlanStage.class); @@ -253,6 +267,20 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService { } } + /** + * 首次保存时自动生成项目计划编号 + */ + private void fillProjectPlanCode(ErpProjectPlan entity) { + if (StringUtils.isNotBlank(entity.getProjectPlanCode())) { + return; + } + String code = remoteCodeRuleService.selectCodeRuleCode(PROJECT_PLAN_CODE_RULE); + if (StringUtils.isBlank(code)) { + throw new ServiceException("生成项目计划编号失败"); + } + entity.setProjectPlanCode(code); + } + /** * 校验项目经理权限:只有项目经理才能提交项目计划 * @@ -341,8 +369,17 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService { // 办理人 String handler = Convert.toStr(params.get("handler")); } - if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) { + if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) { + projectPlan.setProjectPlanStatus(OAStatusEnum.APPROVING.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) { projectPlan.setProjectPlanStatus(OAStatusEnum.COMPLETED.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) { + projectPlan.setProjectPlanStatus(OAStatusEnum.INVALID.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) { + // 流程驳回:业务状态还原为草稿,允许重新编辑和提交 + projectPlan.setProjectPlanStatus(OAStatusEnum.DRAFT.getStatus()); } baseMapper.updateById(projectPlan); }); 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..ebd7b07f 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; } @@ -136,25 +155,15 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService @Override @GlobalTransactional(rollbackFor = Exception.class) public ErpProjectPurchaseVo projectPurchaseSubmitAndFlowStart(ErpProjectPurchaseBo bo) { - ErpProjectPurchase entity = MapstructUtils.convert(bo, ErpProjectPurchase.class); - validEntityBeforeSave(entity); + ErpProjectPurchase add = MapstructUtils.convert(bo, ErpProjectPurchase.class); + validEntityBeforeSave(add); if (bo.getProjectPurchaseId() == null) { this.insertByBo(bo); } else { this.updateByBo(bo); } - if (bo.getVariables() == null) { - bo.setVariables(new HashMap<>()); - } bo.getVariables().put("ignore", true); - if (StringUtils.isBlank(bo.getFlowCode())) { - throw new ServiceException("流程编码不能为空"); - } RemoteFlowInstanceBizExt bizExt = bo.getBizExt(); - if (bizExt == null) { - bizExt = new RemoteFlowInstanceBizExt(); - bo.setBizExt(bizExt); - } RemoteStartProcess startProcess = new RemoteStartProcess(); startProcess.setBusinessId(String.valueOf(bo.getProjectPurchaseId())); startProcess.setFlowCode(bo.getFlowCode()); @@ -165,13 +174,7 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService if (!started) { throw new ServiceException("流程发起异常"); } - // 更新状态为审批中 - ErpProjectPurchase updateStatus = new ErpProjectPurchase(); - updateStatus.setProjectPurchaseId(bo.getProjectPurchaseId()); - updateStatus.setFlowStatus(BusinessStatusEnum.WAITING.getStatus()); - updateStatus.setProjectPurchaseStatus("2"); - baseMapper.updateById(updateStatus); - return queryById(bo.getProjectPurchaseId()); + return MapstructUtils.convert(add, ErpProjectPurchaseVo.class); } /** @@ -181,10 +184,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 +241,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 +280,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/java/org/dromara/oa/erp/service/impl/ErpProjectReceivingServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectReceivingServiceImpl.java new file mode 100644 index 00000000..53bc28e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectReceivingServiceImpl.java @@ -0,0 +1,365 @@ +package org.dromara.oa.erp.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.map.MapUtil; +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.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.oa.erp.domain.ErpProjectInfo; +import org.dromara.oa.erp.domain.ErpProjectReceiving; +import org.dromara.oa.erp.domain.bo.ErpProjectReceivingBo; +import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo; +import org.dromara.oa.erp.domain.vo.ErpProjectReceivingVo; +import org.dromara.oa.erp.mapper.ErpProjectInfoMapper; +import org.dromara.oa.erp.mapper.ErpProjectReceivingMapper; +import org.dromara.oa.erp.service.IErpProjectReceivingService; +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 java.util.*; + +/** + * 项目收货确认Service业务层处理 + * + * @author Yinq + * @date 2025-11-12 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class ErpProjectReceivingServiceImpl implements IErpProjectReceivingService { + + private static final String RECEIVING_CODE_RULE = "1009"; + + private final ErpProjectReceivingMapper baseMapper; + private final ErpProjectInfoMapper projectInfoMapper; + + @DubboReference(timeout = 30000) + private RemoteWorkflowService remoteWorkflowService; + @DubboReference(timeout = 30000) + private RemoteCodeRuleService remoteCodeRuleService; + + /** + * 查询项目收货确认 + * + * @param receivingId 主键 + * @return 项目收货确认 + */ + @Override + public ErpProjectReceivingVo queryById(Long receivingId){ + return baseMapper.selectCustomErpProjectReceivingVoById(receivingId); + } + + /** + * 分页查询项目收货确认列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 项目收货确认分页列表 + */ + @Override + public TableDataInfo queryPageList(ErpProjectReceivingBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectCustomErpProjectReceivingVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的项目收货确认列表 + * + * @param bo 查询条件 + * @return 项目收货确认列表 + */ + @Override + public List queryList(ErpProjectReceivingBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectCustomErpProjectReceivingVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(ErpProjectReceivingBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(ErpProjectReceiving.class) + .selectAll(ErpProjectReceiving.class) + .eq(ErpProjectReceiving::getDelFlag, "0") + .eq(StringUtils.isNotBlank(bo.getProjectCode()), ErpProjectReceiving::getProjectCode, bo.getProjectCode()) + .like(StringUtils.isNotBlank(bo.getProjectName()), ErpProjectReceiving::getProjectName, bo.getProjectName()) + .eq(bo.getManagerId() != null, ErpProjectReceiving::getManagerId, bo.getManagerId()) + .eq(bo.getArrivalDate() != null, ErpProjectReceiving::getArrivalDate, bo.getArrivalDate()) + .eq(StringUtils.isNotBlank(bo.getOssId()), ErpProjectReceiving::getOssId, bo.getOssId()) + .eq(bo.getChargeId() != null, ErpProjectReceiving::getChargeId, bo.getChargeId()) + .eq(bo.getDeputyId() != null, ErpProjectReceiving::getDeputyId, bo.getDeputyId()); + if (params != null) { + String beginTime = Convert.toStr(params.get("beginTime")); + String endTime = Convert.toStr(params.get("endTime")); + lqw.ge(StringUtils.isNotBlank(beginTime), ErpProjectReceiving::getArrivalDate, beginTime) + .le(StringUtils.isNotBlank(endTime), ErpProjectReceiving::getArrivalDate, endTime); + } + return lqw; + } + + /** + * 新增项目收货确认 + * + * @param bo 项目收货确认 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(ErpProjectReceivingBo bo) { + // 权限校验:只有项目经理才能提交 + validateProjectManager(bo.getManagerId()); + + ErpProjectReceiving add = MapstructUtils.convert(bo, ErpProjectReceiving.class); + fillReceivingCode(add); + validEntityBeforeSave(add); + // 默认业务状态:暂存 + if (StringUtils.isBlank(add.getReceivingStatus())) { + add.setReceivingStatus(OAStatusEnum.DRAFT.getStatus()); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setReceivingId(add.getReceivingId()); + bo.setReceivingCode(add.getReceivingCode()); + } + return flag; + } + + /** + * 修改项目收货确认 + * + * @param bo 项目收货确认 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(ErpProjectReceivingBo bo) { + // 权限校验:只有项目经理才能修改 + ErpProjectReceiving existing = baseMapper.selectById(bo.getReceivingId()); + if (existing == null) { + throw new ServiceException("项目收货确认不存在"); + } + validateProjectManager(existing.getManagerId()); + + ErpProjectReceiving update = MapstructUtils.convert(bo, ErpProjectReceiving.class); + if (StringUtils.isBlank(update.getReceivingCode())) { + update.setReceivingCode(existing.getReceivingCode()); + } + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ErpProjectReceiving entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 首次保存时自动生成收货确认编号 + */ + private void fillReceivingCode(ErpProjectReceiving entity) { + if (StringUtils.isNotBlank(entity.getReceivingCode())) { + return; + } + String code = remoteCodeRuleService.selectCodeRuleCode(RECEIVING_CODE_RULE); + if (StringUtils.isBlank(code)) { + throw new ServiceException("生成收货确认编号失败"); + } + entity.setReceivingCode(code); + } + + /** + * 校验项目经理权限:只有项目经理才能提交/修改项目收货确认 + * + * @param managerId 项目经理ID + */ + private void validateProjectManager(Long managerId) { + // 超级管理员跳过校验 + if (LoginHelper.isSuperAdmin()) { + return; + } + // 普通用户判断当前用户ID是否等于项目经理ID + Long currentUserId = LoginHelper.getUserId(); + if (!Objects.equals(currentUserId, managerId)) { + throw new ServiceException("只有项目经理才能提交或修改项目收货确认"); + } + } + + /** + * 校验并批量删除项目收货确认信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 根据项目ID准备收货信息 + * + * @param projectId 项目ID + * @return 项目收货确认信息 + */ + @Override + public ErpProjectReceivingVo prepareByProjectId(Long projectId) { + if (projectId == null) { + throw new ServiceException("项目ID不能为空"); + } + + // 查询项目信息 + ErpProjectInfoVo projectInfo = projectInfoMapper.selectVoById(projectId); + if (projectInfo == null) { + throw new ServiceException("项目信息不存在"); + } + + // 构造收货信息 + ErpProjectReceivingVo vo = new ErpProjectReceivingVo(); + vo.setProjectId(projectInfo.getProjectId()); + vo.setProjectCode(projectInfo.getProjectCode()); + vo.setProjectName(projectInfo.getProjectName()); + vo.setManagerId(projectInfo.getManagerId()); + vo.setProjectManagerName(projectInfo.getManagerName()); + vo.setChargeId(projectInfo.getChargeId()); + vo.setChargeName(projectInfo.getChargeName()); + vo.setDeputyId(projectInfo.getDeputyId()); + vo.setDeputyName(projectInfo.getDeputyName()); + + return vo; + } + + /** + * 提交项目收货确认并发起流程 + * + * @param bo 项目收货确认 + * @return 项目收货确认信息 + */ + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public ErpProjectReceivingVo submitAndFlowStart(ErpProjectReceivingBo bo) { + // 权限校验:只有项目经理才能提交 + validateProjectManager(bo.getManagerId()); + + ErpProjectReceiving add = MapstructUtils.convert(bo, ErpProjectReceiving.class); + validEntityBeforeSave(add); + + // 保存或更新 + if (StringUtils.isNull(bo.getReceivingId())) { + this.insertByBo(bo); + } else { + this.updateByBo(bo); + } + + // 发起流程(空值保护) + if (bo.getVariables() == null) { + bo.setVariables(new HashMap<>()); + } + bo.getVariables().put("ignore", true); + RemoteStartProcess startProcess = new RemoteStartProcess(); + startProcess.setBusinessId(bo.getReceivingId().toString()); + startProcess.setFlowCode(bo.getFlowCode()); + startProcess.setVariables(bo.getVariables()); + if (bo.getBizExt() == null) { + bo.setBizExt(new RemoteFlowInstanceBizExt()); + } + if (StringUtils.isNotEmpty(bo.getReceivingCode())) { + bo.getBizExt().setBusinessCode(bo.getReceivingCode()); + } + startProcess.setBizExt(bo.getBizExt()); + bo.getBizExt().setBusinessId(startProcess.getBusinessId()); + + boolean flagOne = remoteWorkflowService.startCompleteTask(startProcess); + if (!flagOne) { + throw new ServiceException("流程发起异常"); + } + + return MapstructUtils.convert(add, ErpProjectReceivingVo.class); + } + + /** + * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成等) + * + * @param processEvent 参数 + */ + @EventListener(condition = "#processEvent.flowCode =='OAPR'") + public void processHandler(ProcessEvent processEvent) { + TenantHelper.dynamic(processEvent.getTenantId(), () -> { + log.info("项目收货流程执行:{}", processEvent.toString()); + ErpProjectReceiving receiving = baseMapper.selectById(Convert.toLong(processEvent.getBusinessId())); + if (receiving != null) { + // 更新流程状态 + receiving.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())) { + receiving.setReceivingStatus(OAStatusEnum.APPROVING.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) { + receiving.setReceivingStatus(OAStatusEnum.COMPLETED.getStatus()); + + // 审批完成后,更新项目信息的项目状态为 5(已收货) + Long projectId = receiving.getProjectId(); + if (projectId != null) { + ErpProjectInfo projectInfo = projectInfoMapper.selectById(projectId); + if (projectInfo != null) { + String currentStatus = projectInfo.getProjectStatus(); + boolean needUpdate = false; + if (StringUtils.isBlank(currentStatus)) { + needUpdate = true; + } else { + try { + /**若项目当前状态为空或“小于 5”(比如 1 暂存、3 可用、),则升级为 "5"(已验收); +不会把状态从更高值回退(如果以后有 8 之类更高状态,也不会被强制降级到 5)。 */ + needUpdate = Integer.parseInt(currentStatus) < 5; + } catch (NumberFormatException e) { + // 非数字状态直接覆盖为已收货 + needUpdate = true; + } + } + if (needUpdate) { + projectInfo.setProjectStatus("5"); // 5:已收货 + projectInfoMapper.updateById(projectInfo); + } + } + } + + log.info("项目收货确认完成: receivingId={}", receiving.getReceivingId()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) { + receiving.setReceivingStatus(OAStatusEnum.INVALID.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) { + // 流程驳回:业务状态还原为草稿,允许重新编辑和提交 + receiving.setReceivingStatus(OAStatusEnum.DRAFT.getStatus());//暂存 + } + baseMapper.updateById(receiving); + } + }); + } + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpContractInfoMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpContractInfoMapper.xml index 2a7ad67d..ec7a3e37 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpContractInfoMapper.xml +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpContractInfoMapper.xml @@ -11,6 +11,7 @@ t.tenant_id, t.contract_flag, t.contract_code, + t.customer_contract_code, t.contract_name, t.contract_category, t.contract_type, diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectAcceptanceMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectAcceptanceMapper.xml new file mode 100644 index 00000000..e9d96236 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectAcceptanceMapper.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into erp_project_acceptance( + tenant_id, + + project_id, + + project_code, + + project_name, + + manager_id, + + acceptance_date, + + oss_id, + + acceptance_code, + + charge_id, + + deputy_id, + + remark, + + del_flag, + + create_dept, + + create_by, + + create_time, + + update_by, + + update_time + + ) + values + + ( + #{item.tenantId}, + + #{item.projectId}, + + #{item.projectCode}, + + #{item.projectName}, + + #{item.managerId}, + + #{item.acceptanceDate}, + + #{item.ossId}, + + #{item.acceptanceCode}, + + #{item.chargeId}, + + #{item.deputyId}, + + #{item.remark}, + + #{item.delFlag}, + + #{item.createDept}, + + #{item.createBy}, + + #{item.createTime}, + + #{item.updateBy}, + + #{item.updateTime} + + ) + + + + + + + update erp_project_acceptance + + + tenant_id = #{item.tenantId}, + + + project_id = #{item.projectId}, + + + project_code = #{item.projectCode}, + + + project_name = #{item.projectName}, + + + manager_id = #{item.managerId}, + + + acceptance_date = #{item.acceptanceDate}, + + + oss_id = #{item.ossId}, + + + acceptance_code = #{item.acceptanceCode}, + + + charge_id = #{item.chargeId}, + + + deputy_id = #{item.deputyId}, + + + remark = #{item.remark}, + + + del_flag = #{item.delFlag}, + + + create_dept = #{item.createDept}, + + + create_by = #{item.createBy}, + + + create_time = #{item.createTime}, + + + update_by = #{item.updateBy}, + + + update_time = #{item.updateTime} + + + where acceptance_id = #{item.acceptanceId} + + + + + + delete from erp_project_acceptance + ${ew.getCustomSqlSegment} + + + + + delete from erp_project_acceptance + where acceptance_id in + + #{id} + + + + + + + + diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectChangeMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectChangeMapper.xml index 9db0fd87..1a7d3f96 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectChangeMapper.xml +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectChangeMapper.xml @@ -7,7 +7,7 @@ - select t.project_change_id, t.tenant_id, t.project_id, t.project_code, t.project_name, t.project_category, + select t.project_change_id, t.project_change_code, t.tenant_id, t.project_id, t.project_code, t.project_name, t.project_category, t.change_type, t.change_number, t.project_manager_id, t.dept_head_id, t.responsible_vp_id, t.apply_change_date, t.contract_amount, t.contract_net_amount, t.current_status, t.change_reason, t.follow_up_work, t.project_change_status, t.flow_status, t.remark, t.active_flag, t.del_flag, @@ -45,7 +45,7 @@ - select project_change_id, tenant_id, project_id, project_code, project_name, project_category, change_type, change_number, project_manager_id, project_manager_name, dept_head_id, dept_head_name, responsible_vp_id, responsible_vp_name, apply_change_date, contract_amount, contract_net_amount, current_status, change_reason, follow_up_work, project_change_status, flow_status, remark, active_flag, del_flag, create_dept, create_by, create_time, update_by, update_time + select project_change_id, project_change_code, tenant_id, project_id, project_code, project_name, project_category, change_type, change_number, project_manager_id, project_manager_name, dept_head_id, dept_head_name, responsible_vp_id, responsible_vp_name, apply_change_date, contract_amount, contract_net_amount, current_status, change_reason, follow_up_work, project_change_status, flow_status, remark, active_flag, del_flag, create_dept, create_by, create_time, update_by, update_time from erp_project_change t ${ew.getCustomSqlSegment} @@ -73,6 +73,8 @@ project_id, + project_change_code, + project_code, project_name, @@ -135,6 +137,8 @@ #{item.projectId}, + #{item.projectChangeCode}, + #{item.projectCode}, #{item.projectName}, @@ -204,6 +208,9 @@ project_id = #{item.projectId}, + + project_change_code = #{item.projectChangeCode}, + project_code = #{item.projectCode}, diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectPlanMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectPlanMapper.xml index 97abedb8..7ae0f312 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectPlanMapper.xml +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectPlanMapper.xml @@ -10,6 +10,7 @@ select t.project_plan_id, t.tenant_id, t.project_id, + t.project_plan_code, t.manager_id, t.charge_id, t.payment_method, @@ -17,6 +18,7 @@ t.flow_status, t.sort_order, t.contract_id, + t.oss_id, t.remark, t.active_flag, t.del_flag, @@ -27,14 +29,16 @@ t.update_time, p.project_name, u1.nick_name as managerName, + d1.dept_name as managerDeptName, u2.nick_name as chargeName, c.contract_name as contractName, u3.nick_name as createName from erp_project_plan t left join erp_project_info p on t.project_id = p.project_id left join sys_user u1 on t.manager_id = u1.user_id + left join sys_dept d1 on u1.dept_id = d1.dept_id left join sys_user u2 on t.charge_id = u2.user_id - left join sys_user u3 on t.create_by = u3.user_id + left join sys_user u3 on t.create_by = u3.user_id left join erp_contract_info c on t.contract_id = c.contract_id ${ew.getCustomSqlSegment} @@ -44,6 +48,7 @@ select t.project_plan_id, t.tenant_id, t.project_id, + t.project_plan_code, t.manager_id, t.charge_id, t.payment_method, @@ -51,6 +56,7 @@ t.flow_status, t.sort_order, t.contract_id, + t.oss_id, t.remark, t.active_flag, t.del_flag, @@ -61,11 +67,13 @@ t.update_time, p.project_name, u1.nick_name as managerName, + d1.dept_name as managerDeptName, u2.nick_name as chargeName, c.contract_name as contractName from erp_project_plan t left join erp_project_info p on t.project_id = p.project_id left join sys_user u1 on t.manager_id = u1.user_id + left join sys_dept d1 on u1.dept_id = d1.dept_id left join sys_user u2 on t.charge_id = u2.user_id left join erp_contract_info c on t.contract_id = c.contract_id where t.project_plan_id = #{projectPlanId} @@ -76,6 +84,7 @@ select t.project_plan_id, t.tenant_id, t.project_id, + t.project_plan_code, t.manager_id, t.charge_id, t.payment_method, @@ -83,6 +92,7 @@ t.flow_status, t.sort_order, t.contract_id, + t.oss_id, t.remark, t.active_flag, t.del_flag, @@ -93,11 +103,13 @@ t.update_time, p.project_name, u1.nick_name as managerName, + d1.dept_name as managerDeptName, u2.nick_name as chargeName, c.contract_name as contractName from erp_project_plan t left join erp_project_info p on t.project_id = p.project_id left join sys_user u1 on t.manager_id = u1.user_id + left join sys_dept d1 on u1.dept_id = d1.dept_id left join sys_user u2 on t.charge_id = u2.user_id left join erp_contract_info c on t.contract_id = c.contract_id where t.project_plan_id in @@ -117,6 +129,7 @@ select t.project_plan_id, t.tenant_id, t.project_id, + t.project_plan_code, t.manager_id, t.charge_id, t.payment_method, @@ -124,6 +137,7 @@ t.flow_status, t.sort_order, t.contract_id, + t.oss_id, t.remark, t.active_flag, t.del_flag, @@ -134,11 +148,13 @@ t.update_time, p.project_name, u1.nick_name as managerName, + d1.dept_name as managerDeptName, u2.nick_name as chargeName, c.contract_name as contractName from erp_project_plan t left join erp_project_info p on t.project_id = p.project_id left join sys_user u1 on t.manager_id = u1.user_id + left join sys_dept d1 on u1.dept_id = d1.dept_id left join sys_user u2 on t.charge_id = u2.user_id left join erp_contract_info c on t.contract_id = c.contract_id ${ew.getCustomSqlSegment} @@ -151,6 +167,8 @@ project_id, + project_plan_code, + manager_id, charge_id, @@ -165,6 +183,8 @@ contract_id, + oss_id, + remark, active_flag, @@ -189,6 +209,8 @@ #{item.projectId}, + #{item.projectPlanCode}, + #{item.managerId}, #{item.chargeId}, @@ -203,6 +225,8 @@ #{item.contractId}, + #{item.ossId}, + #{item.remark}, #{item.activeFlag}, @@ -234,6 +258,9 @@ project_id = #{item.projectId}, + + project_plan_code = #{item.projectPlanCode}, + manager_id = #{item.managerId}, @@ -255,6 +282,9 @@ contract_id = #{item.contractId}, + + oss_id = #{item.ossId}, + remark = #{item.remark}, 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..f2810543 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,44 @@ 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..c8b52e42 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,97 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectReceivingMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectReceivingMapper.xml new file mode 100644 index 00000000..b2503650 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectReceivingMapper.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into erp_project_receiving( + tenant_id, + + project_id, + + project_code, + + project_name, + + manager_id, + + arrival_date, + + oss_id, + + receiving_code, + + charge_id, + + deputy_id, + + remark, + + del_flag, + + create_dept, + + create_by, + + create_time, + + update_by, + + update_time + + ) + values + + ( + #{item.tenantId}, + + #{item.projectId}, + + #{item.projectCode}, + + #{item.projectName}, + + #{item.managerId}, + + #{item.arrivalDate}, + + #{item.ossId}, + + #{item.receivingCode}, + + #{item.chargeId}, + + #{item.deputyId}, + + #{item.remark}, + + #{item.delFlag}, + + #{item.createDept}, + + #{item.createBy}, + + #{item.createTime}, + + #{item.updateBy}, + + #{item.updateTime} + + ) + + + + + + + update erp_project_receiving + + + tenant_id = #{item.tenantId}, + + + project_id = #{item.projectId}, + + + project_code = #{item.projectCode}, + + + project_name = #{item.projectName}, + + + manager_id = #{item.managerId}, + + + arrival_date = #{item.arrivalDate}, + + + oss_id = #{item.ossId}, + + + receiving_code = #{item.receivingCode}, + + + charge_id = #{item.chargeId}, + + + deputy_id = #{item.deputyId}, + + + remark = #{item.remark}, + + + del_flag = #{item.delFlag}, + + + create_dept = #{item.createDept}, + + + create_by = #{item.createBy}, + + + create_time = #{item.createTime}, + + + update_by = #{item.updateBy}, + + + update_time = #{item.updateTime} + + + where receiving_id = #{item.receivingId} + + + + + + delete from erp_project_receiving + ${ew.getCustomSqlSegment} + + + + + delete from erp_project_receiving + where receiving_id in + + #{id} + + + + + + + +