diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetDeptController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetDeptController.java new file mode 100644 index 00000000..c23f4a6b --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetDeptController.java @@ -0,0 +1,116 @@ +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.ErpTimesheetDeptVo; +import org.dromara.oa.erp.domain.bo.ErpTimesheetDeptBo; +import org.dromara.oa.erp.service.IErpTimesheetDeptService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 部门工作明细 + * 前端访问路由地址为:/oa/erp/timesheetDept + * + * @author Yangk + * @date 2025-12-09 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/erp/timesheetDept") +public class ErpTimesheetDeptController extends BaseController { + + private final IErpTimesheetDeptService erpTimesheetDeptService; + + /** + * 查询部门工作明细列表 + */ + @SaCheckPermission("oa/erp:timesheetDept:list") + @GetMapping("/list") + public TableDataInfo list(ErpTimesheetDeptBo bo, PageQuery pageQuery) { + return erpTimesheetDeptService.queryPageList(bo, pageQuery); + } + + /** + * 导出部门工作明细列表 + */ + @SaCheckPermission("oa/erp:timesheetDept:export") + @Log(title = "部门工作明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ErpTimesheetDeptBo bo, HttpServletResponse response) { + List list = erpTimesheetDeptService.queryList(bo); + ExcelUtil.exportExcel(list, "部门工作明细", ErpTimesheetDeptVo.class, response); + } + + /** + * 获取部门工作明细详细信息 + * + * @param timesheetDeptId 主键 + */ + @SaCheckPermission("oa/erp:timesheetDept:query") + @GetMapping("/{timesheetDeptId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("timesheetDeptId") Long timesheetDeptId) { + return R.ok(erpTimesheetDeptService.queryById(timesheetDeptId)); + } + + /** + * 新增部门工作明细 + */ + @SaCheckPermission("oa/erp:timesheetDept:add") + @Log(title = "部门工作明细", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ErpTimesheetDeptBo bo) { + return toAjax(erpTimesheetDeptService.insertByBo(bo)); + } + + /** + * 修改部门工作明细 + */ + @SaCheckPermission("oa/erp:timesheetDept:edit") + @Log(title = "部门工作明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ErpTimesheetDeptBo bo) { + return toAjax(erpTimesheetDeptService.updateByBo(bo)); + } + + /** + * 删除部门工作明细 + * + * @param timesheetDeptIds 主键串 + */ + @SaCheckPermission("oa/erp:timesheetDept:remove") + @Log(title = "部门工作明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{timesheetDeptIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("timesheetDeptIds") Long[] timesheetDeptIds) { + return toAjax(erpTimesheetDeptService.deleteWithValidByIds(List.of(timesheetDeptIds), true)); + } + + /** + * 下拉框查询部门工作明细列表 + */ + @GetMapping("/getErpTimesheetDeptList") + public R> getErpTimesheetDeptList(ErpTimesheetDeptBo bo) { + List list = erpTimesheetDeptService.queryList(bo); + return R.ok(list); + } + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetInfoController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetInfoController.java new file mode 100644 index 00000000..a6a59643 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetInfoController.java @@ -0,0 +1,116 @@ +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.ErpTimesheetInfoVo; +import org.dromara.oa.erp.domain.bo.ErpTimesheetInfoBo; +import org.dromara.oa.erp.service.IErpTimesheetInfoService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 工时填报 + * 前端访问路由地址为:/oa/erp/timesheetInfo + * + * @author Yangk + * @date 2025-12-09 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/erp/timesheetInfo") +public class ErpTimesheetInfoController extends BaseController { + + private final IErpTimesheetInfoService erpTimesheetInfoService; + + /** + * 查询工时填报列表 + */ + @SaCheckPermission("oa/erp:timesheetInfo:list") + @GetMapping("/list") + public TableDataInfo list(ErpTimesheetInfoBo bo, PageQuery pageQuery) { + return erpTimesheetInfoService.queryPageList(bo, pageQuery); + } + + /** + * 导出工时填报列表 + */ + @SaCheckPermission("oa/erp:timesheetInfo:export") + @Log(title = "工时填报", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ErpTimesheetInfoBo bo, HttpServletResponse response) { + List list = erpTimesheetInfoService.queryList(bo); + ExcelUtil.exportExcel(list, "工时填报", ErpTimesheetInfoVo.class, response); + } + + /** + * 获取工时填报详细信息 + * + * @param timesheetId 主键 + */ + @SaCheckPermission("oa/erp:timesheetInfo:query") + @GetMapping("/{timesheetId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("timesheetId") Long timesheetId) { + return R.ok(erpTimesheetInfoService.queryById(timesheetId)); + } + + /** + * 新增工时填报 + */ + @SaCheckPermission("oa/erp:timesheetInfo:add") + @Log(title = "工时填报", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ErpTimesheetInfoBo bo) { + return toAjax(erpTimesheetInfoService.insertByBo(bo)); + } + + /** + * 修改工时填报 + */ + @SaCheckPermission("oa/erp:timesheetInfo:edit") + @Log(title = "工时填报", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ErpTimesheetInfoBo bo) { + return toAjax(erpTimesheetInfoService.updateByBo(bo)); + } + + /** + * 删除工时填报 + * + * @param timesheetIds 主键串 + */ + @SaCheckPermission("oa/erp:timesheetInfo:remove") + @Log(title = "工时填报", businessType = BusinessType.DELETE) + @DeleteMapping("/{timesheetIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("timesheetIds") Long[] timesheetIds) { + return toAjax(erpTimesheetInfoService.deleteWithValidByIds(List.of(timesheetIds), true)); + } + + /** + * 下拉框查询工时填报列表 + */ + @GetMapping("/getErpTimesheetInfoList") + public R> getErpTimesheetInfoList(ErpTimesheetInfoBo bo) { + List list = erpTimesheetInfoService.queryList(bo); + return R.ok(list); + } + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetProjectController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetProjectController.java new file mode 100644 index 00000000..7b3ef15a --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetProjectController.java @@ -0,0 +1,116 @@ +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.ErpTimesheetProjectVo; +import org.dromara.oa.erp.domain.bo.ErpTimesheetProjectBo; +import org.dromara.oa.erp.service.IErpTimesheetProjectService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 项目工作明细 + * 前端访问路由地址为:/oa/erp/timesheetProject + * + * @author Yangk + * @date 2025-12-09 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/erp/timesheetProject") +public class ErpTimesheetProjectController extends BaseController { + + private final IErpTimesheetProjectService erpTimesheetProjectService; + + /** + * 查询项目工作明细列表 + */ + @SaCheckPermission("oa/erp:timesheetProject:list") + @GetMapping("/list") + public TableDataInfo list(ErpTimesheetProjectBo bo, PageQuery pageQuery) { + return erpTimesheetProjectService.queryPageList(bo, pageQuery); + } + + /** + * 导出项目工作明细列表 + */ + @SaCheckPermission("oa/erp:timesheetProject:export") + @Log(title = "项目工作明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ErpTimesheetProjectBo bo, HttpServletResponse response) { + List list = erpTimesheetProjectService.queryList(bo); + ExcelUtil.exportExcel(list, "项目工作明细", ErpTimesheetProjectVo.class, response); + } + + /** + * 获取项目工作明细详细信息 + * + * @param timesheetProjectId 主键 + */ + @SaCheckPermission("oa/erp:timesheetProject:query") + @GetMapping("/{timesheetProjectId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("timesheetProjectId") Long timesheetProjectId) { + return R.ok(erpTimesheetProjectService.queryById(timesheetProjectId)); + } + + /** + * 新增项目工作明细 + */ + @SaCheckPermission("oa/erp:timesheetProject:add") + @Log(title = "项目工作明细", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ErpTimesheetProjectBo bo) { + return toAjax(erpTimesheetProjectService.insertByBo(bo)); + } + + /** + * 修改项目工作明细 + */ + @SaCheckPermission("oa/erp:timesheetProject:edit") + @Log(title = "项目工作明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ErpTimesheetProjectBo bo) { + return toAjax(erpTimesheetProjectService.updateByBo(bo)); + } + + /** + * 删除项目工作明细 + * + * @param timesheetProjectIds 主键串 + */ + @SaCheckPermission("oa/erp:timesheetProject:remove") + @Log(title = "项目工作明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{timesheetProjectIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("timesheetProjectIds") Long[] timesheetProjectIds) { + return toAjax(erpTimesheetProjectService.deleteWithValidByIds(List.of(timesheetProjectIds), true)); + } + + /** + * 下拉框查询项目工作明细列表 + */ + @GetMapping("/getErpTimesheetProjectList") + public R> getErpTimesheetProjectList(ErpTimesheetProjectBo bo) { + List list = erpTimesheetProjectService.queryList(bo); + return R.ok(list); + } + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpTimesheetDept.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpTimesheetDept.java new file mode 100644 index 00000000..6b6712c4 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpTimesheetDept.java @@ -0,0 +1,68 @@ +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.io.Serial; +import java.math.BigDecimal; + +/** + * 部门工作明细对象 erp_timesheet_dept + * + * @author Yangk + * @date 2025-12-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("erp_timesheet_dept") +public class ErpTimesheetDept extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门工作ID + */ + @TableId(value = "timesheet_dept_id", type = IdType.ASSIGN_ID) + private Long timesheetDeptId; + + /** + * 工时填报ID + */ + private Long timesheetId; + + /** + * 序号 + */ + private Long sortOrder; + + /** + * 部门工作描述 + */ + private String workDescription; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 部门直线经理ID + */ + private Long deptManagerId; + + /** + * 工时 + */ + private BigDecimal hours; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpTimesheetInfo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpTimesheetInfo.java new file mode 100644 index 00000000..83fcebab --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpTimesheetInfo.java @@ -0,0 +1,96 @@ +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.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 工时填报对象 erp_timesheet_info + * + * @author Yangk + * @date 2025-12-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("erp_timesheet_info") +public class ErpTimesheetInfo extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 工时填报ID + */ + @TableId(value = "timesheet_id", type = IdType.ASSIGN_ID) + private Long timesheetId; + + /** + * 工时填报编号 + */ + private String timesheetCode; + + /** + * 人员ID(填报人) + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 起始时间(自然周的周一) + */ + private Date startTime; + + /** + * 结束时间(自然周的周日) + */ + private Date endTime; + + /** + * 总工时(自动累计) + */ + private BigDecimal totalHours; + + /** + * 部门工时(根据部门工作自动累计) + */ + private BigDecimal deptHours; + + /** + * 项目工时(根据项目工作自动累计) + */ + private BigDecimal projectHours; + + /** + * 工时填报状态(1暂存 2审批中 3已审批 4作废) + */ + private String timesheetStatus; + + /** + * 流程状态 + */ + private String flowStatus; + + /** + * 备注 + */ + private String remark; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpTimesheetProject.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpTimesheetProject.java new file mode 100644 index 00000000..271770f1 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpTimesheetProject.java @@ -0,0 +1,78 @@ +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.io.Serial; +import java.math.BigDecimal; + +/** + * 项目工作明细对象 erp_timesheet_project + * + * @author Yangk + * @date 2025-12-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("erp_timesheet_project") +public class ErpTimesheetProject extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 项目工作ID + */ + @TableId(value = "timesheet_project_id", type = IdType.ASSIGN_ID) + private Long timesheetProjectId; + + /** + * 工时填报ID + */ + private Long timesheetId; + + /** + * 序号 + */ + private Long sortOrder; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 项目号 + */ + private String projectCode; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目经理ID + */ + private Long projectManagerId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 工时 + */ + private BigDecimal hours; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpAfterSalesBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpAfterSalesBo.java index d45df539..741487cd 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpAfterSalesBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpAfterSalesBo.java @@ -172,13 +172,11 @@ public class ErpAfterSalesBo extends BaseEntity { /** * 子表列表:售后人员费用 - * 说明:前端 JSON 里传 "laborCostsList": [...] */ private List laborCostsList; /** * 子表列表:售后材料费用 - * 说明:前端 JSON 里传 "materialCostsList": [...] */ private List materialCostsList; @@ -188,7 +186,7 @@ public class ErpAfterSalesBo extends BaseEntity { private String flowCode; /** - * 流程变量 前端会提交一个元素{'entity': {业务详情数据对象}} + * 流程变量 */ private Map variables; diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpTimesheetDeptBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpTimesheetDeptBo.java new file mode 100644 index 00000000..2045ee32 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpTimesheetDeptBo.java @@ -0,0 +1,61 @@ +package org.dromara.oa.erp.domain.bo; + +import org.dromara.oa.erp.domain.ErpTimesheetDept; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 部门工作明细业务对象 erp_timesheet_dept + * + * @author Yangk + * @date 2025-12-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ErpTimesheetDept.class, reverseConvertGenerate = false) +public class ErpTimesheetDeptBo extends BaseEntity { + + /** + * 部门工作ID + */ + @NotNull(message = "部门工作ID不能为空", groups = { EditGroup.class }) + private Long timesheetDeptId; + + /** + * 工时填报ID + */ + @NotNull(message = "工时填报ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long timesheetId; + + /** + * 序号 + */ + private Long sortOrder; + + /** + * 部门工作描述 + */ + private String workDescription; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 部门直线经理ID + */ + private Long deptManagerId; + + /** + * 工时 + */ + private Long hours; + + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpTimesheetInfoBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpTimesheetInfoBo.java new file mode 100644 index 00000000..8d312a26 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpTimesheetInfoBo.java @@ -0,0 +1,120 @@ +package org.dromara.oa.erp.domain.bo; + +import org.dromara.oa.erp.domain.ErpTimesheetInfo; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +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.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt; + +/** + * 工时填报业务对象 erp_timesheet_info + * + * @author Yangk + * @date 2025-12-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ErpTimesheetInfo.class, reverseConvertGenerate = false) +public class ErpTimesheetInfoBo extends BaseEntity { + + /** + * 工时填报ID + */ + @NotNull(message = "工时填报ID不能为空", groups = { EditGroup.class }) + private Long timesheetId; + + /** + * 工时填报编号 + */ + @NotBlank(message = "工时填报编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String timesheetCode; + + /** + * 人员ID(填报人) + */ + @NotNull(message = "人员ID(填报人)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 起始时间(自然周的周一) + */ + @NotNull(message = "起始时间(自然周的周一)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date startTime; + + /** + * 结束时间(自然周的周日) + */ + @NotNull(message = "结束时间(自然周的周日)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date endTime; + + /** + * 总工时(自动累计) + */ + private Long totalHours; + + /** + * 部门工时(根据部门工作自动累计) + */ + private Long deptHours; + + /** + * 项目工时(根据项目工作自动累计) + */ + private Long projectHours; + + /** + * 工时填报状态(1暂存 2审批中 3已审批 4作废) + */ + private String timesheetStatus; + + /** + * 流程状态 + */ + private String flowStatus; + + /** + * 备注 + */ + private String remark; + + /** + * 子表:部门工作明细 + */ + private List timesheetDeptList; + + /** + * 子表:项目工作明细 + */ + private List timesheetProjectList; + + /** + * 流程定义编码 + */ + private String flowCode; + + /** + * 流程变量 + */ + private Map variables; + + /** + * 业务扩展参数 + */ + private RemoteFlowInstanceBizExt bizExt; + + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpTimesheetProjectBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpTimesheetProjectBo.java new file mode 100644 index 00000000..70c9832c --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpTimesheetProjectBo.java @@ -0,0 +1,71 @@ +package org.dromara.oa.erp.domain.bo; + +import org.dromara.oa.erp.domain.ErpTimesheetProject; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 项目工作明细业务对象 erp_timesheet_project + * + * @author Yangk + * @date 2025-12-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ErpTimesheetProject.class, reverseConvertGenerate = false) +public class ErpTimesheetProjectBo extends BaseEntity { + + /** + * 项目工作ID + */ + @NotNull(message = "项目工作ID不能为空", groups = { EditGroup.class }) + private Long timesheetProjectId; + + /** + * 工时填报ID + */ + @NotNull(message = "工时填报ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long timesheetId; + + /** + * 序号 + */ + private Long sortOrder; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 项目号 + */ + private String projectCode; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目经理ID + */ + private Long projectManagerId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 工时 + */ + private Long hours; + + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpAfterSalesVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpAfterSalesVo.java index d81a9c2a..84b484e5 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpAfterSalesVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpAfterSalesVo.java @@ -46,7 +46,7 @@ public class ErpAfterSalesVo implements Serializable { private String afterSalesSubject; /** - * 项目名称 (直接导出名字) + * 项目名称 */ @ExcelProperty(value = "项目名称") private String projectName; @@ -55,7 +55,7 @@ public class ErpAfterSalesVo implements Serializable { private String projectCode; /** - * 客户名称 (直接导出名字) + * 客户名称 */ @ExcelProperty(value = "客户名称") private String customerName; @@ -81,7 +81,7 @@ public class ErpAfterSalesVo implements Serializable { private Date afterSalesDate; /** - * 合同号 (直接导出) + * 合同号 */ @ExcelProperty(value = "合同号") private String contractCode; @@ -101,7 +101,7 @@ public class ErpAfterSalesVo implements Serializable { private String stakeholderId; /** - * 客户干系人 (中文名) + * 客户干系人 */ @ExcelProperty(value = "客户干系人") private String stakeholderName; @@ -112,7 +112,7 @@ public class ErpAfterSalesVo implements Serializable { private String handlerId; /** - * 处理人 (中文名) + * 处理人 */ @ExcelProperty(value = "处理人") private String handlerName; diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpTimesheetDeptVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpTimesheetDeptVo.java new file mode 100644 index 00000000..f78fec85 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpTimesheetDeptVo.java @@ -0,0 +1,74 @@ +package org.dromara.oa.erp.domain.vo; + +import org.dromara.oa.erp.domain.ErpTimesheetDept; +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_timesheet_dept + * + * @author Yangk + * @date 2025-12-09 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ErpTimesheetDept.class) +public class ErpTimesheetDeptVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门工作ID + */ + @ExcelProperty(value = "部门工作ID") + private Long timesheetDeptId; + + /** + * 工时填报ID + */ + @ExcelProperty(value = "工时填报ID") + private Long timesheetId; + + /** + * 序号 + */ + @ExcelProperty(value = "序号") + private Long sortOrder; + + /** + * 部门工作描述 + */ + @ExcelProperty(value = "部门工作描述") + private String workDescription; + + /** + * 部门ID + */ + @ExcelProperty(value = "部门ID") + private Long deptId; + + /** + * 部门直线经理ID + */ + @ExcelProperty(value = "部门直线经理ID") + private Long deptManagerId; + + /** + * 工时 + */ + @ExcelProperty(value = "工时") + private Long hours; + + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpTimesheetInfoVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpTimesheetInfoVo.java new file mode 100644 index 00000000..fbb1dd60 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpTimesheetInfoVo.java @@ -0,0 +1,120 @@ +package org.dromara.oa.erp.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.oa.erp.domain.ErpTimesheetInfo; +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; +import java.util.List; + + +/** + * 工时填报视图对象 erp_timesheet_info + * + * @author Yangk + * @date 2025-12-09 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ErpTimesheetInfo.class) +public class ErpTimesheetInfoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 工时填报ID + */ + @ExcelProperty(value = "工时填报ID") + private Long timesheetId; + + /** + * 工时填报编号 + */ + @ExcelProperty(value = "工时填报编号") + private String timesheetCode; + + /** + * 人员ID(填报人) + */ + @ExcelProperty(value = "人员ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "填=报人") + private Long userId; + + /** + * 部门ID + */ + @ExcelProperty(value = "部门ID") + private Long deptId; + + /** + * 起始时间(自然周的周一) + */ + @ExcelProperty(value = "起始时间", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "自=然周的周一") + private Date startTime; + + /** + * 结束时间(自然周的周日) + */ + @ExcelProperty(value = "结束时间", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "自=然周的周日") + private Date endTime; + + /** + * 总工时(自动累计) + */ + @ExcelProperty(value = "总工时", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "自=动累计") + private Long totalHours; + + /** + * 部门工时(根据部门工作自动累计) + */ + @ExcelProperty(value = "部门工时", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "根=据部门工作自动累计") + private Long deptHours; + + /** + * 项目工时(根据项目工作自动累计) + */ + @ExcelProperty(value = "项目工时", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "根=据项目工作自动累计") + private Long projectHours; + + /** + * 工时填报状态(1暂存 2审批中 3已审批 4作废) + */ + @ExcelProperty(value = "工时填报状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "timesheet_status") + private String timesheetStatus; + + /** + * 流程状态 + */ + @ExcelProperty(value = "流程状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "flow_status") + private String flowStatus; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 子表回显 + */ + private List timesheetDeptList; + private List timesheetProjectList; + + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpTimesheetProjectVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpTimesheetProjectVo.java new file mode 100644 index 00000000..7ff72029 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpTimesheetProjectVo.java @@ -0,0 +1,86 @@ +package org.dromara.oa.erp.domain.vo; + +import org.dromara.oa.erp.domain.ErpTimesheetProject; +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_timesheet_project + * + * @author Yangk + * @date 2025-12-09 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ErpTimesheetProject.class) +public class ErpTimesheetProjectVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 项目工作ID + */ + @ExcelProperty(value = "项目工作ID") + private Long timesheetProjectId; + + /** + * 工时填报ID + */ + @ExcelProperty(value = "工时填报ID") + private Long timesheetId; + + /** + * 序号 + */ + @ExcelProperty(value = "序号") + private Long sortOrder; + + /** + * 项目ID + */ + @ExcelProperty(value = "项目ID") + private Long projectId; + + /** + * 项目号 + */ + @ExcelProperty(value = "项目号") + private String projectCode; + + /** + * 项目名称 + */ + @ExcelProperty(value = "项目名称") + private String projectName; + + /** + * 项目经理ID + */ + @ExcelProperty(value = "项目经理ID") + private Long projectManagerId; + + /** + * 部门ID + */ + @ExcelProperty(value = "部门ID") + private Long deptId; + + /** + * 工时 + */ + @ExcelProperty(value = "工时") + private Long hours; + + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpTimesheetDeptMapper.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpTimesheetDeptMapper.java new file mode 100644 index 00000000..2260f478 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpTimesheetDeptMapper.java @@ -0,0 +1,37 @@ +package org.dromara.oa.erp.mapper; + +import java.util.List; +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.oa.erp.domain.ErpTimesheetDept; +import org.dromara.oa.erp.domain.vo.ErpTimesheetDeptVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 部门工作明细Mapper接口 + * + * @author Yangk + * @date 2025-12-09 + */ +public interface ErpTimesheetDeptMapper extends BaseMapperPlus { + + /** + * 查询部门工作明细列表 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 部门工作明细集合 + */ + public Page selectCustomErpTimesheetDeptVoList(@Param("page") Page page, @Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 查询部门工作明细列表 + * + * @param queryWrapper 条件 + * @return 部门工作明细集合 + */ + public List selectCustomErpTimesheetDeptVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpTimesheetInfoMapper.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpTimesheetInfoMapper.java new file mode 100644 index 00000000..eb9a06af --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpTimesheetInfoMapper.java @@ -0,0 +1,37 @@ +package org.dromara.oa.erp.mapper; + +import java.util.List; +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.oa.erp.domain.ErpTimesheetInfo; +import org.dromara.oa.erp.domain.vo.ErpTimesheetInfoVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 工时填报Mapper接口 + * + * @author Yangk + * @date 2025-12-09 + */ +public interface ErpTimesheetInfoMapper extends BaseMapperPlus { + + /** + * 查询工时填报列表 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 工时填报集合 + */ + public Page selectCustomErpTimesheetInfoVoList(@Param("page") Page page, @Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 查询工时填报列表 + * + * @param queryWrapper 条件 + * @return 工时填报集合 + */ + public List selectCustomErpTimesheetInfoVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpTimesheetProjectMapper.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpTimesheetProjectMapper.java new file mode 100644 index 00000000..6ed5133b --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/ErpTimesheetProjectMapper.java @@ -0,0 +1,37 @@ +package org.dromara.oa.erp.mapper; + +import java.util.List; +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.oa.erp.domain.ErpTimesheetProject; +import org.dromara.oa.erp.domain.vo.ErpTimesheetProjectVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 项目工作明细Mapper接口 + * + * @author Yangk + * @date 2025-12-09 + */ +public interface ErpTimesheetProjectMapper extends BaseMapperPlus { + + /** + * 查询项目工作明细列表 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 项目工作明细集合 + */ + public Page selectCustomErpTimesheetProjectVoList(@Param("page") Page page, @Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 查询项目工作明细列表 + * + * @param queryWrapper 条件 + * @return 项目工作明细集合 + */ + public List selectCustomErpTimesheetProjectVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpTimesheetDeptService.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpTimesheetDeptService.java new file mode 100644 index 00000000..be3b34ca --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpTimesheetDeptService.java @@ -0,0 +1,70 @@ +package org.dromara.oa.erp.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.dromara.oa.erp.domain.ErpTimesheetDept; +import org.dromara.oa.erp.domain.vo.ErpTimesheetDeptVo; +import org.dromara.oa.erp.domain.bo.ErpTimesheetDeptBo; +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 Yangk + * @date 2025-12-09 + */ +public interface IErpTimesheetDeptService extends IService { + + /** + * 查询部门工作明细 + * + * @param timesheetDeptId 主键 + * @return 部门工作明细 + */ + ErpTimesheetDeptVo queryById(Long timesheetDeptId); + + /** + * 分页查询部门工作明细列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 部门工作明细分页列表 + */ + TableDataInfo queryPageList(ErpTimesheetDeptBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的部门工作明细列表 + * + * @param bo 查询条件 + * @return 部门工作明细列表 + */ + List queryList(ErpTimesheetDeptBo bo); + + /** + * 新增部门工作明细 + * + * @param bo 部门工作明细 + * @return 是否新增成功 + */ + Boolean insertByBo(ErpTimesheetDeptBo bo); + + /** + * 修改部门工作明细 + * + * @param bo 部门工作明细 + * @return 是否修改成功 + */ + Boolean updateByBo(ErpTimesheetDeptBo bo); + + /** + * 校验并批量删除部门工作明细信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpTimesheetInfoService.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpTimesheetInfoService.java new file mode 100644 index 00000000..1afc580f --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpTimesheetInfoService.java @@ -0,0 +1,79 @@ +package org.dromara.oa.erp.service; + +import org.dromara.oa.erp.domain.ErpTimesheetInfo; +import org.dromara.oa.erp.domain.bo.ErpAfterSalesBo; +import org.dromara.oa.erp.domain.vo.ErpAfterSalesVo; +import org.dromara.oa.erp.domain.vo.ErpTimesheetDeptVo; +import org.dromara.oa.erp.domain.vo.ErpTimesheetInfoVo; +import org.dromara.oa.erp.domain.bo.ErpTimesheetInfoBo; +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 Yangk + * @date 2025-12-09 + */ +public interface IErpTimesheetInfoService { + + /** + * 查询工时填报 + * + * @param timesheetId 主键 + * @return 工时填报 + */ + ErpTimesheetInfoVo queryById(Long timesheetId); + + /** + * 分页查询工时填报列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 工时填报分页列表 + */ + TableDataInfo queryPageList(ErpTimesheetInfoBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的工时填报列表 + * + * @param bo 查询条件 + * @return 工时填报列表 + */ + List queryList(ErpTimesheetInfoBo bo); + + /** + * 新增工时填报 + * + * @param bo 工时填报 + * @return 是否新增成功 + */ + Boolean insertByBo(ErpTimesheetInfoBo bo); + + /** + * 修改工时填报 + * + * @param bo 工时填报 + * @return 是否修改成功 + */ + Boolean updateByBo(ErpTimesheetInfoBo bo); + + /** + * 校验并批量删除工时填报信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 提交项目工时并启动流程 + * @param bo + * @return + */ + ErpTimesheetInfoVo submitAndFlowStart(ErpTimesheetInfoBo bo); +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpTimesheetProjectService.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpTimesheetProjectService.java new file mode 100644 index 00000000..91e0e89c --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpTimesheetProjectService.java @@ -0,0 +1,70 @@ +package org.dromara.oa.erp.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.dromara.oa.erp.domain.ErpTimesheetProject; +import org.dromara.oa.erp.domain.vo.ErpTimesheetProjectVo; +import org.dromara.oa.erp.domain.bo.ErpTimesheetProjectBo; +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 Yangk + * @date 2025-12-09 + */ +public interface IErpTimesheetProjectService extends IService { + + /** + * 查询项目工作明细 + * + * @param timesheetProjectId 主键 + * @return 项目工作明细 + */ + ErpTimesheetProjectVo queryById(Long timesheetProjectId); + + /** + * 分页查询项目工作明细列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 项目工作明细分页列表 + */ + TableDataInfo queryPageList(ErpTimesheetProjectBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的项目工作明细列表 + * + * @param bo 查询条件 + * @return 项目工作明细列表 + */ + List queryList(ErpTimesheetProjectBo bo); + + /** + * 新增项目工作明细 + * + * @param bo 项目工作明细 + * @return 是否新增成功 + */ + Boolean insertByBo(ErpTimesheetProjectBo bo); + + /** + * 修改项目工作明细 + * + * @param bo 项目工作明细 + * @return 是否修改成功 + */ + Boolean updateByBo(ErpTimesheetProjectBo bo); + + /** + * 校验并批量删除项目工作明细信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpAfterSalesServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpAfterSalesServiceImpl.java index 0e6e3554..c8105067 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpAfterSalesServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpAfterSalesServiceImpl.java @@ -159,7 +159,7 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { * @return 是否新增成功 */ @Override - @Transactional(rollbackFor = Exception.class) // 【重要】开启事务!如果子表保存失败,主表也要回滚,防止数据不一致 + @Transactional(rollbackFor = Exception.class) // 开启事务!如果子表保存失败,主表也要回滚,防止数据不一致 public Boolean insertByBo(ErpAfterSalesBo bo) { ErpAfterSales add = MapstructUtils.convert(bo, ErpAfterSales.class); @@ -195,7 +195,7 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { * @return 是否修改成功 */ @Override - @Transactional(rollbackFor = Exception.class) // 【重要】开启事务 + @Transactional(rollbackFor = Exception.class) // 开启事务 public Boolean updateByBo(ErpAfterSalesBo bo) { ErpAfterSales update = MapstructUtils.convert(bo, ErpAfterSales.class); validEntityBeforeSave(update); @@ -216,7 +216,7 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { // 遍历列表,清空 ID laborList.forEach(item -> { - item.setLaborCostsId(null); // 关键:清空ID,让MP重新生成雪花ID,避免和逻辑删除的数据冲突 + item.setLaborCostsId(null); // 清空ID,让MP重新生成雪花ID,避免和逻辑删除的数据冲突 item.setAfterSalesId(afterSalesId); }); @@ -232,7 +232,7 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { List materialList = MapstructUtils.convert(materialBoList, ErpAfterSalesMaterialCosts.class); materialList.forEach(item -> { - item.setMaterialCostsId(null); // 关键:清空ID + item.setMaterialCostsId(null); item.setAfterSalesId(afterSalesId); }); diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetDeptServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetDeptServiceImpl.java new file mode 100644 index 00000000..b3885fc3 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetDeptServiceImpl.java @@ -0,0 +1,141 @@ +package org.dromara.oa.erp.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; + import org.dromara.common.mybatis.core.page.TableDataInfo; + import org.dromara.common.mybatis.core.page.PageQuery; + import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.oa.erp.domain.bo.ErpTimesheetDeptBo; +import org.dromara.oa.erp.domain.vo.ErpTimesheetDeptVo; +import org.dromara.oa.erp.domain.ErpTimesheetDept; +import org.dromara.oa.erp.mapper.ErpTimesheetDeptMapper; +import org.dromara.oa.erp.service.IErpTimesheetDeptService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 部门工作明细Service业务层处理 + * + * @author Yangk + * @date 2025-12-09 + */ +@RequiredArgsConstructor +@Service +public class ErpTimesheetDeptServiceImpl + extends ServiceImpl + implements IErpTimesheetDeptService { + + private final ErpTimesheetDeptMapper baseMapper; + + /** + * 查询部门工作明细 + * + * @param timesheetDeptId 主键 + * @return 部门工作明细 + */ + @Override + public ErpTimesheetDeptVo queryById(Long timesheetDeptId){ + return baseMapper.selectVoById(timesheetDeptId); + } + + /** + * 分页查询部门工作明细列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 部门工作明细分页列表 + */ + @Override + public TableDataInfo queryPageList(ErpTimesheetDeptBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的部门工作明细列表 + * + * @param bo 查询条件 + * @return 部门工作明细列表 + */ + @Override + public List queryList(ErpTimesheetDeptBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(ErpTimesheetDeptBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(ErpTimesheetDept.class) + .selectAll(ErpTimesheetDept.class) + .eq(ErpTimesheetDept::getDelFlag, "0") + .eq(bo.getTimesheetId() != null, ErpTimesheetDept::getTimesheetId, bo.getTimesheetId()) + .eq(bo.getSortOrder() != null, ErpTimesheetDept::getSortOrder, bo.getSortOrder()) + .eq(StringUtils.isNotBlank(bo.getWorkDescription()), ErpTimesheetDept::getWorkDescription, bo.getWorkDescription()) + .eq(bo.getDeptId() != null, ErpTimesheetDept::getDeptId, bo.getDeptId()) + .eq(bo.getDeptManagerId() != null, ErpTimesheetDept::getDeptManagerId, bo.getDeptManagerId()) + .eq(bo.getHours() != null, ErpTimesheetDept::getHours, bo.getHours()) +; + return lqw; + } + + /** + * 新增部门工作明细 + * + * @param bo 部门工作明细 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(ErpTimesheetDeptBo bo) { + ErpTimesheetDept add = MapstructUtils.convert(bo, ErpTimesheetDept.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setTimesheetDeptId(add.getTimesheetDeptId()); + } + return flag; + } + + /** + * 修改部门工作明细 + * + * @param bo 部门工作明细 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(ErpTimesheetDeptBo bo) { + ErpTimesheetDept update = MapstructUtils.convert(bo, ErpTimesheetDept.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ErpTimesheetDept entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除部门工作明细信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetInfoServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetInfoServiceImpl.java new file mode 100644 index 00000000..c73c75e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetInfoServiceImpl.java @@ -0,0 +1,281 @@ +package org.dromara.oa.erp.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.seata.spring.annotation.GlobalTransactional; +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 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.oa.erp.domain.ErpTimesheetDept; +import org.dromara.oa.erp.domain.ErpTimesheetProject; +import org.dromara.oa.erp.domain.bo.ErpTimesheetDeptBo; +import org.dromara.oa.erp.domain.bo.ErpTimesheetProjectBo; +import org.dromara.oa.erp.domain.vo.ErpTimesheetDeptVo; +import org.dromara.oa.erp.domain.vo.ErpTimesheetProjectVo; +import org.dromara.oa.erp.service.IErpTimesheetDeptService; +import org.dromara.oa.erp.service.IErpTimesheetProjectService; +import org.dromara.workflow.api.RemoteWorkflowService; +import org.dromara.workflow.api.domain.RemoteStartProcess; +import org.springframework.stereotype.Service; +import org.dromara.oa.erp.domain.bo.ErpTimesheetInfoBo; +import org.dromara.oa.erp.domain.vo.ErpTimesheetInfoVo; +import org.dromara.oa.erp.domain.ErpTimesheetInfo; +import org.dromara.oa.erp.mapper.ErpTimesheetInfoMapper; +import org.dromara.oa.erp.service.IErpTimesheetInfoService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 工时填报Service业务层处理 + * + * @author Yangk + * @date 2025-12-09 + */ +@RequiredArgsConstructor +@Service +public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { + + private final ErpTimesheetInfoMapper baseMapper; + + @DubboReference(timeout = 30000) + private RemoteWorkflowService remoteWorkflowService; + + private final IErpTimesheetDeptService timesheetDeptService; + private final IErpTimesheetProjectService timesheetProjectService; + + /** + * 查询工时填报 + * + * @param timesheetId 主键 + * @return 工时填报 + */ + @Override + public ErpTimesheetInfoVo queryById(Long timesheetId) { + ErpTimesheetInfoVo vo = baseMapper.selectVoById(timesheetId); + if (vo != null) { + // 回显部门工时 + List deptList = timesheetDeptService.list( + new LambdaQueryWrapper().eq(ErpTimesheetDept::getTimesheetId, timesheetId) + ); + vo.setTimesheetDeptList(MapstructUtils.convert(deptList, ErpTimesheetDeptVo.class)); + + // 回显项目工时 + List projectList = timesheetProjectService.list( + new LambdaQueryWrapper().eq(ErpTimesheetProject::getTimesheetId, timesheetId) + ); + vo.setTimesheetProjectList(MapstructUtils.convert(projectList, ErpTimesheetProjectVo.class)); + } + return vo; + } + + /** + * 分页查询工时填报列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 工时填报分页列表 + */ + @Override + public TableDataInfo queryPageList(ErpTimesheetInfoBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的工时填报列表 + * + * @param bo 查询条件 + * @return 工时填报列表 + */ + @Override + public List queryList(ErpTimesheetInfoBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(ErpTimesheetInfoBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(ErpTimesheetInfo.class) + .selectAll(ErpTimesheetInfo.class) + .eq(ErpTimesheetInfo::getDelFlag, "0") + .eq(StringUtils.isNotBlank(bo.getTimesheetCode()), ErpTimesheetInfo::getTimesheetCode, bo.getTimesheetCode()) + .eq(bo.getUserId() != null, ErpTimesheetInfo::getUserId, bo.getUserId()) + .eq(bo.getDeptId() != null, ErpTimesheetInfo::getDeptId, bo.getDeptId()) + .eq(bo.getStartTime() != null, ErpTimesheetInfo::getStartTime, bo.getStartTime()) + .eq(bo.getEndTime() != null, ErpTimesheetInfo::getEndTime, bo.getEndTime()) + .eq(bo.getTotalHours() != null, ErpTimesheetInfo::getTotalHours, bo.getTotalHours()) + .eq(bo.getDeptHours() != null, ErpTimesheetInfo::getDeptHours, bo.getDeptHours()) + .eq(bo.getProjectHours() != null, ErpTimesheetInfo::getProjectHours, bo.getProjectHours()) + .eq(StringUtils.isNotBlank(bo.getTimesheetStatus()), ErpTimesheetInfo::getTimesheetStatus, bo.getTimesheetStatus()) + .eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpTimesheetInfo::getFlowStatus, bo.getFlowStatus()) +; + return lqw; + } + + /** + * 新增工时填报 + * + * @param bo 工时填报 + * @return 是否新增成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(ErpTimesheetInfoBo bo) { + ErpTimesheetInfo add = MapstructUtils.convert(bo, ErpTimesheetInfo.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + + if (flag) { + // 回填 ID 给 BO + bo.setTimesheetId(add.getTimesheetId()); + Long timesheetId = add.getTimesheetId(); + + // 保存部门工时子表 + List deptBoList = bo.getTimesheetDeptList(); + if (CollUtil.isNotEmpty(deptBoList)) { + List list = MapstructUtils.convert(deptBoList, ErpTimesheetDept.class); + list.forEach(item -> item.setTimesheetId(timesheetId)); + timesheetDeptService.saveBatch(list); + } + + // 保存项目工时子表 + List projectBoList = bo.getTimesheetProjectList(); + if (CollUtil.isNotEmpty(projectBoList)) { + List list = MapstructUtils.convert(projectBoList, ErpTimesheetProject.class); + list.forEach(item -> item.setTimesheetId(timesheetId)); + timesheetProjectService.saveBatch(list); + } + } + return flag; + } + + /** + * 修改工时填报 + * + * @param bo 工时填报 + * @return 是否修改成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(ErpTimesheetInfoBo bo) { + ErpTimesheetInfo update = MapstructUtils.convert(bo, ErpTimesheetInfo.class); + validEntityBeforeSave(update); + int row = baseMapper.updateById(update); + + if (row > 0) { + Long timesheetId = bo.getTimesheetId(); + + // 更新部门工时 (先删后增) + timesheetDeptService.remove(new LambdaQueryWrapper() + .eq(ErpTimesheetDept::getTimesheetId, timesheetId)); + + List deptBoList = bo.getTimesheetDeptList(); + if (CollUtil.isNotEmpty(deptBoList)) { + List list = MapstructUtils.convert(deptBoList, ErpTimesheetDept.class); + list.forEach(item -> { + item.setTimesheetDeptId(null); // 清空子表ID,防止逻辑删除冲突 + item.setTimesheetId(timesheetId); + }); + timesheetDeptService.saveBatch(list); + } + + // 更新项目工时 (先删后增) + timesheetProjectService.remove(new LambdaQueryWrapper() + .eq(ErpTimesheetProject::getTimesheetId, timesheetId)); + + List projectBoList = bo.getTimesheetProjectList(); + if (CollUtil.isNotEmpty(projectBoList)) { + List list = MapstructUtils.convert(projectBoList, ErpTimesheetProject.class); + list.forEach(item -> { + item.setTimesheetProjectId(null); + item.setTimesheetId(timesheetId); + }); + timesheetProjectService.saveBatch(list); + } + } + return row > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ErpTimesheetInfo entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除工时填报信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 提交项目售后信息并提交流程 + * + * @param bo + * @return + */ + @Override + @GlobalTransactional(rollbackFor = Exception.class) // 开启全局事务 + public ErpTimesheetInfoVo submitAndFlowStart(ErpTimesheetInfoBo bo) { + + ErpTimesheetInfo add = MapstructUtils.convert(bo, ErpTimesheetInfo.class); + validEntityBeforeSave(add); + + if (bo.getTimesheetId() == null) { + 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.getTimesheetId().toString()); + startProcess.setFlowCode(bo.getFlowCode()); + startProcess.setVariables(bo.getVariables()); + startProcess.setBizExt(bo.getBizExt()); + + // 确保 BizExt 里也有 BusinessId + if (bo.getBizExt() != null) { + bo.getBizExt().setBusinessId(startProcess.getBusinessId()); + } + + // 调用远程服务启动流程 + // startCompleteTask 表示“启动并自动完成第一个发起节点”,直接流转到下一个审批人 + boolean flagOne = remoteWorkflowService.startCompleteTask(startProcess); + + if (!flagOne) { + throw new ServiceException("流程发起异常"); + } + + return MapstructUtils.convert(add, ErpTimesheetInfoVo.class); + } +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetProjectServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetProjectServiceImpl.java new file mode 100644 index 00000000..22677fff --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetProjectServiceImpl.java @@ -0,0 +1,143 @@ +package org.dromara.oa.erp.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; + import org.dromara.common.mybatis.core.page.TableDataInfo; + import org.dromara.common.mybatis.core.page.PageQuery; + import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.oa.erp.domain.bo.ErpTimesheetProjectBo; +import org.dromara.oa.erp.domain.vo.ErpTimesheetProjectVo; +import org.dromara.oa.erp.domain.ErpTimesheetProject; +import org.dromara.oa.erp.mapper.ErpTimesheetProjectMapper; +import org.dromara.oa.erp.service.IErpTimesheetProjectService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 项目工作明细Service业务层处理 + * + * @author Yangk + * @date 2025-12-09 + */ +@RequiredArgsConstructor +@Service +public class ErpTimesheetProjectServiceImpl + extends ServiceImpl + implements IErpTimesheetProjectService { + + private final ErpTimesheetProjectMapper baseMapper; + + /** + * 查询项目工作明细 + * + * @param timesheetProjectId 主键 + * @return 项目工作明细 + */ + @Override + public ErpTimesheetProjectVo queryById(Long timesheetProjectId){ + return baseMapper.selectVoById(timesheetProjectId); + } + + /** + * 分页查询项目工作明细列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 项目工作明细分页列表 + */ + @Override + public TableDataInfo queryPageList(ErpTimesheetProjectBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的项目工作明细列表 + * + * @param bo 查询条件 + * @return 项目工作明细列表 + */ + @Override + public List queryList(ErpTimesheetProjectBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(ErpTimesheetProjectBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(ErpTimesheetProject.class) + .selectAll(ErpTimesheetProject.class) + .eq(ErpTimesheetProject::getDelFlag, "0") + .eq(bo.getTimesheetId() != null, ErpTimesheetProject::getTimesheetId, bo.getTimesheetId()) + .eq(bo.getSortOrder() != null, ErpTimesheetProject::getSortOrder, bo.getSortOrder()) + .eq(bo.getProjectId() != null, ErpTimesheetProject::getProjectId, bo.getProjectId()) + .eq(StringUtils.isNotBlank(bo.getProjectCode()), ErpTimesheetProject::getProjectCode, bo.getProjectCode()) + .like(StringUtils.isNotBlank(bo.getProjectName()), ErpTimesheetProject::getProjectName, bo.getProjectName()) + .eq(bo.getProjectManagerId() != null, ErpTimesheetProject::getProjectManagerId, bo.getProjectManagerId()) + .eq(bo.getDeptId() != null, ErpTimesheetProject::getDeptId, bo.getDeptId()) + .eq(bo.getHours() != null, ErpTimesheetProject::getHours, bo.getHours()) +; + return lqw; + } + + /** + * 新增项目工作明细 + * + * @param bo 项目工作明细 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(ErpTimesheetProjectBo bo) { + ErpTimesheetProject add = MapstructUtils.convert(bo, ErpTimesheetProject.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setTimesheetProjectId(add.getTimesheetProjectId()); + } + return flag; + } + + /** + * 修改项目工作明细 + * + * @param bo 项目工作明细 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(ErpTimesheetProjectBo bo) { + ErpTimesheetProject update = MapstructUtils.convert(bo, ErpTimesheetProject.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ErpTimesheetProject entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除项目工作明细信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpTimesheetDeptMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpTimesheetDeptMapper.xml new file mode 100644 index 00000000..8d891bb2 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpTimesheetDeptMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpTimesheetInfoMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpTimesheetInfoMapper.xml new file mode 100644 index 00000000..2ec722b7 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpTimesheetInfoMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpTimesheetProjectMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpTimesheetProjectMapper.xml new file mode 100644 index 00000000..803a36e7 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpTimesheetProjectMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + +