This commit is contained in:
aikai 2024-03-08 10:09:15 +08:00
commit 9f02423626
64 changed files with 2448 additions and 15 deletions

View File

@ -25,6 +25,11 @@ public interface ErrorCodeConstants {
ErrorCode OA_EVECTION_NOT_EXISTS = new ErrorCode(1_009_001_101, "出差申请不存在");
ErrorCode OA_SEAL_NOT_EXISTS = new ErrorCode(1_009_001_102, "用章申请不存在");
ErrorCode OA_CONTRACT_NOT_EXISTS = new ErrorCode(1_009_001_103, "合同审批不存在");
ErrorCode OA_CASH_NOT_EXISTS = new ErrorCode(1_009_001_104, "现金支出申请不存在");
ErrorCode OA_OVERTIME_NOT_EXISTS = new ErrorCode(1_009_001_105, "加班申请不存在");
ErrorCode OA_REGULAR_NOT_EXISTS = new ErrorCode(1_009_001_106, "转正申请不存在");
ErrorCode OA_SHIFTJOBS_NOT_EXISTS = new ErrorCode(1_009_001_107, "调岗申请不存在");
ErrorCode OA_SECOND_NOT_EXISTS = new ErrorCode(1_009_001_108, "借调申请不存在");
// ========== 流程模型 1-009-002-000 ==========
ErrorCode MODEL_KEY_EXISTS = new ErrorCode(1_009_002_000, "已经存在流程标识为【{}】的流程");

View File

@ -41,7 +41,7 @@ public class BpmOACashController {
}
@GetMapping("/get")
@Operation(summary = "获得请假申请")
@Operation(summary = "获得现金支出申请")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<BpmOACashRespVO> getCash(@RequestParam("id") Long id) {

View File

@ -41,7 +41,7 @@ public class BpmOAContractController {
}
@GetMapping("/get")
@Operation(summary = "获得请假申请")
@Operation(summary = "获得合同审批")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<BpmOAContractRespVO> getContract(@RequestParam("id") Long id) {

View File

@ -41,7 +41,7 @@ public class BpmOAEvectionController {
}
@GetMapping("/get")
@Operation(summary = "获得请假申请")
@Operation(summary = "获得出差申请")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<BpmOAEvectionRespVO> getEvection(@RequestParam("id") Long id) {

View File

@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime.BpmOAOvertimeCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime.BpmOAOvertimeRespVO;
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAOvertimeConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeDO;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAOvertimeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
/**
* OA 加班申请 Controller
*
* @author 符溶馨
*/
@Tag(name = "管理后台 - OA 加班申请")
@RestController
@RequestMapping("/bpm/oa/overtime")
@Validated
public class BpmOAOvertimeController {
@Resource
private BpmOAOvertimeService overtimeService;
@PostMapping("/create")
@Operation(summary = "创建请求申请")
public CommonResult<Long> createOvertime(@Valid @RequestBody BpmOAOvertimeCreateReqVO createReqVO) {
return success(overtimeService.createOvertime(getLoginUserId(), createReqVO));
}
@GetMapping("/get")
@Operation(summary = "获得加班申请")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<BpmOAOvertimeRespVO> getOvertime(@RequestParam("id") Long id) {
BpmOAOvertimeDO overtime = overtimeService.getOvertime(id);
return success(BpmOAOvertimeConvert.INSTANCE.convert(overtime));
}
}

View File

@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.regular.BpmOARegularCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.regular.BpmOARegularRespVO;
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOARegularConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOARegularDO;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOARegularService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
/**
* OA 转正申请 Controller
*
* @author 符溶馨
*/
@Tag(name = "管理后台 - OA 转正申请")
@RestController
@RequestMapping("/bpm/oa/regular")
@Validated
public class BpmOARegularController {
@Resource
private BpmOARegularService regularService;
@PostMapping("/create")
@Operation(summary = "创建请求申请")
public CommonResult<Long> createRegular(@Valid @RequestBody BpmOARegularCreateReqVO createReqVO) {
return success(regularService.createRegular(getLoginUserId(), createReqVO));
}
@GetMapping("/get")
@Operation(summary = "获得转正申请")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<BpmOARegularRespVO> getRegular(@RequestParam("id") Long id) {
BpmOARegularDO regular = regularService.getRegular(id);
return success(BpmOARegularConvert.INSTANCE.convert(regular));
}
}

View File

@ -41,7 +41,7 @@ public class BpmOASealController {
}
@GetMapping("/get")
@Operation(summary = "获得请假申请")
@Operation(summary = "获得用章申请")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<BpmOASealRespVO> getSeal(@RequestParam("id") Long id) {

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.second.BpmOASecondCreateReqVO;
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOASecondConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOASecondDO;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOASecondService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
/**
* OA 借调申请 Controller
*
* @author 符溶馨
*/
@Tag(name = "管理后台 - OA 借调申请")
@RestController
@RequestMapping("/bpm/oa/second")
@Validated
public class BpmOASecondController {
@Resource
private BpmOASecondService service;
@PostMapping("/create")
@Operation(summary = "创建借调申请")
public CommonResult<Long> createLeave(@Valid @RequestBody BpmOASecondCreateReqVO createReqVO) {
return success(service.createSecond(getLoginUserId(), createReqVO));
}
@GetMapping("/get")
@Operation(summary = "获得借调申请")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<?> getLeave(@RequestParam("id") Long id) {
BpmOASecondDO second = service.getSecond(id);
return success(BpmOASecondConvert.INSTANCE.convert(second));
}
}

View File

@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.shiftjobs.BpmOAShiftjobsCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.shiftjobs.BpmOAShiftjobsRespVO;
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAShiftjobsConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAShiftjobsDO;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAShiftjobsService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
/**
* OA 调岗申请 Controller
*
* @author 符溶馨
*/
@Tag(name = "管理后台 - OA 调岗申请")
@RestController
@RequestMapping("/bpm/oa/shiftjobs")
@Validated
public class BpmOAShiftjobsController {
@Resource
private BpmOAShiftjobsService shiftjobsService;
@PostMapping("/create")
@Operation(summary = "创建请求申请")
public CommonResult<Long> createShiftjobs(@Valid @RequestBody BpmOAShiftjobsCreateReqVO createReqVO) {
return success(shiftjobsService.createShiftjobs(getLoginUserId(), createReqVO));
}
@GetMapping("/get")
@Operation(summary = "获得用章申请")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<BpmOAShiftjobsRespVO> getShiftjobs(@RequestParam("id") Long id) {
BpmOAShiftjobsDO shiftjobs = shiftjobsService.getShiftjobs(id);
return success(BpmOAShiftjobsConvert.INSTANCE.convert(shiftjobs));
}
}

View File

@ -0,0 +1,48 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* 加班申请 创建 Request VO
*
* @author 符溶馨
*/
@Schema(description = "管理后台 - 加班申请创建 Request VO")
@Data
@EqualsAndHashCode()
@ToString(callSuper = true)
public class BpmOAOvertimeCreateReqVO {
@Schema(description = "加班原因", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "加班事由不能为空")
private String reason;
@Schema(description = "加班的开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "开始时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime startTime;
@Schema(description = "加班的结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "结束时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime endTime;
@Schema(description = "加班时长", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "加班时长不能为空")
private BigDecimal timeLength;
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
private List<UploadUserFile> fileItems;
}

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOABaseRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* @author 符溶馨
*/
@Schema(description = "管理后台 - 加班申请 请求Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class BpmOAOvertimeRespVO extends BpmOABaseRespVO {
@Schema(description = "加班原因", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "加班事由不能为空")
private String reason;
@Schema(description = "加班的开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "开始时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime startTime;
@Schema(description = "加班的结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "结束时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime endTime;
@Schema(description = "加班时长", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "加班时长不能为空")
private BigDecimal timeLength;
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
private List<UploadUserFile> fileItems;
}

View File

@ -1,7 +1,5 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.procure;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.reimbursement.ProcureDetail;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.reimbursement.Reimbursement;
import lombok.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;

View File

@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.procure;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.reimbursement.ProcureDetail;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;

View File

@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.procure;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.reimbursement.ProcureDetail;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.reimbursement;
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.procure;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@ -0,0 +1,45 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.regular;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
import java.util.List;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
/**
* 转正申请 创建 Request VO
*
* @author 符溶馨
*/
@Schema(description = "管理后台 - 转正申请创建 Request VO")
@Data
@EqualsAndHashCode()
@ToString(callSuper = true)
public class BpmOARegularCreateReqVO {
@Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "部门不能为空")
private Long deptId;
@Schema(description = "入职时间", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate entryDate;
@Schema(description = "转正时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "转正时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate confirmationDate;
@Schema(description = "备注", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String notes;
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
private List<UploadUserFile> fileItems;
}

View File

@ -0,0 +1,44 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.regular;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOABaseRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
import java.util.List;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
/**
* @author 符溶馨
*/
@Schema(description = "管理后台 - 转正申请 请求Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class BpmOARegularRespVO extends BpmOABaseRespVO {
@Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "部门不能为空")
private Long deptId;
@Schema(description = "入职时间", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate entryDate;
@Schema(description = "转正时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "转正时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate confirmationDate;
@Schema(description = "备注", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String notes;
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
private List<UploadUserFile> fileItems;
}

View File

@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.second;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 借调申请 创建 Request VO
*
* @author 符溶馨
*/
@Schema(description = "管理后台 - 借调申请创建 Request VO")
@Data
@EqualsAndHashCode()
@ToString(callSuper = true)
public class BpmOASecondCreateReqVO {
@Schema(description = "借调类型", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "借调类型不能为空")
private String type;
@Schema(description = "借调说明", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String reason;
@Schema(description = "借调明细", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "借调项目不能为空")
private List<Second> seconds;
@Schema(description = "押金", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Long deposit;
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
private List<UploadUserFile> fileItems ;
}

View File

@ -0,0 +1,35 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.second;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOABaseRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.validation.constraints.NotNull;
import java.util.List;
@Schema(description = "管理后台 - 借调申请创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class BpmOASecondRespVO extends BpmOABaseRespVO {
@Schema(description = "借调类型", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "借调类型不能为空")
private String type;
@Schema(description = "借调说明", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String reason;
@Schema(description = "借调明细", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "借调项目不能为空")
private List<Second> seconds;
@Schema(description = "押金", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Long deposit;
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
private List<UploadUserFile> fileItems ;
}

View File

@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.shiftjobs;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 调岗申请 创建 Request VO
*
* @author 符溶馨
*/
@Schema(description = "管理后台 - 调岗申请创建 Request VO")
@Data
@EqualsAndHashCode()
@ToString(callSuper = true)
public class BpmOAShiftjobsCreateReqVO {
@Schema(description = "调岗类型-参见 bpm_oa_shiftjobs_type 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "调岗类型不能为空")
private Integer type;
@Schema(description = "原部门编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "原部门不能为空")
private Long oldDeptId;
@Schema(description = "原上级领导编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Long oldParentId;
@Schema(description = "原岗位编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Long oldPostId;
@Schema(description = "新部门编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "新部门不能为空")
private Long newDeptId;
@Schema(description = "新上级领导编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Long newParentId;
@Schema(description = "新岗位编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Long newPostId;
@Schema(description = "备注", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String notes;
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private List<UploadUserFile> fileItems;
}

View File

@ -0,0 +1,51 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.shiftjobs;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOABaseRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @author 符溶馨
*/
@Schema(description = "管理后台 - 调岗申请 请求Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class BpmOAShiftjobsRespVO extends BpmOABaseRespVO {
@Schema(description = "调岗类型-参见 bpm_oa_shiftjobs_type 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "调岗类型不能为空")
private Integer type;
@Schema(description = "原部门编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "原部门不能为空")
private Long oldDeptId;
@Schema(description = "原上级领导编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Long oldParentId;
@Schema(description = "原岗位编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Long oldPostId;
@Schema(description = "新部门编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "新部门不能为空")
private Long newDeptId;
@Schema(description = "新上级领导编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Long newParentId;
@Schema(description = "新岗位编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private Long newPostId;
@Schema(description = "备注", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String notes;
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
private List<UploadUserFile> fileItems;
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.bpm.convert.oa;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime.BpmOAOvertimeCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime.BpmOAOvertimeRespVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 加班申请 Convert
*
* @author 符溶馨
*/
@Mapper
public interface BpmOAOvertimeConvert {
BpmOAOvertimeConvert INSTANCE = Mappers.getMapper(BpmOAOvertimeConvert.class);
BpmOAOvertimeDO convert(BpmOAOvertimeCreateReqVO bean);
BpmOAOvertimeRespVO convert(BpmOAOvertimeDO bean);
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.bpm.convert.oa;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.regular.BpmOARegularCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.regular.BpmOARegularRespVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOARegularDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 转正申请 Convert
*
* @author 符溶馨
*/
@Mapper
public interface BpmOARegularConvert {
BpmOARegularConvert INSTANCE = Mappers.getMapper(BpmOARegularConvert.class);
BpmOARegularDO convert(BpmOARegularCreateReqVO bean);
BpmOARegularRespVO convert(BpmOARegularDO bean);
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.bpm.convert.oa;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.second.BpmOASecondCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.second.BpmOASecondRespVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOASecondDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 借调申请 Convert
*
* @author 符溶馨
*/
@Mapper
public interface BpmOASecondConvert {
BpmOASecondConvert INSTANCE = Mappers.getMapper(BpmOASecondConvert.class);
BpmOASecondDO convert(BpmOASecondCreateReqVO bean);
BpmOASecondRespVO convert(BpmOASecondDO bean);
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.bpm.convert.oa;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.shiftjobs.BpmOAShiftjobsCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.shiftjobs.BpmOAShiftjobsRespVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAShiftjobsDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 调岗申请 Convert
*
* @author 符溶馨
*/
@Mapper
public interface BpmOAShiftjobsConvert {
BpmOAShiftjobsConvert INSTANCE = Mappers.getMapper(BpmOAShiftjobsConvert.class);
BpmOAShiftjobsDO convert(BpmOAShiftjobsCreateReqVO bean);
BpmOAShiftjobsRespVO convert(BpmOAShiftjobsDO bean);
}

View File

@ -0,0 +1,85 @@
package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* OA 加班申请 DO
*
*
* @author 符溶馨
*/
@TableName(value ="bpm_oa_overtime", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BpmOAOvertimeDO extends BaseDO {
/**
* 出差表单主键
*/
@TableId
private Long id;
/**
* 申请人的用户编号
*
* 关联 AdminUserDO id 属性
*/
private Long userId;
/**
* 加班事由
*/
private String reason;
/**
* 开始时间
*/
private LocalDateTime startTime;
/**
* 结束时间
*/
private LocalDateTime endTime;
/**
* 加班时长
*/
private BigDecimal timeLength;
/**
* 出差的结果
*
* 枚举 {@link BpmProcessInstanceResultEnum}
* 考虑到简单所以直接复用了 BpmProcessInstanceResultEnum 枚举也可以自己定义一个枚举哈
*/
private Integer result;
/**
* 对应的流程编号
*
* 关联 ProcessInstance id 属性
*/
private String processInstanceId;
/**
* 附件基本信息
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<UploadUserFile> fileItems ;
}

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.reimbursement.ProcureDetail;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.procure.ProcureDetail;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;

View File

@ -0,0 +1,84 @@
package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;
import java.time.LocalDate;
import java.util.List;
/**
* OA 转正申请 DO
*
*
* @author 符溶馨
*/
@TableName(value ="bpm_oa_regular", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BpmOARegularDO extends BaseDO {
/**
* 出差表单主键
*/
@TableId
private Long id;
/**
* 申请人的用户编号
*
* 关联 AdminUserDO id 属性
*/
private Long userId;
/**
* 申请人的部门编号
*/
private Long deptId;
/**
* 入职时间
*/
private LocalDate entryDate;
/**
* 转正时间
*/
private LocalDate confirmationDate;
/**
* 备注
*/
private String notes;
/**
* 出差的结果
*
* 枚举 {@link BpmProcessInstanceResultEnum}
* 考虑到简单所以直接复用了 BpmProcessInstanceResultEnum 枚举也可以自己定义一个枚举哈
*/
private Integer result;
/**
* 对应的流程编号
*
* 关联 ProcessInstance id 属性
*/
private String processInstanceId;
/**
* 附件基本信息
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<UploadUserFile> fileItems ;
}

View File

@ -0,0 +1,84 @@
package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.second.Second;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;
import java.util.List;
/**
* OA 借调申请 DO
*
*
* @author 符溶馨
*/
@TableName(value ="bpm_oa_second", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BpmOASecondDO extends BaseDO {
/**
* 请假表单主键
*/
@TableId
private Long id;
/**
* 申请人的用户编号
* 关联 AdminUserDO id 属性
*/
private Long userId;
/**
* 借调类型
*/
private String type;
/**
* 借调说明
*/
private String reason;
/**
* 借调明细数据JSON
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<Second> seconds;
/**
* 押金
*/
private Long deposit;
/**
* 结果
*
* 枚举 {@link BpmProcessInstanceResultEnum}
* 考虑到简单所以直接复用了 BpmProcessInstanceResultEnum 枚举也可以自己定义一个枚举哈
*/
private Integer result;
/**
* 对应的流程编号
*
* 关联 ProcessInstance id 属性
*/
private String processInstanceId;
/**
* 附件基本信息
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<UploadUserFile> fileItems;
}

View File

@ -0,0 +1,103 @@
package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;
import java.util.List;
/**
* OA 调岗申请 DO
*
*
* @author 符溶馨
*/
@TableName(value ="bpm_oa_shiftjobs", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BpmOAShiftjobsDO extends BaseDO {
/**
* 调岗表单主键
*/
@TableId
private Long id;
/**
* 申请人的用户编号
*
* 关联 AdminUserDO id 属性
*/
private Long userId;
/**
* 调岗类型
*/
private String type;
/**
* 原部门编号
*/
private Long oldDeptId;
/**
* 原上级领导编号
*/
private Long oldParentId;
/**
* 原岗位编号
*/
private Long oldPostId;
/**
* 新部门编号
*/
private Long newDeptId;
/**
* 新上级领导编号
*/
private Long newParentId;
/**
* 新岗位编号
*/
private Long newPostId;
/**
* 备注
*/
private String notes;
/**
* 用章的结果
*
* 枚举 {@link BpmProcessInstanceResultEnum}
* 考虑到简单所以直接复用了 BpmProcessInstanceResultEnum 枚举也可以自己定义一个枚举哈
*/
private Integer result;
/**
* 对应的流程编号
*
* 关联 ProcessInstance id 属性
*/
private String processInstanceId;
/**
* 附件基本信息
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<UploadUserFile> fileItems ;
}

View File

@ -0,0 +1,15 @@
package cn.iocoder.yudao.module.bpm.dal.mysql.oa;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 加班申请 Mapper
*
* @author 符溶馨
*/
@Mapper
public interface BpmOAOvertimeMapper extends BaseMapperX<BpmOAOvertimeDO> {
}

View File

@ -0,0 +1,15 @@
package cn.iocoder.yudao.module.bpm.dal.mysql.oa;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOARegularDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 转正申请 Mapper
*
* @author 符溶馨
*/
@Mapper
public interface BpmOARegularMapper extends BaseMapperX<BpmOARegularDO> {
}

View File

@ -0,0 +1,15 @@
package cn.iocoder.yudao.module.bpm.dal.mysql.oa;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOASecondDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 借调申请 Mapper
*
* @author 符溶馨
*/
@Mapper
public interface BpmOASecondMapper extends BaseMapperX<BpmOASecondDO> {
}

View File

@ -0,0 +1,14 @@
package cn.iocoder.yudao.module.bpm.dal.mysql.oa;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAShiftjobsDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 调岗申请 Mapper
*
* @author 符溶馨
*/
@Mapper
public interface BpmOAShiftjobsMapper extends BaseMapperX<BpmOAShiftjobsDO> {
}

View File

@ -17,7 +17,7 @@ import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_CONTRACT_NOT_EXISTS;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_CASH_NOT_EXISTS;
/**
* OA 现金支出 Service 实现类
@ -74,7 +74,7 @@ public class BpmOACashServiceImpl extends BpmOABaseService implements BpmOACashS
private void validateLeaveExists(Long id) {
if (cashMapper.selectById(id) == null) {
throw exception(OA_CONTRACT_NOT_EXISTS);
throw exception(OA_CASH_NOT_EXISTS);
}
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.bpm.service.oa;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime.BpmOAOvertimeCreateReqVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeDO;
import javax.validation.Valid;
/**
* 加班申请 Service 接口
*
* @author 符溶馨
*/
public interface BpmOAOvertimeService {
/**
* 创建加班申请
*
* @param userId 用户编号
* @param createReqVO 创建信息
* @return 编号
*/
Long createOvertime(Long userId, @Valid BpmOAOvertimeCreateReqVO createReqVO);
/**
* 更新加班申请的状态
*
* @param id 编号
* @param result 结果
*/
void updateOvertimeResult(Long id, Integer result);
/**
* 获得加班申请
*
* @param id 编号
* @return 加班申请
*/
BpmOAOvertimeDO getOvertime(Long id);
}

View File

@ -0,0 +1,86 @@
package cn.iocoder.yudao.module.bpm.service.oa;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime.BpmOAOvertimeCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAOvertimeConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAOvertimeMapper;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_OVERTIME_NOT_EXISTS;
/**
* OA 加班申请 Service 实现类
*
* @author 符溶馨
*/
@Service
@Validated
public class BpmOAOvertimeServiceImpl extends BpmOABaseService implements BpmOAOvertimeService{
/**
* OA 加班对应的流程定义 KEY
*/
public static final String PROCESS_KEY = "oa_overtime";
@Resource
private BpmOAOvertimeMapper overtimeMapper;
@Resource
private BpmProcessInstanceApi processInstanceApi;
@Override
public Long createOvertime(Long userId, BpmOAOvertimeCreateReqVO createReqVO) {
//插入OA 转正申请
BpmOAOvertimeDO overtime = BpmOAOvertimeConvert.INSTANCE.convert(createReqVO).setUserId(userId)
.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
overtimeMapper.insert(overtime) ;
// 发起 BPM 流程
Map<String, Object> processInstanceVariables = new HashMap<>();
String processInstanceId = processInstanceApi.createProcessInstance(userId,
new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
.setVariables(processInstanceVariables).setBusinessKey(String.valueOf(overtime.getId()))).getCheckedData();
// 将工作流的编号更新到 OA 加班单中
overtimeMapper.updateById(new BpmOAOvertimeDO().setId(overtime.getId()).setProcessInstanceId(processInstanceId));
List<UploadUserFile> fileItems = createReqVO.getFileItems() ;
//这里的逻辑如果fileItems不为空且有数据那么说明是上传了附件的则需要更工作流文件表对应的实例Id
if (fileItems != null && !fileItems.isEmpty()) {
uploadBpmFileProcessInstanceId(processInstanceId,fileItems) ;
}
return overtime.getId();
}
@Override
public void updateOvertimeResult(Long id, Integer result) {
validateLeaveExists(id);
overtimeMapper.updateById(new BpmOAOvertimeDO().setId(id).setResult(result));
}
private void validateLeaveExists(Long id) {
if (overtimeMapper.selectById(id) == null) {
throw exception(OA_OVERTIME_NOT_EXISTS);
}
}
@Override
public BpmOAOvertimeDO getOvertime(Long id) {
return overtimeMapper.selectById(id);
}
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.bpm.service.oa;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.regular.BpmOARegularCreateReqVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOARegularDO;
import javax.validation.Valid;
/**
* 转正申请 Service 接口
*
* @author 符溶馨
*/
public interface BpmOARegularService {
/**
* 创建转正申请
*
* @param userId 用户编号
* @param createReqVO 创建信息
* @return 编号
*/
Long createRegular(Long userId, @Valid BpmOARegularCreateReqVO createReqVO);
/**
* 更新转正申请的状态
*
* @param id 编号
* @param result 结果
*/
void updateRegularResult(Long id, Integer result);
/**
* 获得转正申请
*
* @param id 编号
* @return 转正申请
*/
BpmOARegularDO getRegular(Long id);
}

View File

@ -0,0 +1,86 @@
package cn.iocoder.yudao.module.bpm.service.oa;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.regular.BpmOARegularCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOARegularConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOARegularDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOARegularMapper;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_REGULAR_NOT_EXISTS;
/**
* OA 转正申请 Service 实现类
*
* @author 符溶馨
*/
@Service
@Validated
public class BpmOARegularServiceImpl extends BpmOABaseService implements BpmOARegularService{
/**
* OA 转正对应的流程定义 KEY
*/
public static final String PROCESS_KEY = "oa_regular";
@Resource
private BpmOARegularMapper regularMapper;
@Resource
private BpmProcessInstanceApi processInstanceApi;
@Override
public Long createRegular(Long userId, BpmOARegularCreateReqVO createReqVO) {
//插入OA 转正申请
BpmOARegularDO regular = BpmOARegularConvert.INSTANCE.convert(createReqVO).setUserId(userId)
.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
regularMapper.insert(regular) ;
// 发起 BPM 流程
Map<String, Object> processInstanceVariables = new HashMap<>();
String processInstanceId = processInstanceApi.createProcessInstance(userId,
new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
.setVariables(processInstanceVariables).setBusinessKey(String.valueOf(regular.getId()))).getCheckedData();
// 将工作流的编号更新到 OA 转正单中
regularMapper.updateById(new BpmOARegularDO().setId(regular.getId()).setProcessInstanceId(processInstanceId));
List<UploadUserFile> fileItems = createReqVO.getFileItems() ;
//这里的逻辑如果fileItems不为空且有数据那么说明是上传了附件的则需要更工作流文件表对应的实例Id
if (fileItems != null && !fileItems.isEmpty()) {
uploadBpmFileProcessInstanceId(processInstanceId,fileItems) ;
}
return regular.getId();
}
@Override
public void updateRegularResult(Long id, Integer result) {
validateLeaveExists(id);
regularMapper.updateById(new BpmOARegularDO().setId(id).setResult(result));
}
private void validateLeaveExists(Long id) {
if (regularMapper.selectById(id) == null) {
throw exception(OA_REGULAR_NOT_EXISTS);
}
}
@Override
public BpmOARegularDO getRegular(Long id) {
return regularMapper.selectById(id);
}
}

View File

@ -5,6 +5,12 @@ import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOASealDO;
import javax.validation.Valid;
/**
* 用章申请 Service 接口
*
* @author 符溶馨
*/
public interface BpmOASealService {
/**

View File

@ -30,7 +30,7 @@ import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_SEAL_NOT_E
public class BpmOASealServiceImpl extends BpmOABaseService implements BpmOASealService {
/**
* OA 出差对应的流程定义 KEY
* OA 用章对应的流程定义 KEY
*/
public static final String PROCESS_KEY = "oa_seal";
@ -43,7 +43,7 @@ public class BpmOASealServiceImpl extends BpmOABaseService implements BpmOASealS
@Override
public Long createSeal(Long userId, BpmOASealCreateReqVO createReqVO) {
//插入OA 出差申请
//插入OA 用章申请
BpmOASealDO seal = BpmOASealConvert.INSTANCE.convert(createReqVO).setUserId(userId)
.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
sealMapper.insert(seal) ;
@ -54,7 +54,7 @@ public class BpmOASealServiceImpl extends BpmOABaseService implements BpmOASealS
new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
.setVariables(processInstanceVariables).setBusinessKey(String.valueOf(seal.getId()))).getCheckedData();
// 将工作流的编号更新到 OA 请假单中
// 将工作流的编号更新到 OA 用章单中
sealMapper.updateById(new BpmOASealDO().setId(seal.getId()).setProcessInstanceId(processInstanceId));
List<UploadUserFile> fileItems = createReqVO.getFileItems() ;

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.bpm.service.oa;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.second.BpmOASecondCreateReqVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOASecondDO;
import javax.validation.Valid;
/**
* 借调申请 Service 接口
*
* @author 符溶馨
*/
public interface BpmOASecondService {
/**
* 创建借调申请
*
* @param userId 用户编号
* @param createReqVO 创建信息
* @return 编号
*/
Long createSecond(Long userId, @Valid BpmOASecondCreateReqVO createReqVO);
/**
* 更新借调申请的状态
*
* @param id 编号
* @param result 结果
*/
void updateSecondResult(Long id, Integer result);
/**
* 获得借调申请
*
* @param id 编号
* @return 借调申请
*/
BpmOASecondDO getSecond(Long id);
}

View File

@ -0,0 +1,83 @@
package cn.iocoder.yudao.module.bpm.service.oa;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.second.BpmOASecondCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOASecondConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOASecondDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOASecondMapper;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_SECOND_NOT_EXISTS;
/**
* 功能描述
* OA 借调申请 Service 实现类
*
* @author 符溶馨
*/
@Service
@Validated
public class BpmOASecondServiceImpl extends BpmOABaseService implements BpmOASecondService{
/**
* OA 请假对应的流程定义 KEY
*/
public static final String PROCESS_KEY = "oa_second";
@Resource
private BpmOASecondMapper secondMapper ;
@Resource
private BpmProcessInstanceApi processInstanceApi;
@Override
public Long createSecond(Long userId, BpmOASecondCreateReqVO createReqVO) {
BpmOASecondDO second = BpmOASecondConvert.INSTANCE.convert(createReqVO).setUserId(userId)
.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
secondMapper.insert(second) ;
// 发起 BPM 流程
Map<String, Object> processInstanceVariables = new HashMap<>();
String processInstanceId = processInstanceApi.createProcessInstance(userId,
new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
.setVariables(processInstanceVariables).setBusinessKey(String.valueOf(second.getId()))).getCheckedData();
// 将工作流的编号更新到 OA 请假单中
secondMapper.updateById(new BpmOASecondDO().setId(second.getId()).setProcessInstanceId(processInstanceId));
List<UploadUserFile> fileItems = createReqVO.getFileItems() ;
//这里的逻辑如果fileItems不为空且有数据那么说明是上传了附件的则需要更工作流文件表对应的实例Id
if (fileItems != null && !fileItems.isEmpty()) {
uploadBpmFileProcessInstanceId(processInstanceId,fileItems) ;
}
return second.getId();
}
@Override
public void updateSecondResult(Long id, Integer result) {
validateLeaveExists(id);
secondMapper.updateById(new BpmOASecondDO().setId(id).setResult(result));
}
private void validateLeaveExists(Long id) {
if (secondMapper.selectById(id) == null) {
throw exception(OA_SECOND_NOT_EXISTS);
}
}
@Override
public BpmOASecondDO getSecond(Long id) {
return secondMapper.selectById(id);
}
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.bpm.service.oa;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.shiftjobs.BpmOAShiftjobsCreateReqVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAShiftjobsDO;
import javax.validation.Valid;
/**
* 调岗申请 Service 接口
*
* @author 符溶馨
*/
public interface BpmOAShiftjobsService {
/**
* 创建调岗申请
*
* @param userId 用户编号
* @param createReqVO 创建信息
* @return 编号
*/
Long createShiftjobs(Long userId, @Valid BpmOAShiftjobsCreateReqVO createReqVO);
/**
* 更新调岗申请的状态
*
* @param id 编号
* @param result 结果
*/
void updateShiftjobsResult(Long id, Integer result);
/**
* 获得调岗申请
*
* @param id 编号
* @return 调岗申请
*/
BpmOAShiftjobsDO getShiftjobs(Long id);
}

View File

@ -0,0 +1,86 @@
package cn.iocoder.yudao.module.bpm.service.oa;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.shiftjobs.BpmOAShiftjobsCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAShiftjobsConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAShiftjobsDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAShiftjobsMapper;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_SHIFTJOBS_NOT_EXISTS;
/**
* OA 调岗申请 Service 实现类
*
* @author 符溶馨
*/
@Service
@Validated
public class BpmOAShiftjobsServiceImpl extends BpmOABaseService implements BpmOAShiftjobsService{
/**
* OA 调岗对应的流程定义 KEY
*/
public static final String PROCESS_KEY = "oa_shiftjobs";
@Resource
private BpmOAShiftjobsMapper shiftjobsMapper;
@Resource
private BpmProcessInstanceApi processInstanceApi;
@Override
public Long createShiftjobs(Long userId, BpmOAShiftjobsCreateReqVO createReqVO) {
//插入OA 调岗申请
BpmOAShiftjobsDO shiftjobs = BpmOAShiftjobsConvert.INSTANCE.convert(createReqVO).setUserId(userId)
.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
shiftjobsMapper.insert(shiftjobs) ;
// 发起 BPM 流程
Map<String, Object> processInstanceVariables = new HashMap<>();
String processInstanceId = processInstanceApi.createProcessInstance(userId,
new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
.setVariables(processInstanceVariables).setBusinessKey(String.valueOf(shiftjobs.getId()))).getCheckedData();
// 将工作流的编号更新到 OA 调岗单中
shiftjobsMapper.updateById(new BpmOAShiftjobsDO().setId(shiftjobs.getId()).setProcessInstanceId(processInstanceId));
List<UploadUserFile> fileItems = createReqVO.getFileItems() ;
//这里的逻辑如果fileItems不为空且有数据那么说明是上传了附件的则需要更工作流文件表对应的实例Id
if (fileItems != null && !fileItems.isEmpty()) {
uploadBpmFileProcessInstanceId(processInstanceId,fileItems) ;
}
return shiftjobs.getId();
}
@Override
public void updateShiftjobsResult(Long id, Integer result) {
validateLeaveExists(id);
shiftjobsMapper.updateById(new BpmOAShiftjobsDO().setId(id).setResult(result));
}
private void validateLeaveExists(Long id) {
if (shiftjobsMapper.selectById(id) == null) {
throw exception(OA_SHIFTJOBS_NOT_EXISTS);
}
}
@Override
public BpmOAShiftjobsDO getShiftjobs(Long id) {
return shiftjobsMapper.selectById(id);
}
}

View File

@ -4,6 +4,7 @@ import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceRe
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventListener;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOACashService;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOACashServiceImpl;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@ -12,6 +13,7 @@ import javax.annotation.Resource;
*
* @author 符溶馨
*/
@Component
public class BpmOACashResultListener extends BpmProcessInstanceResultEventListener {
@Resource
private BpmOACashService cashService;

View File

@ -4,6 +4,7 @@ import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceRe
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventListener;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAContractService;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAContractServiceImpl;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@ -12,6 +13,7 @@ import javax.annotation.Resource;
*
* @author 符溶馨
*/
@Component
public class BpmOAContractResultListener extends BpmProcessInstanceResultEventListener {
@Resource

View File

@ -4,6 +4,7 @@ import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceRe
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventListener;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAEvectionService;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAEvectionServiceImpl;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@ -12,6 +13,7 @@ import javax.annotation.Resource;
*
* @author 符溶馨
*/
@Component
public class BpmOAEvectionResultListener extends BpmProcessInstanceResultEventListener {
@Resource

View File

@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.bpm.service.oa.listener;
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent;
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventListener;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAOvertimeService;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAOvertimeServiceImpl;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* OA 加班单的结果的监听器实现类
*
* @author 符溶馨
*/
@Component
public class BpmOAOvertimeResultListener extends BpmProcessInstanceResultEventListener {
@Resource
private BpmOAOvertimeService overtimeService;
@Override
protected String getProcessDefinitionKey() {
return BpmOAOvertimeServiceImpl.PROCESS_KEY;
}
@Override
protected void onEvent(BpmProcessInstanceResultEvent event) {
overtimeService.updateOvertimeResult(Long.parseLong(event.getBusinessKey()), event.getResult());
}
}

View File

@ -4,6 +4,7 @@ import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceRe
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventListener;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOASealService;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOASealServiceImpl;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@ -12,6 +13,7 @@ import javax.annotation.Resource;
*
* @author 符溶馨
*/
@Component
public class BpmOASealResultListener extends BpmProcessInstanceResultEventListener {
@Resource

View File

@ -0,0 +1,29 @@
package cn.iocoder.yudao.module.bpm.service.oa.listener;
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent;
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventListener;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOASecondService;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOASecondServiceImpl;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* OA 借调单的结果的监听器实现类
*/
@Component
public class BpmOASecondResultListener extends BpmProcessInstanceResultEventListener {
@Resource
private BpmOASecondService secondService;
@Override
protected String getProcessDefinitionKey() {
return BpmOASecondServiceImpl.PROCESS_KEY;
}
@Override
protected void onEvent(BpmProcessInstanceResultEvent event) {
secondService.updateSecondResult(Long.parseLong(event.getBusinessKey()), event.getResult());
}
}

View File

@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.bpm.service.oa.listener;
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent;
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventListener;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAShiftjobsService;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAShiftjobsServiceImpl;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* OA 调岗单的结果的监听器实现类
*
* @author 符溶馨
*/
@Component
public class BpmOAShiftjobsResultListener extends BpmProcessInstanceResultEventListener {
@Resource
private BpmOAShiftjobsService shiftjobsService;
@Override
protected String getProcessDefinitionKey() {
return BpmOAShiftjobsServiceImpl.PROCESS_KEY;
}
@Override
protected void onEvent(BpmProcessInstanceResultEvent event) {
shiftjobsService.updateShiftjobsResult(Long.parseLong(event.getBusinessKey()), event.getResult());
}
}

View File

@ -0,0 +1,110 @@
package cn.iocoder.yudao.module.smartfactory.controller.screendata.factory;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.smartfactory.controller.screendata.factory.vo.*;
import cn.iocoder.yudao.module.smartfactory.service.screendata.ScreenDataService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.annotation.security.PermitAll;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "工厂大屏数据")
@RestController
@RequestMapping("/smartfactory/factory-screen-data")
@Validated
public class FactoryScreenDataController {
@Resource
private ScreenDataService screenDataService;
/**
*
* @param type 1: 2 3区
* @param adcode
* @return
*/
@GetMapping("/getProvincesData")
@PermitAll
@Operation(summary = "大屏全局省份/省/市工厂数据(包函工厂基本信息)")
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
public CommonResult<List<ProvincesDataRespVO>> getProvincesData(Integer type, String adcode) {
List<ProvincesDataRespVO> provincesDatas = screenDataService.getProvincesData(type,adcode) ;
return success(provincesDatas);
}
@GetMapping("/getStaffData")
@PermitAll
@Operation(summary = "大屏员工信息数据")
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
public CommonResult<StaffDataRespVO> getStaffData(Long factoryId) {
StaffDataRespVO staffDataRespVO = screenDataService.getStaffData(factoryId) ;
return success(staffDataRespVO);
}
@GetMapping("/getPropertyData")
@PermitAll
@Operation(summary = "大屏资产数据")
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
public CommonResult<PropertyDataRespVO> getPropertyData(Long factoryId) {
PropertyDataRespVO propertyDataRespVO = screenDataService.getPropertyData(factoryId) ;
return success(propertyDataRespVO);
}
@GetMapping("/getFactoryOperateData")
@PermitAll
@Operation(summary = "大屏工厂运营数据")
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
public CommonResult<OperateDataRespVO> getFactoryOperateData(Long factoryId) {
OperateDataRespVO factoryOperateDataRespVO = screenDataService.getFactoryOperateData(factoryId) ;
return success(factoryOperateDataRespVO);
}
@GetMapping("/getFactoryRollData")
@PermitAll
@Operation(summary = "大屏工厂滚动数据")
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
public CommonResult<FactoryRollDataRespVO> getFactoryRollData() {
FactoryRollDataRespVO factoryRollDataRespVO = screenDataService.getFactoryRollData() ;
return success(factoryRollDataRespVO);
}
@GetMapping("/getFactoryCamerasData")
@PermitAll
@Operation(summary = "大屏工厂监控视频数据")
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
public CommonResult<List<FactoryCameraDataRespVO>> getFactoryCamerasData(Long factoryId) {
List<FactoryCameraDataRespVO> factoryCameraDatas = screenDataService.getFactoryCamerasData(factoryId) ;
return success(factoryCameraDatas);
}
@GetMapping("/getFactoryWeatherInfo")
@PermitAll
@Operation(summary = "大屏工厂天气数据")
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
public CommonResult<FactoryWeatherDataRespVO> getFactoryWeatherInfo(Long factoryId) {
return success(screenDataService.getFactoryWeatherInfo(factoryId));
}
/**
* 大屏工厂打包线数据
* @param type
* @param factoryId
* @return
*/
@GetMapping("/getFactoryPackLineInfo")
@PermitAll
@Operation(summary = "大屏工厂打包线数据")
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
public CommonResult<List<FactoryPackLineDataRespVO>> getFactoryPackLineInfo(Integer type,Long factoryId ) {
return success(screenDataService.getFactoryPackLineInfo(type,factoryId));
}
}

View File

@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.smartfactory.controller.screendata.factory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 功能描述
*
* @author: yj
* @date: 2024年03月05日 13:55
*/
@Schema(description = "大屏数据 - 工厂摄像头数据 Response VO")
@Data
public class FactoryCameraDataRespVO {
@Schema(description = "设备id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long factoryId;
@Schema(description = "设备id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private String id;
@Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "南昌市")
private String name;
@Schema(description = "设别编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "afcbdc00465348918d67518e2294792b")
private String code;
@Schema(description = "设备类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
private Integer type;
@Schema(description = "设备图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://xx.com/ss.jpg")
private String imgUrl ;
@Schema(description = "推流地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "ws://hik.znkj.ispt.com.cn:559/openUrl/Koe0Kg8")
private String streamUrl ;
}

View File

@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.smartfactory.controller.screendata.factory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 功能描述
*
* @author: yj
* @date: 2024年03月05日 13:55
*/
@Schema(description = "大屏数据 - 工厂打包线数据 Response VO")
@Data
public class FactoryPackLineDataRespVO {
@Schema(description = "打包线id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long packLineId;
@Schema(description = "规格id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private String standardsId;
@Schema(description = "规格标准", requiredMode = Schema.RequiredMode.REQUIRED, example = "800 * 400")
private String standards;
@Schema(description = "打包数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer total;
@Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-04")
private String date ;
}

View File

@ -0,0 +1,44 @@
package cn.iocoder.yudao.module.smartfactory.controller.screendata.factory.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 功能描述
*
* @author: yj
* @date: 2024年03月05日 13:55
*/
@Schema(description = "大屏数据 - 工厂基础滚动数据 Response VO")
@Data
public class FactoryRollDataRespVO {
@Schema(description = "工厂名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "江西省南昌市第一工厂")
private String name;
@Schema(description = "工厂简称", requiredMode = Schema.RequiredMode.REQUIRED, example = "第一工厂")
private String shortName;
@Schema(description = "城市名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "南昌市")
private String cityName;
@Schema(description = "员工数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer total;
@Schema(description = "窑炉数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer kilnTotal;
@Schema(description = "打包线数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
private Integer packLineTotal ;
@Schema(description = "托盘数", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer trayTotal ;
@Schema(description = "绑带", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer tieTotal ;
@Schema(description = "叉车数", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer forkliftTotal ;
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.smartfactory.controller.screendata.factory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
* 功能描述
*
* @author: yj
* @date: 2024年03月05日 13:55
*/
@Schema(description = "大屏数据 - 工厂天气数据 Response VO")
@Data
public class FactoryWeatherDataRespVO {
@Schema(description = "工厂ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long factoryId;
@Schema(description = "城市编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
private String areaCode ;
@Schema(description = "温度", requiredMode = Schema.RequiredMode.REQUIRED, example = "12.3")
private String temperature ;
@Schema(description = "湿度", requiredMode = Schema.RequiredMode.REQUIRED, example = "68%")
private String humidity ;
@Schema(description = "天气", requiredMode = Schema.RequiredMode.REQUIRED, example = "")
private String weather ;
@Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "")
private String date ;
}

View File

@ -0,0 +1,165 @@
package cn.iocoder.yudao.module.smartfactory.controller.screendata.factory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.text.DecimalFormat;
/**
* 功能描述
*
* @author: yj
* @date: 2024年03月05日 13:55
*/
@Schema(description = "大屏数据 - 工厂运营数据 Response VO")
@Data
public class OperateDataRespVO {
/**今日 **/
@Schema(description = "今日出库", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer outboundTotal;
@Schema(description = "今日入库(打包数-破损)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
private Integer warehouseTotal ;
@Schema(description = "今日破损", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer wornTotal ;
@Schema(description = "优等品", requiredMode = Schema.RequiredMode.REQUIRED, example = "100 (优等品,即使打包线打包数量)")
private Integer ydpTotal ;
@Schema(description = "一级品", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer yjpTotal ;
@Schema(description = "合格品", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer hgpTotal ;
/**昨日 **/
@Schema(description = "昨日出库", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer outboundTotalYesterday;
@Schema(description = "昨日入库", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
private Integer warehouseTotalYesterday ;
@Schema(description = "昨日破损", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer wornTotalYesterday ;
@Schema(description = "优等品", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer ydpTotalYesterday ;
@Schema(description = "一级品", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer yjpTotalYesterday ;
@Schema(description = "合格品", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer hgpTotalYesterday ;
/**本周 **/
@Schema(description = "本周出库", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer outboundTotalWeek;
@Schema(description = "本周入库", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
private Integer warehouseTotalWeek ;
@Schema(description = "本周分检数", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer sortingTotalWeek ;
@Schema(description = "本周破损", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer wornTotalWeek ;
@Schema(description = "优等品", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer ydpTotalWeek ;
@Schema(description = "一级品", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer yjpTotalWeek ;
@Schema(description = "合格品", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer hgpTotalWeek ;
/**本月 **/
@Schema(description = "本月出库", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer outboundTotalMonth;
@Schema(description = "本月入库", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
private Integer warehouseTotalMonth ;
@Schema(description = "本月分检数", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer sortingTotalMonth ;
@Schema(description = "本月破损", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer wornTotalMonth ;
@Schema(description = "优等品", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer ydpTotalMonth ;
@Schema(description = "一级品", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer yjpTotalMonth ;
@Schema(description = "合格品", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer hgpTotalMonth ;
/**
* 公式(今日破损 - 昨日破损) / 昨日破损 * 100% = 环比%
*/
@Schema(description = "破损环比增长/下降", requiredMode = Schema.RequiredMode.REQUIRED, example = "-12.22%")
private String wornQOQ;
DecimalFormat df = new DecimalFormat("#0.00");
public String setWornQOQ() {
double a = getWornTotal() ;
double b = getWornTotalYesterday() ;
double i = ((a - b) / b ) * 100;
this.wornQOQ = df.format(i) ;
return wornQOQ;
}
@Schema(description = "优等率", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private String ydl;
@Schema(description = "昨日优等率", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private String ydlYesterday;
@Schema(description = "本周优等率", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private String ydlWeek;
@Schema(description = "本月优等率", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private String ydlMonth;
/**
* 根据type类型, 计划今日昨日本周本月
* @param type 1= 今日 2= 昨日 3= 本周 4本月
* @param ydpTotal 合格品
* @param yjpTotal 一级品
* @param hgpTotal 合格品
*/
public void setYdl(Integer type, Integer ydpTotal, Integer yjpTotal, Integer hgpTotal) {
double a = ydpTotal ;
double b = ydpTotal + yjpTotal + hgpTotal ;
double i = (a / b ) * 100 ;
String c = df.format(i) ;
switch ( type ) {
case 1:
this.ydl = c ;
break ;
case 2:
this.ydlYesterday = c ;
break ;
case 3:
this.ydlWeek = c ;
break ;
case 4:
this.ydlMonth = c ;
break ;
}
}
// public static void main(String[] args) {
// OperateDataRespVO a = new OperateDataRespVO() ;
//
// a.setYdl(4, 100, 20,30);
//
// System.out.println(a.getYdl());
// System.out.println(a.getYdlYesterday());
// System.out.println(a.getYdlWeek());
// System.out.println(a.getYdlMonth());
// }
}

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.smartfactory.controller.screendata.factory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
* 功能描述
*
* @author: yj
* @date: 2024年03月05日 13:55
*/
@Schema(description = "大屏数据 - 资产数据 Response VO")
@Data
public class PropertyDataRespVO {
@Schema(description = "窑炉数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer kilnTotal;
@Schema(description = "打包线数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
private Integer packLineTotal ;
@Schema(description = "托盘数", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer trayTotal ;
@Schema(description = "绑带", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer tieTotal ;
@Schema(description = "叉车数据", requiredMode = Schema.RequiredMode.REQUIRED)
private ForkliftInfo forkliftInfo ;
class ForkliftInfo {
@Schema(description = "叉车数", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer forkliftTotal ;
@Schema(description = "运行中", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer onlineTotal ;
@Schema(description = "离线", requiredMode = Schema.RequiredMode.REQUIRED, example = "3")
private Integer outLineTotal ;
}
}

View File

@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.smartfactory.controller.screendata.factory.vo;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factoryinfo.vo.FactoryInfoRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
* 功能描述
*
* @author: yj
* @date: 2024年03月05日 13:55
*/
@Schema(description = "大屏数据 - 省份工厂数据 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ProvincesDataRespVO {
@Schema(description = "区域名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "江西省 or 高安市")
private String name;
@Schema(description = "区域标记点", requiredMode = Schema.RequiredMode.REQUIRED, example = "[114.173355, 22.320048]")
private List<Double> center ;
@Schema(description = "区域标记点oid", requiredMode = Schema.RequiredMode.REQUIRED, example = "[114.134357, 22.377366]")
private List<Double> centroid ;
@Schema(description = "区域代码", requiredMode = Schema.RequiredMode.REQUIRED, example = "810000")
private Integer adcode ;
@Schema(description = "英文名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "jiangxi")
private String enName ;
@Schema(description = "工厂数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
private Integer value;
/**
* 只有到第三层 district_id 区县的时候需要输出工厂ID
*/
@Schema(description = "工厂Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
private Long factoryId;
}

View File

@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.smartfactory.controller.screendata.factory.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
* 功能描述
*
* @author: yj
* @date: 2024年03月05日 13:55
*/
@Schema(description = "大屏数据 - 工厂员工数据 Response VO")
@Data
public class StaffDataRespVO {
@Schema(description = "员工数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer total;
@Schema(description = "男员工", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
private Integer maleTotal ;
@Schema(description = "女员工", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer femaleTotal ;
@Schema(description = "员工信息", requiredMode = Schema.RequiredMode.REQUIRED, example = "阿依塔洪·阿依提巴依 搬运工")
private List<StaffInfo> staffInfos ;
class StaffInfo {
@Schema(description = "员工名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "马龙")
private String name ;
@Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "叉车司机")
private String postName ;
}
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.smartfactory.framework.util;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.util.*;
/**
* @author qun.xu
* @version 1.0.0
* @date 2019.03.28
*/
public class HttpUtil {
/**
* GET请求 带头部信息
*
* @param url
* @param headers
* @return
*/
public static String doGetSetHeader(String url, Map<String, String> headers) {
try {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet request = new HttpGet(url);
headers.forEach((k, v) -> request.setHeader(k, v));
HttpResponse response = httpClient.execute(request);
return EntityUtils.toString(response.getEntity(), "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

View File

@ -0,0 +1,75 @@
package cn.iocoder.yudao.module.smartfactory.service.screendata;
import cn.iocoder.yudao.module.smartfactory.controller.screendata.factory.vo.*;
import java.util.List;
/**
* 大屏数据 Service 接口
*
* @author 姚君
*/
public interface ScreenDataService {
/**
* 大屏全局省份//市工厂数据
* adcode是null就查询全部省份数据
* @param adcode //区编码
* @return 显示数据
*/
List<ProvincesDataRespVO> getProvincesData(Integer type, String adcode) ;
/**
* 查询员工数据
* factoryId是null查询所有工厂员工数据
* @param factoryId 工厂ID
* @return
*/
StaffDataRespVO getStaffData(Long factoryId) ;
/**
* 查询资产数据
* @param factoryId
* factoryId是null查询所有工厂资产数据
* @return
*/
PropertyDataRespVO getPropertyData(Long factoryId) ;
/**
* 查询工厂运营数据
* @param factoryId
* factoryId是null查询所有工厂运营数据
* @return
*/
OperateDataRespVO getFactoryOperateData(Long factoryId) ;
/**
* 大屏工厂滚屏数据查询
* @return
*/
FactoryRollDataRespVO getFactoryRollData() ;
/**
* 获取工厂监控设备集合
* @param factoryId
* @return
*/
List<FactoryCameraDataRespVO> getFactoryCamerasData(Long factoryId) ;
/**
* 获取工厂对应城市的天气数据
* @param factoryId
* @return
*/
FactoryWeatherDataRespVO getFactoryWeatherInfo(Long factoryId) ;
/**
* 根据类型获取工厂打包线数据
* @param type 1= 今日 2= 本周
* @param factoryId
* @return
*/
List<FactoryPackLineDataRespVO> getFactoryPackLineInfo(Integer type,Long factoryId) ;
}

View File

@ -0,0 +1,88 @@
package cn.iocoder.yudao.module.smartfactory.service.screendata;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.module.smartfactory.controller.screendata.factory.vo.*;
import cn.iocoder.yudao.module.smartfactory.framework.util.HttpUtil;
import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 功能描述
*
* @author: yj
* @date: 2024年03月06日 11:54
*/
@Service
@Validated
public class ScreenDataServiceImpl implements ScreenDataService{
@Override
public List<ProvincesDataRespVO> getProvincesData(Integer type,String adcode) {
return null;
}
@Override
public StaffDataRespVO getStaffData(Long factoryId) {
return null;
}
@Override
public PropertyDataRespVO getPropertyData(Long factoryId) {
return null;
}
@Override
public OperateDataRespVO getFactoryOperateData(Long factoryId) {
return null;
}
@Override
public FactoryRollDataRespVO getFactoryRollData() {
return null;
}
@Override
public List<FactoryCameraDataRespVO> getFactoryCamerasData(Long factoryId) {
return null;
}
private static final String WEATHER_URL = "https://d1.weather.com.cn/sk_2d/";
private static final String REFERER = "referer";
private static final String REFERER_URL = "http://www.weather.com.cn/";
private static final String WEATHER_SPLIT = "dataSK=";
public FactoryWeatherDataRespVO getFactoryWeatherInfo(Long factoryId) {
//根据factoryId 查询areaCode;
String areaCode = "101190101" ;
String url = WEATHER_URL + areaCode + ".html";
Map<String, String> headers = new HashMap<>();
headers.put(REFERER, REFERER_URL);
String result = HttpUtil.doGetSetHeader(url, headers);
String[] str = result.split(WEATHER_SPLIT);
if(str.length > 1) {
FactoryWeatherDataRespVO vo = new FactoryWeatherDataRespVO();
JSONObject jsonObject = JSONUtil.parseObj(str[1]) ;
vo.setFactoryId(factoryId);
vo.setAreaCode(areaCode) ;
vo.setTemperature(jsonObject.getStr("temp")) ; //温度
vo.setHumidity(jsonObject.getStr("sd")); //湿度
vo.setWeather(jsonObject.getStr("weather")) ; //天气
vo.setDate(jsonObject.getStr("date")); //日期
return vo ;
}else {
return null ;
}
}
public List<FactoryPackLineDataRespVO> getFactoryPackLineInfo(Integer type, Long factoryId) {
return null ;
}
}