学习记录604@flowable之moveActivityIdTo任务回退特殊案例分析

本文例句几个使用moveActivityIdTo回退任务的情况分析,都是比较特殊的,包含了网关和会签也就是多实例的情况
注意面谈和下户是会签的。

流程图

在这里插入图片描述

bpmn

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef" exporter="Flowable Open Source Modeler" exporterVersion="6.7.2">
  <process id="shenpi1" name="审批1" isExecutable="true">
    <startEvent id="startEvent1" flowable:formKey="form1" flowable:formFieldValidation="true"></startEvent>
    <userTask id="task1" name="task1" flowable:assignee="${task1User}" flowable:formFieldValidation="true">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-FC6E2281-7982-46E4-8DE1-C0E348423AEE" sourceRef="startEvent1" targetRef="task1"></sequenceFlow>
    <endEvent id="sid-046F1A3D-D72A-4E4A-B96E-67CEEDB5546A"></endEvent>
    <sequenceFlow id="sid-682B5211-BD85-47CC-A1A4-DFC096B93EA9" sourceRef="task1" targetRef="sid-958847DE-F754-4CAE-9BDC-A10F4675FAD3"></sequenceFlow>
    <inclusiveGateway id="sid-958847DE-F754-4CAE-9BDC-A10F4675FAD3"></inclusiveGateway>
    <userTask id="签约" name="签约" flowable:assignee="${signUser}" flowable:formFieldValidation="true">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <userTask id="面谈" name="面谈" flowable:assignee="${interviewUser}" flowable:formFieldValidation="true">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
      <multiInstanceLoopCharacteristics isSequential="false" flowable:collection="interviewUserList" flowable:elementVariable="interviewUser">
        <extensionElements></extensionElements>
      </multiInstanceLoopCharacteristics>
    </userTask>
    <userTask id="下户" name="下户" flowable:assignee="${settledownUser}" flowable:formFieldValidation="true">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
      <multiInstanceLoopCharacteristics isSequential="false" flowable:collection="settledownUserList" flowable:elementVariable="settledownUser">
        <extensionElements></extensionElements>
      </multiInstanceLoopCharacteristics>
    </userTask>
    <inclusiveGateway id="sid-A43ADF34-6A6C-442D-A852-E361D3B1C81F"></inclusiveGateway>
    <userTask id="task3" name="task3" flowable:assignee="${task3User}" flowable:formFieldValidation="true">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-D0D8A122-4BAD-465F-9E47-0BFE56443C2B" sourceRef="sid-A43ADF34-6A6C-442D-A852-E361D3B1C81F" targetRef="task3"></sequenceFlow>
    <userTask id="task4" name="task4" flowable:assignee="${task4User}" flowable:formFieldValidation="true">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-F943C505-8338-4C48-B981-A6F2F5B2B880" sourceRef="task3" targetRef="task4"></sequenceFlow>
    <sequenceFlow id="sid-51659918-0236-49D6-8492-7733C325D21E" sourceRef="task4" targetRef="sid-046F1A3D-D72A-4E4A-B96E-67CEEDB5546A"></sequenceFlow>
    <sequenceFlow id="sid-41BBDCE1-FF5E-45FD-BDA8-37AD7A2FF3FE" sourceRef="sid-958847DE-F754-4CAE-9BDC-A10F4675FAD3" targetRef="签约"></sequenceFlow>
    <sequenceFlow id="sid-EF358D70-81F5-4A1B-AA65-FEC76F6C1AC8" name="是否下户" sourceRef="sid-958847DE-F754-4CAE-9BDC-A10F4675FAD3" targetRef="下户">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${isSettledown}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-308E451E-FB93-404A-937F-D9743F9C394E" name="是否面谈" sourceRef="sid-958847DE-F754-4CAE-9BDC-A10F4675FAD3" targetRef="面谈">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${isInterview}]]></conditionExpression>
    </sequenceFlow>
    <userTask id="签约后" name="签约后" flowable:assignee="${signafterUser}" flowable:formFieldValidation="true">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-89E68DE4-FC1D-4982-B872-FAC7CD294CB6" sourceRef="签约" targetRef="签约后"></sequenceFlow>
    <sequenceFlow id="sid-A14E6EDF-2300-4E8C-AC0C-346373724498" sourceRef="签约后" targetRef="sid-A43ADF34-6A6C-442D-A852-E361D3B1C81F"></sequenceFlow>
    <userTask id="面谈后" name="面谈后" flowable:assignee="${interviewafterUser}" flowable:formFieldValidation="true">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-A22F3A80-4729-4908-ADE2-A5E57A04D9DC" sourceRef="面谈" targetRef="面谈后"></sequenceFlow>
    <sequenceFlow id="sid-59A84E5A-A993-402C-ACBD-018F86773CF9" sourceRef="面谈后" targetRef="sid-A43ADF34-6A6C-442D-A852-E361D3B1C81F"></sequenceFlow>
    <userTask id="下户后" name="下户后" flowable:assignee="${settledownafterUser}" flowable:formFieldValidation="true">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-2DB7DC75-36E4-4103-9978-2D463273C55E" sourceRef="下户" targetRef="下户后"></sequenceFlow>
    <sequenceFlow id="sid-9A371B81-3050-4A98-9EA4-716D8CBDE88B" sourceRef="下户后" targetRef="sid-A43ADF34-6A6C-442D-A852-E361D3B1C81F"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_shenpi1">
    <bpmndi:BPMNPlane bpmnElement="shenpi1" id="BPMNPlane_shenpi1">
      <bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
        <omgdc:Bounds height="30.0" width="30.0" x="100.0" y="163.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="task1" id="BPMNShape_task1">
        <omgdc:Bounds height="80.0" width="100.0" x="175.0" y="138.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-046F1A3D-D72A-4E4A-B96E-67CEEDB5546A" id="BPMNShape_sid-046F1A3D-D72A-4E4A-B96E-67CEEDB5546A">
        <omgdc:Bounds height="28.0" width="28.0" x="1170.0" y="164.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-958847DE-F754-4CAE-9BDC-A10F4675FAD3" id="BPMNShape_sid-958847DE-F754-4CAE-9BDC-A10F4675FAD3">
        <omgdc:Bounds height="40.0" width="40.0" x="320.0" y="158.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="签约" id="BPMNShape_签约">
        <omgdc:Bounds height="80.0" width="100.0" x="480.0" y="30.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="面谈" id="BPMNShape_面谈">
        <omgdc:Bounds height="80.0" width="100.0" x="465.0" y="135.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="下户" id="BPMNShape_下户">
        <omgdc:Bounds height="80.0" width="100.0" x="480.0" y="240.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-A43ADF34-6A6C-442D-A852-E361D3B1C81F" id="BPMNShape_sid-A43ADF34-6A6C-442D-A852-E361D3B1C81F">
        <omgdc:Bounds height="40.0" width="40.0" x="780.0" y="158.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="task3" id="BPMNShape_task3">
        <omgdc:Bounds height="80.0" width="100.0" x="855.0" y="135.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="task4" id="BPMNShape_task4">
        <omgdc:Bounds height="80.0" width="100.0" x="990.0" y="138.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="签约后" id="BPMNShape_签约后">
        <omgdc:Bounds height="80.0" width="100.0" x="625.0" y="30.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="面谈后" id="BPMNShape_面谈后">
        <omgdc:Bounds height="80.0" width="100.0" x="625.0" y="138.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="下户后" id="BPMNShape_下户后">
        <omgdc:Bounds height="80.0" width="100.0" x="615.0" y="240.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sid-A14E6EDF-2300-4E8C-AC0C-346373724498" id="BPMNEdge_sid-A14E6EDF-2300-4E8C-AC0C-346373724498" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="20.0" flowable:targetDockerY="20.0">
        <omgdi:waypoint x="721.235515964831" y="109.95"></omgdi:waypoint>
        <omgdi:waypoint x="789.2670527670527" y="168.72961373390558"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-9A371B81-3050-4A98-9EA4-716D8CBDE88B" id="BPMNEdge_sid-9A371B81-3050-4A98-9EA4-716D8CBDE88B" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="20.0" flowable:targetDockerY="20.0">
        <omgdi:waypoint x="714.9499999999999" y="242.2222222222222"></omgdi:waypoint>
        <omgdi:waypoint x="788.6075949367088" y="186.58607594936709"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-2DB7DC75-36E4-4103-9978-2D463273C55E" id="BPMNEdge_sid-2DB7DC75-36E4-4103-9978-2D463273C55E" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
        <omgdi:waypoint x="579.9499999998759" y="280.0"></omgdi:waypoint>
        <omgdi:waypoint x="614.999999999972" y="280.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-59A84E5A-A993-402C-ACBD-018F86773CF9" id="BPMNEdge_sid-59A84E5A-A993-402C-ACBD-018F86773CF9" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="20.0" flowable:targetDockerY="20.0">
        <omgdi:waypoint x="724.9499999999999" y="178.0"></omgdi:waypoint>
        <omgdi:waypoint x="780.0" y="178.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-51659918-0236-49D6-8492-7733C325D21E" id="BPMNEdge_sid-51659918-0236-49D6-8492-7733C325D21E" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
        <omgdi:waypoint x="1089.9499999999825" y="178.0"></omgdi:waypoint>
        <omgdi:waypoint x="1170.0" y="178.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-FC6E2281-7982-46E4-8DE1-C0E348423AEE" id="BPMNEdge_sid-FC6E2281-7982-46E4-8DE1-C0E348423AEE" flowable:sourceDockerX="15.0" flowable:sourceDockerY="15.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
        <omgdi:waypoint x="129.9499984899576" y="178.0"></omgdi:waypoint>
        <omgdi:waypoint x="174.9999999999917" y="178.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-A22F3A80-4729-4908-ADE2-A5E57A04D9DC" id="BPMNEdge_sid-A22F3A80-4729-4908-ADE2-A5E57A04D9DC" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
        <omgdi:waypoint x="564.95" y="175.0"></omgdi:waypoint>
        <omgdi:waypoint x="595.0" y="175.0"></omgdi:waypoint>
        <omgdi:waypoint x="595.0" y="178.0"></omgdi:waypoint>
        <omgdi:waypoint x="624.9999999999812" y="178.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-89E68DE4-FC1D-4982-B872-FAC7CD294CB6" id="BPMNEdge_sid-89E68DE4-FC1D-4982-B872-FAC7CD294CB6" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
        <omgdi:waypoint x="579.95" y="70.0"></omgdi:waypoint>
        <omgdi:waypoint x="625.0" y="70.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-F943C505-8338-4C48-B981-A6F2F5B2B880" id="BPMNEdge_sid-F943C505-8338-4C48-B981-A6F2F5B2B880" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
        <omgdi:waypoint x="954.9499999999999" y="176.11"></omgdi:waypoint>
        <omgdi:waypoint x="989.9999999999998" y="176.88888888888889"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-D0D8A122-4BAD-465F-9E47-0BFE56443C2B" id="BPMNEdge_sid-D0D8A122-4BAD-465F-9E47-0BFE56443C2B" flowable:sourceDockerX="20.5" flowable:sourceDockerY="20.5" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
        <omgdi:waypoint x="819.8034722222221" y="177.85185185185185"></omgdi:waypoint>
        <omgdi:waypoint x="854.9999999999997" y="176.67296650717702"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-EF358D70-81F5-4A1B-AA65-FEC76F6C1AC8" id="BPMNEdge_sid-EF358D70-81F5-4A1B-AA65-FEC76F6C1AC8" flowable:sourceDockerX="20.5" flowable:sourceDockerY="20.5" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
        <omgdi:waypoint x="348.6019627631508" y="189.3472782333503"></omgdi:waypoint>
        <omgdi:waypoint x="417.79998779296875" y="282.0"></omgdi:waypoint>
        <omgdi:waypoint x="480.0" y="280.89037423468073"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-308E451E-FB93-404A-937F-D9743F9C394E" id="BPMNEdge_sid-308E451E-FB93-404A-937F-D9743F9C394E" flowable:sourceDockerX="20.5" flowable:sourceDockerY="20.5" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
        <omgdi:waypoint x="359.43685852981963" y="178.5"></omgdi:waypoint>
        <omgdi:waypoint x="412.5" y="178.5"></omgdi:waypoint>
        <omgdi:waypoint x="412.5" y="175.0"></omgdi:waypoint>
        <omgdi:waypoint x="465.0" y="175.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-682B5211-BD85-47CC-A1A4-DFC096B93EA9" id="BPMNEdge_sid-682B5211-BD85-47CC-A1A4-DFC096B93EA9" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="20.5" flowable:targetDockerY="20.5">
        <omgdi:waypoint x="274.94999999999806" y="178.21623376623378"></omgdi:waypoint>
        <omgdi:waypoint x="320.4130434782609" y="178.4130434782609"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-41BBDCE1-FF5E-45FD-BDA8-37AD7A2FF3FE" id="BPMNEdge_sid-41BBDCE1-FF5E-45FD-BDA8-37AD7A2FF3FE" flowable:sourceDockerX="20.5" flowable:sourceDockerY="20.5" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
        <omgdi:waypoint x="347.3709969788519" y="165.3882175226586"></omgdi:waypoint>
        <omgdi:waypoint x="397.5" y="70.0"></omgdi:waypoint>
        <omgdi:waypoint x="479.99999999999966" y="70.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

回退情况1

红框表示当前节点,箭头表示从哪里回退到哪里。
在这里插入图片描述

流程刚刚经过task1,现在从签约节点回退到task1,我本来想的是这个操作会把所有的并行节点都回退到task1,但是并没有,而是撤销了签约任务,多个task1,其他的下户面谈任务还在,然后再提交task1,就又产生了新的下户和面谈任务。

// 从签约回退到task1,刚完成task1,没有完成其他任务
    @Transactional
    public void back1() {
        Task task = taskService.createTaskQuery().taskAssignee("signUser").singleResult();
        runtimeService.createChangeActivityStateBuilder().processInstanceId(task.getProcessInstanceId()).moveActivityIdTo(task.getTaskDefinitionKey(),"task1").changeState();
    }

其实按照上面的程序moveActivityIdTo,确实是移动某个单一(不是会签)节点到某个节点,不会回退其他并行任务。

回退情况2

红框表示当前节点,箭头表示从哪里回退到哪里。
在这里插入图片描述

从面谈回退到task1,此时刚完成task1,没有完成其他任务,结果是其他的会签面谈任务也被回退掉了,这个比较合乎常理,现实生活中,多人会签如果其中一个人驳回了任务,那么其他的会签任务也同样回退,然后再进行新的会签。比如投票,这次投票没有达到最低比例要求,投票不成立,下次再次每个人重新投票,这才是合理的。

// 从面谈回退到task1,此时刚完成task1,没有完成其他任务
    @Transactional
    public void back2() {
        Task task = taskService.createTaskQuery().taskAssignee("interviewUser1").list().get(0);
        runtimeService.createChangeActivityStateBuilder().processInstanceId(task.getProcessInstanceId()).moveActivityIdTo(task.getTaskDefinitionKey(),"task1").changeState();
    }

回退情况3

红框表示当前节点,箭头表示从哪里回退到哪里。
在这里插入图片描述

从下户回退到签约,也就是并行分支间跨分支跳转了,本来以为会报错,但是竟然成功了,没有报错,但是有什么意义呢,虽然程序上没有报错,实际情况这种操作是不合理的。

   // 从下户回退到签约,此时刚完成task1,没有完成其他任务
    @Transactional
    public void back3() {
        Task task = taskService.createTaskQuery().taskAssignee("settledownUser1").list().get(0);
        runtimeService.createChangeActivityStateBuilder().processInstanceId(task.getProcessInstanceId()).moveActivityIdTo(task.getTaskDefinitionKey(),"task1").changeState();
    }

回退情况4

红框表示当前节点,箭头表示从哪里回退到哪里。
在这里插入图片描述

下户后节点回退到下户会签节点,结果也是合理的,出现了两个下户任务,也就是再重新会签。

    // 从下户后回退到下户会签
    @Transactional
    public void back4() {
        Task task = taskService.createTaskQuery().taskAssignee("settledownafterUser").list().get(0);
        runtimeService.createChangeActivityStateBuilder().processInstanceId(task.getProcessInstanceId()).moveActivityIdTo(task.getTaskDefinitionKey(),"下户").changeState();
    }

回退情况5

红框表示当前节点,箭头表示从哪里回退到哪里。
在这里插入图片描述
task3回退到回退到面谈会签,结果还是比较合理的,出现了两个面谈任务。而其他分支处于完成的情况,在task3处等待。

    // 从task3后回退到面谈会签
    @Transactional
    public void back5() {
        Task task = taskService.createTaskQuery().taskAssignee("task3User").list().get(0);
        runtimeService.createChangeActivityStateBuilder().processInstanceId(task.getProcessInstanceId()).moveActivityIdTo(task.getTaskDefinitionKey(),"面谈").changeState();
    }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值