package com.chinaztt.mes.plan.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; import com.chinaztt.mes.common.handler.StateMachineHandler; import com.chinaztt.mes.common.numgen.NumberGenerator; import com.chinaztt.mes.common.oa.OAProcess; import com.chinaztt.mes.common.oa.OAProperty; import com.chinaztt.mes.common.oa.OAResult; import com.chinaztt.mes.common.util.StateResult; import com.chinaztt.mes.plan.dto.OutsourcingOrderDTO; import com.chinaztt.mes.plan.entity.OutsourcingOrder; import com.chinaztt.mes.plan.mapper.OutsourcingOrderMapper; import com.chinaztt.mes.plan.service.OutsourcingOrderService; import com.chinaztt.mes.plan.state.outsourcing.OutsourcingOrderStateMachineConfig; import com.chinaztt.mes.plan.state.outsourcing.constant.OutsourcingOrderEvents; import com.chinaztt.mes.plan.state.outsourcing.constant.OutsourcingOrderStateStringValues; import com.chinaztt.mes.plan.state.outsourcing.constant.OutsourcingOrderStates; import com.chinaztt.ztt.common.core.util.R; import com.chinaztt.ztt.common.security.util.SecurityUtils; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; import org.springframework.statemachine.config.StateMachineFactory; import org.springframework.statemachine.persist.StateMachinePersister; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * 委外订单表 * * @author cxf * @date 2021-08-16 16:13:50 */ @Slf4j @Service @AllArgsConstructor @Transactional(rollbackFor = Exception.class) public class OutsourcingOrderServiceImpl extends ServiceImpl implements OutsourcingOrderService { public static final String OA_ERROR_CODE = "999"; private OAProperty oaProperty; private NumberGenerator outsourcingOrderNumberGenerator; private StateMachineFactory outsourcingOrderStateMachineFactory; private StateMachinePersister persister; @Override public boolean save(OutsourcingOrder outsourcingOrder) { outsourcingOrder.setState(OutsourcingOrderStateStringValues.PLANNED); checkOutsourcingOrderNo(outsourcingOrder); return SqlHelper.retBool(baseMapper.insert(outsourcingOrder)); } @Override public boolean updateById(OutsourcingOrder outsourcingOrder) { checkOutsourcingOrderNo(outsourcingOrder); return SqlHelper.retBool(baseMapper.updateById(outsourcingOrder)); } private void checkOutsourcingOrderNo(OutsourcingOrder outsourcingOrder) { if (StringUtils.isBlank(outsourcingOrder.getOutsourcingOrderNo())) { // 1. 自动生成编号 outsourcingOrder.setOutsourcingOrderNo(outsourcingOrderNumberGenerator.generateNumberWithPrefix(OutsourcingOrder.DIGIT, OutsourcingOrder.PREFIX, OutsourcingOrder::getOutsourcingOrderNo)); } else { // 2.判断是否重复 List repeatNos = baseMapper.selectList(Wrappers.query().lambda() .eq(OutsourcingOrder::getOutsourcingOrderNo, outsourcingOrder.getOutsourcingOrderNo()).ne(OutsourcingOrder::getId, outsourcingOrder.getId())); if (CollectionUtil.isNotEmpty(repeatNos)) { throw new RuntimeException("编号重复"); } } } @Override public IPage getOutsourcingOrderPage(Page page, QueryWrapper gen) { return baseMapper.getOutsourcingOrderPage(page, gen); } @Override public boolean changeState(List ids, String event) { for (Long id : ids) { OutsourcingOrder outsourcingOrder = baseMapper.selectById(id); Message message = MessageBuilder.withPayload(OutsourcingOrderEvents.valueOf(event)).setHeader("outsourcingOrder", outsourcingOrder).build(); StateMachineHandler handler = new StateMachineHandler(outsourcingOrderStateMachineFactory, persister, OutsourcingOrderStateMachineConfig.MACHINE_ID, outsourcingOrder); StateResult res = handler.sendEvent(message, outsourcingOrder.getId()); if (!res.isSuccess()) { throw new RuntimeException(res.getMsg()); } } return true; } @Override public OutsourcingOrderDTO selectById(Long id) { return baseMapper.selectDtoById(id); } @Override public R approvalOaByOutsourcingOrderId(Long outsourcingOrderId) { OutsourcingOrder outsourcingOrder = baseMapper.selectById(outsourcingOrderId); // 发起OA流程 Map mainFields = new LinkedHashMap(); OAResult oaResult; try { oaResult = OAProcess.start(mainFields, "委外订单采购流程", oaProperty.getOutsourcingOrderId(), SecurityUtils.getUser().getUsername()); } catch (Exception e) { return R.failed("发起OA流程失败"); } if (OA_ERROR_CODE.equals(oaResult.getErrorCode())) { return R.failed(oaResult.getErrorMsg()); } else { if (StringUtils.isNotBlank(oaResult.getAddWorkflowResult())) { outsourcingOrder.setOaId(Long.parseLong(oaResult.getAddWorkflowResult())); } } // OA流程发起成功,状态修改为审核中 outsourcingOrder.setOaState("02submit"); baseMapper.updateById(outsourcingOrder); return R.ok(outsourcingOrder); } @Override public boolean updateOutsourcingOrder(String isAudit, Long oaWorkId) { return SqlHelper.retBool(baseMapper.updateByOaWorkId(isAudit, oaWorkId)); } }