17 changed files with 699 additions and 27 deletions
			
			
		@ -0,0 +1,17 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.feign; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.common.to.process.ProcessWorkFlowResponse; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springframework.stereotype.Component; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Component | 
				
			||||
public class AccessPlanV4ClientFallback implements IAccessPlanV4Client { | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public R<Boolean> listener(ProcessWorkFlowResponse processWorkFlowResponse) { | 
				
			||||
        return R.fail("执行失败!"); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,17 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.feign; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.common.to.process.ProcessWorkFlowResponse; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springframework.stereotype.Component; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Component | 
				
			||||
public class AccessTaskV4ClientFallback implements IAccessTaskV4Client { | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public R<Boolean> listener(ProcessWorkFlowResponse processWorkFlowResponse) { | 
				
			||||
        return R.fail("执行失败!"); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,25 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.feign; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.common.to.process.ProcessWorkFlowResponse; | 
				
			||||
import com.hnac.hzims.operational.OperationalConstants; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springframework.cloud.openfeign.FeignClient; | 
				
			||||
import org.springframework.web.bind.annotation.PostMapping; | 
				
			||||
import org.springframework.web.bind.annotation.RequestBody; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@FeignClient( | 
				
			||||
	value = OperationalConstants.APP_NAME, | 
				
			||||
	fallback = AccessTaskClientFallback.class | 
				
			||||
) | 
				
			||||
public interface IAccessPlanV4Client { | 
				
			||||
 | 
				
			||||
	String API_PREFIX = "/feign/accessPlanV4"; | 
				
			||||
 | 
				
			||||
	String PLAN_PROCESS_LISTENER = API_PREFIX + "listener"; | 
				
			||||
 | 
				
			||||
	@PostMapping(PLAN_PROCESS_LISTENER) | 
				
			||||
	R<Boolean> listener(@RequestBody ProcessWorkFlowResponse processWorkFlowResponse); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,25 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.feign; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.common.to.process.ProcessWorkFlowResponse; | 
				
			||||
import com.hnac.hzims.operational.OperationalConstants; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springframework.cloud.openfeign.FeignClient; | 
				
			||||
import org.springframework.web.bind.annotation.PostMapping; | 
				
			||||
import org.springframework.web.bind.annotation.RequestBody; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@FeignClient( | 
				
			||||
	value = OperationalConstants.APP_NAME, | 
				
			||||
	fallback = AccessTaskClientFallback.class | 
				
			||||
) | 
				
			||||
public interface IAccessTaskV4Client { | 
				
			||||
 | 
				
			||||
	String API_PREFIX = "/feign/accessTaskV4"; | 
				
			||||
 | 
				
			||||
	String PLAN_PROCESS_LISTENER = API_PREFIX + "listener"; | 
				
			||||
 | 
				
			||||
	@PostMapping(PLAN_PROCESS_LISTENER) | 
				
			||||
	R<Boolean> listener(@RequestBody ProcessWorkFlowResponse processWorkFlowResponse); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,38 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.controller; | 
				
			||||
 | 
				
			||||
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; | 
				
			||||
import com.hnac.hzims.operational.access.dto.AccessPlanV4DTO; | 
				
			||||
import com.hnac.hzims.operational.access.service.AccessPlanV4Service; | 
				
			||||
import io.swagger.annotations.Api; | 
				
			||||
import io.swagger.annotations.ApiOperation; | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import org.springblade.core.boot.ctrl.BladeController; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springframework.web.bind.annotation.PostMapping; | 
				
			||||
import org.springframework.web.bind.annotation.RequestMapping; | 
				
			||||
import org.springframework.web.bind.annotation.RestController; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@RestController | 
				
			||||
@AllArgsConstructor | 
				
			||||
@RequestMapping("/overhaul_plan") | 
				
			||||
@Api(tags = "v4检修计划流程") | 
				
			||||
public class AccessPlanV4Controller extends BladeController { | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	private final AccessPlanV4Service service; | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * v4检修计划流程开启 | 
				
			||||
	 * @return | 
				
			||||
	 */ | 
				
			||||
	@PostMapping("/overhaul_start_v4") | 
				
			||||
	@ApiOperationSupport(order = 1) | 
				
			||||
	@ApiOperation(value = "v4检修计划流程开启") | 
				
			||||
	public R startV4(AccessPlanV4DTO entity) { | 
				
			||||
		return R.status(service.startProcessV4(entity)); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,19 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.controller; | 
				
			||||
 | 
				
			||||
import io.swagger.annotations.Api; | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import org.springblade.core.boot.ctrl.BladeController; | 
				
			||||
import org.springframework.web.bind.annotation.RequestMapping; | 
				
			||||
import org.springframework.web.bind.annotation.RestController; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@RestController | 
				
			||||
@AllArgsConstructor | 
				
			||||
@RequestMapping("/overhaul_task") | 
				
			||||
@Api(tags = "v4检修计划流程") | 
				
			||||
public class AccessV4Controller extends BladeController { | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,24 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.dto; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.operational.access.entity.OperAccessPlanEntity; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
import lombok.Data; | 
				
			||||
import lombok.EqualsAndHashCode; | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@EqualsAndHashCode(callSuper = true) | 
				
			||||
public class AccessPlanV4DTO extends OperAccessPlanEntity { | 
				
			||||
 | 
				
			||||
	private static final long serialVersionUID = 1L; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty("检修材料列表") | 
				
			||||
	private List<OperAccessMaterialDTO> accessMaterials; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty("检修内容列表") | 
				
			||||
	private List<OperAccessContentDTO> accessContents; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,39 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.dto; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.operational.access.entity.OperAccessTaskEntity; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
import lombok.Data; | 
				
			||||
import lombok.EqualsAndHashCode; | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@EqualsAndHashCode(callSuper = true) | 
				
			||||
public class AccessTaskV4DTO extends OperAccessTaskEntity { | 
				
			||||
 | 
				
			||||
	private static final long serialVersionUID = 1L; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "创建机构集合") | 
				
			||||
	private List<Long> deptIds; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "工作流Key") | 
				
			||||
	private String procDefId; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty("为1时排除票据ID为空的数据") | 
				
			||||
	private Long excludeNullTicket; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty("检修任务详情") | 
				
			||||
	private List<OperAccessTaskDetailDTO> accessTaskDetails; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty("检修材料列表") | 
				
			||||
	private List<OperAccessMaterialDTO> accessMaterials; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty("开始时间") | 
				
			||||
	private String startTime; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty("结束时间") | 
				
			||||
	private String endTime; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,34 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.feign; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.common.to.process.ProcessWorkFlowResponse; | 
				
			||||
import com.hnac.hzims.operational.access.service.AccessPlanV4Service; | 
				
			||||
import lombok.RequiredArgsConstructor; | 
				
			||||
import lombok.extern.slf4j.Slf4j; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springframework.web.bind.annotation.PostMapping; | 
				
			||||
import org.springframework.web.bind.annotation.RequestBody; | 
				
			||||
import org.springframework.web.bind.annotation.RequestMapping; | 
				
			||||
import org.springframework.web.bind.annotation.RestController; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@RestController | 
				
			||||
@RequestMapping("/feign/accessPlanV4") | 
				
			||||
@Slf4j | 
				
			||||
@RequiredArgsConstructor | 
				
			||||
public class AccessPlanV4Client implements IAccessPlanV4Client { | 
				
			||||
 | 
				
			||||
	private final AccessPlanV4Service service; | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * 检修计划流程监听 | 
				
			||||
	 * @param processWorkFlowResponse | 
				
			||||
	 * @return | 
				
			||||
	 */ | 
				
			||||
	@Override | 
				
			||||
	@PostMapping("/listener") | 
				
			||||
	public R<Boolean> listener(@RequestBody ProcessWorkFlowResponse processWorkFlowResponse) { | 
				
			||||
		return R.status(service.listener(processWorkFlowResponse)); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,35 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.feign; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.common.to.process.ProcessWorkFlowResponse; | 
				
			||||
import com.hnac.hzims.operational.access.service.AccessPlanV4Service; | 
				
			||||
import com.hnac.hzims.operational.access.service.AccessTaskV4Service; | 
				
			||||
import lombok.RequiredArgsConstructor; | 
				
			||||
import lombok.extern.slf4j.Slf4j; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springframework.web.bind.annotation.PostMapping; | 
				
			||||
import org.springframework.web.bind.annotation.RequestBody; | 
				
			||||
import org.springframework.web.bind.annotation.RequestMapping; | 
				
			||||
import org.springframework.web.bind.annotation.RestController; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@RestController | 
				
			||||
@RequestMapping("/feign/accessTaskV4") | 
				
			||||
@Slf4j | 
				
			||||
@RequiredArgsConstructor | 
				
			||||
public class AccessTaskV4Client implements IAccessPlanV4Client { | 
				
			||||
 | 
				
			||||
	private final AccessTaskV4Service service; | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * 检修任务流程监听 | 
				
			||||
	 * @param processWorkFlowResponse | 
				
			||||
	 * @return | 
				
			||||
	 */ | 
				
			||||
	@Override | 
				
			||||
	@PostMapping("/listener") | 
				
			||||
	public R<Boolean> listener(@RequestBody ProcessWorkFlowResponse processWorkFlowResponse) { | 
				
			||||
		return R.status(service.listener(processWorkFlowResponse)); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,14 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.service; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.common.to.process.ProcessWorkFlowResponse; | 
				
			||||
import com.hnac.hzims.operational.access.dto.AccessPlanV4DTO; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
public interface AccessPlanV4Service{ | 
				
			||||
 | 
				
			||||
   boolean startProcessV4(AccessPlanV4DTO entity); | 
				
			||||
 | 
				
			||||
    boolean listener(ProcessWorkFlowResponse processWorkFlowResponse); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,14 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.service; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.common.to.process.ProcessWorkFlowResponse; | 
				
			||||
import com.hnac.hzims.operational.access.dto.AccessTaskV4DTO; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
public interface AccessTaskV4Service { | 
				
			||||
 | 
				
			||||
    boolean startProcessV4(AccessTaskV4DTO entity); | 
				
			||||
 | 
				
			||||
    boolean listener(ProcessWorkFlowResponse processWorkFlowResponse); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,212 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.service.impl; | 
				
			||||
 | 
				
			||||
import com.alibaba.fastjson.JSONObject; | 
				
			||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
				
			||||
import com.hnac.hzims.common.to.process.ProcessWorkFlowResponse; | 
				
			||||
import com.hnac.hzims.operational.access.dto.*; | 
				
			||||
import com.hnac.hzims.operational.access.entity.OperAccessContentEntity; | 
				
			||||
import com.hnac.hzims.operational.access.entity.OperAccessMaterialEntity; | 
				
			||||
import com.hnac.hzims.operational.access.service.*; | 
				
			||||
import lombok.RequiredArgsConstructor; | 
				
			||||
import lombok.extern.slf4j.Slf4j; | 
				
			||||
import org.apache.commons.lang3.RandomUtils; | 
				
			||||
import org.springblade.core.log.exception.ServiceException; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springblade.core.tool.utils.BeanUtil; | 
				
			||||
import org.springblade.core.tool.utils.CollectionUtil; | 
				
			||||
import org.springblade.core.tool.utils.DateUtil; | 
				
			||||
import org.springblade.core.tool.utils.ObjectUtil; | 
				
			||||
import org.springblade.flow.core.entity.BladeFlow; | 
				
			||||
import org.springblade.flow.core.feign.IFlowClient; | 
				
			||||
import org.springblade.flow.core.utils.FlowUtil; | 
				
			||||
import org.springframework.stereotype.Service; | 
				
			||||
import org.springframework.transaction.annotation.Transactional; | 
				
			||||
import org.springframework.util.CollectionUtils; | 
				
			||||
 | 
				
			||||
import java.text.DecimalFormat; | 
				
			||||
import java.util.*; | 
				
			||||
import java.util.stream.Collectors; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Service | 
				
			||||
@Slf4j | 
				
			||||
@RequiredArgsConstructor | 
				
			||||
public class AccessPlanV4ServiceImpl implements AccessPlanV4Service{ | 
				
			||||
 | 
				
			||||
    private final IOperAccessPlanService planService; | 
				
			||||
 | 
				
			||||
    private final IOperAccessMaterialService materialService; | 
				
			||||
 | 
				
			||||
    private final IOperAccessContentService contentService; | 
				
			||||
 | 
				
			||||
    private final AccessTaskV4Service accessTaskV4Service; | 
				
			||||
 | 
				
			||||
    private final IFlowClient flowClient; | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 开启检修计划流程 | 
				
			||||
     * @param entity | 
				
			||||
     * @return | 
				
			||||
     */ | 
				
			||||
    @Override | 
				
			||||
    @Transactional(rollbackFor = Exception.class) | 
				
			||||
    public boolean startProcessV4(AccessPlanV4DTO entity) { | 
				
			||||
        // 步骤1.保存检修计划
 | 
				
			||||
        this.saveAccess(entity); | 
				
			||||
 | 
				
			||||
        // 步骤2.保存检修材料
 | 
				
			||||
        this.saveAccessMaterial(entity); | 
				
			||||
 | 
				
			||||
        // 步骤3.保存检修明细
 | 
				
			||||
        this.saveAccessContent(entity); | 
				
			||||
 | 
				
			||||
        // 步骤2.开启检修计划流程
 | 
				
			||||
        this.startProcess(entity); | 
				
			||||
        return true; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 保存检修计划 | 
				
			||||
     * @param entity | 
				
			||||
     */ | 
				
			||||
    private void saveAccess(AccessPlanV4DTO entity) { | 
				
			||||
        // 检修计划保存
 | 
				
			||||
        entity.setCode("PLAN_" + DateUtil.format(DateUtil.now(), DateUtil.PATTERN_DATETIME_MINI) + new DecimalFormat("###").format(RandomUtils.nextInt(0, 999))); | 
				
			||||
        planService.save(entity); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 保存检修材料 | 
				
			||||
     * @param entity | 
				
			||||
     */ | 
				
			||||
    private void saveAccessMaterial(AccessPlanV4DTO entity) { | 
				
			||||
        if(CollectionUtils.isEmpty(entity.getAccessMaterials())){ | 
				
			||||
            return; | 
				
			||||
        } | 
				
			||||
        // 查询计划是否绑定检修材料
 | 
				
			||||
        List<OperAccessMaterialEntity> existsDetails = materialService.list(new LambdaQueryWrapper<OperAccessMaterialEntity>() {{ | 
				
			||||
            eq(OperAccessMaterialEntity::getPlanId, entity.getId()); | 
				
			||||
            eq(OperAccessMaterialEntity::getIsDeleted, 0L); | 
				
			||||
        }}); | 
				
			||||
        Set<Long> detailIds = entity.getAccessMaterials().stream().map(OperAccessMaterialDTO::getId).filter(Objects::nonNull).collect(Collectors.toSet()); | 
				
			||||
        List<Long> ids = existsDetails.stream().map(OperAccessMaterialEntity::getId).filter(id -> !detailIds.contains(id)).collect(Collectors.toList()); | 
				
			||||
        if (!CollectionUtils.isEmpty(ids)) { | 
				
			||||
            materialService.deleteLogic(ids); | 
				
			||||
        } | 
				
			||||
        // 材料添加/修改
 | 
				
			||||
        for (OperAccessMaterialDTO material : entity.getAccessMaterials()) { | 
				
			||||
            material.setPlanId(entity.getId()); | 
				
			||||
            if (ObjectUtil.isEmpty(material.getId())) { | 
				
			||||
                materialService.doSave(material); | 
				
			||||
                continue; | 
				
			||||
            } | 
				
			||||
            materialService.updateById(material); | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 保存检修明细 | 
				
			||||
     * @param entity | 
				
			||||
     */ | 
				
			||||
    private void saveAccessContent(AccessPlanV4DTO entity) { | 
				
			||||
        if(CollectionUtils.isEmpty(entity.getAccessContents())){ | 
				
			||||
            return; | 
				
			||||
        } | 
				
			||||
        // 查询计划是否绑定任务明细
 | 
				
			||||
        List<OperAccessContentEntity> existsDetails = contentService.list(new LambdaQueryWrapper<OperAccessContentEntity>() {{ | 
				
			||||
            eq(OperAccessContentEntity::getPlanId, entity.getId()); | 
				
			||||
            eq(OperAccessContentEntity::getIsDeleted, 0L); | 
				
			||||
        }}); | 
				
			||||
        Set<Long> detailIds = entity.getAccessContents().stream().map(OperAccessContentDTO::getId).filter(Objects::nonNull).collect(Collectors.toSet()); | 
				
			||||
        List<Long> ids = existsDetails.stream().map(OperAccessContentEntity::getId).filter(id -> !detailIds.contains(id)).collect(Collectors.toList()); | 
				
			||||
        if (!CollectionUtils.isEmpty(ids)) { | 
				
			||||
            contentService.deleteLogic(ids); | 
				
			||||
        } | 
				
			||||
        // 明细添加/修改
 | 
				
			||||
        for (OperAccessContentDTO content : entity.getAccessContents()) { | 
				
			||||
            content.setPlanId(entity.getId()); | 
				
			||||
            if (ObjectUtil.isEmpty(content.getId())) { | 
				
			||||
                contentService.doSave(content); | 
				
			||||
                continue; | 
				
			||||
            } | 
				
			||||
            contentService.doUpdateById(content); | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 开启检修计划流程 | 
				
			||||
     * @param entity | 
				
			||||
     */ | 
				
			||||
    private void startProcess(AccessPlanV4DTO entity) { | 
				
			||||
        Map<String, Object> variables = JSONObject.parseObject(JSONObject.toJSONString(entity), Map.class); | 
				
			||||
        R<BladeFlow> result = flowClient.startProcessInstanceContainNameByKey("overhaul_plan", FlowUtil.getBusinessKey("access_plan_v4",String.valueOf(entity.getId())), entity.getName(), variables); | 
				
			||||
        // 更新任务流程Id
 | 
				
			||||
        if (result.isSuccess()) { | 
				
			||||
            BladeFlow flow = result.getData(); | 
				
			||||
            entity.setProcessInstanceId(flow.getProcessInstanceId()); | 
				
			||||
            planService.updateById(entity); | 
				
			||||
        } else { | 
				
			||||
            throw new ServiceException("开启检修计划流程失败,code=" + result.getCode()); | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 检修计划流程监听 | 
				
			||||
     * @param processWorkFlowResponse | 
				
			||||
     * @return | 
				
			||||
     */ | 
				
			||||
    @Override | 
				
			||||
    public boolean listener(ProcessWorkFlowResponse processWorkFlowResponse) { | 
				
			||||
        Map<String, Object> variables = (Map<String, Object>) processWorkFlowResponse.getVariables(); | 
				
			||||
        AccessPlanV4DTO entity = JSONObject.parseObject(variables.toString(), AccessPlanV4DTO.class); | 
				
			||||
        entity.setTaskName(processWorkFlowResponse.getTaskName()); | 
				
			||||
        entity.setNextStepOperator(processWorkFlowResponse.getNextStepOperator()); | 
				
			||||
        if((Boolean) variables.get("pass")){ | 
				
			||||
            entity.setTaskName("流程结束"); | 
				
			||||
            entity.setNextStepOperator("流程结束,不需要人员处理"); | 
				
			||||
            // 开启检修任务
 | 
				
			||||
            this.startTaskProcess(entity); | 
				
			||||
        } | 
				
			||||
        this.saveAccess(entity); | 
				
			||||
        this.saveAccessMaterial(entity); | 
				
			||||
        this.saveAccessContent(entity); | 
				
			||||
        return true; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 开启检修任务 | 
				
			||||
     * @param entity | 
				
			||||
     */ | 
				
			||||
    private void startTaskProcess(AccessPlanV4DTO entity) { | 
				
			||||
        for(OperAccessContentDTO item : entity.getAccessContents()){ | 
				
			||||
            //任务参数
 | 
				
			||||
            AccessTaskV4DTO task = BeanUtil.copy(item, AccessTaskV4DTO.class); | 
				
			||||
            task.setCreateTime(new Date()); | 
				
			||||
            task.setCreateUser(entity.getCreateUser()); | 
				
			||||
            task.setProcDefId(entity.getProcDefId()); | 
				
			||||
            task.setHandler(item.getManager()); | 
				
			||||
            task.setPlanId(entity.getId()); | 
				
			||||
            task.setContentId(item.getId()); | 
				
			||||
            task.setEmCode(item.getEmCode()); | 
				
			||||
            // 任务详情
 | 
				
			||||
            if(CollectionUtil.isNotEmpty(item.getAccessContentDetails())){ | 
				
			||||
                task.setAccessTaskDetails(item.getAccessContentDetails().stream().map(content -> { | 
				
			||||
                    OperAccessTaskDetailDTO detail = new OperAccessTaskDetailDTO(); | 
				
			||||
                    detail.setContentDetailId(content.getId()); | 
				
			||||
                    detail.setContent(content.getContent()); | 
				
			||||
                    detail.setName(content.getName()); | 
				
			||||
                    return detail; | 
				
			||||
                }).collect(Collectors.toList())); | 
				
			||||
            } | 
				
			||||
            // 材料
 | 
				
			||||
            if(CollectionUtil.isNotEmpty(entity.getAccessMaterials())){ | 
				
			||||
                task.setAccessMaterials(entity.getAccessMaterials().stream().map(o-> BeanUtil.copy(o,OperAccessMaterialDTO.class)).collect(Collectors.toList())); | 
				
			||||
            } | 
				
			||||
            accessTaskV4Service.startProcessV4(task); | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,160 @@
					 | 
				
			||||
package com.hnac.hzims.operational.access.service.impl; | 
				
			||||
 | 
				
			||||
import com.alibaba.fastjson.JSON; | 
				
			||||
import com.alibaba.fastjson.JSONObject; | 
				
			||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
				
			||||
import com.hnac.hzims.common.to.process.ProcessWorkFlowResponse; | 
				
			||||
import com.hnac.hzims.operational.access.dto.AccessTaskV4DTO; | 
				
			||||
import com.hnac.hzims.operational.access.dto.OperAccessTaskDetailDTO; | 
				
			||||
import com.hnac.hzims.operational.access.entity.OperAccessMaterialEntity; | 
				
			||||
import com.hnac.hzims.operational.access.entity.OperAccessTaskDetailEntity; | 
				
			||||
import com.hnac.hzims.operational.access.service.AccessTaskV4Service; | 
				
			||||
import com.hnac.hzims.operational.access.service.IOperAccessMaterialService; | 
				
			||||
import com.hnac.hzims.operational.access.service.IOperAccessTaskDetailService; | 
				
			||||
import com.hnac.hzims.operational.access.service.IOperAccessTaskService; | 
				
			||||
import lombok.RequiredArgsConstructor; | 
				
			||||
import lombok.extern.slf4j.Slf4j; | 
				
			||||
import org.apache.commons.lang3.RandomUtils; | 
				
			||||
import org.springblade.core.log.exception.ServiceException; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springblade.core.tool.utils.CollectionUtil; | 
				
			||||
import org.springblade.core.tool.utils.DateUtil; | 
				
			||||
import org.springblade.core.tool.utils.ObjectUtil; | 
				
			||||
import org.springblade.flow.core.entity.BladeFlow; | 
				
			||||
import org.springblade.flow.core.feign.IFlowClient; | 
				
			||||
import org.springblade.flow.core.utils.FlowUtil; | 
				
			||||
import org.springblade.flow.core.utils.TaskUtil; | 
				
			||||
import org.springframework.stereotype.Service; | 
				
			||||
import org.springframework.transaction.annotation.Transactional; | 
				
			||||
import org.springframework.util.CollectionUtils; | 
				
			||||
 | 
				
			||||
import java.text.DecimalFormat; | 
				
			||||
import java.util.List; | 
				
			||||
import java.util.Map; | 
				
			||||
import java.util.Objects; | 
				
			||||
import java.util.Set; | 
				
			||||
import java.util.stream.Collectors; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Service | 
				
			||||
@Slf4j | 
				
			||||
@RequiredArgsConstructor | 
				
			||||
public class AccessTaskV4ServiceImpl implements AccessTaskV4Service { | 
				
			||||
 | 
				
			||||
    private final IOperAccessTaskService taskService; | 
				
			||||
 | 
				
			||||
    private final IOperAccessMaterialService materialService; | 
				
			||||
 | 
				
			||||
    private final IOperAccessTaskDetailService detailService; | 
				
			||||
 | 
				
			||||
    private final IFlowClient flowClient; | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 开启检修任务流程 | 
				
			||||
     * @param entity | 
				
			||||
     * @return | 
				
			||||
     */ | 
				
			||||
    @Override | 
				
			||||
    @Transactional(rollbackFor = Exception.class) | 
				
			||||
    public boolean startProcessV4(AccessTaskV4DTO entity) { | 
				
			||||
        // 步骤1.保存检修任务
 | 
				
			||||
        this.save(entity); | 
				
			||||
 | 
				
			||||
        // 步骤2.保存检修材料
 | 
				
			||||
        this.saveMaterial(entity); | 
				
			||||
 | 
				
			||||
        // 步骤3.保存检修详情
 | 
				
			||||
        this.saveDetails(entity); | 
				
			||||
 | 
				
			||||
        // 步骤4.开启检修任务流程
 | 
				
			||||
        this.startProcess(entity); | 
				
			||||
        return true; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 开启检修流程 | 
				
			||||
     * @param entity | 
				
			||||
     */ | 
				
			||||
    private void startProcess(AccessTaskV4DTO entity) { | 
				
			||||
        Map<String, Object> variables = JSONObject.parseObject(JSONObject.toJSONString(entity), Map.class); | 
				
			||||
        variables.put("handler",TaskUtil.getTaskUser(entity.getHandler().toString())); | 
				
			||||
        R<BladeFlow> result = flowClient.startProcessInstanceContainNameByKey("overhaul_task", FlowUtil.getBusinessKey("access_task_v4", String.valueOf(entity.getId())), entity.getName(),variables); | 
				
			||||
        // 更新任务流程Id
 | 
				
			||||
        if (result.isSuccess()) { | 
				
			||||
            BladeFlow flow = result.getData(); | 
				
			||||
            entity.setProcessInstanceId(flow.getProcessInstanceId()); | 
				
			||||
            taskService.updateById(entity); | 
				
			||||
        } else { | 
				
			||||
            throw new ServiceException("开启检修任务流程失败,code=" + result.getCode()); | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 检修任务保存 | 
				
			||||
     * @param entity | 
				
			||||
     */ | 
				
			||||
    private void save(AccessTaskV4DTO entity) { | 
				
			||||
        entity.setCode("TASK" + DateUtil.format(DateUtil.now(), DateUtil.PATTERN_DATETIME_MINI) + new DecimalFormat("###").format(RandomUtils.nextInt(0, 999))); | 
				
			||||
        List<OperAccessMaterialEntity> materialEntityList = JSONObject.parseArray(JSON.toJSONString(entity.getAccessMaterials()), OperAccessMaterialEntity.class); | 
				
			||||
        taskService.save(entity); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 保存检修材料 | 
				
			||||
     * @param entity | 
				
			||||
     */ | 
				
			||||
    private void saveMaterial(AccessTaskV4DTO entity) { | 
				
			||||
        if (CollectionUtil.isNotEmpty(entity.getAccessMaterials())) { | 
				
			||||
           return; | 
				
			||||
        } | 
				
			||||
        materialService.saveOrUpdateBatch(entity.getAccessMaterials().stream().peek(material -> { | 
				
			||||
            material.setPlanId(null); | 
				
			||||
            material.setId(null); | 
				
			||||
            material.setTaskId(entity.getId()); | 
				
			||||
        }).collect(Collectors.toList())); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 保存检修对象 | 
				
			||||
     * @param entity | 
				
			||||
     * | 
				
			||||
     */ | 
				
			||||
    private void saveDetails(AccessTaskV4DTO entity) { | 
				
			||||
        if(CollectionUtil.isEmpty(entity.getAccessTaskDetails())){ | 
				
			||||
            return; | 
				
			||||
        } | 
				
			||||
        // 查询检修任务关联的检修对象
 | 
				
			||||
        List<OperAccessTaskDetailEntity> existsDetails = detailService.list(new LambdaQueryWrapper<OperAccessTaskDetailEntity>() {{ | 
				
			||||
            eq(OperAccessTaskDetailEntity::getTaskId, entity.getId()); | 
				
			||||
            eq(OperAccessTaskDetailEntity::getIsDeleted, 0L); | 
				
			||||
        }}); | 
				
			||||
        Set<Long> detailIds = entity.getAccessTaskDetails().stream().map(OperAccessTaskDetailDTO::getId).filter(Objects::nonNull).collect(Collectors.toSet()); | 
				
			||||
        List<Long> ids = existsDetails.stream().map(OperAccessTaskDetailEntity::getId).filter(id -> !detailIds.contains(id)).collect(Collectors.toList()); | 
				
			||||
        if (!CollectionUtils.isEmpty(ids)) { | 
				
			||||
            detailService.deleteLogic(ids); | 
				
			||||
        } | 
				
			||||
        // 检修任务对象
 | 
				
			||||
        Set<Long> existsIds = existsDetails.stream().map(OperAccessTaskDetailEntity::getId).collect(Collectors.toSet()); | 
				
			||||
        for (OperAccessTaskDetailDTO details : entity.getAccessTaskDetails()) { | 
				
			||||
            details.setTaskId(entity.getId()); | 
				
			||||
            if (ObjectUtil.isNotEmpty(entity.getId())) { | 
				
			||||
                detailService.updateById(details); | 
				
			||||
                continue; | 
				
			||||
            } | 
				
			||||
            detailService.doSave(details); | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 检修任务流程监听 | 
				
			||||
     * @param processWorkFlowResponse | 
				
			||||
     * @return | 
				
			||||
     */ | 
				
			||||
    @Override | 
				
			||||
    public boolean listener(ProcessWorkFlowResponse processWorkFlowResponse) { | 
				
			||||
 | 
				
			||||
        return false; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue