package com.fzzy.work.service; import com.fzzy.igds.constant.Constant; import com.fzzy.igds.data.BaseResp; import com.fzzy.igds.domain.InoutNoticeIn; import com.fzzy.igds.domain.InoutNoticeOut; import com.fzzy.igds.utils.ContextUtil; import com.fzzy.work.data.WorkStatus; import com.fzzy.work.data.WorkBizType; import com.fzzy.work.data.WorkNode; import com.fzzy.work.domain.WorkOrder; import com.fzzy.work.domain.WorkOrderConf; import com.fzzy.work.domain.WorkOrderProcess; import com.ruoyi.common.core.domain.entity.SysUser; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Date; /** * @Desc: 工单业务接口 * @Author: Andy.jia * @Date: 2026/1/15 */ @Slf4j @Service public class BizWorkService { @Resource private WorkOrderConfService confService; @Resource private WorkOrderService orderService; @Resource private WorkOrderProcessService orderProcessService; /** * 获取流程配置信息 * @param deptId 库区ID * @param type 业务类型 * @return 配置信息 */ public WorkOrderConf getConfByDeptId(String deptId, WorkBizType type) { return confService.getByDeptId(deptId, type); } /** * * 根据出入库通知单启动审批工单 * @param data 出入库工单数据 * @return 响应结果 */ public BaseResp startByNoticeIn(InoutNoticeIn data, WorkOrderConf conf) { if (null == conf) conf = confService.getByDeptId(data.getDeptId(), WorkBizType.TYPE_10); if (Constant.YN_N.equals(conf.getValTag())) return BaseResp.error("流程未启用"); //创建工单 WorkOrder work = new WorkOrder(); work.setId(ContextUtil.generateOrderId("RKD")); work.setBizType(WorkBizType.TYPE_10.getCode()); work.setBusinessId(data.getId()); work.setBankId(data.getBankId()); work.setBusinessUrl("com.fzzy.igds.InoutNoticeIn-Detail.d"); work.setCreateTime(new Date()); work.setDeptId(data.getDeptId()); work.setCompanyId(data.getCompanyId()); work.setUpdateTime(new Date()); work.setTitle("入库通知单审批"); work.setConfId(conf.getId()); work.setStatus(WorkStatus.STATUS_30.getCode()); work.setReceiveTime(new Date()); String nextNode = this.getNextNode(WorkNode.NODE_START.getCode(), conf).getCode(); work.setNode(nextNode); orderService.addData(work); //添加记录 WorkOrderProcess process = new WorkOrderProcess(); process.setId(ContextUtil.UUID()); process.setAction("提交"); process.setCreateTime(new Date()); process.setOrderId(work.getId()); process.setAssigneeName(work.getCreateBy()); process.setAssigneeId(work.getCreateById()); process.setNode(WorkNode.NODE_START.getCode()); orderProcessService.addData(process, false); return BaseResp.success(); } /** * * 根据出出库通知单启动审批工单 * @param data 出入库工单数据 * @return 响应结果 */ public BaseResp startByNoticeOut(InoutNoticeOut data, WorkOrderConf conf) { if (null == conf) conf = confService.getByDeptId(data.getDeptId(), WorkBizType.TYPE_20); if (Constant.YN_N.equals(conf.getValTag())) return BaseResp.error("流程未启用"); //创建工单 WorkOrder work = new WorkOrder(); work.setId(ContextUtil.generateOrderId("CKD")); work.setBizType(WorkBizType.TYPE_20.getCode()); work.setBusinessId(data.getId()); work.setBankId(data.getBankId()); work.setBusinessUrl("com.fzzy.igds.InoutNoticeOut-Detail.d"); work.setCreateTime(new Date()); work.setDeptId(data.getDeptId()); work.setCompanyId(data.getCompanyId()); work.setUpdateTime(new Date()); work.setTitle("出库通知单审批"); work.setConfId(conf.getId()); work.setStatus(WorkStatus.STATUS_30.getCode()); work.setReceiveTime(new Date()); String nextNode = this.getNextNode(WorkNode.NODE_START.getCode(), conf).getCode(); work.setNode(nextNode); orderService.addData(work); //添加记录 WorkOrderProcess process = new WorkOrderProcess(); process.setId(ContextUtil.UUID()); process.setAction("提交"); process.setCreateTime(new Date()); process.setOrderId(work.getId()); process.setAssigneeName(work.getCreateBy()); process.setAssigneeId(work.getCreateById()); process.setNode(WorkNode.NODE_START.getCode()); orderProcessService.addData(process, false); return BaseResp.success(); } /** * 根据当前节点获取下一个节点 * @param curNode * @param conf * @return */ private WorkNode getNextNode(String curNode, WorkOrderConf conf) { if (null == conf) return WorkNode.NODE_END; if (WorkNode.NODE_START.getCode().equals(curNode)) { if (Constant.YN_Y.equals(conf.getNodeVal1())) return WorkNode.NODE1; if (Constant.YN_Y.equals(conf.getNodeVal2())) return WorkNode.NODE2; if (Constant.YN_Y.equals(conf.getNodeVal3())) return WorkNode.NODE3; } if (WorkNode.NODE1.getCode().equals(curNode)) { if (Constant.YN_Y.equals(conf.getNodeVal2())) return WorkNode.NODE2; if (Constant.YN_Y.equals(conf.getNodeVal3())) return WorkNode.NODE3; } if (WorkNode.NODE2.getCode().equals(curNode)) { if (Constant.YN_Y.equals(conf.getNodeVal3())) return WorkNode.NODE3; } return WorkNode.NODE_END; } /** * 获取待处理工单 * @return 处理结果 */ public BaseResp todoByProcess(WorkOrderProcess process) { String action = process.getAction(); if (StringUtils.isEmpty(action)) { return BaseResp.error("没有识别到处理动作,请重新尝试"); } log.info("-----工单处理-----{}", process); //获取工单 WorkOrder work = orderService.selectById(process.getOrderId()); if (null == work) return BaseResp.error("当前工单已不存在"); if (work.getStatus().equals(WorkStatus.STATUS_50.getCode()) || work.getStatus().equals(WorkStatus.STATUS_60.getCode())) { return BaseResp.error("当前工单已处理,请刷新页面重试!!"); } //判断是不是指定处理人 SysUser user = ContextUtil.getLoginUser(); if (StringUtils.isNotEmpty(work.getAssigneeId())) { if (!work.getAssigneeId().equals(user.getLoginName())) { return BaseResp.error("当前工单已分配其他人处理,请勿处理"); } } String curNode = process.getNode(); //获取处理人 if (!curNode.equals(work.getNode())) { return BaseResp.error("当前工单已被处理,请刷新页面重试!!"); } //获取配置信息 WorkOrderConf conf = confService.selectById(work.getConfId()); if (null == conf) return BaseResp.error("当前工单未配置流程"); //添加记录 process.setId(ContextUtil.UUID()); process.setCreateTime(new Date()); process.setOrderId(work.getId()); process.setAssigneeName(user.getUserName()); process.setAssigneeId(user.getLoginName()); WorkNode nextNode = this.getNextNode(work.getNode(), conf); log.info("工单审批:{},当前节点:{},下一节点:{}", work.getTitle(), work.getNode(), nextNode); //通过操作 if ("pass".equals(action)) { process.setAction("通过"); process.setNode(work.getNode()); //结束判断,如果是结束节点,则结束工单 if (WorkNode.NODE_END.getCode().equals(nextNode.getCode())) { work.setStatus(WorkStatus.STATUS_50.getCode()); work.setAssigneeName(process.getAssigneeName()); work.setAssigneeId(process.getAssigneeId()); work.setNode(nextNode.getCode()); orderService.complete(work); } //增加审批记录 orderProcessService.addData(process, WorkNode.NODE_END.equals(nextNode)); return BaseResp.success(); } //拒绝操作 if ("refuse".equals(action)) { process.setAction("拒绝"); process.setNode(WorkNode.NODE_END.getCode()); work.setStatus(WorkStatus.STATUS_60.getCode()); orderService.complete(work); //增加审批记录 orderProcessService.addData(process, true); return BaseResp.success(); } //转交或者指派操作 if ("transfer".equals(action)) { if (StringUtils.isEmpty(process.getAssigneeName())) { return BaseResp.error("请选择处理人"); } process.setAction("转交/指派"); process.setNode(work.getNode()); String info = user.getUserName() + "转交给" + process.getAssigneeName() + "处理,处理建议:" + process.getRemark(); process.setRemark(info); //更新处理人 work.setAssigneeId(process.getAssigneeId()); work.setAssigneeName(process.getAssigneeName()); orderService.updateData(work); orderProcessService.addData(process, false); return BaseResp.success(); } return BaseResp.error("系统没有识别到操作动作,未执行相关流程审批"); } }