This commit is contained in:
aikai 2024-05-24 09:57:40 +08:00
commit 7391de6ca6
111 changed files with 4169 additions and 472 deletions

View File

@ -32,6 +32,7 @@ public interface ErrorCodeConstants {
ErrorCode OA_SECOND_NOT_EXISTS = new ErrorCode(1_009_001_108, "借调申请不存在");
ErrorCode OA_IMPREST_NOT_EXISTS = new ErrorCode(1_009_001_109, "备用金申请不存在");
ErrorCode OA_INCENTIVE_NOT_EXISTS = new ErrorCode(1_009_001_110, "奖惩申请不存在");
ErrorCode OA_WORK_TASK_NOT_EXISTS = new ErrorCode(1_009_001_110, "工作任务不存在");
// ========== 流程模型 1-009-002-000 ==========
ErrorCode MODEL_KEY_EXISTS = new ErrorCode(1_009_002_000, "已经存在流程标识为【{}】的流程");

View File

@ -19,8 +19,8 @@ public enum BpmTaskRuleScriptEnum {
LEADER_X2(21L, "流程发起人的二级领导"),
LEADER_X3(22L, "流程发起人的三级领导"),
LEADER_X4(23L, "审批人的一级领导"),
LEADER_X5(24L, "调岗部门领导");
LEADER_X5(24L, "调岗部门领导"),
LEADER_X6(25L, "分配任务的责任人");
/**
* 脚本编号

View File

@ -7,9 +7,9 @@ import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmPro
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
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.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
@ -18,8 +18,8 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@ -45,7 +45,10 @@ public class BpmProcessDefinitionController {
// @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
public CommonResult<List<BpmProcessDefinitionRespVO>> getProcessDefinitionList(
BpmProcessDefinitionListReqVO listReqVO) {
return success(bpmDefinitionService.getProcessDefinitionList(listReqVO));
List<BpmProcessDefinitionRespVO> respVOS = bpmDefinitionService.getProcessDefinitionList(listReqVO);
respVOS = respVOS.stream().filter(data -> !data.getId().contains("work_task")).collect(Collectors.toList());
return success(respVOS);
}
@GetMapping ("/get-bpmn-xml")

View File

@ -0,0 +1,121 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskRespVO;
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAWorkTaskConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAWorkTaskService;
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
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/worktask")
@Validated
public class BpmOAWorkTaskController {
@Resource
private BpmOAWorkTaskService workTaskService;
@Resource
private AdminUserApi userApi;
@Resource
private DeptApi deptApi;
@Resource
private BpmTaskService taskService;
@PostMapping("/create")
@Operation(summary = "创建任务分配")
public CommonResult<Long> createLeave(@Valid @RequestBody BpmOAWorkTaskReqVO createReqVO) {
return success(workTaskService.createWorkTask(getLoginUserId(), createReqVO));
}
@GetMapping("/get")
@Operation(summary = "获得任务分配")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<BpmOAWorkTaskRespVO> getTask(@RequestParam("id") Long id) {
BpmOAWorkTaskDO workTask = workTaskService.getWorkTask(id);
//获得 责任人用户信息
AdminUserRespDTO userRespDTO = userApi.getUser(workTask.getReceiverUserId()).getCheckedData();
//获得 责任人部门信息
DeptRespDTO deptRespDTO = deptApi.getDept(userRespDTO.getDeptId()).getCheckedData();
String taskId = null;
if (workTask.getWorkTaskStatus() != 3) {
//获得TASK
taskId = taskService.getCurrentTaskIdByProcessInstanceId(workTask.getProcessInstanceId());
}
return success(BpmOAWorkTaskConvert.INSTANCE.convert(workTask, userRespDTO, deptRespDTO, taskId));
}
@GetMapping("/getByProcessInstanceId")
@Operation(summary = "获得任务分配")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<BpmOAWorkTaskDO> getTask(@RequestParam("id") String processInstanceId) {
BpmOAWorkTaskDO workTask = workTaskService.getWorkTaskByProcessInstanceId(processInstanceId);
return success(workTask);
}
@PutMapping("/add")
@Operation(summary = "添加任务跟踪数据【全量传】")
public CommonResult<Boolean> addTrackInfo(@RequestBody BpmOAWorkTaskReqVO updateReqVO) {
workTaskService.addTrackInfo(updateReqVO) ;
return success(true);
}
@PostMapping("/update")
@Operation(summary = "更新工作任务的状态和进度")
public CommonResult<Boolean> updateWorkTask(@RequestBody BpmOAWorkTaskReqVO createReqVO) {
workTaskService.updateWorkTask(createReqVO) ;
return success(true);
}
@GetMapping("/page")
@Operation(summary = "获得工作任务分页")
public CommonResult<PageResult<BpmOAWorkTaskRespVO>> getPage(@Valid BpmOAWorkTaskPageReqVO pageVO) {
PageResult<BpmOAWorkTaskRespVO> pageResult = workTaskService.getPage(getLoginUserId(), pageVO);
return success(pageResult);
}
@GetMapping("/my-page")
@Operation(summary = "获得我的任务分页")
public CommonResult<PageResult<BpmOAWorkTaskRespVO>> getMyPage(@Valid BpmOAWorkTaskPageReqVO pageVO) {
PageResult<BpmOAWorkTaskRespVO> pageResult = workTaskService.getMyPage(getLoginUserId(), pageVO);
return success(pageResult);
}
}

View File

@ -0,0 +1,45 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
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;
@Schema(description = "管理后台 - 任务分配分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class BpmOAWorkTaskPageReqVO extends PageParam {
@Schema(description = "发起人用户ID")
private Long fromUserId;
@Schema(description = "用户ID")
private Long userId;
@Schema(description = "部门编号")
private Long deptId;
@Schema(description = "用户ID列表")
private List<Long> userIdList;
@Schema(description = "状态")
private Integer workTaskStatus;
@Schema(description = "任务名称")
private String taskName;
@Schema(description = "是否查看我的任务分配标识 | 1我的 2全部")
private Integer isMyTask;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@Schema(description = "申请时间")
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,74 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
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 yj
*/
@Schema(description = "管理后台 - 工作任务分配 Request VO")
@Data
public class BpmOAWorkTaskReqVO {
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED)
private Long id;
@Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "任务名称不能为空")
private String taskName;
@Schema(description = "任务内容", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "任务内容不能为空")
private String taskContent;
@Schema(description = "任务级别", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "任务级别不能为空")
private Integer level;
@Schema(description = "任务的开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "截止时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate startTime;
@Schema(description = "任务的截止时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "截止时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate endTime;
@Schema(description = "责任人ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "责任人不能为空")
private Long userId;
@Schema(description = "任务进度百分比", requiredMode = Schema.RequiredMode.REQUIRED)
private Long schedule ;
@Schema(description = "工作任务状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1:待启动2:进行中3.已完成4.延期, 5.搁置")
private Integer workTaskStatus ;
@Schema(description = "搁置或延期原因")
private String reason;
@Schema(description = "搁置后 任务开始日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate shelveStartTime;
@Schema(description = "搁置后 任务结束日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate shelveEndTime;
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
private List<UploadUserFile> fileItems;
@Schema(description = "跟踪内容集合")
private BpmOAWorkTaskTrackInfo trackInfos;
}

View File

@ -0,0 +1,94 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOABaseRespVO;
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.time.LocalDateTime;
import java.util.List;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 报销响应数据 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class BpmOAWorkTaskRespVO extends BpmOABaseRespVO {
@Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "任务名称不能为空")
private String taskName;
@Schema(description = "任务内容", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "任务内容不能为空")
private String taskContent;
@Schema(description = "任务级别", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "任务级别不能为空")
private Integer level;
@Schema(description = "任务的开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "截止时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate startTime;
@Schema(description = "任务的截止时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "截止时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate endTime;
@Schema(description = "发起人用户ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "责任名称不能为空")
private Long fromUserId;
@Schema(description = "发起人名称", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "责任名称不能为空")
private String fromUserName;
@Schema(description = "责任人用户ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "责任名称不能为空")
private Long receiverUserId;
@Schema(description = "责任人名称", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "责任名称不能为空")
private String userName;
@Schema(description = "责任人部门名称", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "部门名称不能为空")
private String deptName;
@Schema(description = "任务进度百分比", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "任务进度百分比")
private Long schedule ;
@Schema(description = "工作任务状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1:待启动2:进行中3.已完成4.延期, 5.搁置")
@NotNull(message = "工作任务状态")
private Integer workTaskStatus ;
@Schema(description = "搁置或延期原因")
private String reason;
@Schema(description = "搁置后 任务开始日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate shelveStartTime;
@Schema(description = "搁置后 任务结束日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate shelveEndTime;
@Schema(description = "跟踪内容集合")
private List<BpmOAWorkTaskTrackInfo> trackInfo;
@Schema(description = "更新时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime updateTime;
@Schema(description = "TaskId")
private String taskId;
}

View File

@ -0,0 +1,15 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 跟踪内容集合 VO")
@Data
public class BpmOAWorkTaskTrackInfo {
@Schema(description = "跟踪内容", example = "11111112122222")
private String trackContent;
@Schema(description = "跟踪内容提交时间", example = "2024-05-12 12:00:44")
private String trackTime;
}

View File

@ -6,17 +6,24 @@ import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.print.BpmProcessInstancePrintDataReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.print.BpmProcessInstancePrintDataRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@ -31,6 +38,15 @@ public class BpmProcessInstanceController {
@Resource
private BpmProcessInstanceService processInstanceService;
@Resource
private BpmTaskService bpmTaskService;
@Resource
private AdminUserApi adminUserApi;
@Resource
private BpmMessageService messageService;
@GetMapping("/my-page")
@Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用")
@PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
@ -57,6 +73,28 @@ public class BpmProcessInstanceController {
return success(processInstanceService.getProcessInstanceVO(id));
}
@GetMapping("/urge-approve")
@Operation(summary = "审批提醒", description = "在【流程详细】界面中,进行调用")
@Parameter(name = "id", description = "流程实例的编号", required = true)
@PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
@DataPermission(enable = false)
public CommonResult<Boolean> urgeApprove(@RequestParam("id") String id) {
//获得流程实例
ProcessInstance processInstance = processInstanceService.getProcessInstance(id);
if (processInstance != null) {
// 获得任务列表
List<BpmTaskRespVO> BpmTaskRespVOs = bpmTaskService.getTaskListByProcessInstanceId(id);
AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId())).getCheckedData();
Task task = bpmTaskService.getTasksByProcessInstanceId(id).get(0);
//发送信息通知
messageService.sendMessageWhenTaskAssigned(
BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task, BpmTaskRespVOs));
}
return success(true);
}
@DeleteMapping("/cancel")
@Operation(summary = "取消流程实例", description = "撤回发起的流程")
@PreAuthorize("@ss.hasPermission('bpm:process-instance:cancel')")

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.bpm.convert.message;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
import cn.iocoder.yudao.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO;
import cn.iocoder.yudao.module.system.api.subscribe.dto.MsgData;
@ -37,7 +38,8 @@ public interface BpmMessageConvert {
* @param miniProgramState 小程序的状态
* @return
*/
default SubscribeMessageReqDTO convertApprovalResultNotification(String openId, String processInstanceName, String time, String result, String reason, String processInstanceId,
default SubscribeMessageReqDTO convertApprovalResultNotification(String openId, String processInstanceName,
String time, String result, String reason, String processInstanceId,
String miniProgramState) {
SubscribeMessageReqDTO message = new SubscribeMessageReqDTO();
message.setToUser(openId);
@ -91,7 +93,8 @@ public interface BpmMessageConvert {
* @param miniProgramState 小程序的状态
* @return
*/
default SubscribeMessageReqDTO convertProcessToDoReminder(String openId, String processInstanceName, String startUserNickname, String time, String schedule, String processInstanceId, String miniProgramState) {
default SubscribeMessageReqDTO convertProcessToDoReminder(String openId, String processInstanceName,
String startUserNickname, String time, String schedule, String processInstanceId, String miniProgramState) {
SubscribeMessageReqDTO message = new SubscribeMessageReqDTO();
message.setToUser(openId);
message.setTemplateId("3cP4btlFSSiZk65qVewN_WoT_bh0OfUkYzzTsADOrR4");
@ -123,4 +126,56 @@ public interface BpmMessageConvert {
message.setPage("pages/bpm/task/todo/examineApprove?id=" + processInstanceId);
return message;
}
/**
* @param openId 微信小程序唯一id
* @param workTaskDO 任务对象
* @param nickname 发布人姓名
* @param miniProgramState 小程序的状态
* @return
*/
default SubscribeMessageReqDTO convertWorkTask(String openId, String processInstanceName, BpmOAWorkTaskDO workTaskDO,
String nickname, String time, String miniProgramState, Boolean isFlag) {
SubscribeMessageReqDTO message = new SubscribeMessageReqDTO();
message.setToUser(openId);
message.setTemplateId("fH29xjNb8pe-7onQ-wE3QrBAC-y8aaC_oosYZKNMtzM");
//消息类型
MsgData noticeType = new MsgData();
noticeType.setName("phrase8");
noticeType.setValue(processInstanceName);
message.addData(noticeType);
//发送人
MsgData publishMan = new MsgData();
publishMan.setName("thing16");
publishMan.setValue(nickname);
message.addData(publishMan);
//发送时间
MsgData createTime = new MsgData();
createTime.setName("time3");
createTime.setValue(time);
message.addData(createTime);
//消息内容
MsgData content = new MsgData();
content.setName("thing2");
if (isFlag) {
content.setValue("你分配的任务已完成!");
}else {
content.setValue("你收到了一个新的任务!");
}
message.addData(content);
message.setMiniprogramState(miniProgramState);
if (isFlag) {
message.setPage("subPages/task/taskAssignment?userId=" + workTaskDO.getReceiverUserId());
}else {
message.setPage("subPages/task/taskDispose?id=" + workTaskDO.getId());
}
return message;
}
}

View File

@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.bpm.convert.oa;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskRespVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 分配任务 Convert
*
* @author 芋艿
*/
@Mapper
public interface BpmOAWorkTaskConvert {
BpmOAWorkTaskConvert INSTANCE = Mappers.getMapper(BpmOAWorkTaskConvert.class);
BpmOAWorkTaskDO convert(BpmOAWorkTaskReqVO bean);
default BpmOAWorkTaskRespVO convert(BpmOAWorkTaskDO workTask, AdminUserRespDTO userRespDTO, DeptRespDTO deptRespDTO, String taskId) {
BpmOAWorkTaskRespVO respVO = BeanUtils.toBean(workTask, BpmOAWorkTaskRespVO.class);
respVO.setUserName(userRespDTO.getNickname());
respVO.setDeptName(deptRespDTO.getName());
respVO.setTaskId(taskId);
return respVO;
}
}

View File

@ -0,0 +1,122 @@
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.worktask.BpmOAWorkTaskTrackInfo;
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_work_task", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BpmOAWorkTaskDO extends BaseDO {
/**
* 工作任务表单主键
*/
@TableId
private Long id;
/**
* 发起人
*/
private Long fromUserId;
/**
* 发起人部门编号
*/
private Long fromDeptId;
/**
* 接受人
*/
private Long receiverUserId;
/**
* 任务名称
*/
private String taskName;
/**
* 任务内容
*/
private String taskContent;
/**
* 任务级别
* 字典值 参考 bpm_oa_work_task_type
*/
private Integer level;
/**
* 开始时间
*/
private LocalDate startTime;
/**
* 截止时间
*/
private LocalDate endTime;
/**
* 任务进度 百分比
*/
private Long schedule;
/**
* 任务的状态 任务自身的状态 1:待启动2:进行中3.已完成4.延期, 5.搁置
* 字典值 参考 bpm_oa_work_task_status
*/
private Integer workTaskStatus ;
/**
* 搁置或延期 原因
*/
private String reason;
/**
* 搁置后 任务开始日期
*/
private LocalDate shelveStartTime;
/**
* 搁置后 任务结束日期
*/
private LocalDate shelveEndTime;
/**
* 任务分配BPM流程的结果
*
* 枚举 {@link BpmProcessInstanceResultEnum}
* 考虑到简单所以直接复用了 BpmProcessInstanceResultEnum 枚举也可以自己定义一个枚举哈
*/
private Integer result;
/**
* 对应的流程编号
*
* 关联 ProcessInstance id 属性
*/
private String processInstanceId;
/**
* 附件基本信息
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<UploadUserFile> fileItems ;
/**
* 任务跟踪信息
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<BpmOAWorkTaskTrackInfo> trackInfo;
}

View File

@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.bpm.dal.mysql.oa;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskPageReqVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 分配任务 Mapper
*
* @author yj
*/
@Mapper
public interface BpmOAWorkTaskMapper extends BaseMapperX<BpmOAWorkTaskDO> {
default PageResult<BpmOAWorkTaskDO> selectPage(Long userId, BpmOAWorkTaskPageReqVO reqVO) {
if (reqVO.getIsMyTask() == 2) {
userId = null;
}
return selectPage(reqVO, new LambdaQueryWrapperX<BpmOAWorkTaskDO>()
.eqIfPresent(BpmOAWorkTaskDO::getFromUserId, reqVO.getFromUserId())
.inIfPresent(BpmOAWorkTaskDO::getReceiverUserId, reqVO.getUserIdList())
.eqIfPresent(BpmOAWorkTaskDO::getReceiverUserId, reqVO.getUserId())
.likeIfPresent(BpmOAWorkTaskDO::getTaskName, reqVO.getTaskName())
.eqIfPresent(BpmOAWorkTaskDO::getWorkTaskStatus, reqVO.getWorkTaskStatus())
.betweenIfPresent(BpmOAWorkTaskDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(BpmOAWorkTaskDO::getFromUserId, userId)
.orderByDesc(BpmOAWorkTaskDO::getId));
}
default PageResult<BpmOAWorkTaskDO> selectMyPage(Long userId, BpmOAWorkTaskPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<BpmOAWorkTaskDO>()
.eqIfPresent(BpmOAWorkTaskDO::getFromUserId, reqVO.getFromUserId())
.likeIfPresent(BpmOAWorkTaskDO::getTaskName, reqVO.getTaskName())
.eqIfPresent(BpmOAWorkTaskDO::getWorkTaskStatus, reqVO.getWorkTaskStatus())
.betweenIfPresent(BpmOAWorkTaskDO::getCreateTime, reqVO.getCreateTime())
.eq(BpmOAWorkTaskDO::getReceiverUserId, userId)
.orderByDesc(BpmOAWorkTaskDO::getId));
}
}

View File

@ -18,6 +18,8 @@ public interface BpmProcessInstanceExtMapper extends BaseMapperX<BpmProcessInsta
default PageResult<BpmProcessInstanceExtDO> selectCCPage(Long userId, BpmProcessInstanceMyPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessInstanceExtDO>()
// .eqIfPresent(BpmProcessInstanceExtDO::getStartUserId, userId)
//只能查询流程标识定义为oa开头的流程
.likeIfPresent(BpmProcessInstanceExtDO::getProcessDefinitionId, "oa_")
.likeIfPresent(BpmProcessInstanceExtDO::getCcids, "[" + userId + "]")
.eqIfPresent(BpmProcessInstanceExtDO::getProcessDefinitionId, reqVO.getProcessDefinitionId())
.eqIfPresent(BpmProcessInstanceExtDO::getCategory, reqVO.getCategory())
@ -30,6 +32,8 @@ public interface BpmProcessInstanceExtMapper extends BaseMapperX<BpmProcessInsta
default PageResult<BpmProcessInstanceExtDO> selectPage(Long userId, BpmProcessInstanceMyPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessInstanceExtDO>()
//只能查询流程标识定义为oa开头的流程
.likeIfPresent(BpmProcessInstanceExtDO::getProcessDefinitionId, "oa_")
.eqIfPresent(BpmProcessInstanceExtDO::getStartUserId, userId)
.likeIfPresent(BpmProcessInstanceExtDO::getName, reqVO.getName())
.eqIfPresent(BpmProcessInstanceExtDO::getProcessDefinitionId, reqVO.getProcessDefinitionId())
@ -57,6 +61,8 @@ public interface BpmProcessInstanceExtMapper extends BaseMapperX<BpmProcessInsta
default PageResult<BpmProcessInstanceExtDO> selectStatisticePage(BpmProcessInstanceMyPageReqVO reqVO) {
//如果为空那么查询全部
return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessInstanceExtDO>()
//只能查询流程标识定义为oa开头的流程
.likeIfPresent(BpmProcessInstanceExtDO::getProcessDefinitionId, "oa_")
.likeIfPresent(BpmProcessInstanceExtDO::getName, reqVO.getName())
.eqIfPresent(BpmProcessInstanceExtDO::getProcessDefinitionId, reqVO.getProcessDefinitionId())
.eqIfPresent(BpmProcessInstanceExtDO::getCategory, reqVO.getCategory())

View File

@ -44,4 +44,11 @@ public interface BpmTaskExtMapper extends BaseMapperX<BpmTaskExtDO> {
.eq(BpmTaskExtDO::getProcessInstanceId, processInstanceId)
.eq(BpmTaskExtDO::getResult, BpmProcessInstanceResultEnum.APPROVE.getResult()));
}
default List<BpmTaskExtDO> selectTask(List<String> processInstanceId, Integer result) {
return selectList(new LambdaQueryWrapperX<BpmTaskExtDO>()
.inIfPresent(BpmTaskExtDO::getProcessInstanceId, processInstanceId)
.eqIfPresent(BpmTaskExtDO::getResult, result));
}
}

View File

@ -0,0 +1,54 @@
package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum;
import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript;
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.runtime.ProcessInstance;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Set;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static java.util.Collections.emptySet;
@Component
public class BpmTaskWorkTaskReceiverUserScript implements BpmTaskAssignScript {
@Resource
@Lazy // 解决循环依赖
private BpmProcessInstanceService bpmProcessInstanceService;
@Resource
@Lazy // 解决循环依赖
private BpmTaskService bpmTaskService ;
@Resource
private HttpSession session;
@Override
public Set<Long> calculateTaskCandidateUsers(DelegateExecution execution) {
// 获得发起人
ProcessInstance processInstance = bpmProcessInstanceService.getProcessInstance(execution.getProcessInstanceId());
List<BpmTaskRespVO> bpmTaskRespVOs = bpmTaskService.getTaskListByProcessInstanceId(processInstance.getProcessInstanceId());
if (CollUtil.isEmpty(bpmTaskRespVOs)) {
return emptySet();
}
return SetUtils.asSet((Long) session.getAttribute(getLoginUserId().toString()));
}
@Override
public BpmTaskRuleScriptEnum getEnum() {
return BpmTaskRuleScriptEnum.LEADER_X6;
}
}

View File

@ -2,15 +2,16 @@ package cn.iocoder.yudao.module.bpm.service.message;
import cn.iocoder.yudao.framework.web.config.WebProperties;
import cn.iocoder.yudao.module.bpm.convert.message.BpmMessageConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
import cn.iocoder.yudao.module.bpm.enums.message.BpmMessageEnum;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO;
import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAWorkTaskService;
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
import cn.iocoder.yudao.module.system.api.sms.SmsSendApi;
import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@ -36,7 +37,7 @@ import java.util.regex.Pattern;
public class BpmMessageServiceImpl implements BpmMessageService {
@Resource
private SmsSendApi smsSendApi;
private AdminUserApi userApi;
@Resource
private NotifyMessageSendApi notifyMessageSendApi;
@ -51,6 +52,9 @@ public class BpmMessageServiceImpl implements BpmMessageService {
@Lazy // 解决循环依赖
private BpmProcessInstanceService bpmProcessInstanceService;
@Resource
private BpmOAWorkTaskService workTaskService;
@Override
public void sendMessageWhenProcessInstanceApprove(BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO) {
//审批通过
@ -67,14 +71,27 @@ public class BpmMessageServiceImpl implements BpmMessageService {
//发送审批结果通知至微信
String openId = getUserOpenId(reqDTO.getStartUserId());
if (openId != null) {
subscribeMessageSendApi.sendApprovalResultNotification(
BpmMessageConvert.INSTANCE.convertApprovalResultNotification(
openId, reqDTO.getProcessInstanceName(), reqDTO.getCreateTime(), "通过", reqDTO.getReason(),
reqDTO.getProcessInstanceId(),
/**
* 跳转小程序类型developer为开发版trial为体验版formal为正式版默认为正式版
*/
"formal"));
// 获得任务分配数据
BpmOAWorkTaskDO workTaskDO = workTaskService.getWorkTaskByProcessInstanceId(reqDTO.getProcessInstanceId());
if (workTaskDO != null) {
String nickName = userApi.getUser(workTaskDO.getReceiverUserId()).getCheckedData().getNickname();
subscribeMessageSendApi.sendWorkLogComment(BpmMessageConvert.INSTANCE.convertWorkTask(
openId, reqDTO.getProcessInstanceName(), workTaskDO, nickName, reqDTO.getCreateTime(),
"formal", true));
}else {
subscribeMessageSendApi.sendApprovalResultNotification(
BpmMessageConvert.INSTANCE.convertApprovalResultNotification(
openId, reqDTO.getProcessInstanceName(), reqDTO.getCreateTime(), "通过", reqDTO.getReason(),
reqDTO.getProcessInstanceId(),
/**
* 跳转小程序类型developer为开发版trial为体验版formal为正式版默认为正式版
*/
"formal"));
}
}
//当流程全部审批通过
@ -147,6 +164,7 @@ public class BpmMessageServiceImpl implements BpmMessageService {
// templateParams.put("taskName", reqDTO.getTaskName());
templateParams.put("startUserNickname", reqDTO.getStartUserNickname());
templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId()));
//短信
// smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getAssigneeUserId(),
// BpmMessageEnum.TASK_ASSIGNED.getSmsTemplateCode(), templateParams));
@ -158,10 +176,21 @@ public class BpmMessageServiceImpl implements BpmMessageService {
//发送OA流程待办提醒
String openId = getUserOpenId(assigneeUserId); //只有在微信小程序登陆过用户才会有openid
if (openId != null) {
subscribeMessageSendApi.sendProcessToDoReminder(BpmMessageConvert.INSTANCE.convertProcessToDoReminder(
openId, reqDTO.getProcessInstanceName(), reqDTO.getStartUserNickname(), reqDTO.getCreateTime(), reqDTO.getSchedule(),
reqDTO.getProcessInstanceId(),
"formal"));
// 获得任务分配数据
BpmOAWorkTaskDO workTaskDO = workTaskService.getWorkTaskByProcessInstanceId(reqDTO.getProcessInstanceId());
if (workTaskDO != null) {
subscribeMessageSendApi.sendWorkLogComment(BpmMessageConvert.INSTANCE.convertWorkTask(
openId, reqDTO.getProcessInstanceName(), workTaskDO, reqDTO.getStartUserNickname(), reqDTO.getCreateTime(),
"formal", false));
}else {
subscribeMessageSendApi.sendProcessToDoReminder(BpmMessageConvert.INSTANCE.convertProcessToDoReminder(
openId, reqDTO.getProcessInstanceName(), reqDTO.getStartUserNickname(), reqDTO.getCreateTime(), reqDTO.getSchedule(),
reqDTO.getProcessInstanceId(),
"formal"));
}
}
}
}

View File

@ -0,0 +1,78 @@
package cn.iocoder.yudao.module.bpm.service.oa;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskRespVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
import javax.validation.Valid;
/**
* 任务分配 Service 接口
*
* @author jason
*/
public interface BpmOAWorkTaskService {
/**
* 创建工作任务
*
* @param userId 用户编号
* @param createReqVO 创建信息
* @return 编号
*/
Long createWorkTask(Long userId, @Valid BpmOAWorkTaskReqVO createReqVO);
/**
* 更新工作任务的状态
*
* @param id 编号
* @param result 结果
*/
void updateWorkTaskResult(Long id, Integer result);
/**
* 获得工作任务详情
*
* @param id 编号
* @return 任务分配
*/
BpmOAWorkTaskDO getWorkTask(Long id);
/**
* 获得工作任务详情
*
* @param processInstanceId 流程实例编号
* @return 任务分配
*/
BpmOAWorkTaskDO getWorkTaskByProcessInstanceId(String processInstanceId);
/**
* 更新 工作跟踪日志数据
* 因为是所有数据是存储在一个字段所以是全量更新
* @param updateReqVO
*
*/
void addTrackInfo(BpmOAWorkTaskReqVO updateReqVO) ;
void updateWorkTask(BpmOAWorkTaskReqVO createReqVO) ;
/**
* 获得 任务分配分页
* @param loginUserId 用户编号
* @param pageVO 分页条件
* @return 任务分配分页
*/
PageResult<BpmOAWorkTaskRespVO> getPage(Long loginUserId, BpmOAWorkTaskPageReqVO pageVO);
/**
* 获得 我的任务分页
* @param loginUserId 用户编号
* @param pageVO 分页条件
* @return 任务分配分页
*/
PageResult<BpmOAWorkTaskRespVO> getMyPage(Long loginUserId, BpmOAWorkTaskPageReqVO pageVO);
}

View File

@ -0,0 +1,228 @@
package cn.iocoder.yudao.module.bpm.service.oa;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
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.worktask.BpmOAWorkTaskPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.worktask.BpmOAWorkTaskTrackInfo;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAWorkTaskConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAWorkTaskDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAWorkTaskMapper;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_WORK_TASK_NOT_EXISTS;
/**
* OA 请假申请 Service 实现类
*
* @author jason
*/
@Service
@Validated
public class BpmOAWorkTaskServiceImpl extends BpmOABaseService implements BpmOAWorkTaskService {
/**
* OA 请假对应的流程定义 KEY
*/
public static final String PROCESS_KEY = "work_task";
@Resource
private BpmOAWorkTaskMapper workTaskMapper;
@Resource
private BpmProcessInstanceApi processInstanceApi;
@Resource
private HttpSession session;
@Resource
private AdminUserApi userApi;
@Resource
private DeptApi deptApi;
@Resource
@Lazy
private BpmTaskService taskService;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createWorkTask(Long userId, BpmOAWorkTaskReqVO createReqVO) {
//设置 责任人Id
session.setAttribute(userId.toString(), createReqVO.getUserId());
// 获取当前登录用户得信息
AdminUserRespDTO userRespDTO = userApi.getUser(userId).getCheckedData();
BpmOAWorkTaskDO workTask = BpmOAWorkTaskConvert.INSTANCE.convert(createReqVO)
.setFromUserId(userId)
.setFromDeptId(userRespDTO.getDeptId())
.setWorkTaskStatus(1) //默认待启动状态
.setReceiverUserId(createReqVO.getUserId())
.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
workTaskMapper.insert(workTask);
// 发起 BPM 流程
Map<String, Object> processInstanceVariables = new HashMap<>();
String processInstanceId = processInstanceApi.createProcessInstance(userId,
new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
.setVariables(processInstanceVariables).setBusinessKey(String.valueOf(workTask.getId()))).getCheckedData();
// 将工作流的编号更新到 OA 请假单中
workTaskMapper.updateById(new BpmOAWorkTaskDO().setId(workTask.getId()).setProcessInstanceId(processInstanceId));
List<UploadUserFile> fileItems = createReqVO.getFileItems() ;
//这里的逻辑如果fileItems不为空且有数据那么说明是上传了附件的则需要更工作流文件表对应的实例Id
if (fileItems != null && !fileItems.isEmpty()) {
uploadBpmFileProcessInstanceId(processInstanceId,fileItems) ;
}
return workTask.getId();
}
@Override
public void updateWorkTaskResult(Long id, Integer result) {
validateLeaveExists(id);
//bpm流程设置成已完成需要将任务自生的状态设置成已完成
workTaskMapper.updateById(new BpmOAWorkTaskDO().setId(id).setResult(result).setWorkTaskStatus(3).setSchedule(100L));
}
private BpmOAWorkTaskDO validateLeaveExists(Long id) {
BpmOAWorkTaskDO taskDO = workTaskMapper.selectById(id);
if (taskDO == null) {
throw exception(OA_WORK_TASK_NOT_EXISTS);
}
return taskDO;
}
@Override
public BpmOAWorkTaskDO getWorkTask(Long id) {
return workTaskMapper.selectById(id);
}
@Override
public BpmOAWorkTaskDO getWorkTaskByProcessInstanceId(String processInstanceId) {
return workTaskMapper.selectOne(BpmOAWorkTaskDO::getProcessInstanceId, processInstanceId);
}
@Override
public void addTrackInfo(BpmOAWorkTaskReqVO updateReqVO) {
//设置 跟踪任务创建时间
BpmOAWorkTaskTrackInfo taskTrackInfo = updateReqVO.getTrackInfos();
taskTrackInfo.setTrackTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
BpmOAWorkTaskDO taskDO = validateLeaveExists(updateReqVO.getId());
List<BpmOAWorkTaskTrackInfo> info = taskDO.getTrackInfo();
if (info == null) {
info = new ArrayList<>();
}
info.add(taskTrackInfo);
BpmOAWorkTaskDO updateDo = new BpmOAWorkTaskDO();
updateDo.setId(updateReqVO.getId());
updateDo.setTrackInfo(info);
workTaskMapper.updateById(updateDo);
}
@Override
public void updateWorkTask(BpmOAWorkTaskReqVO createReqVO) {
BpmOAWorkTaskDO taskDO = validateLeaveExists(createReqVO.getId());
if (taskDO.getWorkTaskStatus() == 5 && createReqVO.getWorkTaskStatus() == 2) {
Long daysDifference = ChronoUnit.DAYS.between(taskDO.getStartTime(), taskDO.getEndTime());
createReqVO.setShelveStartTime(LocalDate.now());
createReqVO.setShelveEndTime(LocalDate.now().plusDays(daysDifference));
}
taskDO = BeanUtils.toBean(createReqVO, BpmOAWorkTaskDO.class);
//更新任务进度 任务状态
workTaskMapper.updateById(taskDO);
}
@Override
public PageResult<BpmOAWorkTaskRespVO> getPage(Long loginUserId, BpmOAWorkTaskPageReqVO pageVO) {
PageResult<BpmOAWorkTaskDO> pageResult = workTaskMapper.selectPage(loginUserId, pageVO);
// 获得责任人 用户Id
List<Long> userIds = pageResult.getList().stream().map(BpmOAWorkTaskDO::getReceiverUserId).collect(Collectors.toList());
// 获得责任人用户信息列表
List<AdminUserRespDTO> userRespDTOS = userApi.getUserList(userIds).getCheckedData();
Map<Long, AdminUserRespDTO> userMap = convertMap(userRespDTOS, AdminUserRespDTO::getId);
//获得部门信息map
Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(userRespDTOS.stream().map(AdminUserRespDTO::getDeptId).collect(Collectors.toSet()));
//获得发起人用户信息列表
List<Long> fromUserIds = pageResult.getList().stream().map(BpmOAWorkTaskDO::getFromUserId).collect(Collectors.toList());
Map<Long, AdminUserRespDTO> fromUserMap = userApi.getUserMap(fromUserIds);
PageResult<BpmOAWorkTaskRespVO> dataPage = BeanUtils.toBean(pageResult, BpmOAWorkTaskRespVO.class);
dataPage.getList().forEach(data -> {
data.setFromUserName(fromUserMap.get(data.getFromUserId()).getNickname());
data.setUserName(userMap.get(data.getReceiverUserId()).getNickname());
data.setDeptName(deptMap.get(userMap.get(data.getReceiverUserId()).getDeptId()).getName());
});
return dataPage;
}
@Override
public PageResult<BpmOAWorkTaskRespVO> getMyPage(Long loginUserId, BpmOAWorkTaskPageReqVO pageVO) {
PageResult<BpmOAWorkTaskDO> pageResult = workTaskMapper.selectMyPage(loginUserId, pageVO);
//获得发起人用户信息列表
List<Long> fromUserIds = pageResult.getList().stream().map(BpmOAWorkTaskDO::getFromUserId).collect(Collectors.toList());
Map<Long, AdminUserRespDTO> fromUserMap = userApi.getUserMap(fromUserIds);
//获得任务分配processInstanceId
List<String> processInstanceIds = pageResult.getList().stream().map(BpmOAWorkTaskDO::getProcessInstanceId).collect(Collectors.toList());
List<BpmTaskExtDO> taskExtDOS = taskService.getTaskByProcessInstanceIdAndResult(processInstanceIds, BpmProcessInstanceResultEnum.PROCESS.getResult());
Map<String, BpmTaskExtDO> taskExtDOMap = convertMap(taskExtDOS, BpmTaskExtDO::getProcessInstanceId);
PageResult<BpmOAWorkTaskRespVO> dataPage = BeanUtils.toBean(pageResult, BpmOAWorkTaskRespVO.class);
dataPage.getList().forEach(data -> {
data.setFromUserName(fromUserMap.get(data.getFromUserId()).getNickname());
data.setTaskId(taskExtDOMap.get(data.getProcessInstanceId()) != null ? taskExtDOMap.get(data.getProcessInstanceId()).getTaskId() : null);
});
return dataPage;
}
}

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.BpmOAWorkTaskService;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAWorkTaskServiceImpl;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* OA 分配工作 的结果的监听器实现类
*
* @author 姚君
*/
@Component
public class BpmOAWorkTaskResultListener extends BpmProcessInstanceResultEventListener {
@Resource
private BpmOAWorkTaskService workTaskService;
@Override
protected String getProcessDefinitionKey() {
return BpmOAWorkTaskServiceImpl.PROCESS_KEY;
}
@Override
protected void onEvent(BpmProcessInstanceResultEvent event) {
workTaskService.updateWorkTaskResult(Long.parseLong(event.getBusinessKey()), event.getResult());
}
}

View File

@ -64,6 +64,14 @@ public interface BpmTaskService {
*/
List<Task> getTasksByProcessInstanceIds(List<String> processInstanceIds);
/**
* 获得流程任务列表
*
* @param processInstanceId 流程实例的编号
* @return 流程任务列表
*/
List<Task> getTasksByProcessInstanceId(String processInstanceId);
/**
* 获得指令流程实例的流程任务列表包括所有状态的
*
@ -196,4 +204,6 @@ public interface BpmTaskService {
* @return 当前任务的taskId
*/
String getCurrentTaskIdByProcessInstanceId(String processInstanceId) ;
List<BpmTaskExtDO> getTaskByProcessInstanceIdAndResult(List<String> processInstanceId, Integer result);
}

View File

@ -24,7 +24,6 @@ import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.PostApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@ -91,9 +90,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Resource
private DeptApi deptApi;
@Resource
private PostApi postApi;
@Resource
private BpmTaskExtMapper taskExtMapper;
@ -122,8 +118,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
Map<String, BpmTaskExtDO> bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId);
// 获得 ProcessInstance Map
Set<String> ids = new HashSet<>();
ids.addAll(processInstanceIds);
Set<String> ids = new HashSet<>(processInstanceIds);
Map<String, HistoricProcessInstance> historicProcessInstanceMap =
processInstanceService.getHistoricProcessInstanceMap(ids);
@ -138,10 +133,13 @@ public class BpmTaskServiceImpl implements BpmTaskService {
public PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) {
// 查询待办任务
TaskQuery taskQuery = taskService.createTaskQuery().taskAssignee(String.valueOf(userId)) // 分配给自己
//只能查询流程标识定义为oa开头的流程
.processDefinitionKeyLike("oa_%")
.orderByTaskCreateTime().desc(); // 创建时间倒序
if (StrUtil.isNotBlank(pageVO.getName())) {
//流程定义的名称
taskQuery.processDefinitionName(pageVO.getName());
// taskQuery.taskNameLike("%" + pageVO.getName() + "%");
}
if (ArrayUtil.get(pageVO.getCreateTime(), 0) != null) {
@ -178,6 +176,8 @@ public class BpmTaskServiceImpl implements BpmTaskService {
queryWrapperX.eq(BpmTaskExtDO::getDeleted, false);
queryWrapperX.groupBy(BpmTaskExtDO::getName);
queryWrapperX.select(BpmTaskExtDO::getName);
//只能查询流程标识定义为oa开头的流程
queryWrapperX.likeIfPresent(BpmTaskExtDO::getProcessDefinitionId,"oa_");
List<BpmTaskExtDO> list = taskExtMapper.selectList(queryWrapperX);
List<String> taskNames = list.stream().map(BpmTaskExtDO::getName)
.collect(Collectors.toList());
@ -185,6 +185,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
// 查询已办任务
HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery().finished() // 已完成
.taskAssignee(String.valueOf(userId)) // 分配给自己
.processDefinitionKeyLike("oa_%")
.orderByHistoricTaskInstanceEndTime().desc(); // 审批时间倒序
if (taskNames != null && !taskNames.isEmpty()) {
/**
@ -283,6 +284,12 @@ public class BpmTaskServiceImpl implements BpmTaskService {
return taskService.createTaskQuery().processInstanceIdIn(processInstanceIds).list();
}
@Override
public List<Task> getTasksByProcessInstanceId(String processInstanceId) {
return taskService.createTaskQuery().processInstanceId(processInstanceId).orderByTaskCreateTime().desc().list();
}
@Override
public List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId) {
// 获得任务列表
@ -1220,4 +1227,10 @@ public class BpmTaskServiceImpl implements BpmTaskService {
throw exception(TASK_NOT_EXISTS);
}
}
@Override
public List<BpmTaskExtDO> getTaskByProcessInstanceIdAndResult(List<String> processInstanceId, Integer result) {
return taskExtMapper.selectTask(processInstanceId, result);
}
}

View File

@ -19,6 +19,7 @@
#{id}
</foreach>
</if>
AND process_definition_id like 'oa_%'
GROUP BY name
</select>
@ -42,6 +43,7 @@
#{id}
</foreach>
</if>
AND process_definition_id like 'oa_%'
GROUP BY result
</select>
@ -55,6 +57,7 @@
WHERE end_time IS NOT NULL
AND reason != '自动审批'
AND deleted = FALSE
AND process_definition_id like 'oa_%'
GROUP BY assignee_user_id order by userTime desc limit 0, 10
</select>
@ -72,6 +75,7 @@
#{id}
</foreach>
</if>
AND process_definition_id like 'oa_%'
GROUP BY assignee_user_id
</select>

View File

@ -9,6 +9,8 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Collection;
@ -46,6 +48,24 @@ public interface DeptApi {
@Operation(summary = "获取所有部门信息")
CommonResult<List<DeptRespDTO>> getDeptList();
@PostMapping(PREFIX + "/create")
@Operation(summary = "创建部门")
CommonResult<Long> createDept(@RequestBody DeptRespDTO deptRespDTO);
@PostMapping(PREFIX + "/update")
@Operation(summary = "修改部门信息")
void updateDept(@RequestBody DeptRespDTO deptRespDTO);
@PostMapping(PREFIX + "/delete")
@Operation(summary = "删除部门信息")
@Parameter(name = "factoryId", description = "工厂编号", example = "100001", required = true)
void deleteDept(@RequestParam("factoryId") Long factoryId);
@PostMapping(PREFIX + "/getByFactoryId")
@Operation(summary = "根据工厂ID获得部门信息")
@Parameter(name = "factoryId", description = "工厂编号", example = "100001", required = true)
CommonResult<DeptRespDTO> getDeptByFactoryId(@RequestParam("factoryId") Long factoryId);
/**
* 获得指定编号的部门 Map
*

View File

@ -22,6 +22,9 @@ public class DeptRespDTO {
@Schema(description = "负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long leaderUserId;
@Schema(description = "工厂编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long factoryId;
@Schema(description = "部门标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private String flag;

View File

@ -26,4 +26,8 @@ public interface SubscribeMessageSendApi {
@PostMapping(PREFIX + "/send-company-notice")
@Operation(summary = "发送公司公告通知")
CommonResult<Long> sendCompanyNotice(@RequestBody SubscribeMessageReqDTO reqDTO);
@PostMapping(PREFIX + "/send-worklog-comment")
@Operation(summary = "发送日志评论、回复通知")
CommonResult<Long> sendWorkLogComment(@RequestBody SubscribeMessageReqDTO reqDTO);
}

View File

@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
import cn.iocoder.yudao.module.system.service.dept.DeptService;
import org.springframework.validation.annotation.Validated;
@ -61,4 +62,43 @@ public class DeptApiImpl implements DeptApi {
return success(BeanUtils.toBean(deptDOs, DeptRespDTO.class));
}
@Override
public CommonResult<Long> createDept(DeptRespDTO deptRespDTO) {
DeptSaveReqVO deptSaveReqVO = BeanUtils.toBean(deptRespDTO, DeptSaveReqVO.class);
return success(deptService.createDept(deptSaveReqVO));
}
@Override
public void updateDept(DeptRespDTO deptRespDTO) {
DeptDO deptDO = deptService.getDeptByFactoryId(deptRespDTO.getFactoryId());
if (deptDO != null) {
DeptSaveReqVO deptSaveReqVO = BeanUtils.toBean(deptDO, DeptSaveReqVO.class);
deptSaveReqVO.setLeaderUserId(deptRespDTO.getLeaderUserId());
deptSaveReqVO.setName(deptRespDTO.getName());
deptService.updateDept(deptSaveReqVO);
}
}
@Override
public void deleteDept(Long factoryId) {
DeptDO deptDO = deptService.getDeptByFactoryId(factoryId);
if (deptDO != null) {
deptService.deleteDept(deptDO.getId());
}
}
@Override
public CommonResult<DeptRespDTO> getDeptByFactoryId(Long factoryId) {
DeptDO deptDO = deptService.getDeptByFactoryId(factoryId);
return success(BeanUtils.toBean(deptDO, DeptRespDTO.class));
}
}

View File

@ -48,6 +48,13 @@ public class SubscribeMessageSendApiImpl implements SubscribeMessageSendApi {
return success(1L);
}
@SneakyThrows
@Override
public CommonResult<Long> sendWorkLogComment(SubscribeMessageReqDTO reqDTO) {
socialClientService.getWxMaService().getMsgService().sendSubscribeMsg(initWxMaSubscribeMessage(reqDTO));
return success(1L);
}
private WxMaSubscribeMessage initWxMaSubscribeMessage(SubscribeMessageReqDTO reqDTO) {
WxMaSubscribeMessage message = WxMaSubscribeMessage.builder()
.toUser(reqDTO.getToUser())

View File

@ -24,6 +24,9 @@ public class DeptRespVO {
@Schema(description = "负责人的用户编号", example = "2048")
private Long leaderUserId;
@Schema(description = "工厂编号", example = "2048")
private Long factoryId;
@Schema(description = "联系电话", example = "15601691000")
private String phone;

View File

@ -32,6 +32,9 @@ public class DeptSaveReqVO {
@Schema(description = "负责人的用户编号", example = "2048")
private Long leaderUserId;
@Schema(description = "工厂编号", example = "1")
private Long factoryId;
@Schema(description = "联系电话", example = "15601691000")
@Size(max = 11, message = "联系电话长度不能超过11个字符")
private String phone;

View File

@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*;
@ -21,9 +22,7 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.context.annotation.Bean;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@ -120,6 +119,17 @@ public class UserController {
return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap));
}
@GetMapping({"/list-all"})
@Operation(summary = "获取用户精简信息列表", description = "只包含被开启的用户,主要用于前端的下拉选项,无数据权限")
@DataPermission(enable = false)
public CommonResult<List<UserSimpleRespVO>> getAllUserList() {
List<AdminUserDO> list = userService.getUserListByStatus(CommonStatusEnum.ENABLE.getStatus());
// 拼接数据
Map<Long, DeptDO> deptMap = deptService.getDeptMap(
convertList(list, AdminUserDO::getDeptId));
return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap));
}
@GetMapping("/get")
@Operation(summary = "获得用户详情")
@Parameter(name = "id", description = "编号", required = true, example = "1024")

View File

@ -0,0 +1,66 @@
package cn.iocoder.yudao.module.system.convert.worklog;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.module.system.api.subscribe.dto.MsgData;
import cn.iocoder.yudao.module.system.api.subscribe.dto.SubscribeMessageReqDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.comment.WorkLogCommentDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.Date;
@Mapper
public interface LogCommentConvert {
LogCommentConvert INSTANCE = Mappers.getMapper(LogCommentConvert.class);
/**
* @param openId 微信小程序唯一id
* @param logCommentDO 评论对象
* @param nickname 发布人姓名
* @param miniProgramState 小程序的状态
* @return
*/
default SubscribeMessageReqDTO convertLogComment(String openId, WorkLogCommentDO logCommentDO, String nickname, String miniProgramState) {
SubscribeMessageReqDTO message = new SubscribeMessageReqDTO();
message.setToUser(openId);
message.setTemplateId("fH29xjNb8pe-7onQ-wE3QrBAC-y8aaC_oosYZKNMtzM");
//消息类型
MsgData noticeType = new MsgData();
noticeType.setName("phrase8");
if (logCommentDO.getType()) {
noticeType.setValue("评论回复");
}else {
noticeType.setValue("日志评论");
}
message.addData(noticeType);
//发送人
MsgData publishMan = new MsgData();
publishMan.setName("thing16");
publishMan.setValue(nickname);
message.addData(publishMan);
//发送时间
MsgData createTime = new MsgData();
createTime.setName("time3");
createTime.setValue(DateUtils.dateFormat(new Date(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
message.addData(createTime);
//消息内容
MsgData content = new MsgData();
String comment = logCommentDO.getComment();
content.setName("thing2");
if (comment.length() > 10) {
comment = comment.substring(0,10) + ". . . . ";
}
content.setValue(comment);
message.addData(content);
message.setMiniprogramState(miniProgramState);
message.setPage("/subPages/workLogDetail/workLogDetail?id=" + logCommentDO.getWorkLogId());
return message;
}
}

View File

@ -52,6 +52,10 @@ public class DeptDO extends TenantBaseDO {
* 关联 {@link AdminUserDO#getId()}
*/
private Long leaderUserId;
/**
* 工厂编号
*/
private Long factoryId;
/**
* 联系电话
*/

View File

@ -92,6 +92,11 @@ public class AdminUserDO extends TenantBaseDO {
* 枚举 {@link CommonStatusEnum}
*/
private Integer status;
/**
* 用户类型
* 1公司用户 2工厂用户
*/
private Integer userType;
/**
* 最后登录IP
*/

View File

@ -39,6 +39,7 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
.eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus())
.betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getCreateTime())
.inIfPresent(AdminUserDO::getDeptId, deptIds)
.eq(AdminUserDO::getUserType, 1) //查询公司用户
.orderByDesc(AdminUserDO::getId));
}
@ -47,17 +48,24 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
}
default List<AdminUserDO> selectListByStatus(Integer status) {
return selectList(AdminUserDO::getStatus, status);
return selectList(new LambdaQueryWrapperX<AdminUserDO>()
.eq(AdminUserDO::getStatus, status)
.eq(AdminUserDO::getUserType, 1));
}
default List<AdminUserDO> selectListByDeptIds(Collection<Long> deptIds) {
return selectList(AdminUserDO::getDeptId, deptIds);
return selectList(new LambdaQueryWrapperX<AdminUserDO>()
.in(AdminUserDO::getDeptId, deptIds)
.eq(AdminUserDO::getUserType, 1));
}
default List<AdminUserDO> selectListByDeptId(Long deptId, Long userId) {
return selectList(new LambdaQueryWrapperX<AdminUserDO>()
.eq(AdminUserDO::getDeptId, deptId)
.ne(AdminUserDO::getId, userId));
.ne(AdminUserDO::getId, userId)
.eq(AdminUserDO::getUserType , 1));
}
void emptyOpenId(@Param("openId") String openId);

View File

@ -281,6 +281,12 @@ public class AdminAuthServiceImpl implements AdminAuthService {
createLoginLog(user.getId(), phoneNumber, logTypeEnum, LoginResultEnum.USER_DISABLED);
throw exception(AUTH_LOGIN_USER_DISABLED);
}
// 校验账号是否为工厂用户
if (user.getUserType() == 2) {
createLoginLog(null, phoneNumber, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
throw exception(AUTH_MOBILE_NOT_EXISTS);
}
//清空openId
userService.emptyOpenId(reqVO.getOpenId());
//绑定用户openId

View File

@ -5,15 +5,21 @@ import cn.hutool.json.JSONObject;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.LogInstanceRespVO;
import cn.iocoder.yudao.module.system.controller.app.comment.dto.CommentDTO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentPageListVO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentTypeCountVO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentPageReqVO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentSaveReqVO;
import cn.iocoder.yudao.module.system.convert.worklog.LogCommentConvert;
import cn.iocoder.yudao.module.system.dal.dataobject.comment.WorkLogCommentDO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO;
import cn.iocoder.yudao.module.system.dal.mysql.comment.WorkLogCommentMapper;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import cn.iocoder.yudao.module.system.service.worklog.LogFormService;
import cn.iocoder.yudao.module.system.service.worklog.LogInstanceService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -21,6 +27,7 @@ import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -39,6 +46,15 @@ public class WorkLogCommentServiceImpl implements WorkLogCommentService {
@Resource
private LogFormService logFormService;
@Resource
private AdminUserService userService;
@Resource
private LogInstanceService logInstanceService;
@Resource
private SubscribeMessageSendApi subscribeMessageSendApi;
@Override
public Long createWorkLogComment(WorkLogCommentSaveReqVO createReqVO) {
// 插入
@ -46,6 +62,10 @@ public class WorkLogCommentServiceImpl implements WorkLogCommentService {
Long userId = WebFrameworkUtils.getLoginUserId();
workLogComment.setUserId(userId);
workLogCommentMapper.insert(workLogComment);
//创建评论回复后 发送消息通知
sendMessage(workLogComment);
// 返回
return workLogComment.getId();
}
@ -134,4 +154,26 @@ public class WorkLogCommentServiceImpl implements WorkLogCommentService {
return vo;
}
/**
* 评论或回复 发送消息通知
*/
private void sendMessage(WorkLogCommentDO workLogComment) {
//获得日志详情
LogInstanceRespVO instanceDO = logInstanceService.getLogInstance(workLogComment.getWorkLogId());
//获得 用户信息Map
Map<Long, AdminUserDO> userMap = userService.getUserMap(Arrays.asList(instanceDO.getStartUserId(), workLogComment.getUserId()));
String openId = userMap.get(instanceDO.getStartUserId()).getOpenId();
if (openId != null) {
//发送消息通知
subscribeMessageSendApi.sendWorkLogComment(LogCommentConvert.INSTANCE.convertLogComment(
openId, workLogComment, userMap.get(workLogComment.getUserId()).getNickname(),
"formal"));
}
}
}

View File

@ -103,4 +103,6 @@ public interface DeptService {
List<DeptDO> getDeptByLeaderId(Long leaderUserId);
List<DeptDO> getDeptTree();
DeptDO getDeptByFactoryId(Long factoryId);
}

View File

@ -278,4 +278,10 @@ public class DeptServiceImpl implements DeptService {
return deptMapper.selectTree();
}
@Override
public DeptDO getDeptByFactoryId(Long factoryId) {
return deptMapper.selectOne(DeptDO::getFactoryId, factoryId);
}
}

View File

@ -33,12 +33,10 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@ -544,21 +542,6 @@ public class AdminUserServiceImpl implements AdminUserService {
return passwordEncoder.encode(password);
}
private void IdCardAnalysis(AdminUserDO updateUser) {
LocalDate nowDate = LocalDate.now();
String idCard = updateUser.getIdcard();
//通过身份证号码 获得出生日期
LocalDate date = LocalDate.parse(idCard.substring(6, 14));
//通过身份证号码 获得性别
Integer sex = Integer.parseInt(idCard.substring(16, 17)) % 2 == 0 ? 2 : 1;
//通过身份证号码 获得年龄
Integer age = nowDate.getYear() - date.getYear();
}
@Override
public String getSignImgPath(Long userId) {
//2L 用户签名

View File

@ -17,11 +17,14 @@
<select id="selectByDeptIds" resultType="cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO">
select a.*, b.name deptName FROM system_users a, system_dept b
where a.dept_id = b.id
and a.dept_id in
<foreach collection="list" item="deptIds" open="(" close=")" separator=",">
#{deptIds}
</foreach>
where
a.dept_id = b.id
and a.status = 0
and a.user_type = 1
and a.dept_id in
<foreach collection="list" item="deptIds" open="(" close=")" separator=",">
#{deptIds}
</foreach>
</select>
<select id="selectUserByBoss">

View File

@ -12,4 +12,16 @@ public interface ErrorCodeConstants {
ErrorCode FACTORY_INFO_NOT_EXISTS = new ErrorCode(1_000_000_001, "工厂信息不存在");
ErrorCode CAMERA_DEVICE_NOT_EXISTS = new ErrorCode(1_000_000_002, "监控摄像头不存在");
ErrorCode FACTOYRY_EXISTS_STAFF = new ErrorCode(1_000_000_003, "工厂下存在员工,不能删除工厂");
ErrorCode SIZE_NOT_EXISTS = new ErrorCode(1_000_000_004, "规格不存在");
//打包线模块
ErrorCode PACKAGE_NOT_EXISTS = new ErrorCode(1_000_001_001, "打包线信息不存在");
ErrorCode PACKAGE_DATA_EXISTS = new ErrorCode(1_000_001_001, "当前日期的数据已存在");
//出入库数据模块
ErrorCode SIZEDATA_NOT_EXISTS = new ErrorCode(1_000_002_001, "不能操作非当天录入得数据");
}

View File

@ -22,8 +22,8 @@ public class SfFactoryInfoPageReqVO extends PageParam {
@Schema(description = "工厂简称", example = "王五")
private String shortName;
@Schema(description = "工厂代号")
private String code;
@Schema(description = "工厂类型")
private String type;
@Schema(description = "工厂简介", example = "你猜")
private String description;

View File

@ -26,9 +26,9 @@ public class SfFactoryInfoRespVO {
@ExcelProperty("工厂简称")
private String shortName;
@Schema(description = "工厂代号")
@ExcelProperty("工厂代号")
private String code;
@Schema(description = "工厂类型")
@ExcelProperty("工厂类型")
private String type;
@Schema(description = "工厂简介", example = "你猜")
@ExcelProperty("工厂简介")

View File

@ -22,8 +22,8 @@ public class SfFactoryInfoSaveReqVO {
@NotEmpty(message = "工厂简称不能为空")
private String shortName;
@Schema(description = "工厂代号")
private String code;
@Schema(description = "工厂类型")
private String type;
@Schema(description = "工厂简介", example = "你猜")
private String description;

View File

@ -3,14 +3,14 @@ package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataDetailRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.service.factorydata.FactoryDataService;
import cn.iocoder.yudao.module.smartfactory.service.factorydata.FactoryDataSizeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -29,65 +29,80 @@ import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.E
@Tag(name = "管理后台 - 工厂出库入库数据")
@RestController
@RequestMapping("/factory/data")
@RequestMapping("/smartfactory/factory-data")
@Validated
public class FactoryDataController {
@Resource
private FactoryDataService dataService;
@PostMapping("/create")
@Operation(summary = "创建工厂出库入库数据")
@PreAuthorize("@ss.hasPermission('factory:data:create')")
public CommonResult<Long> createData(@Valid @RequestBody FactoryDataSaveReqVO createReqVO) {
return success(dataService.createData(createReqVO));
@Resource
private FactoryDataSizeService factoryDataSizeService;
@PostMapping("/create-size")
@Operation(summary = "创建工厂出库入库规格数据")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:create')")
public CommonResult<Long> createSizeData(@Valid @RequestBody FactoryDataSizeCreateReqVO createReqVO) {
return success(factoryDataSizeService.createData(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新工厂出库入库数据")
@PreAuthorize("@ss.hasPermission('factory:data:update')")
public CommonResult<Boolean> updateData(@Valid @RequestBody FactoryDataSaveReqVO updateReqVO) {
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:update')")
public CommonResult<Boolean> updateData(@Valid @RequestBody FactoryDataSizeCreateReqVO updateReqVO) {
dataService.updateData(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除工厂出库入库数据")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('factory:data:delete')")
public CommonResult<Boolean> deleteData(@RequestParam("id") Long id) {
dataService.deleteData(id);
@Parameter(name = "factoryId", description = "工厂编号", required = true, example = "1000078")
@Parameter(name = "date", description = "日期", required = true, example = "2024-05-17")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:delete')")
public CommonResult<Boolean> deleteData(@RequestParam("factoryId") Long factoryId, @RequestParam("date") String date) {
dataService.deleteData(factoryId, date);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得工厂出库入库数据")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('factory:data:query')")
public CommonResult<FactoryDataRespVO> getData(@RequestParam("id") Long id) {
FactoryDataDO data = dataService.getData(id);
return success(BeanUtils.toBean(data, FactoryDataRespVO.class));
@Parameter(name = "factoryId", description = "工厂编号", required = true, example = "1000078")
@Parameter(name = "date", description = "日期", required = true, example = "2024-05-17")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:query')")
public CommonResult<FactoryDataDetailRespVO> getData(@RequestParam("factoryId") Long factoryId, @RequestParam("date") String date) {
return success(dataService.getData(factoryId, date));
}
@GetMapping("/get-total")
@Operation(summary = "获得出入库数据总数 | 入库总数、出库总数、破损总数")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:query')")
public CommonResult<FactoryDataTotalVO> getDataTotal() {
return success(dataService.getDataTotal());
}
@GetMapping("/page")
@Operation(summary = "获得工厂出库入库数据分页")
@PreAuthorize("@ss.hasPermission('factory:data:query')")
public CommonResult<PageResult<FactoryDataRespVO>> getDataPage(@Valid FactoryDataPageReqVO pageReqVO) {
PageResult<FactoryDataDO> pageResult = dataService.getDataPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, FactoryDataRespVO.class));
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:query')")
public CommonResult<PageResult<FactoryDataDetailRespVO>> getDataPage(@Valid FactoryDataPageReqVO pageReqVO) {
PageResult<FactoryDataDetailRespVO> pageResult = dataService.getDataPage(pageReqVO);
return success(pageResult);
}
@GetMapping("/export-excel")
@Operation(summary = "导出工厂出库入库数据 Excel")
@PreAuthorize("@ss.hasPermission('factory:data:export')")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:export')")
@OperateLog(type = EXPORT)
public void exportDataExcel(@Valid FactoryDataPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<FactoryDataDO> list = dataService.getDataPage(pageReqVO).getList();
List<FactoryDataDetailRespVO> list = dataService.getDataPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "工厂出库入库数据.xls", "数据", FactoryDataRespVO.class,
BeanUtils.toBean(list, FactoryDataRespVO.class));
ExcelUtils.write(response, "工厂出库入库数据.xls", "数据", FactoryDataDetailRespVO.class,
list);
}
}

View File

@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
@Schema(description = "管理后台 - 工厂出库入库 规格详情数据 Response VO")
@Data
public class FactoryDataDetailRespVO {
@Schema(description = "工厂id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000078")
private Long factoryId;
@Schema(description = "工厂名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "新景象")
private String factoryName;
@Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-05-14")
private LocalDate date;
@Schema(description = "入库总箱数")
private Integer inTotalNum;
@Schema(description = "入库总平方数")
private BigDecimal squareNum;
@Schema(description = "出库总箱数")
private Integer outTotalNum;
@Schema(description = "破损总数")
private Integer damageNum;
@Schema(description = "是否可编辑 | 1可 ")
private Integer isEdit;
/**
* 规格明细
*/
private List<FactoryDataInfoRespVO> items;
}

View File

@ -0,0 +1,66 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
@Schema(description = "规格明细")
@Data
public class FactoryDataInfoRespVO {
@Schema(description = "打包线数据id")
private Long id;
@Schema(description = "工厂id")
private Long factoryId;
@Schema(description = "打包线名称")
private String packageName;
@Schema(description = "日期")
private LocalDate date;
@Schema(description = "规格id")
private Long sizeId;
@Schema(description = "规格名称")
private String sizeName;
@Schema(description = "规格片数")
private Integer sizePieces;
@Schema(description = "手动打包数")
private Integer num;
@Schema(description = "自动打包数")
private Integer autoNum;
@Schema(description = "入库数量")
private Integer inNum;
@Schema(description = "入库平方数")
private BigDecimal squareNum;
@Schema(description = "打包破损数")
private Integer damageNum;
@Schema(description = "入库破损数id")
private Long inDamageNumId;
@Schema(description = "入库破损数")
private Integer inDamageNum;
@Schema(description = "出库数id")
private Long outNumId;
@Schema(description = "出库数量")
private Integer outNum;
@Schema(description = "出库破损数id")
private Long outDamageNumId;
@Schema(description = "出库破损数")
private Integer outDamageNum;
}

View File

@ -1,15 +1,17 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo;
import lombok.*;
import java.time.LocalDate;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import java.math.BigDecimal;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 工厂出库入库数据分页 Request VO")
@ -18,36 +20,24 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@ToString(callSuper = true)
public class FactoryDataPageReqVO extends PageParam {
@Schema(description = "工厂id", example = "7606")
@Schema(description = "工厂id", example = "1000078")
private Long factoryId;
@Schema(description = "进出库类型 1出库 2", example = "1")
@Schema(description = "进出库类型 1出库 2", example = "1")
private Integer dataType;
@Schema(description = "日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@Schema(description = "日期", example = "2024-05-14")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate[] date;
@Schema(description = "搬运工姓名", example = "张三")
private String porterName;
@Schema(description = "叉车司机姓名", example = "芋艿")
private String dirverName;
@Schema(description = "仓库看管员姓名", example = "李四")
private String keeperName;
@Schema(description = "总数量")
@Schema(description = "总箱数")
private Integer totalNum;
@Schema(description = "金额")
private BigDecimal totalAmount;
@Schema(description = "总平方数")
private BigDecimal squareNum;
@Schema(description = "总车数")
private Integer totalTruck;
@Schema(description = "搬运总数")
private Integer moveNum;
@Schema(description = "破损片数")
private Integer damageNum;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)

View File

@ -1,67 +0,0 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDate;
import java.util.*;
import java.util.*;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 工厂出库入库数据 Response VO")
@Data
@ExcelIgnoreUnannotated
public class FactoryDataRespVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17120")
@ExcelProperty("主键id")
private Long id;
@Schema(description = "工厂id", requiredMode = Schema.RequiredMode.REQUIRED, example = "7606")
@ExcelProperty("工厂id")
private Long factoryId;
@Schema(description = "进出库类型 1出库 2进库", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("进出库类型 1出库 2进库")
private Integer dataType;
@Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("日期")
private LocalDate date;
@Schema(description = "搬运工姓名", example = "张三")
@ExcelProperty("搬运工姓名")
private String porterName;
@Schema(description = "叉车司机姓名", example = "芋艿")
@ExcelProperty("叉车司机姓名")
private String dirverName;
@Schema(description = "仓库看管员姓名", example = "李四")
@ExcelProperty("仓库看管员姓名")
private String keeperName;
@Schema(description = "总数量")
@ExcelProperty("总数量")
private Integer totalNum;
@Schema(description = "总金额")
@ExcelProperty("总金额")
private BigDecimal totalAmount;
@Schema(description = "总车数")
@ExcelProperty("总车数")
private Integer totalTruck;
@Schema(description = "搬运总数")
@ExcelProperty("搬运总数")
private Integer moveNum;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -1,52 +1,38 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import lombok.Data;
import java.time.LocalDate;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDate;
@Schema(description = "管理后台 - 工厂出库入库数据新增/修改 Request VO")
@Data
public class FactoryDataSaveReqVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17120")
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "工厂id", requiredMode = Schema.RequiredMode.REQUIRED, example = "7606")
@Schema(description = "工厂id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000078")
@NotNull(message = "工厂id不能为空")
private Long factoryId;
@Schema(description = "进出库类型 1出库 2", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "进出库类型 1出库 2库不能为空")
@Schema(description = "进出库类型 1出库 2", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "进出库类型 1出库 2库不能为空")
private Integer dataType;
@Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-05-14")
@NotNull(message = "日期不能为空")
private LocalDate date;
@Schema(description = "搬运工姓名", example = "张三")
private String porterName;
@Schema(description = "叉车司机姓名", example = "芋艿")
private String dirverName;
@Schema(description = "仓库看管员姓名", example = "李四")
private String keeperName;
@Schema(description = "总数量")
@Schema(description = "总箱数")
private Integer totalNum;
@Schema(description = "金额")
private BigDecimal totalAmount;
@Schema(description = "总平方数")
private BigDecimal squareNum;
@Schema(description = "总车数")
private Integer totalTruck;
@Schema(description = "搬运总数")
private Integer moveNum;
@Schema(description = "破损片数")
private Integer damageNum;
}

View File

@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 工厂出库入库数据 总览 Request VO")
@Data
public class FactoryDataTotalVO {
@Schema(description = "入库总数")
private Integer inTotal;
@Schema(description = "出库总数")
private Integer outTotal;
@Schema(description = "破损总数")
private Integer damageNum;
}

View File

@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataSaveReqVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
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;
@Schema(description = "管理后台 - 工厂规格数据新增 Request VO")
@Data
public class FactoryDataSizeCreateReqVO {
@Schema(description = "打包线数据信息")
private List<PackageDataSaveReqVO> packageData;
@Schema(description = "规格信息", requiredMode = Schema.RequiredMode.REQUIRED)
private List<FactoryDataSizeSaveReqVO> items;
@Schema(description = "工厂编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000078")
@NotNull(message = "工厂编号不能为空")
private Long factoryId;
@Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "日期不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate date;
}

View File

@ -0,0 +1,45 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 工厂规格数据 Response VO")
@Data
public class FactoryDataSizeRespVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "工厂编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000078")
private Long factoryId;
@Schema(description = "规格编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long sizeId;
@Schema(description = "规格名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "300*300")
private String sizeName;
@Schema(description = "规格片数", requiredMode = Schema.RequiredMode.REQUIRED, example = "4")
private Integer sizePieces;
@Schema(description = "数据类型 | 1:入库破损 2:出库数 3:出库破损", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer type;
@Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer num;
@Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED)
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate date;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime createTime;
}

View File

@ -0,0 +1,41 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Schema(description = "管理后台 - 工厂规格数据修改 Request VO")
@Data
public class FactoryDataSizeSaveReqVO {
@Schema(description = "规格编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "规格编号不能为空")
private Long sizeId;
@Schema(description = "规格名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "300*300")
@NotNull(message = "规格名称不能为空")
private String sizeName;
@Schema(description = "规格片数", requiredMode = Schema.RequiredMode.REQUIRED, example = "4")
@NotNull(message = "规格片数不能为空")
private Integer sizePieces;
@Schema(description = "入库破损数量Id")
private Long inDamageNumId;
@Schema(description = "入库破损数量")
private Integer inDamageNum;
@Schema(description = "出库数量Id")
private Long outNumId;
@Schema(description = "出库数量")
private Integer outNum;
@Schema(description = "出库破损数量Id")
private Long outDamageNumId;
@Schema(description = "出库破损数量")
private Integer outDamageNum;
}

View File

@ -9,6 +9,7 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factoryinfo.vo.FactoryInfoPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factoryinfo.vo.FactoryInfoRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factoryinfo.vo.FactoryInfoSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factoryinfo.vo.FactorySimpleRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO;
import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService;
import io.swagger.v3.oas.annotations.Operation;
@ -69,6 +70,15 @@ public class FactoryInfoController {
return success(factoryInfo);
}
@GetMapping("/simple-list")
@Operation(summary = "获得工厂列表 | 用于前端下拉框")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-info:query')")
public CommonResult<List<FactorySimpleRespVO>> getFactoryList() {
List<FactoryInfoDO> factoryInfo = factoryInfoService.getFactoryListByType();
return success(BeanUtils.toBean(factoryInfo, FactorySimpleRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得工厂信息分页")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-info:query')")

View File

@ -22,8 +22,8 @@ public class FactoryInfoPageReqVO extends PageParam {
@Schema(description = "工厂简称", example = "第一工厂")
private String shortName;
@Schema(description = "工厂代码", example = "10000")
private String code;
@Schema(description = "工厂类型", example = "1")
private String type;
@Schema(description = "状态", example = "1")
private Integer status;

View File

@ -28,9 +28,9 @@ public class FactoryInfoRespVO {
@ExcelProperty("工厂简称")
private String shortName;
@Schema(description = "工厂代码", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000")
@ExcelProperty("工厂代码")
private String code;
@Schema(description = "工厂类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("工厂类型")
private String type;
@Schema(description = "工厂简介", example = "这是一个工厂简介")
@ExcelProperty("工厂简介")
@ -61,4 +61,6 @@ public class FactoryInfoRespVO {
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "负责人编号", example = "126")
private Long leaderUserId;
}

View File

@ -22,9 +22,9 @@ public class FactoryInfoSaveReqVO {
@NotEmpty(message = "工厂简称不能为空")
private String shortName;
@Schema(description = "工厂代码", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000")
@NotEmpty(message = "工厂代码不能为空")
private String code;
@Schema(description = "工厂类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotEmpty(message = "工厂类型不能为空")
private String type;
@Schema(description = "工厂简介", example = "这是一个工厂简介")
private String description;
@ -39,7 +39,7 @@ public class FactoryInfoSaveReqVO {
@Schema(description = "区县id", requiredMode = Schema.RequiredMode.REQUIRED, example = "22761")
@NotNull(message = "区县id不能为空")
private Long districtId;
private Long adCode;
@Schema(description = "省名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "江西省")
@NotEmpty(message = "省名称不能为空")
@ -70,4 +70,6 @@ public class FactoryInfoSaveReqVO {
@NotNull(message = "状态不能为空")
private Integer status;
@Schema(description = "负责人编号", example = "126")
private Long leaderUserId;
}

View File

@ -0,0 +1,20 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.factoryinfo.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 工厂信息 Response VO")
@Data
@ExcelIgnoreUnannotated
public class FactorySimpleRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28794")
private Long id;
@Schema(description = "工厂名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "江西省南昌市第一工厂")
private String name;
@Schema(description = "工厂简称", requiredMode = Schema.RequiredMode.REQUIRED, example = "第一工厂")
private String shortName;
}

View File

@ -0,0 +1,95 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackagePageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackageRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackageSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packageInfo.PackageDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.size.SizeDO;
import cn.iocoder.yudao.module.smartfactory.service.packageInfo.PackageService;
import cn.iocoder.yudao.module.smartfactory.service.size.SizeService;
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.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 打包线")
@RestController
@RequestMapping("/smartfactory/package")
@Validated
public class PackageController {
@Resource
private PackageService packageService;
@Resource
private SizeService sizeService;
@PostMapping("/create")
@Operation(summary = "创建打包线")
@PreAuthorize("@ss.hasPermission('smartfactory:package:create')")
public CommonResult<Long> createPackage(@Valid @RequestBody PackageSaveReqVO createReqVO) {
return success(packageService.createPackage(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新打包线")
@PreAuthorize("@ss.hasPermission('smartfactory:package:update')")
public CommonResult<Boolean> updatePackage(@Valid @RequestBody PackageSaveReqVO updateReqVO) {
packageService.updatePackage(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除打包线")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('smartfactory:package:delete')")
public CommonResult<Boolean> deletePackage(@RequestParam("id") Long id) {
packageService.deletePackage(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得打包线")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('smartfactory:package:query')")
public CommonResult<PackageRespVO> getPackage(@RequestParam("id") Long id) {
PackageDO packageDO = packageService.getPackage(id);
//获得规格信息
SizeDO sizeDo = sizeService.getSize(packageDO.getSizeId());
PackageRespVO respVO = BeanUtils.toBean(packageDO, PackageRespVO.class);
respVO.setSizeName(sizeDo.getName());
return success(respVO);
}
@GetMapping("/get-list")
@Operation(summary = "获得指定工厂的打包线列表")
@Parameter(name = "factoryId", description = "工厂编号", required = true, example = "1000078")
@PreAuthorize("@ss.hasPermission('smartfactory:package:query')")
public CommonResult<List<PackageRespVO>> getPackageByFactoryId(@RequestParam("factoryId") Long factoryId) {
return success(packageService.getPackageByFactoryId(factoryId));
}
@GetMapping("/page")
@Operation(summary = "获得打包线分页")
@PreAuthorize("@ss.hasPermission('smartfactory:package:query')")
public CommonResult<PageResult<PackageRespVO>> getPackagePage(@Valid PackagePageReqVO pageReqVO) {
return success(packageService.getPackagePage(pageReqVO));
}
}

View File

@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 打包线分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PackagePageReqVO extends PageParam {
@Schema(description = "工厂id", example = "10000078")
private Long factoryId;
@Schema(description = "规格id", example = "100")
private Long sizeId;
@Schema(description = "规格片数", example = "3")
private Integer sizePieces;
@Schema(description = "打包线名称", example = "1线")
private String name;
@Schema(description = "设备名称", example = "芋艿")
private String deviceName;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,50 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo;
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.time.LocalDateTime;
@Schema(description = "管理后台 - 打包线 Response VO")
@Data
@ExcelIgnoreUnannotated
public class PackageRespVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
@ExcelProperty("主键id")
private Long id;
@Schema(description = "工厂id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000078")
@ExcelProperty("工厂id")
private Long factoryId;
@Schema(description = "工厂名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "新景象")
@ExcelProperty("工厂名称")
private String factoryName;
@Schema(description = "规格id", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
@ExcelProperty("规格id")
private Long sizeId;
@Schema(description = "规格名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "300*300")
@ExcelProperty("规格名称")
private String sizeName;
@Schema(description = "规格片数", requiredMode = Schema.RequiredMode.REQUIRED, example = "3")
@ExcelProperty("规格片数")
private Integer sizePieces;
@Schema(description = "打包线名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1线")
@ExcelProperty("打包线名称")
private String name;
@Schema(description = "设备名称", example = "芋艿")
@ExcelProperty("设备名称")
private String deviceName;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,35 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Schema(description = "管理后台 - 打包线新增/修改 Request VO")
@Data
public class PackageSaveReqVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
private Long id;
@Schema(description = "工厂id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000078")
@NotNull(message = "工厂id不能为空")
private Long factoryId;
@Schema(description = "规格id", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
@NotNull(message = "规格id不能为空")
private Long sizeId;
@Schema(description = "规格片数", requiredMode = Schema.RequiredMode.REQUIRED, example = "3")
@NotNull(message = "规格片数不能为空")
private Integer sizePieces;
@Schema(description = "打包线名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1线")
@NotEmpty(message = "打包线名称不能为空")
private String name;
@Schema(description = "设备名称", example = "芋艿")
private String deviceName;
}

View File

@ -6,9 +6,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackagePageDataRespVO;
import cn.iocoder.yudao.module.smartfactory.convert.packageData.PackageDataConvert;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packagedata.PackageDataDO;
import cn.iocoder.yudao.module.smartfactory.service.packagedata.PackageDataService;
import io.swagger.v3.oas.annotations.Operation;
@ -29,7 +31,7 @@ import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.E
@Tag(name = "管理后台 - 打包线数据")
@RestController
@RequestMapping("/factory/package-data")
@RequestMapping("/smartfactory/package-data")
@Validated
public class PackageDataController {
@ -38,56 +40,64 @@ public class PackageDataController {
@PostMapping("/create")
@Operation(summary = "创建打包线数据")
@PreAuthorize("@ss.hasPermission('factory:package-data:create')")
public CommonResult<Long> createPackageData(@Valid @RequestBody PackageDataSaveReqVO createReqVO) {
@PreAuthorize("@ss.hasPermission('smartfactory:package-data:create')")
public CommonResult<Long> createPackageData(@Valid @RequestBody PackageDataCreateReqVO createReqVO) {
return success(packageDataService.createPackageData(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新打包线数据")
@PreAuthorize("@ss.hasPermission('factory:package-data:update')")
public CommonResult<Boolean> updatePackageData(@Valid @RequestBody PackageDataSaveReqVO updateReqVO) {
@PreAuthorize("@ss.hasPermission('smartfactory:package-data:update')")
public CommonResult<Boolean> updatePackageData(@Valid @RequestBody PackageDataCreateReqVO updateReqVO) {
packageDataService.updatePackageData(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除打包线数据")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('factory:package-data:delete')")
public CommonResult<Boolean> deletePackageData(@RequestParam("id") Long id) {
packageDataService.deletePackageData(id);
@Parameter(name = "factoryId", description = "工厂编号", required = true, example = "1000078")
@Parameter(name = "date", description = "打包日期", required = true, example = "2024-05-14")
@PreAuthorize("@ss.hasPermission('smartfactory:package-data:delete')")
public CommonResult<Boolean> deletePackageData(@RequestParam("factoryId") Long factoryId, @RequestParam("date") String date) {
packageDataService.deletePackageData(factoryId, date);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得打包线数据")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('factory:package-data:query')")
public CommonResult<PackageDataRespVO> getPackageData(@RequestParam("id") Long id) {
PackageDataDO packageData = packageDataService.getPackageData(id);
@GetMapping("/get-list")
@Operation(summary = "获得指定 工厂和打包日期的 打包线数据列表")
@Parameter(name = "factoryId", description = "工厂编号", required = true, example = "1000078")
@Parameter(name = "date", description = "打包日期", required = true, example = "2024-05-14")
@PreAuthorize("@ss.hasPermission('smartfactory:package-data:query')")
public CommonResult<List<PackageDataRespVO>> getListByFactoryIdAndDate(@RequestParam("factoryId") Long factoryId, @RequestParam("date") String date) {
List<PackageDataDO> packageData = packageDataService.getListByFactoryIdAndDate(factoryId, date);
return success(BeanUtils.toBean(packageData, PackageDataRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得打包线数据分页")
@PreAuthorize("@ss.hasPermission('factory:package-data:query')")
public CommonResult<PageResult<PackageDataRespVO>> getPackageDataPage(@Valid PackageDataPageReqVO pageReqVO) {
PageResult<PackageDataDO> pageResult = packageDataService.getPackageDataPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, PackageDataRespVO.class));
@PreAuthorize("@ss.hasPermission('smartfactory:package-data:query')")
public CommonResult<PageResult<PackagePageDataRespVO>> getPackageDataPage(@Valid PackageDataPageReqVO pageReqVO) {
PageResult<PackageDataRespVO> pageResult = packageDataService.getPackageDataPage(pageReqVO);
List<PackagePageDataRespVO> dataRespVOS = PackageDataConvert.INSTANCE.convertList1(pageResult.getList());
return success(new PageResult<>(dataRespVOS, pageResult.getTotal()));
}
@GetMapping("/export-excel")
@Operation(summary = "导出打包线数据 Excel")
@PreAuthorize("@ss.hasPermission('factory:package-data:export')")
@PreAuthorize("@ss.hasPermission('smartfactory:package-data:export')")
@OperateLog(type = EXPORT)
public void exportPackageDataExcel(@Valid PackageDataPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<PackageDataDO> list = packageDataService.getPackageDataPage(pageReqVO).getList();
List<PackageDataRespVO> list = packageDataService.getPackageDataPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "打包线数据.xls", "数据", PackageDataRespVO.class,
BeanUtils.toBean(list, PackageDataRespVO.class));
ExcelUtils.write(response, "打包线数据.xls", "数据", PackageDataRespVO.class, list);
}
}

View File

@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
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;
@Schema(description = "管理后台 - 打包线数据新增 Request VO")
@Data
public class PackageDataCreateReqVO {
@Schema(description = "工厂编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "工厂编号不能为空")
private Long factoryId;
@Schema(description = "打包线信息", requiredMode = Schema.RequiredMode.REQUIRED)
private List<PackageDataSaveReqVO> packageData;
@Schema(description = "打包日期", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "打包日期不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate packageDate;
}

View File

@ -1,12 +1,16 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 打包线数据分页 Request VO")
@ -15,24 +19,34 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@ToString(callSuper = true)
public class PackageDataPageReqVO extends PageParam {
@Schema(description = "工厂id", example = "29256")
private Long factoryId;
@Schema(description = "规格id", example = "5911")
private Long sizeId;
@Schema(description = "规格名称", example = "王五")
private String sizeName;
@Schema(description = "打包线id", example = "31120")
@Schema(description = "打包线id", example = "12")
private Long packageId;
@Schema(description = "打包线名称", example = "李四")
@Schema(description = "打包线名称", example = "1线")
private String packageName;
@Schema(description = "打包数量")
@Schema(description = "工厂id", example = "1000078")
private Long factoryId;
@Schema(description = "规格名称", example = "300*300")
private String sizeName;
@Schema(description = "规格片数", example = "1")
private Integer sizePieces;
@Schema(description = "设备名称", example = "三星")
private String deviceName;
@Schema(description = "打包日期", example = "2024-05-14")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate packageDate;
@Schema(description = "手动打包数量")
private Integer num;
@Schema(description = "自动打包数量")
private Integer autoNum;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;

View File

@ -1,48 +1,78 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
@Schema(description = "管理后台 - 打包线数据 Response VO")
@Data
@ExcelIgnoreUnannotated
public class PackageDataRespVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "18914")
@ExcelProperty("主键id")
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("编号")
private Long id;
@Schema(description = "工厂id", requiredMode = Schema.RequiredMode.REQUIRED, example = "29256")
@ExcelProperty("工厂id")
@Schema(description = "工厂id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000078")
@ExcelProperty("工厂编号")
private Long factoryId;
@Schema(description = "规格id", requiredMode = Schema.RequiredMode.REQUIRED, example = "5911")
@ExcelProperty("规格id")
private Long sizeId;
@Schema(description = "工厂名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "新景象")
@ExcelProperty("工厂名称")
private String factoryName;
@Schema(description = "规格名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
@ExcelProperty("规格名称")
private String sizeName;
@Schema(description = "打包线id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31120")
@ExcelProperty("打包线id")
@Schema(description = "打包线id", requiredMode = Schema.RequiredMode.REQUIRED, example = "12")
private Long packageId;
@Schema(description = "打包线名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
@Schema(description = "打包线名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1线")
@ExcelProperty("打包线名称")
private String packageName;
@Schema(description = "打包数量", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("打包数量")
@Schema(description = "规格编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long sizeId;
@Schema(description = "规格名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "300*300")
@ExcelProperty("规格名称")
private String sizeName;
@Schema(description = "规格片数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("规格片数")
private Integer sizePieces;
@Schema(description = "设备名称", example = "三星")
@ExcelProperty("设备名称")
private String deviceName;
@Schema(description = "打包日期", requiredMode = Schema.RequiredMode.REQUIRED)
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
@ExcelProperty("打包日期")
private LocalDate packageDate;
@Schema(description = "手动打包数量", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("手动打包数量")
private Integer num;
@Schema(description = "自动打包数量", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("自动打包数量")
private Integer autoNum;
@Schema(description = "平方数", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("平方数")
private BigDecimal squareNum;
@Schema(description = "破损数量", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("破损数量")
private Integer damageNum;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -1,40 +1,59 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
import lombok.Data;
@Schema(description = "管理后台 - 打包线数据新增/修改 Request VO")
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
@Schema(description = "管理后台 - 打包线数据修改 Request VO")
@Data
public class PackageDataSaveReqVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "18914")
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "工厂id", requiredMode = Schema.RequiredMode.REQUIRED, example = "29256")
@NotNull(message = "工厂id不能为空")
private Long factoryId;
@Schema(description = "规格id", requiredMode = Schema.RequiredMode.REQUIRED, example = "5911")
@NotNull(message = "规格id不能为空")
private Long sizeId;
@Schema(description = "规格名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
@NotEmpty(message = "规格名称不能为空")
private String sizeName;
@Schema(description = "打包线id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31120")
@Schema(description = "打包线id", requiredMode = Schema.RequiredMode.REQUIRED, example = "12")
@NotNull(message = "打包线id不能为空")
private Long packageId;
@Schema(description = "打包线名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
@Schema(description = "打包线名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1线")
@NotEmpty(message = "打包线名称不能为空")
private String packageName;
@Schema(description = "打包数量", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "打包数量不能为空")
@Schema(description = "工厂id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000078")
@NotNull(message = "工厂id不能为空")
private Long factoryId;
@Schema(description = "规格编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotEmpty(message = "规格编号不能为空")
private Long sizeId;
@Schema(description = "规格名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "300*300")
@NotEmpty(message = "规格名称不能为空")
private String sizeName;
@Schema(description = "规格片数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "规格片数不能为空")
private Integer sizePieces;
@Schema(description = "设备名称", example = "三星")
private String deviceName;
@Schema(description = "打包日期", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDate packageDate;
@Schema(description = "手动打包数量", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "手动打包数量不能为空")
private Integer num;
@Schema(description = "自动打包数量", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "打包数量不能为空")
private Integer autoNum;
@Schema(description = "破损数量", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "破损数量不能为空")
private Integer damageNum;
}

View File

@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.List;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
@Schema(description = "管理后台 - 打包线分页数据 Response VO")
@Data
public class PackagePageDataRespVO {
@Schema(description = "工厂id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000078")
private Long factoryId;
@Schema(description = "工厂名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "新景象")
private String factoryName;
@Schema(description = "打包日期", requiredMode = Schema.RequiredMode.REQUIRED)
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private String packageDate;
@Schema(description = "打包线数据集", requiredMode = Schema.RequiredMode.REQUIRED)
private List<PackageDataRespVO> packageDataS;
}

View File

@ -0,0 +1,82 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.size;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.smartfactory.controller.admin.size.vo.SizePageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.size.vo.SizeRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.size.vo.SizeSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.size.SizeDO;
import cn.iocoder.yudao.module.smartfactory.service.size.SizeService;
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.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 规格")
@RestController
@RequestMapping("/smartfactory/size")
@Validated
public class SizeController {
@Resource
private SizeService sizeService;
@PostMapping("/create")
@Operation(summary = "创建规格")
@PreAuthorize("@ss.hasPermission('smartfactory:size:create')")
public CommonResult<Long> createSize(@Valid @RequestBody SizeSaveReqVO createReqVO) {
return success(sizeService.createSize(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新规格")
@PreAuthorize("@ss.hasPermission('smartfactory:size:update')")
public CommonResult<Boolean> updateSize(@Valid @RequestBody SizeSaveReqVO updateReqVO) {
sizeService.updateSize(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除规格")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('smartfactory:size:delete')")
public CommonResult<Boolean> deleteSize(@RequestParam("id") Long id) {
sizeService.deleteSize(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得规格")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('smartfactory:size:query')")
public CommonResult<SizeRespVO> getSize(@RequestParam("id") Long id) {
SizeDO size = sizeService.getSize(id);
return success(BeanUtils.toBean(size, SizeRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得规格分页")
@PreAuthorize("@ss.hasPermission('smartfactory:size:query')")
public CommonResult<PageResult<SizeRespVO>> getSizePage(@Valid SizePageReqVO pageReqVO) {
PageResult<SizeDO> pageResult = sizeService.getSizePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, SizeRespVO.class));
}
@GetMapping("/simple-list")
@Operation(summary = "获得规格列表 | 用于前端下拉框")
@PreAuthorize("@ss.hasPermission('smartfactory:size:query')")
public CommonResult<List<SizeRespVO>> getSize() {
List<SizeDO> sizes = sizeService.getListSize();
return success(BeanUtils.toBean(sizes, SizeRespVO.class));
}
}

View File

@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.size.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 规格分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SizePageReqVO extends PageParam {
@Schema(description = "规格名称", example = "300*300")
private String name;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.size.vo;
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.time.LocalDateTime;
@Schema(description = "管理后台 - 规格 Response VO")
@Data
@ExcelIgnoreUnannotated
public class SizeRespVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("主键id")
private Long id;
@Schema(description = "规格名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "300*300")
@ExcelProperty("规格名称")
private String name;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,19 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.size.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
@Schema(description = "管理后台 - 规格新增/修改 Request VO")
@Data
public class SizeSaveReqVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "规格名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "300*300")
@NotEmpty(message = "规格名称不能为空")
private String name;
}

View File

@ -0,0 +1,75 @@
package cn.iocoder.yudao.module.smartfactory.convert.packageData;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackagePageDataRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packagedata.PackageDataDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Mapper
public interface PackageDataConvert {
PackageDataConvert INSTANCE = Mappers.getMapper(PackageDataConvert.class);
default List<PackageDataDO> convertList(PackageDataCreateReqVO createReqVO) {
List<PackageDataDO> packageDataDOS = new ArrayList<>();
for (PackageDataSaveReqVO respVO : createReqVO.getPackageData()) {
PackageDataDO dataDO = BeanUtils.toBean(respVO, PackageDataDO.class);
String[] size = dataDO.getSizeName().split("\\*");
//计算平方数
BigDecimal squareNum = BigDecimal.valueOf((double) Integer.parseInt(size[0]) / 1000)
.multiply(BigDecimal.valueOf((double) Integer.parseInt(size[1]) / 1000))
.multiply(BigDecimal.valueOf(dataDO.getSizePieces()))
.multiply(BigDecimal.valueOf(Integer.sum(dataDO.getNum(), dataDO.getAutoNum())));
//设置平方数
dataDO.setSquareNum(squareNum);
dataDO.setPackageDate(createReqVO.getPackageDate());
packageDataDOS.add(dataDO);
}
return packageDataDOS;
}
default List<PackagePageDataRespVO> convertList1(List<PackageDataRespVO> dataRespVOS) {
List<PackagePageDataRespVO> pageDataRespVOS = new ArrayList<>();
// 工厂id和日期 进行分组
Map<Long, Map<LocalDate, List<PackageDataRespVO>>> groupedByFactoryIdAndDate = dataRespVOS.stream()
.collect(Collectors.groupingBy(PackageDataRespVO::getFactoryId,
Collectors.groupingBy(PackageDataRespVO::getPackageDate)));
groupedByFactoryIdAndDate.forEach((factoryId, dateMap) -> {
dateMap.entrySet().stream().sorted(Map.Entry.<LocalDate, List<PackageDataRespVO>>comparingByKey().reversed())
.forEach((data) -> {
PackagePageDataRespVO dataRespVO = new PackagePageDataRespVO();
dataRespVO.setFactoryId(factoryId);
dataRespVO.setFactoryName(data.getValue().get(0).getFactoryName());
dataRespVO.setPackageDate(data.getKey().toString());
dataRespVO.setPackageDataS(BeanUtils.toBean(data.getValue(), PackageDataRespVO.class));
pageDataRespVOS.add(dataRespVO);
});
});
return pageDataRespVOS;
}
}

View File

@ -16,7 +16,6 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
* @author 艾楷
*/
@TableName("sf_factory_info")
@KeySequence("sf_factory_info_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@ -39,9 +38,9 @@ public class SfFactoryInfoDO extends BaseDO {
*/
private String shortName;
/**
* 工厂代号
* 工厂类型
*/
private String code;
private String type;
/**
* 工厂简介
*/

View File

@ -1,14 +1,12 @@
package cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.time.LocalDate;
import java.util.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import java.time.LocalDate;
/**
* 工厂出库入库数据 DO
@ -16,7 +14,6 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
* @author 艾楷
*/
@TableName("sf_factory_data")
@KeySequence("sf_factory_data_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@ -35,7 +32,7 @@ public class FactoryDataDO extends BaseDO {
*/
private Long factoryId;
/**
* 进出库类型 1出库 2
* 进出库类型 1出库 2
*/
private Integer dataType;
/**
@ -43,32 +40,15 @@ public class FactoryDataDO extends BaseDO {
*/
private LocalDate date;
/**
* 搬运工姓名
*/
private String porterName;
/**
* 叉车司机姓名
*/
private String dirverName;
/**
* 仓库看管员姓名
*/
private String keeperName;
/**
* 总数量
* 总箱数
*/
private Integer totalNum;
/**
* 金额
* 总平方数
*/
private BigDecimal totalAmount;
private BigDecimal squareNum;
/**
* 总车
* 破损片数
*/
private Integer totalTruck;
/**
* 搬运总数
*/
private Integer moveNum;
private Integer damageNum;
}

View File

@ -0,0 +1,65 @@
package cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.time.LocalDate;
/**
* 工厂出库入库规格数据 DO
*
* @author 符溶馨
*/
@TableName("sf_factory_data_size")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class FactoryDataSizeDO extends BaseDO {
/**
* 主键id
*/
@TableId
private Long id;
/**
* 工厂ID
*/
private Long factoryId;
/**
* 规格ID
*/
private Long sizeId;
/**
* 规格名称
*/
private String sizeName;
/**
* 规格片数
*/
private Integer sizePieces;
/**
* 数据类型
* 1:入库破损 2:出库数 3:出库破损
*/
private Integer type;
/**
* 数量
*/
private Integer num;
/**
* 日期
*/
private LocalDate date;
}

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@ -15,7 +15,6 @@ import java.math.BigDecimal;
* @author 姚君
*/
@TableName("sf_factory_info")
@KeySequence("sf_factory_info_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@ -47,9 +46,9 @@ public class FactoryInfoDO extends BaseDO {
*/
private String shortName;
/**
* 工厂代码
* 工厂类型
*/
private String code;
private String type;
/**
* 工厂简介
*/
@ -104,15 +103,8 @@ public class FactoryInfoDO extends BaseDO {
/**
* 状态
* <p>
* 枚举 {@link TODO common_status 对应的}
* 枚举 {@link CommonStatusEnum 枚举}
*/
private Integer status;
public void setId(Long id) {
//由于 直接在数据库中改了 id 所以这里要加一层判断
if (id == 1L){
id = 10000078L;
}
this.id = id;
}
}

View File

@ -0,0 +1,51 @@
package cn.iocoder.yudao.module.smartfactory.dal.dataobject.packageInfo;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 打包线 DO
*
* @author 符溶馨
*/
@TableName("sf_package")
@KeySequence("sf_package_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PackageDO extends BaseDO {
/**
* 主键id
*/
@TableId
private Long id;
/**
* 工厂id
*/
private Long factoryId;
/**
* 规格id
*/
private Long sizeId;
/**
* 规格片数
*/
private Integer sizePieces;
/**
* 打包线名称
*/
private String name;
/**
* 设备名称
*/
private String deviceName;
}

View File

@ -1,11 +1,12 @@
package cn.iocoder.yudao.module.smartfactory.dal.dataobject.packagedata;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 打包线数据 DO
@ -13,7 +14,6 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
* @author 艾楷
*/
@TableName("sf_package_data")
@KeySequence("sf_package_data_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@ -27,18 +27,6 @@ public class PackageDataDO extends BaseDO {
*/
@TableId
private Long id;
/**
* 工厂id
*/
private Long factoryId;
/**
* 规格id
*/
private Long sizeId;
/**
* 规格名称
*/
private String sizeName;
/**
* 打包线id
*/
@ -48,8 +36,43 @@ public class PackageDataDO extends BaseDO {
*/
private String packageName;
/**
* 打包数量
* 工厂id
*/
private Long factoryId;
/**
* 规格编号
*/
private Long sizeId;
/**
* 规格名称
*/
private String sizeName;
/**
* 规格片数
*/
private Integer sizePieces;
/**
* 设备名称
*/
private String deviceName;
/**
* 打包日期
*/
private LocalDate packageDate;
/**
* 手动打包数量
*/
private Integer num;
/**
* 自动打包数量
*/
private Integer autoNum;
/**
* 平方数
*/
private BigDecimal squareNum;
/**
* 破损数量
*/
private Integer damageNum;
}

View File

@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.smartfactory.dal.dataobject.size;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 规格 DO
*
* @author 符溶馨
*/
@TableName("sf_size")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SizeDO extends BaseDO {
/**
* 主键id
*/
@TableId
private Long id;
/**
* 规格名称
*/
private String name;
}

View File

@ -19,7 +19,7 @@ public interface SfFactoryInfoMapper extends BaseMapperX<SfFactoryInfoDO> {
return selectPage(reqVO, new LambdaQueryWrapperX<SfFactoryInfoDO>()
.likeIfPresent(SfFactoryInfoDO::getFullName, reqVO.getFullName())
.likeIfPresent(SfFactoryInfoDO::getShortName, reqVO.getShortName())
.eqIfPresent(SfFactoryInfoDO::getCode, reqVO.getCode())
.eqIfPresent(SfFactoryInfoDO::getType, reqVO.getType())
.eqIfPresent(SfFactoryInfoDO::getDescription, reqVO.getDescription())
.eqIfPresent(SfFactoryInfoDO::getProvinceId, reqVO.getProvinceId())
.likeIfPresent(SfFactoryInfoDO::getProvinceName, reqVO.getProvinceName())

View File

@ -1,34 +1,42 @@
package cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataDetailRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.util.List;
/**
* 工厂出库入库数据 Mapper
*
* @author 艾楷
* @author 符溶馨
*/
@Mapper
public interface FactoryDataMapper extends BaseMapperX<FactoryDataDO> {
default PageResult<FactoryDataDO> selectPage(FactoryDataPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<FactoryDataDO>()
.eqIfPresent(FactoryDataDO::getFactoryId, reqVO.getFactoryId())
.eqIfPresent(FactoryDataDO::getDataType, reqVO.getDataType())
.betweenIfPresent(FactoryDataDO::getDate, reqVO.getDate())
.likeIfPresent(FactoryDataDO::getPorterName, reqVO.getPorterName())
.likeIfPresent(FactoryDataDO::getDirverName, reqVO.getDirverName())
.likeIfPresent(FactoryDataDO::getKeeperName, reqVO.getKeeperName())
.eqIfPresent(FactoryDataDO::getTotalNum, reqVO.getTotalNum())
.eqIfPresent(FactoryDataDO::getTotalAmount, reqVO.getTotalAmount())
.eqIfPresent(FactoryDataDO::getTotalTruck, reqVO.getTotalTruck())
.eqIfPresent(FactoryDataDO::getMoveNum, reqVO.getMoveNum())
.betweenIfPresent(FactoryDataDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(FactoryDataDO::getId));
IPage<FactoryDataDetailRespVO> selectDetailPage(@Param("page") IPage<FactoryDataDetailRespVO> mpPage, @Param("reqVO") FactoryDataPageReqVO pageReqVO);
default FactoryDataDO selectListByType(Long factoryId, LocalDate date, Integer type) {
return selectOne(new LambdaQueryWrapperX<FactoryDataDO>()
.eq(FactoryDataDO::getFactoryId, factoryId)
.eq(FactoryDataDO::getDate, date)
.eq(FactoryDataDO::getDataType, type));
}
default List<FactoryDataDO> selectListByFactoryAndDate(Long factoryId, String date) {
return selectList(new LambdaQueryWrapperX<FactoryDataDO>()
.eq(FactoryDataDO::getFactoryId, factoryId)
.eq(FactoryDataDO::getDate, date));
}
FactoryDataTotalVO selectDataSum();
}

View File

@ -0,0 +1,49 @@
package cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataSizeDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
/**
* 工厂出库入库规格数据 Mapper
*
* @author 符溶馨
*/
@Mapper
public interface FactoryDataSizeMapper extends BaseMapperX<FactoryDataSizeDO> {
List<FactoryDataInfoRespVO> selectDetailList(@Param("factoryId") Long factoryId, @Param("date") LocalDate[] date);
default void deleteByFactoryId(Long factoryId, String date) {
delete(new LambdaQueryWrapperX<FactoryDataSizeDO>()
.eq(FactoryDataSizeDO::getFactoryId, factoryId)
.eq(FactoryDataSizeDO::getDate, date));
}
default Long selectCountByFactoryId(Long factoryId, String date, LocalDateTime[] dateTimes) {
return selectCount(new LambdaQueryWrapperX<FactoryDataSizeDO>()
.eq(FactoryDataSizeDO::getFactoryId, factoryId)
.eq(FactoryDataSizeDO::getDate, date)
.betweenIfPresent(FactoryDataSizeDO::getCreateTime, dateTimes));
}
default Long selectCountByType(Long factoryId, LocalDate date, Collection<Integer> types) {
return selectCount(new LambdaQueryWrapperX<FactoryDataSizeDO>()
.eq(FactoryDataSizeDO::getFactoryId, factoryId)
.eq(FactoryDataSizeDO::getDate, date)
.in(FactoryDataSizeDO::getType, types));
}
List<FactoryDataInfoRespVO> selectSUMByDateTimes(@Param("dateTime") LocalDateTime[] dateTimes);
}

View File

@ -23,10 +23,10 @@ public interface FactoryInfoMapper extends BaseMapperX<FactoryInfoDO> {
return selectPage(reqVO, new LambdaQueryWrapperX<FactoryInfoDO>()
.likeIfPresent(FactoryInfoDO::getName, reqVO.getName())
.likeIfPresent(FactoryInfoDO::getShortName, reqVO.getShortName())
.likeIfPresent(FactoryInfoDO::getCode, reqVO.getCode())
.likeIfPresent(FactoryInfoDO::getType, reqVO.getType())
.eqIfPresent(FactoryInfoDO::getStatus, reqVO.getStatus())
.betweenIfPresent(FactoryInfoDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(FactoryInfoDO::getSort));
.orderByAsc(FactoryInfoDO::getSort));
}
/**

View File

@ -0,0 +1,20 @@
package cn.iocoder.yudao.module.smartfactory.dal.mysql.packageInfo;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackagePageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackageRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packageInfo.PackageDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 打包线 Mapper
*
* @author 符溶馨
*/
@Mapper
public interface PackageMapper extends BaseMapperX<PackageDO> {
IPage<PackageRespVO> selectPackagePage(@Param("page") IPage<PackageRespVO> mpPage, @Param("reqVO") PackagePageReqVO pageReqVO);
}

View File

@ -1,11 +1,18 @@
package cn.iocoder.yudao.module.smartfactory.dal.mysql.packagedata;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packagedata.PackageDataDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 打包线数据 Mapper
@ -15,16 +22,29 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface PackageDataMapper extends BaseMapperX<PackageDataDO> {
default PageResult<PackageDataDO> selectPage(PackageDataPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<PackageDataDO>()
.eqIfPresent(PackageDataDO::getFactoryId, reqVO.getFactoryId())
.eqIfPresent(PackageDataDO::getSizeId, reqVO.getSizeId())
.likeIfPresent(PackageDataDO::getSizeName, reqVO.getSizeName())
.eqIfPresent(PackageDataDO::getPackageId, reqVO.getPackageId())
.likeIfPresent(PackageDataDO::getPackageName, reqVO.getPackageName())
.eqIfPresent(PackageDataDO::getNum, reqVO.getNum())
.betweenIfPresent(PackageDataDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PackageDataDO::getId));
IPage<PackageDataRespVO> selectPackagePage(@Param("page") IPage<PackageDataRespVO> mpPage, @Param("reqVO") PackageDataPageReqVO pageReqVO);
List<FactoryDataDO> selectDataListByDateTime(@Param("dateTime") LocalDateTime[] dateTimes);
default List<PackageDataDO> selectListByFactoryIdAndDate(Long factoryId, String date) {
return selectList(new LambdaQueryWrapperX<PackageDataDO>()
.eq(PackageDataDO::getFactoryId, factoryId)
.eq(PackageDataDO::getPackageDate, date));
}
default Long selectCountByDateTime(Long factoryId, LocalDate date, LocalDateTime[] dateTimes) {
return selectCount(new LambdaQueryWrapperX<PackageDataDO>()
.eq(PackageDataDO::getFactoryId, factoryId)
.eq(PackageDataDO::getPackageDate, date)
.betweenIfPresent(PackageDataDO::getCreateTime, dateTimes));
}
default void delectData(Long factoryId, String date) {
delete(new LambdaQueryWrapperX<PackageDataDO>()
.eq(PackageDataDO::getFactoryId, factoryId)
.eq(PackageDataDO::getPackageDate, date));
}
}

View File

@ -0,0 +1,25 @@
package cn.iocoder.yudao.module.smartfactory.dal.mysql.size;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.smartfactory.controller.admin.size.vo.SizePageReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.size.SizeDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 规格 Mapper
*
* @author 符溶馨
*/
@Mapper
public interface SizeMapper extends BaseMapperX<SizeDO> {
default PageResult<SizeDO> selectPage(SizePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<SizeDO>()
.likeIfPresent(SizeDO::getName, reqVO.getName())
.betweenIfPresent(SizeDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(SizeDO::getId));
}
}

View File

@ -0,0 +1,116 @@
package cn.iocoder.yudao.module.smartfactory.framework.job.factoryData;
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO;
import cn.iocoder.yudao.module.smartfactory.service.factorydata.FactoryDataService;
import cn.iocoder.yudao.module.smartfactory.service.factorydata.FactoryDataSizeService;
import cn.iocoder.yudao.module.smartfactory.service.packagedata.PackageDataService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
/**
* 工厂 出入库数据统计 定时任务
*/
@Component
@Slf4j
public class FactoryDataJob {
@Resource
private FactoryDataSizeService dataSizeService;
@Resource
private PackageDataService packageDataService;
@Resource
private FactoryDataService factoryDataService;
@XxlJob("factoryDataJob")
@TenantJob // --- 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意
public ReturnT<String> execute() throws Exception {
LocalDateTime[] dateTimes = {LocalDateTime.now().minusDays(1).with(LocalTime.MIN), LocalDateTime.now().minusDays(1).with(LocalTime.MAX)};
//查询 当前统计时间前一天的的打包线数据
List<FactoryDataDO> factoryDataDOS = packageDataService.getDataListByDateTime(dateTimes);
//查询 当前统计时间前一天的的出入库规格数据
List<FactoryDataInfoRespVO> infoRespVOS = dataSizeService.getSUMByDateTimes(dateTimes);
List<FactoryDataDO> outFactoryDataDOs = new ArrayList<>();
//处理入库数据
factoryDataDOS.forEach(data -> {
//设置 出入库类型为 入库
data.setDataType(2);
data.setCreator(Objects.requireNonNull(getLoginUserId()).toString());
//取出 同一个工厂和日期的数据
List<FactoryDataInfoRespVO> infos = infoRespVOS.stream()
.filter(info -> info.getFactoryId().equals(data.getFactoryId()) && info.getDate().equals(data.getDate()))
.collect(Collectors.toList());
if (!infos.isEmpty()) {
if (infos.get(0).getInDamageNum() != null) {
// 设置 入库破损数
data.setDamageNum(data.getDamageNum() + infos.get(0).getInDamageNum());
}
// 如果存在出库数时
if (infos.get(0).getOutNum() != null) {
FactoryDataDO dataDO = new FactoryDataDO();
dataDO.setFactoryId(data.getFactoryId());
dataDO.setDate(data.getDate());
dataDO.setDataType(1);
dataDO.setTotalNum(infos.get(0).getOutNum());
dataDO.setDamageNum(infos.get(0).getOutDamageNum());
dataDO.setCreator(Objects.requireNonNull(getLoginUserId()).toString());
outFactoryDataDOs.add(dataDO);
}
}
// 移除已处理过的 入库数据
infoRespVOS.removeAll(infos);
});
// 插入 出库数据
for (FactoryDataInfoRespVO infoRespVO : infoRespVOS) {
FactoryDataDO dataDO = new FactoryDataDO();
dataDO.setFactoryId(infoRespVO.getFactoryId());
dataDO.setDate(infoRespVO.getDate());
dataDO.setDataType(1);
dataDO.setTotalNum(infoRespVO.getOutNum());
dataDO.setDamageNum(infoRespVO.getOutDamageNum());
dataDO.setCreator(Objects.requireNonNull(getLoginUserId()).toString());
outFactoryDataDOs.add(dataDO);
}
// 插入
factoryDataDOS.addAll(outFactoryDataDOs);
factoryDataService.createData(factoryDataDOS);
// 返回执行成功
return ReturnT.SUCCESS;
}
}

View File

@ -0,0 +1 @@
package cn.iocoder.yudao.module.smartfactory.framework.job;

View File

@ -1,11 +1,14 @@
package cn.iocoder.yudao.module.smartfactory.service.factorydata;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataDetailRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO;
import javax.validation.Valid;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
@ -19,32 +22,34 @@ public interface FactoryDataService {
/**
* 创建工厂出库入库数据
*
* @param createReqVO 创建信息
* @param factoryDataDOS 创建信息
* @return 编号
*/
Long createData(@Valid FactoryDataSaveReqVO createReqVO);
Long createData(List<FactoryDataDO> factoryDataDOS);
/**
* 更新工厂出库入库数据
*
* @param updateReqVO 更新信息
*/
void updateData(@Valid FactoryDataSaveReqVO updateReqVO);
void updateData(@Valid FactoryDataSizeCreateReqVO updateReqVO);
/**
* 删除工厂出库入库数据
*
* @param id 编号
* @param factoryId 工厂编号
* @param date 日期
*/
void deleteData(Long id);
void deleteData(Long factoryId, String date);
/**
* 获得工厂出库入库数据
*
* @param id 编号
* @param factoryId 工厂编号
* @param date 日期
* @return 工厂出库入库数据
*/
FactoryDataDO getData(Long id);
FactoryDataDetailRespVO getData(Long factoryId, String date);
/**
* 获得工厂出库入库数据分页
@ -52,7 +57,13 @@ public interface FactoryDataService {
* @param pageReqVO 分页查询
* @return 工厂出库入库数据分页
*/
PageResult<FactoryDataDO> getDataPage(FactoryDataPageReqVO pageReqVO);
PageResult<FactoryDataDetailRespVO> getDataPage(FactoryDataPageReqVO pageReqVO);
/**
* 获得工厂总数 总览
* @return
*/
FactoryDataTotalVO getDataTotal();
/**
* 获取当天的所有数据
@ -70,4 +81,14 @@ public interface FactoryDataService {
* @return
*/
List<FactoryDataDO> getByTimeAndFactoryId(Long factoryId, Date beginDay, Date endDay);
/**
* 根据日期和工厂过滤
*
* @param factoryId 工厂编号
* @param date 日期
* @param type 出入库类型
* @return 出入库数据
*/
FactoryDataDO getListByType(Long factoryId, LocalDate date, Integer type);
}

View File

@ -2,18 +2,37 @@ package cn.iocoder.yudao.module.smartfactory.service.factorydata;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataDetailRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.convert.packageData.PackageDataConvert;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packagedata.PackageDataDO;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata.FactoryDataMapper;
import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
/**
@ -28,36 +47,185 @@ public class FactoryDataServiceImpl implements FactoryDataService {
@Resource
private FactoryDataMapper dataMapper;
@Resource
@Lazy // 循环依赖避免报错
private FactoryDataSizeService dataSizeService;
@Resource
private FactoryInfoService factoryInfoService;
@Override
public Long createData(FactoryDataSaveReqVO createReqVO) {
// 插入
FactoryDataDO data = BeanUtils.toBean(createReqVO, FactoryDataDO.class);
dataMapper.insert(data);
public Long createData(List<FactoryDataDO> factoryDataDOS) {
dataMapper.insertBatch(factoryDataDOS);
// 返回
return data.getId();
return (long) factoryDataDOS.size();
}
@Override
public void updateData(FactoryDataSaveReqVO updateReqVO) {
// 更新
FactoryDataDO updateObj = BeanUtils.toBean(updateReqVO, FactoryDataDO.class);
dataMapper.updateById(updateObj);
public void updateData(FactoryDataSizeCreateReqVO updateReqVO) {
// 修改 规格明细数据
dataSizeService.updateData(updateReqVO);
//校验 出入库统计数据是否存在
List<FactoryDataDO> factoryDataDOS = dataMapper.selectListByFactoryAndDate(updateReqVO.getFactoryId(), updateReqVO.getDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
if (factoryDataDOS != null && !factoryDataDOS.isEmpty()) {
PackageDataCreateReqVO createReqVO = new PackageDataCreateReqVO();
createReqVO.setPackageData(updateReqVO.getPackageData());
createReqVO.setFactoryId(updateReqVO.getFactoryId());
createReqVO.setPackageDate(updateReqVO.getDate());
//获得 打包线数据对象
List<PackageDataDO> packageDataDOS = PackageDataConvert.INSTANCE.convertList(createReqVO);
// 更新
factoryDataDOS.forEach(data -> {
switch (data.getDataType()) {
//出库数据
case 1:
data.setTotalNum(updateReqVO.getItems().stream().mapToInt(FactoryDataSizeSaveReqVO::getOutNum).sum());
data.setDamageNum(updateReqVO.getItems().stream().mapToInt(FactoryDataSizeSaveReqVO::getOutDamageNum).sum());
break;
//入库数据
case 2:
Integer damageNum = packageDataDOS.stream().mapToInt(PackageDataDO::getDamageNum).sum()
+ updateReqVO.getItems().stream().mapToInt(FactoryDataSizeSaveReqVO::getInDamageNum).sum();
data.setTotalNum(packageDataDOS.stream().mapToInt(info -> info.getNum() + info.getAutoNum()).sum());
data.setDamageNum(damageNum);
data.setSquareNum(packageDataDOS.stream().map(PackageDataDO::getSquareNum).reduce(BigDecimal.ZERO, BigDecimal::add));
}
});
//更新 出入库统计数据
dataMapper.updateBatch(factoryDataDOS);
}
}
@Override
public void deleteData(Long id) {
// 删除
dataMapper.deleteById(id);
public void deleteData(Long factoryId, String date) {
//删除出入库 规格数据
dataSizeService.deleteData(factoryId, date);
}
@Override
public FactoryDataDO getData(Long id) {
return dataMapper.selectById(id);
public FactoryDataDetailRespVO getData(Long factoryId, String date) {
FactoryDataDetailRespVO respVO = new FactoryDataDetailRespVO();
respVO.setFactoryId(factoryId);
respVO.setDate(LocalDate.parse(date));
respVO.setDamageNum(0);
// 获得 指定工厂和日期的出入库统计数据
List<FactoryDataDO> factoryDataDOS = dataMapper.selectListByFactoryAndDate(factoryId, date);
for (FactoryDataDO factoryDataDO : factoryDataDOS) {
switch (factoryDataDO.getDataType()) {
//出库数据
case 1:
respVO.setOutTotalNum(factoryDataDO.getTotalNum());
respVO.setDamageNum(respVO.getDamageNum() + factoryDataDO.getDamageNum());
break;
//入库数据
case 2:
respVO.setInTotalNum(factoryDataDO.getTotalNum());
respVO.setSquareNum(factoryDataDO.getSquareNum());
respVO.setDamageNum(respVO.getDamageNum() + factoryDataDO.getDamageNum());
break;
}
}
//获得 规则明细数据
List<FactoryDataInfoRespVO> infoRespVOS = dataSizeService.getDetailList(factoryId, new LocalDate[]{LocalDate.parse(date), LocalDate.parse(date)});
respVO.setItems(infoRespVOS);
return respVO;
}
@Override
public PageResult<FactoryDataDO> getDataPage(FactoryDataPageReqVO pageReqVO) {
return dataMapper.selectPage(pageReqVO);
public PageResult<FactoryDataDetailRespVO> getDataPage(FactoryDataPageReqVO pageReqVO) {
//获得 出入库数据分页列表
IPage<FactoryDataDetailRespVO> mpPage = MyBatisUtils.buildPage(pageReqVO);
IPage<FactoryDataDetailRespVO> page = dataMapper.selectDetailPage(mpPage, pageReqVO);
PageResult<FactoryDataDetailRespVO> dataPage = new PageResult<>(page.getRecords(), page.getTotal());
List<FactoryDataDetailRespVO> respVOS = dataPage.getList();
if (!respVOS.isEmpty()) {
//获得工厂信息列表
List<Long> factoryIdS = respVOS.stream().map(FactoryDataDetailRespVO::getFactoryId).collect(Collectors.toList());
List<FactoryInfoDO> factoryInfoDOS = factoryInfoService.getFactoryList(factoryIdS);
Map<Long, FactoryInfoDO> factoryMap = convertMap(factoryInfoDOS, FactoryInfoDO::getId);
//获得 入库数打包破损入库破损出库数出库破损的工厂规格数据
List<FactoryDataInfoRespVO> infoDatas = dataSizeService.getDetailList(pageReqVO.getFactoryId(), pageReqVO.getDate());
respVOS.forEach(items -> {
//规格明细数据
List<FactoryDataInfoRespVO> infoList = infoDatas.stream()
.filter(data -> data.getFactoryId().equals(items.getFactoryId()) && data.getDate().equals(items.getDate()))
.collect(Collectors.toList());
items.setItems(infoList);
items.setFactoryName(factoryMap.get(items.getFactoryId()).getName());
//移除 已处理过的数据
infoDatas.removeAll(infoList);
});
// 展示当天录入的数据
if (!infoDatas.isEmpty()) {
// 工厂id和日期 进行分组
Map<Long, Map<LocalDate, List<FactoryDataInfoRespVO>>> groupedByFactoryIdAndDate = infoDatas.stream()
.collect(Collectors.groupingBy(FactoryDataInfoRespVO::getFactoryId,
Collectors.groupingBy(FactoryDataInfoRespVO::getDate)));
groupedByFactoryIdAndDate.forEach((factoryId, dateMap) -> {
//按日期倒叙 并遍历
dateMap.entrySet().stream().sorted(Map.Entry.comparingByKey())
.forEach((date) -> {
FactoryDataDetailRespVO dataDetailRespVO = new FactoryDataDetailRespVO();
dataDetailRespVO.setFactoryId(factoryId);
dataDetailRespVO.setFactoryName(factoryMap.get(factoryId).getName());
dataDetailRespVO.setDate(date.getKey());
//设置入库总数
dataDetailRespVO.setInTotalNum(date.getValue().stream().filter(info -> info.getInNum() != null).mapToInt(FactoryDataInfoRespVO::getInNum).sum());
//设置入库平方数
dataDetailRespVO.setSquareNum(date.getValue().stream().map(FactoryDataInfoRespVO::getSquareNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
//设置出库总数
dataDetailRespVO.setOutTotalNum(infoDatas.stream().filter(info -> info.getOutNum() != null).mapToInt(FactoryDataInfoRespVO::getOutNum).sum());
//设置 出入库破损总数
dataDetailRespVO.setDamageNum(infoDatas.stream().filter(info -> info.getInDamageNum() != null).mapToInt(info -> info.getInDamageNum() + info.getOutDamageNum()).sum());
dataDetailRespVO.setItems(date.getValue());
//设置 可编辑状态
dataDetailRespVO.setIsEdit(1);
respVOS.add(0, dataDetailRespVO);
});
});
dataPage.setTotal((long) respVOS.size());
}
}
return dataPage;
}
@Override
public FactoryDataTotalVO getDataTotal() {
return dataMapper.selectDataSum();
}
@Override
@ -78,4 +246,9 @@ public class FactoryDataServiceImpl implements FactoryDataService {
.eq(FactoryDataDO::getFactoryId, factoryId));
}
@Override
public FactoryDataDO getListByType(Long factoryId, LocalDate date, Integer type) {
return dataMapper.selectListByType(factoryId, date, type);
}
}

View File

@ -0,0 +1,53 @@
package cn.iocoder.yudao.module.smartfactory.service.factorydata;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO;
import javax.validation.Valid;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 工厂出库入库规格数据 Service 接口
*
* @author 符溶馨
*/
public interface FactoryDataSizeService {
/**
* 创建工厂规格数据
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createData(@Valid FactoryDataSizeCreateReqVO createReqVO);
/**
* 更新工厂规格数据
*
* @param updateReqVO 更新信息
*/
void updateData(@Valid FactoryDataSizeCreateReqVO updateReqVO);
/**
* 删除工厂规格数据
*
* @param factoryId 工厂编号
* @param date 日期
*/
void deleteData(Long factoryId, String date);
/**
* 获得出入库规格数据 列表
* @return 出入库规格数据
*/
List<FactoryDataInfoRespVO> getDetailList(Long factoryId, LocalDate[] date);
/**
* 获得指定时间段内 出入库规格数据之和
* @param dateTimes 时间区间
* @return 出入库规格数据之和
*/
List<FactoryDataInfoRespVO> getSUMByDateTimes(LocalDateTime[] dateTimes);
}

View File

@ -0,0 +1,213 @@
package cn.iocoder.yudao.module.smartfactory.service.factorydata;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataSizeDO;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata.FactoryDataSizeMapper;
import cn.iocoder.yudao.module.smartfactory.service.packagedata.PackageDataService;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.PACKAGE_DATA_EXISTS;
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.SIZEDATA_NOT_EXISTS;
/**
* 工厂出库入库规格数据 Service 实现类
*
* @author 符溶馨
*/
@Service
@Validated
public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
@Resource
private FactoryDataSizeMapper factoryDataSizeMapper;
@Resource
private PackageDataService packageDataService;
@Resource
@Lazy // 循环依赖避免报错
private FactoryDataService factoryDataService;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createData(FactoryDataSizeCreateReqVO createReqVO) {
//校验 当前日期得数据是否已经录入
Collection<Integer> types = Arrays.asList(1,2,3);
Long count = factoryDataSizeMapper.selectCountByType(createReqVO.getFactoryId(), createReqVO.getDate(), types);
if (count > 0L) {
throw exception(PACKAGE_DATA_EXISTS);
}
//校验 当前日期的出库数据是否已经统计过
FactoryDataDO factoryDataDO = factoryDataService.getListByType(createReqVO.getFactoryId(), createReqVO.getDate(), 1);
if (factoryDataDO != null) {
throw exception(PACKAGE_DATA_EXISTS);
}
//插入
List<FactoryDataSizeDO> factoryDataSizeDOs = new ArrayList<>();
for (FactoryDataSizeSaveReqVO reqVO : createReqVO.getItems()) {
if (reqVO.getInDamageNum() != null) {
FactoryDataSizeDO dataSizeDO = BeanUtils.toBean(reqVO, FactoryDataSizeDO.class);
//设置工厂和日期
dataSizeDO.setFactoryId(createReqVO.getFactoryId());
dataSizeDO.setDate(createReqVO.getDate());
//设置入库破损数
dataSizeDO.setType(1);
dataSizeDO.setNum(reqVO.getInDamageNum());
factoryDataSizeDOs.add(dataSizeDO);
}
if (reqVO.getOutNum() != null) {
FactoryDataSizeDO dataSizeDO = BeanUtils.toBean(reqVO, FactoryDataSizeDO.class);
//设置工厂和日期
dataSizeDO.setFactoryId(createReqVO.getFactoryId());
dataSizeDO.setDate(createReqVO.getDate());
//设置出库数
dataSizeDO.setType(2);
dataSizeDO.setNum(reqVO.getOutNum());
factoryDataSizeDOs.add(dataSizeDO);
}
if (reqVO.getOutDamageNum() != null) {
FactoryDataSizeDO dataSizeDO = BeanUtils.toBean(reqVO, FactoryDataSizeDO.class);
//设置工厂和日期
dataSizeDO.setFactoryId(createReqVO.getFactoryId());
dataSizeDO.setDate(createReqVO.getDate());
//设置出库破损数
dataSizeDO.setType(3);
dataSizeDO.setNum(reqVO.getOutDamageNum());
factoryDataSizeDOs.add(dataSizeDO);
}
}
factoryDataSizeMapper.insertBatch(factoryDataSizeDOs);
// 判断打包线数据不为空时 同步插入打包线数据
if (!createReqVO.getPackageData().isEmpty()) {
PackageDataCreateReqVO packCreateReqVO = new PackageDataCreateReqVO();
packCreateReqVO.setFactoryId(createReqVO.getPackageData().get(0).getFactoryId());
packCreateReqVO.setPackageData(createReqVO.getPackageData());
packCreateReqVO.setPackageDate(createReqVO.getDate());
//插入打包线数据
packageDataService.createPackageData(packCreateReqVO);
}
return (long) factoryDataSizeDOs.size();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateData(FactoryDataSizeCreateReqVO updateReqVO) {
// 更新
List<FactoryDataSizeDO> factoryDataSizeDOs = new ArrayList<>();
for (FactoryDataSizeSaveReqVO reqVO : updateReqVO.getItems()) {
if (reqVO.getInDamageNum() != null) {
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
//设置入库破损数
dataSizeDO.setId(reqVO.getInDamageNumId());
dataSizeDO.setNum(reqVO.getInDamageNum());
factoryDataSizeDOs.add(dataSizeDO);
}
if (reqVO.getOutNum() != null) {
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
//设置出库数
dataSizeDO.setId(reqVO.getOutNumId());
dataSizeDO.setNum(reqVO.getOutNum());
factoryDataSizeDOs.add(dataSizeDO);
}
if (reqVO.getOutDamageNum() != null) {
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
//设置出库破损数
dataSizeDO.setId(reqVO.getOutDamageNumId());
dataSizeDO.setNum(reqVO.getOutDamageNum());
factoryDataSizeDOs.add(dataSizeDO);
}
}
factoryDataSizeMapper.updateBatch(factoryDataSizeDOs);
// 判断 是否有打包线数据
if (!updateReqVO.getPackageData().isEmpty()) {
PackageDataCreateReqVO packCreateReqVO = new PackageDataCreateReqVO();
packCreateReqVO.setFactoryId(updateReqVO.getFactoryId());
packCreateReqVO.setPackageDate(updateReqVO.getDate());
packCreateReqVO.setPackageData(updateReqVO.getPackageData());
//插入打包线数据
packageDataService.updatePackageData(packCreateReqVO);
}
}
@Override
public void deleteData(Long factoryId, String date) {
LocalDateTime[] dateTimes = {LocalDateTime.now().with(LocalTime.MIN), LocalDateTime.now().with(LocalTime.MAX)};
//校验是否 为当天数据
Long count = factoryDataSizeMapper.selectCountByFactoryId(factoryId, date, dateTimes);
if (count == 0L) {
throw exception(SIZEDATA_NOT_EXISTS);
}
// 删除
factoryDataSizeMapper.deleteByFactoryId(factoryId, date);
}
@Override
public List<FactoryDataInfoRespVO> getDetailList(Long factoryId, LocalDate[] date) {
return factoryDataSizeMapper.selectDetailList(factoryId, date);
}
@Override
public List<FactoryDataInfoRespVO> getSUMByDateTimes(LocalDateTime[] dateTimes) {
return factoryDataSizeMapper.selectSUMByDateTimes(dateTimes);
}
}

View File

@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO;
import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
/**
@ -47,6 +48,20 @@ public interface FactoryInfoService {
*/
FactoryInfoDO getFactoryInfo(Long id);
/**
* 获得工厂信息列表
*
* @param ids 编号
* @return 工厂信息
*/
List<FactoryInfoDO> getFactoryList(Collection<Long> ids);
/**
* 获得类型为工厂的工厂信息列表
* @return 工厂列表
*/
List<FactoryInfoDO> getFactoryListByType();
/**
* 获得工厂信息分页
*

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.smartfactory.service.factoryinfo;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.ip.core.Area;
@ -11,18 +12,20 @@ import cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.
import cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.vo.ProvincesDataRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factoryinfo.FactoryInfoMapper;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.FACTORY_INFO_NOT_EXISTS;
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.FACTOYRY_EXISTS_STAFF;
/**
* 工厂信息 Service 实现类
@ -36,11 +39,27 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
@Resource
private FactoryInfoMapper factoryInfoMapper;
@Resource
private DeptApi deptApi;
@Resource
private AdminUserApi userApi;
@Override
public Long createFactoryInfo(FactoryInfoSaveReqVO createReqVO) {
// 插入
FactoryInfoDO factoryInfo = BeanUtils.toBean(createReqVO, FactoryInfoDO.class);
factoryInfoMapper.insert(factoryInfo);
//同步插入对应 生产部的下级部门
DeptRespDTO deptRespDTO = new DeptRespDTO();
deptRespDTO.setFactoryId(factoryInfo.getId());
deptRespDTO.setName(createReqVO.getShortName());
deptRespDTO.setParentId(130L); //这里设置上级部门为 生产部
deptRespDTO.setLeaderUserId(createReqVO.getLeaderUserId());
deptRespDTO.setStatus(CommonStatusEnum.ENABLE.getStatus());
deptApi.createDept(deptRespDTO);
// 返回
return factoryInfo.getId();
}
@ -52,14 +71,36 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
// 更新
FactoryInfoDO updateObj = BeanUtils.toBean(updateReqVO, FactoryInfoDO.class);
factoryInfoMapper.updateById(updateObj);
//同步更新 部门信息
DeptRespDTO deptRespDTO = new DeptRespDTO();
deptRespDTO.setName(updateReqVO.getShortName());
deptRespDTO.setLeaderUserId(updateReqVO.getLeaderUserId());
deptRespDTO.setFactoryId(updateReqVO.getId());
deptApi.updateDept(deptRespDTO);
}
@Override
public void deleteFactoryInfo(Long id) {
// 校验存在
validateFactoryInfoExists(id);
//校验工厂下是否存在 员工
DeptRespDTO deptRespDTO = deptApi.getDeptByFactoryId(id).getCheckedData();
List<Long> deptId = new ArrayList<>();
deptId.add(deptRespDTO.getId());
List<AdminUserRespDTO> userRespDTOS = userApi.getUserListByDeptIds(deptId).getCheckedData();
if (userRespDTOS != null && !userRespDTOS.isEmpty()) {
throw exception(FACTOYRY_EXISTS_STAFF);
}
// 删除
factoryInfoMapper.deleteById(id);
//同步删除部门
deptApi.deleteDept(id);
}
private void validateFactoryInfoExists(Long id) {
@ -70,9 +111,22 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
@Override
public FactoryInfoDO getFactoryInfo(Long id) {
return factoryInfoMapper.selectById(id);
}
@Override
public List<FactoryInfoDO> getFactoryList(Collection<Long> ids) {
return factoryInfoMapper.selectList(FactoryInfoDO::getId, ids);
}
@Override
public List<FactoryInfoDO> getFactoryListByType() {
return factoryInfoMapper.selectList(FactoryInfoDO::getType, 3);
}
@Override
public PageResult<FactoryInfoDO> getFactoryInfoPage(FactoryInfoPageReqVO pageReqVO) {
return factoryInfoMapper.selectPage(pageReqVO);
@ -132,5 +186,4 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
public String getWeatherCodeByFactoryId(Long factoryId, String areaCode) {
return factoryInfoMapper.getWeatherCodeByFactoryId(factoryId, areaCode);
}
}

View File

@ -0,0 +1,63 @@
package cn.iocoder.yudao.module.smartfactory.service.packageInfo;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackagePageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackageRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackageSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packageInfo.PackageDO;
import javax.validation.Valid;
import java.util.List;
/**
* 打包线 Service 接口
*
* @author 符溶馨
*/
public interface PackageService {
/**
* 创建打包线
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createPackage(@Valid PackageSaveReqVO createReqVO);
/**
* 更新打包线
*
* @param updateReqVO 更新信息
*/
void updatePackage(@Valid PackageSaveReqVO updateReqVO);
/**
* 删除打包线
*
* @param id 编号
*/
void deletePackage(Long id);
/**
* 获得打包线
*
* @param id 编号
* @return 打包线
*/
PackageDO getPackage(Long id);
/**
* 获得指定工厂的打包线列表
* @param factoryId 工厂编号
* @return 打包线信息列表
*/
List<PackageRespVO> getPackageByFactoryId(Long factoryId);
/**
* 获得打包线分页
*
* @param pageReqVO 分页查询
* @return 打包线分页
*/
PageResult<PackageRespVO> getPackagePage(PackagePageReqVO pageReqVO);
}

View File

@ -0,0 +1,116 @@
package cn.iocoder.yudao.module.smartfactory.service.packageInfo;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackagePageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackageRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackageSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packageInfo.PackageDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.size.SizeDO;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.packageInfo.PackageMapper;
import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService;
import cn.iocoder.yudao.module.smartfactory.service.size.SizeService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.PACKAGE_NOT_EXISTS;
/**
* 打包线 Service 实现类
*
* @author 符溶馨
*/
@Service
@Validated
public class PackageServiceImpl implements PackageService {
@Resource
private PackageMapper packageMapper;
@Resource
private FactoryInfoService factoryService;
@Resource
private SizeService sizeService;
@Override
public Long createPackage(PackageSaveReqVO createReqVO) {
// 插入
PackageDO packDO = BeanUtils.toBean(createReqVO, PackageDO.class);
packageMapper.insert(packDO);
// 返回
return packDO.getId();
}
@Override
public void updatePackage(PackageSaveReqVO updateReqVO) {
// 校验存在
validatePackageExists(updateReqVO.getId());
// 更新
PackageDO updateObj = BeanUtils.toBean(updateReqVO, PackageDO.class);
packageMapper.updateById(updateObj);
}
@Override
public void deletePackage(Long id) {
// 校验存在
validatePackageExists(id);
// 删除
packageMapper.deleteById(id);
}
private void validatePackageExists(Long id) {
if (packageMapper.selectById(id) == null) {
throw exception(PACKAGE_NOT_EXISTS);
}
}
@Override
public PackageDO getPackage(Long id) {
return packageMapper.selectById(id);
}
@Override
public List<PackageRespVO> getPackageByFactoryId(Long factoryId) {
//获得工厂信息
FactoryInfoDO factoryInfoDO = factoryService.getFactoryInfo(factoryId);
//获得打包线信息列表
List<PackageDO> packageDOS = packageMapper.selectList(PackageDO::getFactoryId, factoryId);
//获得 规格信息
List<Long> sizeIds = convertList(packageDOS, PackageDO::getSizeId);
List<SizeDO> sizeDOS = sizeService.getSizes(sizeIds);
//获得规格信息Map
Map<Long, SizeDO> sizeMap = convertMap(sizeDOS, SizeDO::getId);
List<PackageRespVO> respVOS = BeanUtils.toBean(packageDOS, PackageRespVO.class);
respVOS.forEach(data -> {
data.setFactoryName(factoryInfoDO.getName());
data.setSizeName(sizeMap.get(data.getSizeId()).getName());
});
return respVOS;
}
@Override
public PageResult<PackageRespVO> getPackagePage(PackagePageReqVO pageReqVO) {
IPage<PackageRespVO> mpPage = MyBatisUtils.buildPage(pageReqVO);
IPage<PackageRespVO> page = packageMapper.selectPackagePage(mpPage, pageReqVO);
return new PageResult<>(page.getRecords(), page.getTotal());
}
}

Some files were not shown because too many files have changed in this diff Show More