diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/BaseRelationMaterial.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/BaseRelationMaterial.java index 3ec0848c..65f7fad0 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/BaseRelationMaterial.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/BaseRelationMaterial.java @@ -42,6 +42,11 @@ public class BaseRelationMaterial extends TenantEntity { */ private String saleMaterialName; + /** + * 销售物料型号 + */ + private String saleMaterialModel; + /** * 备注 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/bo/BaseRelationMaterialBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/bo/BaseRelationMaterialBo.java index 83dbd306..109e25f8 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/bo/BaseRelationMaterialBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/bo/BaseRelationMaterialBo.java @@ -42,6 +42,11 @@ public class BaseRelationMaterialBo extends BaseEntity { */ private String saleMaterialName; + /** + * 销售物料型号 + */ + private String saleMaterialModel; + /** * 备注 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/vo/BaseRelationMaterialVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/vo/BaseRelationMaterialVo.java index 26bd114c..53048dbf 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/vo/BaseRelationMaterialVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/domain/vo/BaseRelationMaterialVo.java @@ -70,6 +70,12 @@ public class BaseRelationMaterialVo implements Serializable { @ExcelProperty(value = "销售物料名称") private String saleMaterialName; + /** + * 销售物料型号 + */ + @ExcelProperty(value = "销售物料型号") + private String saleMaterialModel; + /** * 备注 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/impl/BaseRelationMaterialServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/impl/BaseRelationMaterialServiceImpl.java index 314f5387..d96f43f2 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/impl/BaseRelationMaterialServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/base/service/impl/BaseRelationMaterialServiceImpl.java @@ -90,6 +90,7 @@ public class BaseRelationMaterialServiceImpl implements IBaseRelationMaterialSer .like(StringUtils.isNotBlank(bo.getMaterialName()), BaseMaterialInfo::getMaterialName, bo.getMaterialName()) .like(StringUtils.isNotBlank(bo.getCustomerName()), CrmCustomerInfo::getCustomerName, bo.getCustomerName()) .like(StringUtils.isNotBlank(bo.getSaleMaterialName()), BaseRelationMaterial::getSaleMaterialName, bo.getSaleMaterialName()) + .like(StringUtils.isNotBlank(bo.getSaleMaterialModel()), BaseRelationMaterial::getSaleMaterialModel, bo.getSaleMaterialModel()) .eq(StringUtils.isNotBlank(bo.getActiveFlag()), BaseRelationMaterial::getActiveFlag, bo.getActiveFlag()); return lqw; } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpProjectReportDetailController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpProjectReportDetailController.java index 6c55eff3..6f6cb035 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpProjectReportDetailController.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpProjectReportDetailController.java @@ -119,7 +119,7 @@ public class ErpProjectReportDetailController extends BaseController { } /** - * 提交合同信息并提交流程 + * 提交项目周报明细并提交流程 * @param wrapper * @return */ @@ -132,4 +132,6 @@ public class ErpProjectReportDetailController extends BaseController { ErpProjectReportDetailBo projectDetailReport = wrapper.getProjectDetailReport(); return R.ok(erpProjectReportDetailService.projectReportSubmitAndFlowStart(projectReport, projectDetailReport)); } + + } 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/ErpProjectReportDetail.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectReportDetail.java index 8b7bb2a9..a8740358 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectReportDetail.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpProjectReportDetail.java @@ -79,7 +79,7 @@ public class ErpProjectReportDetail extends TenantEntity { /** * 计划完成率 */ - private Long plannedCompletionRate; + private Double plannedCompletionRate; /** * 周报情况说明 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/ErpProjectReportDetailBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectReportDetailBo.java index c66444f7..e775aa1d 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectReportDetailBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectReportDetailBo.java @@ -80,7 +80,7 @@ public class ErpProjectReportDetailBo extends BaseEntity { /** * 计划完成率 */ - private Long plannedCompletionRate; + private Double plannedCompletionRate; /** * 周报情况说明 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 f738b254..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 @@ -1,7 +1,11 @@ package org.dromara.oa.erp.domain.vo; +import java.math.BigDecimal; import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; +import java.util.List; +import java.io.Serial; +import java.io.Serializable; + import org.dromara.oa.erp.domain.ErpAfterSales; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; @@ -9,14 +13,6 @@ import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; -import org.dromara.oa.erp.domain.vo.ErpAfterSalesLaborCostsVo; -import org.dromara.oa.erp.domain.vo.ErpAfterSalesMaterialCostsVo; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; -import java.util.List; - /** * 项目售后信息视图对象 erp_after_sales @@ -35,7 +31,6 @@ public class ErpAfterSalesVo implements Serializable { /** * 售后ID */ - @ExcelProperty(value = "售后ID") private Long afterSalesId; /** @@ -50,29 +45,14 @@ public class ErpAfterSalesVo implements Serializable { @ExcelProperty(value = "售后主题") private String afterSalesSubject; - /** - * 项目ID - */ - @ExcelProperty(value = "项目ID") - private Long projectId; - - /** - * 项目编号 - */ - @ExcelProperty(value = "项目编号") - private String projectCode; - /** * 项目名称 */ @ExcelProperty(value = "项目名称") private String projectName; - /** - * 客户ID - */ - @ExcelProperty(value = "客户ID") - private Long customerId; + private Long projectId; + private String projectCode; /** * 客户名称 @@ -80,6 +60,8 @@ public class ErpAfterSalesVo implements Serializable { @ExcelProperty(value = "客户名称") private String customerName; + private Long customerId; + /** * 联系人 */ @@ -98,18 +80,14 @@ public class ErpAfterSalesVo implements Serializable { @ExcelProperty(value = "售后日期") private Date afterSalesDate; - /** - * 合同ID - */ - @ExcelProperty(value = "合同ID") - private Long contractId; - /** * 合同号 */ @ExcelProperty(value = "合同号") private String contractCode; + private Long contractId; + /** * 售后类型 */ @@ -118,19 +96,27 @@ public class ErpAfterSalesVo implements Serializable { private String afterSalesType; /** - * 客户干系人ID(关联客户联系人表) + * 客户干系人ID */ - @ExcelProperty(value = "客户干系人ID", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "关=联客户联系人表") private String stakeholderId; /** - * 处理人ID(关联用户表) + * 客户干系人 + */ + @ExcelProperty(value = "客户干系人") + private String stakeholderName; + + /** + * 处理人ID */ - @ExcelProperty(value = "处理人ID", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "关=联用户表") private String handlerId; + /** + * 处理人 + */ + @ExcelProperty(value = "处理人") + private String handlerName; + /** * 问题描述 */ @@ -141,18 +127,18 @@ public class ErpAfterSalesVo implements Serializable { * 售后总工时 */ @ExcelProperty(value = "售后总工时") - private Long totalWorkHours; + private BigDecimal totalWorkHours; /** * 售后总成本 */ @ExcelProperty(value = "售后总成本") - private Long totalCost; + private BigDecimal totalCost; /** - * 售后问题是否解决(0未解决 1已解决 2部分解决) + * 售后问题是否解决 */ - @ExcelProperty(value = "售后问题是否解决", converter = ExcelDictConvert.class) + @ExcelProperty(value = "解决状态", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "solve_status") private String solveStatus; @@ -169,7 +155,7 @@ public class ErpAfterSalesVo implements Serializable { private String processingResult; /** - * 售后状态(0暂存 1审批中 2可用) + * 售后状态 */ @ExcelProperty(value = "售后状态", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "after_sales_status") @@ -178,15 +164,12 @@ public class ErpAfterSalesVo implements Serializable { /** * 流程状态 */ - @ExcelProperty(value = "流程状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "flow_status") + @ExcelProperty(value = "流程状态") private String flowStatus; /** - * 激活标识(1是 0否) + * 激活标识 */ - @ExcelProperty(value = "激活标识", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "active_flag") private String activeFlag; /** @@ -200,16 +183,4 @@ public class ErpAfterSalesVo implements Serializable { */ private List laborCostsList; private List materialCostsList; - - /** - * 客户干系人姓名(逗号分隔) - */ - private String stakeholderName; - - /** - * 处理人姓名(逗号分隔) - */ - private String handlerName; - - } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectReportDetailVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectReportDetailVo.java index 40c1e09e..e7672aba 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectReportDetailVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpProjectReportDetailVo.java @@ -2,6 +2,7 @@ package org.dromara.oa.erp.domain.vo; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.write.style.ColumnWidth; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.common.excel.annotation.ExcelDictFormat; @@ -30,7 +31,7 @@ public class ErpProjectReportDetailVo implements Serializable { /** * 项目周报明细ID */ - @ExcelProperty(value = "项目周报明细ID") +// @ExcelProperty(value = "项目周报明细ID") private Long reportDetailId; /** @@ -44,11 +45,34 @@ public class ErpProjectReportDetailVo implements Serializable { */ @ExcelProperty(value = "项目ID") private Long projectId; + /** + * 部门名称 + */ +// @ExcelProperty(value = "部门名称") + private String deptName; + /** + * 项目经理名称 + */ +// @ExcelProperty(value = "项目经理名称") + private String managerName; + + /** + * 部门负责人名称 + */ +// @ExcelProperty(value = "部门负责人名称") + private String chargeName; + + /** + * 分管副总名称 + */ +// @ExcelProperty(value = "分管副总名称") + private String deputyName; /** * 填写日期 */ @ExcelProperty(value = "填写日期") + @ColumnWidth(20) // 设置列宽为20个字符 private Date fillTime; /** @@ -91,7 +115,7 @@ public class ErpProjectReportDetailVo implements Serializable { * 计划完成率 */ @ExcelProperty(value = "计划完成率") - private Long plannedCompletionRate; + private Double plannedCompletionRate; /** * 周报情况说明 @@ -109,7 +133,8 @@ public class ErpProjectReportDetailVo implements Serializable { /** * 周报状态(1暂存 2审批中 3可用) */ - @ExcelProperty(value = "周报状态(1暂存 2审批中 3可用)") + @ExcelProperty(value = "周报状态(1暂存 2审批中 3可用)", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=暂存,2=审批中,3=可用") private String projectReportStatus; /** @@ -121,7 +146,7 @@ public class ErpProjectReportDetailVo implements Serializable { /** * 排序号 */ - @ExcelProperty(value = "排序号") +// @ExcelProperty(value = "排序号") private Long sortOrder; /** @@ -151,32 +176,10 @@ public class ErpProjectReportDetailVo implements Serializable { /** * 激活标识(1是 0否) */ - @ExcelProperty(value = "激活标识", converter = ExcelDictConvert.class) +// @ExcelProperty(value = "激活标识", converter = ExcelDictConvert.class) @ExcelDictFormat(readConverterExp = "1=是,0=否") private String activeFlag; - /** - * 部门名称 - */ - @ExcelProperty(value = "部门名称") - private String deptName; - /** - * 项目经理名称 - */ - @ExcelProperty(value = "项目经理名称") - private String managerName; - - /** - * 部门负责人名称 - */ - @ExcelProperty(value = "部门负责人名称") - private String chargeName; - - /** - * 分管副总名称 - */ - @ExcelProperty(value = "分管副总名称") - private String deputyName; } 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/IErpProjectReportDetailService.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpProjectReportDetailService.java index eddfdd78..38fc5291 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpProjectReportDetailService.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpProjectReportDetailService.java @@ -71,9 +71,10 @@ public interface IErpProjectReportDetailService { Boolean deleteWithValidByIds(Collection ids, Boolean isValid); /** - * 提交项目周报并提交流程 + * 提交项目周报明细并提交流程 * @param * @return */ ErpProjectReportDetailVo projectReportSubmitAndFlowStart(ErpProjectReportBo projectReport, ErpProjectReportDetailBo projectDetailReport); + } 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/ErpProjectReportDetailServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectReportDetailServiceImpl.java index 6e4e61ed..6d0b7691 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectReportDetailServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectReportDetailServiceImpl.java @@ -84,6 +84,7 @@ public class ErpProjectReportDetailServiceImpl implements IErpProjectReportDetai @Override public TableDataInfo queryPageList(ErpProjectReportDetailBo bo, PageQuery pageQuery) { MPJLambdaWrapper lqw = buildQueryWrapper(bo); + lqw.orderByDesc(ErpProjectReportDetail::getFillTime); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(result); } @@ -179,8 +180,7 @@ public class ErpProjectReportDetailServiceImpl implements IErpProjectReportDetai } /** - * 提交项目周报信息并提交流程 - * + * 提交项目周报明细并提交流程 * @param projectReport * @param projectDetailReport * @return @@ -194,9 +194,13 @@ public class ErpProjectReportDetailServiceImpl implements IErpProjectReportDetai erpProjectReportService.updateByBo(projectReport); } else { erpProjectReportService.insertByBo(projectReport); + projectDetailReport.setReportId(projectReport.getReportId()); + projectDetailReport.setProjectId(projectReport.getProjectId()); } } else { erpProjectReportService.insertByBo(projectReport); + projectDetailReport.setReportId(projectReport.getReportId()); + projectDetailReport.setProjectId(projectReport.getProjectId()); } ErpProjectReportDetail erpProjectReportDetail = MapstructUtils.convert(projectDetailReport, ErpProjectReportDetail.class); validEntityBeforeSave(erpProjectReportDetail); diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectReportServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectReportServiceImpl.java index 9b226b54..d4ffd4ec 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectReportServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectReportServiceImpl.java @@ -10,11 +10,15 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.oa.erp.domain.ErpProjectContracts; import org.dromara.oa.erp.domain.ErpProjectReport; +import org.dromara.oa.erp.domain.ErpProjectReportDetail; import org.dromara.oa.erp.domain.bo.ErpProjectReportBo; import org.dromara.oa.erp.domain.vo.ErpProjectReportVo; +import org.dromara.oa.erp.mapper.ErpProjectReportDetailMapper; import org.dromara.oa.erp.mapper.ErpProjectReportMapper; +import org.dromara.oa.erp.service.IErpProjectReportDetailService; import org.dromara.oa.erp.service.IErpProjectReportService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.Collection; import java.util.List; @@ -32,6 +36,9 @@ public class ErpProjectReportServiceImpl implements IErpProjectReportService { private final ErpProjectReportMapper baseMapper; + private final ErpProjectReportDetailMapper erpProjectReportDetailMapper; + + /** * 查询项目周报信息 * @@ -78,7 +85,6 @@ public class ErpProjectReportServiceImpl implements IErpProjectReportService { MPJLambdaWrapper lqw = JoinWrappers.lambda(ErpProjectReport.class) .selectAll(ErpProjectReport.class) .eq(bo.getProjectId() != null, ErpProjectReport::getProjectId, bo.getProjectId()) - .eq(StringUtils.isNotBlank(bo.getMilestonePlan()), ErpProjectReport::getMilestonePlan, bo.getMilestonePlan()) .eq(bo.getManagerId() != null, ErpProjectReport::getManagerId, bo.getManagerId()) .eq(bo.getDeptId() != null, ErpProjectReport::getDeptId, bo.getDeptId()) .eq(bo.getChargeId() != null, ErpProjectReport::getChargeId, bo.getChargeId()) @@ -88,6 +94,7 @@ public class ErpProjectReportServiceImpl implements IErpProjectReportService { .eq(StringUtils.isNotBlank(bo.getOssId()), ErpProjectReport::getOssId, bo.getOssId()) .eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpProjectReport::getActiveFlag, bo.getActiveFlag()) .eq("t.del_flag", "0") + .like(StringUtils.isNotBlank(bo.getMilestonePlan()), ErpProjectReport::getMilestonePlan, bo.getMilestonePlan()) .like(StringUtils.isNotBlank(bo.getProjectName()), ErpProjectReport::getProjectName, bo.getProjectName()) .like(StringUtils.isNotBlank(bo.getProjectCode()), ErpProjectReport::getProjectCode, bo.getProjectCode()) .apply(StringUtils.isNotBlank(bo.getDeptName()), "d.dept_name LIKE CONCAT('%', {0}, '%')", bo.getDeptName()) @@ -143,10 +150,16 @@ public class ErpProjectReportServiceImpl implements IErpProjectReportService { * @return 是否删除成功 */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } - return baseMapper.deleteByIds(ids) > 0; + boolean p = baseMapper.deleteByIds(ids) > 0; + // 构建删除条件,根据reportIds删除所有相关的明细 + MPJLambdaWrapper wrapper = JoinWrappers.lambda(ErpProjectReportDetail.class) + .in(ErpProjectReportDetail::getReportId, ids); + boolean pd = erpProjectReportDetailMapper.delete(wrapper) > 0; + return p && pd; } } 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/base/BaseRelationMaterialMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/base/BaseRelationMaterialMapper.xml index 92d58aa8..376e99a9 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/base/BaseRelationMaterialMapper.xml +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/base/BaseRelationMaterialMapper.xml @@ -12,6 +12,7 @@ material_id, customer_id, sale_material_name, + sale_material_model, remark, active_flag, del_flag, 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 @@ + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index ec0b58d5..5f36f0cd 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -1,6 +1,7 @@ package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.map.MapUtil; import cn.hutool.crypto.digest.BCrypt; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.util.ArrayUtil; @@ -39,6 +40,7 @@ import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * 用户信息 @@ -314,4 +316,14 @@ public class SysUserController extends BaseController { List list = userService.selectUserList(); return R.ok(list); } + + /** + * 根据部门ID和角色名查询用户列表 + * @return 用户列表 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/listByDeptAndRole") + public R> listByDeptAndRole(@RequestParam Long deptId, @RequestParam(required = false) String roleName) { + return R.ok(userService.selectUserListByDeptAndRole(deptId, roleName)); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java index 2cfd3db9..4894fe15 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java @@ -128,4 +128,12 @@ public interface SysUserMapper extends BaseMapperPlus { }) int updateById(@Param(Constants.ENTITY) SysUser user); + /** + * 根据部门ID和角色名查询用户列表 + * + * @param deptId 部门ID + * @param roleName 角色名 + * @return 用户列表 + */ + List selectUserListByDeptAndRole(@Param("deptId") Long deptId, @Param("roleName") String roleName); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java index 94a85885..28d44d59 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -1,5 +1,6 @@ package org.dromara.system.service; +import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.system.domain.bo.SysUserBo; @@ -280,5 +281,13 @@ public interface ISysUserService { * @return 用户信息集合信息 */ public List selectUserList(); + /** + * 通过部门ID和角色名查询用户列表 + * + * @param deptId 部门ID + * @param roleName 角色名(如"项目经理") + * @return 用户信息集合 + */ + List selectUserListByDeptAndRole(@Param("roleName") Long deptId, @Param("roleName") String roleName); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index c30cf2fd..b59d5b01 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.annotations.Param; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.exception.ServiceException; @@ -692,5 +693,15 @@ public class SysUserServiceImpl implements ISysUserService { lqw.orderByAsc(SysUser::getNickName); return baseMapper.selectVoList(lqw); } - + /** + * 通过部门ID和角色名查询用户列表 + * + * @param deptId 部门ID + * @param roleName 角色名(如"项目经理") + * @return 用户信息集合 + */ + @Override + public List selectUserListByDeptAndRole(@Param("deptId") Long deptId, @Param("roleName") String roleName) { + return baseMapper.selectUserListByDeptAndRole(deptId, roleName); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 24be330b..e85c4d96 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -38,5 +38,27 @@ left join sys_role r on r.role_id = sur.role_id ${ew.getCustomSqlSegment} + diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingBillController.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingBillController.java new file mode 100644 index 00000000..cd01df9a --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingBillController.java @@ -0,0 +1,128 @@ +package org.dromara.wms.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +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.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.wms.domain.bo.WmsShippingBillBo; +import org.dromara.wms.domain.vo.WmsShippingBillVo; +import org.dromara.wms.service.IWmsShippingBillService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 发货单 + * 前端访问路由地址为:/wms/wmsShippingBill + * + * @author Yinq + * @date 2025-12-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/wmsShippingBill") +public class WmsShippingBillController extends BaseController { + + private final IWmsShippingBillService wmsShippingBillService; + + /** + * 查询发货单列表 + */ + @SaCheckPermission("wms:wmsShippingBill:list") + @GetMapping("/list") + public TableDataInfo list(WmsShippingBillBo bo, PageQuery pageQuery) { + return wmsShippingBillService.queryPageList(bo, pageQuery); + } + + /** + * 导出发货单列表 + */ + @SaCheckPermission("wms:wmsShippingBill:export") + @Log(title = "发货单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WmsShippingBillBo bo, HttpServletResponse response) { + List list = wmsShippingBillService.queryList(bo); + ExcelUtil.exportExcel(list, "发货单", WmsShippingBillVo.class, response); + } + + /** + * 获取发货单详细信息 + * + * @param shippingBillId 主键 + */ + @SaCheckPermission("wms:wmsShippingBill:query") + @GetMapping("/{shippingBillId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("shippingBillId") Long shippingBillId) { + return R.ok(wmsShippingBillService.queryById(shippingBillId)); + } + + /** + * 新增发货单 + */ + @SaCheckPermission("wms:wmsShippingBill:add") + @Log(title = "发货单", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WmsShippingBillBo bo) { + return toAjax(wmsShippingBillService.insertByBo(bo)); + } + + /** + * 修改发货单 + */ + @SaCheckPermission("wms:wmsShippingBill:edit") + @Log(title = "发货单", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WmsShippingBillBo bo) { + return toAjax(wmsShippingBillService.updateByBo(bo)); + } + + /** + * 删除发货单 + * + * @param shippingBillIds 主键串 + */ + @SaCheckPermission("wms:wmsShippingBill:remove") + @Log(title = "发货单", businessType = BusinessType.DELETE) + @DeleteMapping("/{shippingBillIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("shippingBillIds") Long[] shippingBillIds) { + return toAjax(wmsShippingBillService.deleteWithValidByIds(List.of(shippingBillIds), true)); + } + + /** + * 下拉框查询发货单列表 + */ + @GetMapping("/getWmsShippingBillList") + public R> getWmsShippingBillList(WmsShippingBillBo bo) { + List list = wmsShippingBillService.queryList(bo); + return R.ok(list); + } + + /** + * 提交发货单并发起审批流程 + */ + @SaCheckPermission("wms:wmsShippingBill:edit") + @Log(title = "发货单", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/shippingBillSubmitAndFlowStart") + public R shippingBillSubmitAndFlowStart(@RequestBody WmsShippingBillBo bo) { + return R.ok(wmsShippingBillService.shippingBillSubmitAndFlowStart(bo)); + } + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingDetailsController.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingDetailsController.java new file mode 100644 index 00000000..1bdaf5d2 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/controller/WmsShippingDetailsController.java @@ -0,0 +1,117 @@ +package org.dromara.wms.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +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.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.wms.domain.bo.WmsShippingDetailsBo; +import org.dromara.wms.domain.vo.WmsShippingDetailsVo; +import org.dromara.wms.service.IWmsShippingDetailsService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 发货单明细 + * 前端访问路由地址为:/wms/wmsShippingDetails + * + * @author Yinq + * @date 2025-12-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/wmsShippingDetails") +public class WmsShippingDetailsController extends BaseController { + + private final IWmsShippingDetailsService wmsShippingDetailsService; + + /** + * 查询发货单明细列表 + */ + @SaCheckPermission("wms:wmsShippingDetails:list") + @GetMapping("/list") + public TableDataInfo list(WmsShippingDetailsBo bo, PageQuery pageQuery) { + return wmsShippingDetailsService.queryPageList(bo, pageQuery); + } + + /** + * 导出发货单明细列表 + */ + @SaCheckPermission("wms:wmsShippingDetails:export") + @Log(title = "发货单明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WmsShippingDetailsBo bo, HttpServletResponse response) { + List list = wmsShippingDetailsService.queryList(bo); + ExcelUtil.exportExcel(list, "发货单明细", WmsShippingDetailsVo.class, response); + } + + /** + * 获取发货单明细详细信息 + * + * @param shippingDetailsId 主键 + */ + @SaCheckPermission("wms:wmsShippingDetails:query") + @GetMapping("/{shippingDetailsId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("shippingDetailsId") Long shippingDetailsId) { + return R.ok(wmsShippingDetailsService.queryById(shippingDetailsId)); + } + + /** + * 新增发货单明细 + */ + @SaCheckPermission("wms:wmsShippingDetails:add") + @Log(title = "发货单明细", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WmsShippingDetailsBo bo) { + return toAjax(wmsShippingDetailsService.insertByBo(bo)); + } + + /** + * 修改发货单明细 + */ + @SaCheckPermission("wms:wmsShippingDetails:edit") + @Log(title = "发货单明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WmsShippingDetailsBo bo) { + return toAjax(wmsShippingDetailsService.updateByBo(bo)); + } + + /** + * 删除发货单明细 + * + * @param shippingDetailsIds 主键串 + */ + @SaCheckPermission("wms:wmsShippingDetails:remove") + @Log(title = "发货单明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{shippingDetailsIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("shippingDetailsIds") Long[] shippingDetailsIds) { + return toAjax(wmsShippingDetailsService.deleteWithValidByIds(List.of(shippingDetailsIds), true)); + } + + /** + * 下拉框查询发货单明细列表 + */ + @GetMapping("/getWmsShippingDetailsList") + public R> getWmsShippingDetailsList(WmsShippingDetailsBo bo) { + List list = wmsShippingDetailsService.queryList(bo); + return R.ok(list); + } + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingBill.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingBill.java new file mode 100644 index 00000000..6f33d85b --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingBill.java @@ -0,0 +1,235 @@ +package org.dromara.wms.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; +import java.util.Date; +import java.util.List; + +/** + * 发货单对象 wms_shipping_bill + * + * @author Yinq + * @date 2025-12-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wms_shipping_bill") +public class WmsShippingBill extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 发货单ID + */ + @TableId(value = "shipping_bill_id", type = IdType.ASSIGN_ID) + private Long shippingBillId; + + /** + * 发货单号 + */ + private String shippingCode; + + /** + * 发货单类型 + */ + private String shippingType; + + /** + * 发货方式:1公司仓库发货 2供应商代发货 + */ + private String shippingMode; + + /** + * 绑定类型:1项目 2合同 + */ + private String bindType; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 项目编号(冗余,方便导出) + */ + private String projectCode; + + /** + * 项目名称(冗余,方便导出) + */ + private String projectName; + + /** + * 客户ID(逻辑外键) + */ + private Long customerId; + + /** + * 客户名称(冗余,方便导出) + */ + private String customerName; + + /** + * 收货地址 + */ + private String shippingAddress; + + /** + * 关联单号 + */ + private String inventoryAmount; + + /** + * 来源单据类型(如PO采购订单、SO销售订单、PR项目采购申请等) + */ + private String sourceBillType; + + /** + * 来源单据ID(逻辑外键,不建物理外键) + */ + private Long sourceBillId; + + /** + * 来源单据编号 + */ + private String sourceBillCode; + + /** + * 合同ID(逻辑外键) + */ + private Long contractId; + + /** + * 合同编号(冗余,方便导出) + */ + private String contractCode; + + /** + * 合同名称(冗余,方便导出) + */ + private String contractName; + + /** + * SAP订单号(来源合同表,不入库) + */ + @TableField(exist = false) + private String orderContractCode; + + /** + * 供应商 + */ + private String supplier; + + /** + * 供应商ID(逻辑外键) + */ + private Long supplierId; + + /** + * 联系人 + */ + private String contactUser; + + /** + * 联系电话 + */ + private String contactNumber; + + /** + * 收货联系人 + */ + private String receiverName; + + /** + * 收货联系电话 + */ + private String receiverPhone; + + /** + * 物流公司 + */ + private String logisticsCompany; + + /** + * 运单号 + */ + private String trackingNo; + + /** + * 物流联系电话 + */ + private String logisticsPhone; + + /** + * 发货说明 + */ + private String directions; + + /** + * 计划到货时间(冗余,用于未按时发货台账) + */ + private Date planArrivalTime; + + /** + * 实际发货时间 + */ + private Date shippingTime; + + /** + * 客户收货时间 + */ + private Date receivedTime; + + /** + * 业务完成时间(如SAP投料 / 内部流程完成) + */ + private Date completedTime; + + /** + * 发货单状态(1暂存 2审批中 3完成) + */ + private String outStockBillStatus; + + /** + * 流程状态 + */ + private String flowStatus; + + /** + * 发货状态,字典shipping_status:1待发货 2已发货 3已收货 4已完成 + */ + private String shippingStatus; + + /** + * 仓库ID(预留) + */ + private Long warehouseId; + + /** + * 仓库名称(冗余,方便导出) + */ + private String warehouseName; + + /** + * 备注 + */ + private String remark; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 发货单明细列表(主子表关联,不存在于数据库) + */ + @TableField(exist = false) + private List detailsList; + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingDetails.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingDetails.java new file mode 100644 index 00000000..12100b51 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/WmsShippingDetails.java @@ -0,0 +1,131 @@ +package org.dromara.wms.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; +import java.math.BigDecimal; + +/** + * 发货单明细对象 wms_shipping_details + * + * @author Yinq + * @date 2025-12-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wms_shipping_details") +public class WmsShippingDetails extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 发货单明细ID + */ + @TableId(value = "shipping_details_id", type = IdType.AUTO) + private Long shippingDetailsId; + + /** + * 发货单ID(逻辑外键) + */ + private Long shippingBillId; + + /** + * 物料来源类型:1-ERP物料(base_material_info) 2-WMS物料(仓储物料) 3-手工录入 + */ + private String materialSourceType; + + /** + * ERP物料ID(base_material_info.material_id) + */ + private Long erpMaterialId; + + /** + * WMS物料ID(仓储物料表ID,预留) + */ + private Long wmsMaterialId; + + /** + * 来源明细类型:如CONTRACT_DETAIL、PURCHASE_DETAIL等 + */ + private String sourceDetailType; + + /** + * 来源明细ID + */ + private Long sourceDetailId; + + /** + * 仓库ID + */ + private Long warehouseId; + + /** + * 物料ID + */ + private Long materielId; + + /** + * 物料编码(冗余,方便导出) + */ + private String materialCode; + + /** + * 物料名称(冗余,方便导出) + */ + private String materialName; + + /** + * 物料规格 + */ + private String materielSpecification; + + /** + * 批次号 + */ + private String batchNumber; + + /** + * 单价 + */ + private BigDecimal unitPrice; + + /** + * 发货数量 + */ + private BigDecimal shippingStockAmount; + + /** + * 单位ID + */ + private Long unitId; + + /** + * 计量单位名称(冗余,方便导出) + */ + private String unitName; + + /** + * 总价 + */ + private BigDecimal totalPrice; + + /** + * 备注 + */ + private String remark; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingBillBo.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingBillBo.java new file mode 100644 index 00000000..7c39b2ac --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingBillBo.java @@ -0,0 +1,259 @@ +package org.dromara.wms.domain.bo; + +import cn.hutool.core.util.ObjectUtil; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.wms.domain.WmsShippingBill; +import org.dromara.wms.domain.WmsShippingDetails; +import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt; + +import java.util.*; + +/** + * 发货单业务对象 wms_shipping_bill + * + * @author Yinq + * @date 2025-12-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WmsShippingBill.class, reverseConvertGenerate = false) +public class WmsShippingBillBo extends BaseEntity { + + /** + * 发货单ID + */ + @NotNull(message = "发货单ID不能为空", groups = { EditGroup.class }) + private Long shippingBillId; + + /** + * 发货单号 + */ + private String shippingCode; + + /** + * 发货单类型 + */ + private String shippingType; + + /** + * 发货方式:1公司仓库发货 2供应商代发货 + */ + private String shippingMode; + + /** + * 绑定类型:1项目 2合同 + */ + private String bindType; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 项目编号(冗余,方便导出) + */ + private String projectCode; + + /** + * 项目名称(冗余,方便导出) + */ + private String projectName; + + /** + * 客户ID(逻辑外键) + */ + private Long customerId; + + /** + * 客户名称(冗余,方便导出) + */ + private String customerName; + + /** + * 收货地址 + */ + private String shippingAddress; + + /** + * 关联单号 + */ + private String inventoryAmount; + + /** + * 来源单据类型(如PO采购订单、SO销售订单、PR项目采购申请等) + */ + private String sourceBillType; + + /** + * 来源单据ID(逻辑外键,不建物理外键) + */ + private Long sourceBillId; + + /** + * 来源单据编号 + */ + private String sourceBillCode; + + /** + * 合同ID(逻辑外键) + */ + private Long contractId; + + /** + * 合同编号(冗余,方便导出) + */ + private String contractCode; + + /** + * 合同名称(冗余,方便导出) + */ + private String contractName; + + /** + * SAP订单号(来源合同表,不入库) + */ + private String orderContractCode; + + /** + * 供应商 + */ + private String supplier; + + /** + * 供应商ID(逻辑外键) + */ + private Long supplierId; + + /** + * 联系人 + */ + private String contactUser; + + /** + * 联系电话 + */ + private String contactNumber; + + /** + * 收货联系人 + */ + private String receiverName; + + /** + * 收货联系电话 + */ + private String receiverPhone; + + /** + * 物流公司 + */ + private String logisticsCompany; + + /** + * 运单号 + */ + private String trackingNo; + + /** + * 物流联系电话 + */ + private String logisticsPhone; + + /** + * 发货说明 + */ + private String directions; + + /** + * 计划到货时间(冗余,用于未按时发货台账) + */ + private Date planArrivalTime; + + /** + * 实际发货时间 + */ + private Date shippingTime; + + /** + * 客户收货时间 + */ + private Date receivedTime; + + /** + * 业务完成时间(如SAP投料 / 内部流程完成) + */ + private Date completedTime; + + /** + * 发货单状态(1暂存 2审批中 3完成) + */ + private String outStockBillStatus; + + /** + * 流程状态 + */ + private String flowStatus; + + /** + * 发货状态,字典shipping_status:1待发货 2已发货 3已收货 4已完成 + */ + private String shippingStatus; + + /** + * 仓库ID(预留) + */ + private Long warehouseId; + + /** + * 仓库名称(冗余,方便导出) + */ + private String warehouseName; + + /** + * 备注 + */ + private String remark; + + /** + * 发货单明细列表(主子表提交用) + */ + private List detailsList; + + /** + * 流程编码(后端发起流程用) + */ + private String flowCode; + + /** + * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}} + */ + private Map variables; + + /** + * 流程业务扩展信息 + */ + private RemoteFlowInstanceBizExt bizExt; + + public Map getVariables() { + if (variables == null) { + return new HashMap<>(16); + } + variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); + return variables; + } + + public RemoteFlowInstanceBizExt getBizExt() { + if (ObjectUtil.isNull(bizExt)) { + bizExt = new RemoteFlowInstanceBizExt(); + } + return bizExt; + } + + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingDetailsBo.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingDetailsBo.java new file mode 100644 index 00000000..0f6a396b --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/bo/WmsShippingDetailsBo.java @@ -0,0 +1,121 @@ +package org.dromara.wms.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.wms.domain.WmsShippingDetails; + +import java.math.BigDecimal; + +/** + * 发货单明细业务对象 wms_shipping_details + * + * @author Yinq + * @date 2025-12-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WmsShippingDetails.class, reverseConvertGenerate = false) +public class WmsShippingDetailsBo extends BaseEntity { + + /** + * 发货单明细ID + */ + @NotNull(message = "发货单明细ID不能为空", groups = { EditGroup.class }) + private Long shippingDetailsId; + + /** + * 发货单ID(逻辑外键) + */ + private Long shippingBillId; + + /** + * 物料来源类型:1-ERP物料(base_material_info) 2-WMS物料(仓储物料) 3-手工录入 + */ + private String materialSourceType; + + /** + * ERP物料ID(base_material_info.material_id) + */ + private Long erpMaterialId; + + /** + * WMS物料ID(仓储物料表ID,预留) + */ + private Long wmsMaterialId; + + /** + * 来源明细类型:如CONTRACT_DETAIL、PURCHASE_DETAIL等 + */ + private String sourceDetailType; + + /** + * 来源明细ID + */ + private Long sourceDetailId; + + /** + * 仓库ID + */ + private Long warehouseId; + + /** + * 物料ID + */ + private Long materielId; + + /** + * 物料编码(冗余,方便导出) + */ + private String materialCode; + + /** + * 物料名称(冗余,方便导出) + */ + private String materialName; + + /** + * 物料规格 + */ + private String materielSpecification; + + /** + * 批次号 + */ + private String batchNumber; + + /** + * 单价 + */ + private BigDecimal unitPrice; + + /** + * 发货数量 + */ + private BigDecimal shippingStockAmount; + + /** + * 单位ID + */ + private Long unitId; + + /** + * 计量单位名称(冗余,方便导出) + */ + private String unitName; + + /** + * 总价 + */ + private BigDecimal totalPrice; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingBillVo.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingBillVo.java new file mode 100644 index 00000000..fef9eb94 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingBillVo.java @@ -0,0 +1,285 @@ +package org.dromara.wms.domain.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.wms.domain.WmsShippingBill; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + + +/** + * 发货单视图对象 wms_shipping_bill + * + * @author Yinq + * @date 2025-12-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = WmsShippingBill.class) +public class WmsShippingBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 发货单ID + */ + @ExcelProperty(value = "发货单ID") + private Long shippingBillId; + + /** + * 发货单号 + */ + @ExcelProperty(value = "发货单号") + private String shippingCode; + + /** + * 发货单类型 + */ + @ExcelProperty(value = "发货单类型") + private String shippingType; + + /** + * 发货方式:1公司仓库发货 2供应商代发货 + */ + @ExcelProperty(value = "发货方式:1公司仓库发货 2供应商代发货") + private String shippingMode; + + /** + * 绑定类型:1项目 2合同 + */ + @ExcelProperty(value = "绑定类型:1项目 2合同") + private String bindType; + + /** + * 项目ID + */ + @ExcelProperty(value = "项目ID") + private Long projectId; + + /** + * 项目编号(冗余,方便导出) + */ + @ExcelProperty(value = "项目编号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String projectCode; + + /** + * 项目名称(冗余,方便导出) + */ + @ExcelProperty(value = "项目名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String projectName; + + /** + * 客户ID(逻辑外键) + */ + @ExcelProperty(value = "客户ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "逻=辑外键") + private Long customerId; + + /** + * 客户名称(冗余,方便导出) + */ + @ExcelProperty(value = "客户名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String customerName; + + /** + * 收货地址 + */ + @ExcelProperty(value = "收货地址") + private String shippingAddress; + + /** + * 关联单号 + */ + @ExcelProperty(value = "关联单号") + private String inventoryAmount; + + /** + * 来源单据类型(如PO采购订单、SO销售订单、PR项目采购申请等) + */ + @ExcelProperty(value = "来源单据类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "如=PO采购订单、SO销售订单、PR项目采购申请等") + private String sourceBillType; + + /** + * 来源单据ID(逻辑外键,不建物理外键) + */ + @ExcelProperty(value = "来源单据ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "逻=辑外键,不建物理外键") + private Long sourceBillId; + + /** + * 来源单据编号 + */ + @ExcelProperty(value = "来源单据编号") + private String sourceBillCode; + + /** + * 合同ID(逻辑外键) + */ + @ExcelProperty(value = "合同ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "逻=辑外键") + private Long contractId; + + /** + * 合同编号(冗余,方便导出) + */ + @ExcelProperty(value = "合同编号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String contractCode; + + /** + * 合同名称(冗余,方便导出) + */ + @ExcelProperty(value = "合同名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String contractName; + + /** + * SAP订单号(来源合同表,不入库) + */ + @ExcelProperty(value = "SAP订单号") + private String orderContractCode; + + /** + * 供应商 + */ + @ExcelProperty(value = "供应商") + private String supplier; + + /** + * 供应商ID(逻辑外键) + */ + @ExcelProperty(value = "供应商ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "逻=辑外键") + private Long supplierId; + + /** + * 联系人 + */ + @ExcelProperty(value = "联系人") + private String contactUser; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String contactNumber; + + /** + * 收货联系人 + */ + @ExcelProperty(value = "收货联系人") + private String receiverName; + + /** + * 收货联系电话 + */ + @ExcelProperty(value = "收货联系电话") + private String receiverPhone; + + /** + * 物流公司 + */ + @ExcelProperty(value = "物流公司") + private String logisticsCompany; + + /** + * 运单号 + */ + @ExcelProperty(value = "运单号") + private String trackingNo; + + /** + * 物流联系电话 + */ + @ExcelProperty(value = "物流联系电话") + private String logisticsPhone; + + /** + * 发货说明 + */ + @ExcelProperty(value = "发货说明") + private String directions; + + /** + * 计划到货时间(冗余,用于未按时发货台账) + */ + @ExcelProperty(value = "计划到货时间", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,用于未按时发货台账") + private Date planArrivalTime; + + /** + * 实际发货时间 + */ + @ExcelProperty(value = "实际发货时间") + private Date shippingTime; + + /** + * 客户收货时间 + */ + @ExcelProperty(value = "客户收货时间") + private Date receivedTime; + + /** + * 业务完成时间(如SAP投料 / 内部流程完成) + */ + @ExcelProperty(value = "业务完成时间", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "如=SAP投料,/=,内=部流程完成") + private Date completedTime; + + /** + * 发货单状态(1暂存 2审批中 3完成) + */ + @ExcelProperty(value = "发货单状态(1暂存 2审批中 3完成)") + private String outStockBillStatus; + + /** + * 流程状态 + */ + @ExcelProperty(value = "流程状态") + private String flowStatus; + + /** + * 发货状态,字典shipping_status:1待发货 2已发货 3已收货 4已完成 + */ + @ExcelProperty(value = "发货状态,字典shipping_status:1待发货 2已发货 3已收货 4已完成") + private String shippingStatus; + + /** + * 仓库ID(预留) + */ + @ExcelProperty(value = "仓库ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "预=留") + private Long warehouseId; + + /** + * 仓库名称(冗余,方便导出) + */ + @ExcelProperty(value = "仓库名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String warehouseName; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 发货单明细列表 + */ + private List itemsVo; + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingDetailsVo.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingDetailsVo.java new file mode 100644 index 00000000..75a0b255 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/domain/vo/WmsShippingDetailsVo.java @@ -0,0 +1,152 @@ +package org.dromara.wms.domain.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.wms.domain.WmsShippingDetails; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + + + +/** + * 发货单明细视图对象 wms_shipping_details + * + * @author Yinq + * @date 2025-12-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = WmsShippingDetails.class) +public class WmsShippingDetailsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 发货单明细ID + */ + @ExcelProperty(value = "发货单明细ID") + private Long shippingDetailsId; + + /** + * 发货单ID(逻辑外键) + */ + @ExcelProperty(value = "发货单ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "逻=辑外键") + private Long shippingBillId; + + /** + * 物料来源类型:1-ERP物料(base_material_info) 2-WMS物料(仓储物料) 3-手工录入 + */ + @ExcelProperty(value = "物料来源类型:1-ERP物料(base_material_info) 2-WMS物料(仓储物料) 3-手工录入") + private String materialSourceType; + + /** + * ERP物料ID(base_material_info.material_id) + */ + @ExcelProperty(value = "ERP物料ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "b=ase_material_info.material_id") + private Long erpMaterialId; + + /** + * WMS物料ID(仓储物料表ID,预留) + */ + @ExcelProperty(value = "WMS物料ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "仓=储物料表ID,预留") + private Long wmsMaterialId; + + /** + * 来源明细类型:如CONTRACT_DETAIL、PURCHASE_DETAIL等 + */ + @ExcelProperty(value = "来源明细类型:如CONTRACT_DETAIL、PURCHASE_DETAIL等") + private String sourceDetailType; + + /** + * 来源明细ID + */ + @ExcelProperty(value = "来源明细ID") + private Long sourceDetailId; + + /** + * 仓库ID + */ + @ExcelProperty(value = "仓库ID") + private Long warehouseId; + + /** + * 物料ID + */ + @ExcelProperty(value = "物料ID") + private Long materielId; + + /** + * 物料编码(冗余,方便导出) + */ + @ExcelProperty(value = "物料编码", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String materialCode; + + /** + * 物料名称(冗余,方便导出) + */ + @ExcelProperty(value = "物料名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String materialName; + + /** + * 物料规格 + */ + @ExcelProperty(value = "物料规格") + private String materielSpecification; + + /** + * 批次号 + */ + @ExcelProperty(value = "批次号") + private String batchNumber; + + /** + * 单价 + */ + @ExcelProperty(value = "单价") + private BigDecimal unitPrice; + + /** + * 发货数量 + */ + @ExcelProperty(value = "发货数量") + private BigDecimal shippingStockAmount; + + /** + * 单位ID + */ + @ExcelProperty(value = "单位ID") + private Long unitId; + + /** + * 计量单位名称(冗余,方便导出) + */ + @ExcelProperty(value = "计量单位名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余,方便导出") + private String unitName; + + /** + * 总价 + */ + @ExcelProperty(value = "总价") + private BigDecimal totalPrice; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingBillMapper.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingBillMapper.java new file mode 100644 index 00000000..c3ea07bc --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingBillMapper.java @@ -0,0 +1,128 @@ +package org.dromara.wms.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.wms.domain.WmsShippingBill; +import org.dromara.wms.domain.vo.WmsShippingBillVo; + +import java.util.Collection; +import java.util.List; + +/** + * 发货单Mapper接口 + * + * @author Yinq + * @date 2025-12-08 + */ +public interface WmsShippingBillMapper extends BaseMapperPlus { + + /** + * 查询发货单列表 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 发货单集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "t.create_dept"), + @DataColumn(key = "userName", value = "t.create_by") + }) + Page selectCustomWmsShippingBillVoList(@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") + }) + List selectCustomWmsShippingBillVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 根据ID查询发货单详情 + * + * @param shippingBillId 主键ID + * @return 发货单对象 + */ + WmsShippingBillVo selectCustomWmsShippingBillVoById(@Param("shippingBillId") Long shippingBillId); + + /** + * 根据ID列表批量查询发货单 + * + * @param ids ID集合 + * @return 发货单集合 + */ + List selectCustomWmsShippingBillVoByIds(@Param("ids") Collection ids); + + /** + * 统计发货单记录数 + * + * @param queryWrapper 查询条件 + * @return 记录总数 + */ + Long countCustomWmsShippingBill(@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 selectCustomWmsShippingBillVoPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 批量插入发货单 + * + * @param list 发货单对象集合 + * @return 影响行数 + */ + int batchInsertWmsShippingBill(@Param("list") List list); + + /** + * 批量更新发货单 + * + * @param list 发货单对象集合 + * @return 影响行数 + */ + int batchUpdateWmsShippingBill(@Param("list") List list); + + /** + * 根据自定义条件删除发货单 + * + * @param queryWrapper 删除条件 + * @return 影响行数 + */ + int deleteCustomWmsShippingBill(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据ID列表批量删除发货单 + * + * @param ids ID集合 + * @return 影响行数 + */ + int deleteCustomWmsShippingBillByIds(@Param("ids") Collection ids); + + /** + * 检查发货单是否存在 + * + * @param queryWrapper 查询条件 + * @return 是否存在 + */ + Boolean existsWmsShippingBill(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingDetailsMapper.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingDetailsMapper.java new file mode 100644 index 00000000..6959a676 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/mapper/WmsShippingDetailsMapper.java @@ -0,0 +1,114 @@ +package org.dromara.wms.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.wms.domain.WmsShippingDetails; +import org.dromara.wms.domain.vo.WmsShippingDetailsVo; + +import java.util.Collection; +import java.util.List; + +/** + * 发货单明细Mapper接口 + * + * @author Yinq + * @date 2025-12-08 + */ +public interface WmsShippingDetailsMapper extends BaseMapperPlus { + + /** + * 查询发货单明细列表 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 发货单明细集合 + */ + public Page selectCustomWmsShippingDetailsVoList(@Param("page") Page page, @Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 查询发货单明细列表 + * + * @param queryWrapper 条件 + * @return 发货单明细集合 + */ + public List selectCustomWmsShippingDetailsVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper queryWrapper); + + /** + * 根据ID查询发货单明细详情 + * + * @param shippingDetailsId 主键ID + * @return 发货单明细对象 + */ + WmsShippingDetailsVo selectCustomWmsShippingDetailsVoById(@Param("shippingDetailsId") Long shippingDetailsId); + + /** + * 根据ID列表批量查询发货单明细 + * + * @param ids ID集合 + * @return 发货单明细集合 + */ + List selectCustomWmsShippingDetailsVoByIds(@Param("ids") Collection ids); + + /** + * 统计发货单明细记录数 + * + * @param queryWrapper 查询条件 + * @return 记录总数 + */ + Long countCustomWmsShippingDetails(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 分页查询发货单明细(自定义条件) + * + * @param page 分页对象 + * @param queryWrapper 查询条件 + * @return 分页结果 + */ + Page selectCustomWmsShippingDetailsVoPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 批量插入发货单明细 + * + * @param list 发货单明细对象集合 + * @return 影响行数 + */ + int batchInsertWmsShippingDetails(@Param("list") List list); + + /** + * 批量更新发货单明细 + * + * @param list 发货单明细对象集合 + * @return 影响行数 + */ + int batchUpdateWmsShippingDetails(@Param("list") List list); + + /** + * 根据自定义条件删除发货单明细 + * + * @param queryWrapper 删除条件 + * @return 影响行数 + */ + int deleteCustomWmsShippingDetails(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据ID列表批量删除发货单明细 + * + * @param ids ID集合 + * @return 影响行数 + */ + int deleteCustomWmsShippingDetailsByIds(@Param("ids") Collection ids); + + /** + * 检查发货单明细是否存在 + * + * @param queryWrapper 查询条件 + * @return 是否存在 + */ + Boolean existsWmsShippingDetails(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingBillService.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingBillService.java new file mode 100644 index 00000000..b087a551 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingBillService.java @@ -0,0 +1,76 @@ +package org.dromara.wms.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.wms.domain.bo.WmsShippingBillBo; +import org.dromara.wms.domain.vo.WmsShippingBillVo; + +import java.util.Collection; +import java.util.List; + +/** + * 发货单Service接口 + * + * @author Yinq + * @date 2025-12-08 + */ +public interface IWmsShippingBillService { + + /** + * 查询发货单 + * + * @param shippingBillId 主键 + * @return 发货单 + */ + WmsShippingBillVo queryById(Long shippingBillId); + + /** + * 分页查询发货单列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 发货单分页列表 + */ + TableDataInfo queryPageList(WmsShippingBillBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的发货单列表 + * + * @param bo 查询条件 + * @return 发货单列表 + */ + List queryList(WmsShippingBillBo bo); + + /** + * 新增发货单 + * + * @param bo 发货单 + * @return 是否新增成功 + */ + Boolean insertByBo(WmsShippingBillBo bo); + + /** + * 修改发货单 + * + * @param bo 发货单 + * @return 是否修改成功 + */ + Boolean updateByBo(WmsShippingBillBo bo); + + /** + * 校验并批量删除发货单信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 提交发货单并发起流程 + * + * @param bo 发货单 + * @return 发货单VO + */ + WmsShippingBillVo shippingBillSubmitAndFlowStart(WmsShippingBillBo bo); +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingDetailsService.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingDetailsService.java new file mode 100644 index 00000000..290023bd --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingDetailsService.java @@ -0,0 +1,68 @@ +package org.dromara.wms.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.wms.domain.bo.WmsShippingDetailsBo; +import org.dromara.wms.domain.vo.WmsShippingDetailsVo; + +import java.util.Collection; +import java.util.List; + +/** + * 发货单明细Service接口 + * + * @author Yinq + * @date 2025-12-08 + */ +public interface IWmsShippingDetailsService { + + /** + * 查询发货单明细 + * + * @param shippingDetailsId 主键 + * @return 发货单明细 + */ + WmsShippingDetailsVo queryById(Long shippingDetailsId); + + /** + * 分页查询发货单明细列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 发货单明细分页列表 + */ + TableDataInfo queryPageList(WmsShippingDetailsBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的发货单明细列表 + * + * @param bo 查询条件 + * @return 发货单明细列表 + */ + List queryList(WmsShippingDetailsBo bo); + + /** + * 新增发货单明细 + * + * @param bo 发货单明细 + * @return 是否新增成功 + */ + Boolean insertByBo(WmsShippingDetailsBo bo); + + /** + * 修改发货单明细 + * + * @param bo 发货单明细 + * @return 是否修改成功 + */ + Boolean updateByBo(WmsShippingDetailsBo bo); + + /** + * 校验并批量删除发货单明细信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingBillServiceImpl.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingBillServiceImpl.java new file mode 100644 index 00000000..55b244cd --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingBillServiceImpl.java @@ -0,0 +1,339 @@ +package org.dromara.wms.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.map.MapUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.enums.OAStatusEnum; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.wms.domain.WmsShippingBill; +import org.dromara.wms.domain.WmsShippingDetails; +import org.dromara.wms.domain.bo.WmsShippingBillBo; +import org.dromara.wms.domain.vo.WmsShippingBillVo; +import org.dromara.wms.domain.vo.WmsShippingDetailsVo; +import org.dromara.wms.mapper.WmsShippingBillMapper; +import org.dromara.wms.mapper.WmsShippingDetailsMapper; +import org.dromara.wms.service.IWmsShippingBillService; +import org.dromara.workflow.api.RemoteWorkflowService; +import org.dromara.workflow.api.domain.RemoteStartProcess; +import org.dromara.workflow.api.event.ProcessEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 发货单Service业务层处理 + * + * @author Yinq + * @date 2025-12-08 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class WmsShippingBillServiceImpl implements IWmsShippingBillService { + + private final WmsShippingBillMapper baseMapper; + private final WmsShippingDetailsMapper detailsMapper; + + @DubboReference(timeout = 30000) + private RemoteWorkflowService remoteWorkflowService; + + /** + * 查询发货单(包含明细列表) + * + * @param shippingBillId 主键 + * @return 发货单 + */ + @Override + public WmsShippingBillVo queryById(Long shippingBillId) { + // 使用 Mapper.xml 中自定义 SQL(联查合同表)获取发货单及 SAP 订单号 + WmsShippingBillVo vo = baseMapper.selectCustomWmsShippingBillVoById(shippingBillId); + if (vo != null) { + // 查询当前发货单下的明细列表 + LambdaQueryWrapper detailsLqw = Wrappers.lambdaQuery() + .eq(WmsShippingDetails::getDelFlag, "0") + .eq(WmsShippingDetails::getShippingBillId, shippingBillId); + List detailsVoList = detailsMapper.selectVoList(detailsLqw); + vo.setItemsVo(detailsVoList); + } + return vo; + } + + /** + * 分页查询发货单列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 发货单分页列表 + */ + @Override + public TableDataInfo queryPageList(WmsShippingBillBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + // 使用 Mapper.xml 中分页自定义 SQL 接口(selectCustomWmsShippingBillVoPage),联查合同表获取 SAP 订单号 + Page page = baseMapper.selectCustomWmsShippingBillVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 查询符合条件的发货单列表 + * + * @param bo 查询条件 + * @return 发货单列表 + */ + @Override + public List queryList(WmsShippingBillBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + // 使用 Mapper.xml 中自定义 SQL(联查合同表获取 SAP 订单号) + return baseMapper.selectCustomWmsShippingBillVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(WmsShippingBillBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(WmsShippingBill.class) + .selectAll(WmsShippingBill.class) + .eq(WmsShippingBill::getDelFlag, "0") + .eq(StringUtils.isNotBlank(bo.getShippingCode()), WmsShippingBill::getShippingCode, bo.getShippingCode()) + .eq(StringUtils.isNotBlank(bo.getShippingType()), WmsShippingBill::getShippingType, bo.getShippingType()) + .eq(StringUtils.isNotBlank(bo.getShippingMode()), WmsShippingBill::getShippingMode, bo.getShippingMode()) + .eq(StringUtils.isNotBlank(bo.getBindType()), WmsShippingBill::getBindType, bo.getBindType()) + .eq(bo.getProjectId() != null, WmsShippingBill::getProjectId, bo.getProjectId()) + .eq(StringUtils.isNotBlank(bo.getProjectCode()), WmsShippingBill::getProjectCode, bo.getProjectCode()) + .like(StringUtils.isNotBlank(bo.getProjectName()), WmsShippingBill::getProjectName, bo.getProjectName()) + .eq(bo.getCustomerId() != null, WmsShippingBill::getCustomerId, bo.getCustomerId()) + .like(StringUtils.isNotBlank(bo.getCustomerName()), WmsShippingBill::getCustomerName, bo.getCustomerName()) + .eq(StringUtils.isNotBlank(bo.getShippingAddress()), WmsShippingBill::getShippingAddress, bo.getShippingAddress()) + .eq(StringUtils.isNotBlank(bo.getInventoryAmount()), WmsShippingBill::getInventoryAmount, bo.getInventoryAmount()) + .eq(StringUtils.isNotBlank(bo.getSourceBillType()), WmsShippingBill::getSourceBillType, bo.getSourceBillType()) + .eq(bo.getSourceBillId() != null, WmsShippingBill::getSourceBillId, bo.getSourceBillId()) + .eq(StringUtils.isNotBlank(bo.getSourceBillCode()), WmsShippingBill::getSourceBillCode, bo.getSourceBillCode()) + .eq(bo.getContractId() != null, WmsShippingBill::getContractId, bo.getContractId()) + .eq(StringUtils.isNotBlank(bo.getContractCode()), WmsShippingBill::getContractCode, bo.getContractCode()) + .like(StringUtils.isNotBlank(bo.getContractName()), WmsShippingBill::getContractName, bo.getContractName()) + .eq(StringUtils.isNotBlank(bo.getSupplier()), WmsShippingBill::getSupplier, bo.getSupplier()) + .eq(bo.getSupplierId() != null, WmsShippingBill::getSupplierId, bo.getSupplierId()) + .eq(StringUtils.isNotBlank(bo.getContactUser()), WmsShippingBill::getContactUser, bo.getContactUser()) + .eq(StringUtils.isNotBlank(bo.getContactNumber()), WmsShippingBill::getContactNumber, bo.getContactNumber()) + .like(StringUtils.isNotBlank(bo.getReceiverName()), WmsShippingBill::getReceiverName, bo.getReceiverName()) + .eq(StringUtils.isNotBlank(bo.getReceiverPhone()), WmsShippingBill::getReceiverPhone, bo.getReceiverPhone()) + .eq(StringUtils.isNotBlank(bo.getLogisticsCompany()), WmsShippingBill::getLogisticsCompany, bo.getLogisticsCompany()) + .eq(StringUtils.isNotBlank(bo.getTrackingNo()), WmsShippingBill::getTrackingNo, bo.getTrackingNo()) + .eq(StringUtils.isNotBlank(bo.getLogisticsPhone()), WmsShippingBill::getLogisticsPhone, bo.getLogisticsPhone()) + .eq(StringUtils.isNotBlank(bo.getDirections()), WmsShippingBill::getDirections, bo.getDirections()) + .eq(bo.getPlanArrivalTime() != null, WmsShippingBill::getPlanArrivalTime, bo.getPlanArrivalTime()) + .eq(bo.getShippingTime() != null, WmsShippingBill::getShippingTime, bo.getShippingTime()) + .eq(bo.getReceivedTime() != null, WmsShippingBill::getReceivedTime, bo.getReceivedTime()) + .eq(bo.getCompletedTime() != null, WmsShippingBill::getCompletedTime, bo.getCompletedTime()) + .eq(StringUtils.isNotBlank(bo.getOutStockBillStatus()), WmsShippingBill::getOutStockBillStatus, bo.getOutStockBillStatus()) + .eq(StringUtils.isNotBlank(bo.getFlowStatus()), WmsShippingBill::getFlowStatus, bo.getFlowStatus()) + .eq(StringUtils.isNotBlank(bo.getShippingStatus()), WmsShippingBill::getShippingStatus, bo.getShippingStatus()) + .eq(bo.getWarehouseId() != null, WmsShippingBill::getWarehouseId, bo.getWarehouseId()) + .like(StringUtils.isNotBlank(bo.getWarehouseName()), WmsShippingBill::getWarehouseName, bo.getWarehouseName()) +; + return lqw; + } + + /** + * 新增发货单(包含明细列表) + * + * @param bo 发货单 + * @return 是否新增成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(WmsShippingBillBo bo) { + WmsShippingBill add = MapstructUtils.convert(bo, WmsShippingBill.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setShippingBillId(add.getShippingBillId()); + // 同步保存明细列表 + List detailsList = bo.getDetailsList(); + if (CollUtil.isNotEmpty(detailsList)) { + for (WmsShippingDetails detail : detailsList) { + detail.setShippingBillId(add.getShippingBillId()); + } + detailsMapper.insertBatch(detailsList); + } + } + return flag; + } + + /** + * 修改发货单(包含明细列表的增删改) + * + * @param bo 发货单 + * @return 是否修改成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(WmsShippingBillBo bo) { + WmsShippingBill update = MapstructUtils.convert(bo, WmsShippingBill.class); + validEntityBeforeSave(update); + boolean flag = baseMapper.updateById(update) > 0; + + // 处理明细列表的增删改 + List detailsList = bo.getDetailsList(); + Long shippingBillId = bo.getShippingBillId(); + + if (detailsList != null) { + // 1. 获取前端提交的明细ID集合 + List submittedIds = detailsList.stream() + .filter(d -> d.getShippingDetailsId() != null) + .map(WmsShippingDetails::getShippingDetailsId) + .collect(Collectors.toList()); + + // 2. 删除前端未提交的旧明细(即数据库中存在但前端不再提交的记录) + if (CollUtil.isNotEmpty(submittedIds)) { + detailsMapper.delete(Wrappers.lambdaUpdate() + .eq(WmsShippingDetails::getShippingBillId, shippingBillId) + .notIn(WmsShippingDetails::getShippingDetailsId, submittedIds)); + } else { + // 如果前端提交的明细都没有ID(全为新增),则删除该发货单下所有旧明细 + detailsMapper.delete(Wrappers.lambdaUpdate() + .eq(WmsShippingDetails::getShippingBillId, shippingBillId)); + } + + // 3. 新增或更新明细 + for (WmsShippingDetails detail : detailsList) { + detail.setShippingBillId(shippingBillId); + if (detail.getShippingDetailsId() != null) { + detailsMapper.updateById(detail); + } else { + detailsMapper.insert(detail); + } + } + } + return flag; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(WmsShippingBill entity) { + // 发货单号唯一性校验(新增时校验) + if (entity.getShippingBillId() == null && StringUtils.isNotBlank(entity.getShippingCode())) { + Long count = baseMapper.selectCount(Wrappers.lambdaQuery() + .eq(WmsShippingBill::getShippingCode, entity.getShippingCode()) + .eq(WmsShippingBill::getDelFlag, "0")); + if (count > 0) { + throw new ServiceException("发货单号【" + entity.getShippingCode() + "】已存在"); + } + } + // 必须绑定项目或合同 + if (entity.getProjectId() == null && entity.getContractId() == null) { + throw new ServiceException("发货单必须绑定项目或合同"); + } + } + + /** + * 校验并批量删除发货单信息(同时删除明细) + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + // 先删除子表明细 + detailsMapper.delete(Wrappers.lambdaUpdate() + .in(WmsShippingDetails::getShippingBillId, ids)); + // 再删除主表 + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 提交发货单并发起流程 + * + * @param bo 发货单 + * @return 发货单VO + */ + @Override + @Transactional(rollbackFor = Exception.class) + public WmsShippingBillVo shippingBillSubmitAndFlowStart(WmsShippingBillBo bo) { + WmsShippingBill add = MapstructUtils.convert(bo, WmsShippingBill.class); + validEntityBeforeSave(add); + if (StringUtils.isNull(bo.getShippingBillId())) { + this.insertByBo(bo); + } else { + this.updateByBo(bo); + } + // 后端发起需要忽略权限 + bo.getVariables().put("ignore", true); + RemoteStartProcess startProcess = new RemoteStartProcess(); + startProcess.setBusinessId(bo.getShippingBillId().toString()); + startProcess.setFlowCode(bo.getFlowCode()); + startProcess.setVariables(bo.getVariables()); + startProcess.setBizExt(bo.getBizExt()); + bo.getBizExt().setBusinessId(startProcess.getBusinessId()); + boolean flagOne = remoteWorkflowService.startCompleteTask(startProcess); + if (!flagOne) { + throw new ServiceException("流程发起异常"); + } + return MapstructUtils.convert(add, WmsShippingBillVo.class); + } + + /** + * 发货单流程监听(草稿、撤销、退回、作废、终止、已完成等) + * 监听发货单流程编码为 WMSSP 的流程事件 + * + * @param processEvent 流程事件参数 + */ + @EventListener(condition = "#processEvent.flowCode == 'WMSSP'") + public void processHandler(ProcessEvent processEvent) { + TenantHelper.dynamic(processEvent.getTenantId(), () -> { + log.info("发货单流程事件: {}", processEvent.toString()); + WmsShippingBill shippingBill = baseMapper.selectById(Convert.toLong(processEvent.getBusinessId())); + if (shippingBill == null) { + log.warn("发货单不存在,businessId: {}", processEvent.getBusinessId()); + return; + } + // 更新流程状态 + shippingBill.setFlowStatus(processEvent.getStatus()); + Map params = processEvent.getParams(); + if (MapUtil.isNotEmpty(params)) { + // 可获取办理人等信息 + String handler = Convert.toStr(params.get("handler")); + } + // 根据流程状态更新业务状态 + if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) { + // 审批中 + shippingBill.setOutStockBillStatus(OAStatusEnum.APPROVING.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) { + // 审批完成 → 业务状态变为可用/待发货 + shippingBill.setOutStockBillStatus(OAStatusEnum.COMPLETED.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) { + // 作废或终止 → 业务状态变为作废 + shippingBill.setOutStockBillStatus(OAStatusEnum.INVALID.getStatus()); + } else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus()) + || Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) { + // 退回或撤销 → 业务状态变为草稿 + shippingBill.setOutStockBillStatus(OAStatusEnum.DRAFT.getStatus()); + } + baseMapper.updateById(shippingBill); + }); + } +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingDetailsServiceImpl.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingDetailsServiceImpl.java new file mode 100644 index 00000000..985dda74 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingDetailsServiceImpl.java @@ -0,0 +1,148 @@ +package org.dromara.wms.service.impl; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.wms.domain.WmsShippingDetails; +import org.dromara.wms.domain.bo.WmsShippingDetailsBo; +import org.dromara.wms.domain.vo.WmsShippingDetailsVo; +import org.dromara.wms.mapper.WmsShippingDetailsMapper; +import org.dromara.wms.service.IWmsShippingDetailsService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 发货单明细Service业务层处理 + * + * @author Yinq + * @date 2025-12-08 + */ +@RequiredArgsConstructor +@Service +public class WmsShippingDetailsServiceImpl implements IWmsShippingDetailsService { + + private final WmsShippingDetailsMapper baseMapper; + + /** + * 查询发货单明细 + * + * @param shippingDetailsId 主键 + * @return 发货单明细 + */ + @Override + public WmsShippingDetailsVo queryById(Long shippingDetailsId){ + return baseMapper.selectVoById(shippingDetailsId); + } + + /** + * 分页查询发货单明细列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 发货单明细分页列表 + */ + @Override + public TableDataInfo queryPageList(WmsShippingDetailsBo 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(WmsShippingDetailsBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(WmsShippingDetailsBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = JoinWrappers.lambda(WmsShippingDetails.class) + .selectAll(WmsShippingDetails.class) + .eq(WmsShippingDetails::getDelFlag, "0") + .eq(bo.getShippingBillId() != null, WmsShippingDetails::getShippingBillId, bo.getShippingBillId()) + .eq(StringUtils.isNotBlank(bo.getMaterialSourceType()), WmsShippingDetails::getMaterialSourceType, bo.getMaterialSourceType()) + .eq(bo.getErpMaterialId() != null, WmsShippingDetails::getErpMaterialId, bo.getErpMaterialId()) + .eq(bo.getWmsMaterialId() != null, WmsShippingDetails::getWmsMaterialId, bo.getWmsMaterialId()) + .eq(StringUtils.isNotBlank(bo.getSourceDetailType()), WmsShippingDetails::getSourceDetailType, bo.getSourceDetailType()) + .eq(bo.getSourceDetailId() != null, WmsShippingDetails::getSourceDetailId, bo.getSourceDetailId()) + .eq(bo.getWarehouseId() != null, WmsShippingDetails::getWarehouseId, bo.getWarehouseId()) + .eq(bo.getMaterielId() != null, WmsShippingDetails::getMaterielId, bo.getMaterielId()) + .eq(StringUtils.isNotBlank(bo.getMaterialCode()), WmsShippingDetails::getMaterialCode, bo.getMaterialCode()) + .like(StringUtils.isNotBlank(bo.getMaterialName()), WmsShippingDetails::getMaterialName, bo.getMaterialName()) + .eq(StringUtils.isNotBlank(bo.getMaterielSpecification()), WmsShippingDetails::getMaterielSpecification, bo.getMaterielSpecification()) + .eq(StringUtils.isNotBlank(bo.getBatchNumber()), WmsShippingDetails::getBatchNumber, bo.getBatchNumber()) + .eq(bo.getUnitPrice() != null, WmsShippingDetails::getUnitPrice, bo.getUnitPrice()) + .eq(bo.getShippingStockAmount() != null, WmsShippingDetails::getShippingStockAmount, bo.getShippingStockAmount()) + .eq(bo.getUnitId() != null, WmsShippingDetails::getUnitId, bo.getUnitId()) + .like(StringUtils.isNotBlank(bo.getUnitName()), WmsShippingDetails::getUnitName, bo.getUnitName()) + .eq(bo.getTotalPrice() != null, WmsShippingDetails::getTotalPrice, bo.getTotalPrice()) +; + return lqw; + } + + /** + * 新增发货单明细 + * + * @param bo 发货单明细 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(WmsShippingDetailsBo bo) { + WmsShippingDetails add = MapstructUtils.convert(bo, WmsShippingDetails.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setShippingDetailsId(add.getShippingDetailsId()); + } + return flag; + } + + /** + * 修改发货单明细 + * + * @param bo 发货单明细 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(WmsShippingDetailsBo bo) { + WmsShippingDetails update = MapstructUtils.convert(bo, WmsShippingDetails.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(WmsShippingDetails 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-wms/src/main/resources/mapper/wms/WmsShippingBillMapper.xml b/ruoyi-modules/ruoyi-wms/src/main/resources/mapper/wms/WmsShippingBillMapper.xml new file mode 100644 index 00000000..68879c81 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/resources/mapper/wms/WmsShippingBillMapper.xml @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + + + + insert into wms_shipping_bill( + tenant_id, + + shipping_code, + + shipping_type, + + shipping_mode, + + bind_type, + + project_id, + + project_code, + + project_name, + + customer_id, + + customer_name, + + shipping_address, + + inventory_amount, + + source_bill_type, + + source_bill_id, + + source_bill_code, + + contract_id, + + contract_code, + + contract_name, + + supplier, + + supplier_id, + + contact_user, + + contact_number, + + receiver_name, + + receiver_phone, + + logistics_company, + + tracking_no, + + logistics_phone, + + directions, + + plan_arrival_time, + + shipping_time, + + received_time, + + completed_time, + + out_stock_bill_status, + + flow_status, + + shipping_status, + + warehouse_id, + + warehouse_name, + + remark, + + del_flag, + + create_dept, + + create_by, + + create_time, + + update_by, + + update_time + + ) + values + + ( + #{item.tenantId}, + + #{item.shippingCode}, + + #{item.shippingType}, + + #{item.shippingMode}, + + #{item.bindType}, + + #{item.projectId}, + + #{item.projectCode}, + + #{item.projectName}, + + #{item.customerId}, + + #{item.customerName}, + + #{item.shippingAddress}, + + #{item.inventoryAmount}, + + #{item.sourceBillType}, + + #{item.sourceBillId}, + + #{item.sourceBillCode}, + + #{item.contractId}, + + #{item.contractCode}, + + #{item.contractName}, + + #{item.supplier}, + + #{item.supplierId}, + + #{item.contactUser}, + + #{item.contactNumber}, + + #{item.receiverName}, + + #{item.receiverPhone}, + + #{item.logisticsCompany}, + + #{item.trackingNo}, + + #{item.logisticsPhone}, + + #{item.directions}, + + #{item.planArrivalTime}, + + #{item.shippingTime}, + + #{item.receivedTime}, + + #{item.completedTime}, + + #{item.outStockBillStatus}, + + #{item.flowStatus}, + + #{item.shippingStatus}, + + #{item.warehouseId}, + + #{item.warehouseName}, + + #{item.remark}, + + #{item.delFlag}, + + #{item.createDept}, + + #{item.createBy}, + + #{item.createTime}, + + #{item.updateBy}, + + #{item.updateTime} + + ) + + + + + + + update wms_shipping_bill t + + + t.tenant_id = #{item.tenantId}, + + + t.shipping_code = #{item.shippingCode}, + + + t.shipping_type = #{item.shippingType}, + + + t.shipping_mode = #{item.shippingMode}, + + + t.bind_type = #{item.bindType}, + + + t.project_id = #{item.projectId}, + + + t.project_code = #{item.projectCode}, + + + t.project_name = #{item.projectName}, + + + t.customer_id = #{item.customerId}, + + + t.customer_name = #{item.customerName}, + + + t.shipping_address = #{item.shippingAddress}, + + + t.inventory_amount = #{item.inventoryAmount}, + + + t.source_bill_type = #{item.sourceBillType}, + + + t.source_bill_id = #{item.sourceBillId}, + + + t.source_bill_code = #{item.sourceBillCode}, + + + t.contract_id = #{item.contractId}, + + + t.contract_code = #{item.contractCode}, + + + t.contract_name = #{item.contractName}, + + + t.supplier = #{item.supplier}, + + + t.supplier_id = #{item.supplierId}, + + + t.contact_user = #{item.contactUser}, + + + t.contact_number = #{item.contactNumber}, + + + t.receiver_name = #{item.receiverName}, + + + t.receiver_phone = #{item.receiverPhone}, + + + t.logistics_company = #{item.logisticsCompany}, + + + t.tracking_no = #{item.trackingNo}, + + + t.logistics_phone = #{item.logisticsPhone}, + + + t.directions = #{item.directions}, + + + t.plan_arrival_time = #{item.planArrivalTime}, + + + t.shipping_time = #{item.shippingTime}, + + + t.received_time = #{item.receivedTime}, + + + t.completed_time = #{item.completedTime}, + + + t.out_stock_bill_status = #{item.outStockBillStatus}, + + + t.flow_status = #{item.flowStatus}, + + + t.shipping_status = #{item.shippingStatus}, + + + t.warehouse_id = #{item.warehouseId}, + + + t.warehouse_name = #{item.warehouseName}, + + + t.remark = #{item.remark}, + + + t.del_flag = #{item.delFlag}, + + + t.create_dept = #{item.createDept}, + + + t.create_by = #{item.createBy}, + + + t.create_time = #{item.createTime}, + + + t.update_by = #{item.updateBy}, + + + t.update_time = #{item.updateTime} + + + where t.shipping_bill_id = #{item.shippingBillId} + + + + + + delete from wms_shipping_bill t + ${ew.getCustomSqlSegment} + + + + + delete from wms_shipping_bill t + where t.shipping_bill_id in + + #{id} + + + + + + + + diff --git a/ruoyi-modules/ruoyi-wms/src/main/resources/mapper/wms/WmsShippingDetailsMapper.xml b/ruoyi-modules/ruoyi-wms/src/main/resources/mapper/wms/WmsShippingDetailsMapper.xml new file mode 100644 index 00000000..f766a73d --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/resources/mapper/wms/WmsShippingDetailsMapper.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + insert into wms_shipping_details( + tenant_id, + + shipping_bill_id, + + material_source_type, + + erp_material_id, + + wms_material_id, + + source_detail_type, + + source_detail_id, + + warehouse_id, + + materiel_id, + + material_code, + + material_name, + + materiel_specification, + + batch_number, + + unit_price, + + shipping_stock_amount, + + unit_id, + + unit_name, + + total_price, + + remark, + + del_flag, + + create_dept, + + create_by, + + create_time, + + update_by, + + update_time + + ) + values + + ( + #{item.tenantId}, + + #{item.shippingBillId}, + + #{item.materialSourceType}, + + #{item.erpMaterialId}, + + #{item.wmsMaterialId}, + + #{item.sourceDetailType}, + + #{item.sourceDetailId}, + + #{item.warehouseId}, + + #{item.materielId}, + + #{item.materialCode}, + + #{item.materialName}, + + #{item.materielSpecification}, + + #{item.batchNumber}, + + #{item.unitPrice}, + + #{item.shippingStockAmount}, + + #{item.unitId}, + + #{item.unitName}, + + #{item.totalPrice}, + + #{item.remark}, + + #{item.delFlag}, + + #{item.createDept}, + + #{item.createBy}, + + #{item.createTime}, + + #{item.updateBy}, + + #{item.updateTime} + + ) + + + + + + + update wms_shipping_details t + + + t.tenant_id = #{item.tenantId}, + + + t.shipping_bill_id = #{item.shippingBillId}, + + + t.material_source_type = #{item.materialSourceType}, + + + t.erp_material_id = #{item.erpMaterialId}, + + + t.wms_material_id = #{item.wmsMaterialId}, + + + t.source_detail_type = #{item.sourceDetailType}, + + + t.source_detail_id = #{item.sourceDetailId}, + + + t.warehouse_id = #{item.warehouseId}, + + + t.materiel_id = #{item.materielId}, + + + t.material_code = #{item.materialCode}, + + + t.material_name = #{item.materialName}, + + + t.materiel_specification = #{item.materielSpecification}, + + + t.batch_number = #{item.batchNumber}, + + + t.unit_price = #{item.unitPrice}, + + + t.shipping_stock_amount = #{item.shippingStockAmount}, + + + t.unit_id = #{item.unitId}, + + + t.unit_name = #{item.unitName}, + + + t.total_price = #{item.totalPrice}, + + + t.remark = #{item.remark}, + + + t.del_flag = #{item.delFlag}, + + + t.create_dept = #{item.createDept}, + + + t.create_by = #{item.createBy}, + + + t.create_time = #{item.createTime}, + + + t.update_by = #{item.updateBy}, + + + t.update_time = #{item.updateTime} + + + where t.shipping_details_id = #{item.shippingDetailsId} + + + + + + delete from wms_shipping_details t + ${ew.getCustomSqlSegment} + + + + + delete from wms_shipping_details t + where t.shipping_details_id in + + #{id} + + + + + + + +