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/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/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/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/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/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/ErpProjectAcceptanceVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectAcceptanceVo.java new file mode 100644 index 00000000..3ab5f0b7 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectAcceptanceVo.java @@ -0,0 +1,124 @@ +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; + + /** + * 流程状态 + */ + @ExcelProperty(value = "流程状态") + private String flowStatus; + + +} 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..25522ed9 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectReceivingVo.java @@ -0,0 +1,124 @@ +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; + + /** + * 流程状态 + */ + @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/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/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/ErpProjectAcceptanceServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectAcceptanceServiceImpl.java new file mode 100644 index 00000000..01bc78e0 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectAcceptanceServiceImpl.java @@ -0,0 +1,314 @@ +package org.dromara.oa.erp.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.map.MapUtil; +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.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.satoken.utils.LoginHelper; +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 com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.oa.erp.domain.bo.ErpProjectAcceptanceBo; +import org.dromara.oa.erp.domain.vo.ErpProjectAcceptanceVo; +import org.dromara.oa.erp.domain.ErpProjectAcceptance; +import org.dromara.oa.erp.domain.ErpProjectInfo; +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 java.util.List; +import java.util.Map; +import java.util.Collection; +import java.util.Objects; + +/** + * 项目验收确认Service业务层处理 + * + * @author Yinq + * @date 2025-11-12 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class ErpProjectAcceptanceServiceImpl implements IErpProjectAcceptanceService { + + private final ErpProjectAcceptanceMapper baseMapper; + private final ErpProjectInfoMapper projectInfoMapper; + + @DubboReference(timeout = 30000) + private RemoteWorkflowService remoteWorkflowService; + + /** + * 查询项目验收确认 + * + * @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); + validEntityBeforeSave(add); + // 默认业务状态:暂存 + if (StringUtils.isBlank(add.getAcceptanceStatus())) { + add.setAcceptanceStatus(OAStatusEnum.DRAFT.getStatus()); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setAcceptanceId(add.getAcceptanceId()); + } + 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); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ErpProjectAcceptance entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验项目经理权限:只有项目经理才能提交/修改项目验收确认 + * + * @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.FINISH.getStatus())) { + acceptance.setAcceptanceStatus(OAStatusEnum.COMPLETED.getStatus()); + 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()); + } + baseMapper.updateById(acceptance); + } + }); + } + +} 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..deb66019 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectReceivingServiceImpl.java @@ -0,0 +1,310 @@ +package org.dromara.oa.erp.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.map.MapUtil; +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.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.satoken.utils.LoginHelper; +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 com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.oa.erp.domain.bo.ErpProjectReceivingBo; +import org.dromara.oa.erp.domain.vo.ErpProjectReceivingVo; +import org.dromara.oa.erp.domain.ErpProjectReceiving; +import org.dromara.oa.erp.domain.ErpProjectInfo; +import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo; +import org.dromara.oa.erp.mapper.ErpProjectReceivingMapper; +import org.dromara.oa.erp.mapper.ErpProjectInfoMapper; +import org.dromara.oa.erp.service.IErpProjectReceivingService; + +import java.util.*; + +/** + * 项目收货确认Service业务层处理 + * + * @author Yinq + * @date 2025-11-12 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class ErpProjectReceivingServiceImpl implements IErpProjectReceivingService { + + private final ErpProjectReceivingMapper baseMapper; + private final ErpProjectInfoMapper projectInfoMapper; + + @DubboReference(timeout = 30000) + private RemoteWorkflowService remoteWorkflowService; + + /** + * 查询项目收货确认 + * + * @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); + validEntityBeforeSave(add); + // 默认业务状态:暂存 + if (StringUtils.isBlank(add.getReceivingStatus())) { + add.setReceivingStatus(OAStatusEnum.DRAFT.getStatus()); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setReceivingId(add.getReceivingId()); + } + 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); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ErpProjectReceiving entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验项目经理权限:只有项目经理才能提交/修改项目收货确认 + * + * @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.FINISH.getStatus())) { + receiving.setReceivingStatus(OAStatusEnum.COMPLETED.getStatus()); + 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()); + } + baseMapper.updateById(receiving); + } + }); + } + +} 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..5be4aecf --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectAcceptanceMapper.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/ErpProjectReceivingMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectReceivingMapper.xml new file mode 100644 index 00000000..68cc1ca0 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpProjectReceivingMapper.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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} + + + + + + + +