# 竞价系统-操作配置

##概述 所有操作类均实现OperationInterface,因此拥有beforeDone(前置操作), done(主操作), afterDone(后置操作)三个成员方法。 且在类上标注@Service注解,以该类的全路径类名作为Bean名称。
所有实现类均放置在com.soeasycenter.college.operation.impl(通用操作)或者 com.soeasycenter.college.operation.impl.personalize(高校个性化操作)下。

# 高校个性化

通常比较小的高校个性化,可以通过增加参数的方式直接在通用操作添加相关处理; 如果高校个性化比较大,则可以新建一个个性化操作类(在通用操作后加高校缩写), 由开发者根据实际情况觉得是否继承原操作类以及是否调用原操作类的方法。

# 调用方法

  1. 【推荐】使用OperationUtil.doOperation方法,传入操作代码和参数
    OperationParamEntity<IntegrateResultParamDto> param = new OperationParamEntity<>();
    //操作代码
    param.setCode(OperationConstant.OP_C8010);
    //操作参数
    param.setData(paramDto);
    OperationUtil.doOperation(param);
  1. 【不推荐】直接注入该类,然后调用beforeDone, done, afterDone三个方法

# 初始化类

操作配置由OperationData在系统启动时进行初始化,对配置信息完成解析并载入缓存。

# 修改

登录高校端,到“系统配置”-“操作配置”中进行修改,保存后缓存回自动刷新该单位的操作配置的缓存, 并将修改内容即时交换到中心端。

# 配置格式

配置格式为JSON,每个操作为列表中一个一个元素
【示例】

[
  {
    "op_code": "C0010",
    "op_name": "新增申购",
    "op_type": 0,
    "pre_action": "com.soeasycenter.college.operation.impl.NewOrderOperation",
    "done_action": "com.soeasycenter.college.operation.impl.NewOrderOperation",
    "after_action": "com.soeasycenter.college.operation.impl.NewOrderOperation",
    "allow_sms": 0,
    "ok_sms": [
      {
        "sms_obj": "",
        "sms_id": ""
      }
    ],
    "error_sms": [
      {
        "sms_obj": "",
        "sms_id": ""
      }
    ],
    "ms_url": "",
    "exception_handle_code": 7,
    "rollback_type": 0
  },
...(表示省略)
]

# 操作配置项

  1. op_code (操作代码)
    【示例】:C3001
  2. op_name (操作名称)
    【示例】:一审通过
  3. op_type (操作类型)【已废弃】
  4. pre_action (前置操作实现类)
    此操作会调用该名称对应Bean的beforeDone方法
    【示例】:com.soeasycenter.college.operation.impl.IntegrateResultOperation
  5. done (主操作实现类) 此操作会调用该名称对应Bean的done方法
    【示例】:com.soeasycenter.college.operation.impl.IntegrateResultOperation
  6. after_action (后置操作实现类)
    此操作会调用该名称对应Bean的afterDone方法
    【示例】:com.soeasycenter.college.operation.impl.IntegrateResultOperation
  7. allow_sms (是否开启短信通知 0:关闭;1:开启)
    【注意】即使配置了ok_sms或者error_sms,也需要将此项设置为1,否则仍然不会发送短信
    【示例】:1
  8. ok_sms (操作成功短信模板配置) 此字段的值为列表,列表中元素的配置项为
    1. smsId(中心端模板ID或阿里云模板ID)
    2. smsObj 短信接收对象(1:申购人;2:一审管理员;4:二审管理员;8:成交企业,如果需要发送给多个对象, 则将对应的代码相加,如需要发送给申购人和成交企业,则配置为1 + 8 = 9)
    【示例】
    [{"sms_obj":"0100","sms_id":"1"}, {"sms_obj":"0101","sms_id":"8"}] 
    
  9. error_sms (操作失败短信模板配置)
    同上。
  10. ms_url (微服务地址)【已废弃】
  11. exception_handle_code (异常处理类型)
    控制beforeDone, done, afterDone和发送数据到中心端的异常是否抛出, 具体代码如下:
    beforeDone:1
    done: 2
    afterDone: 4
    发送到中心端: 8
    如果多种情况需要抛出异常,则将对应的代码相加填入配置即可。如beforeDone和afterDone均需要抛出异常, 则此项应配置为1 + 4 = 5。如果配置为0xff,则以上四种情况有异常时均会抛出。
    【示例】:0xff
  12. rollbackType (回滚类型 0:不回滚;1:回滚)
    关键操作(如,发布竞价、发布成交结果等)应配置为回滚,即发生异常时,数据库回滚; 其它操作则根据业务情况自行决定是否回滚 【示例】:0
  13. permission_code (权限码)
    如果此项配置了值,则用户在调用此操作时必须拥有该值的shiro权限,否则会抛出权限不足的异常。
    【示例】: pumgr:inteAu:approve
  14. targetNodeCode (关联节点代码)
    此字段由操作定义实现自行决定是否使用、如何使用。 【示例】:FIRINST

# 子操作调用顺序

  1. 调用顺序
    beforeDone -> 即时数据交换 -> done -> 即时数据交换 -> afterDone -> 即时数据交换

  2. 为什么每个子操作后面都有即时数据交换?
    如果去掉前两次数据交换,只在afterDone后面进行一次即时数据交换。则当子操作A.afterDone又调用了其它操作(B)时, B的即时交换会早于A的即时交换进行,从而导致数据混乱甚至覆盖。

    例如,用户初选提交操作(转一审),后操作进行了自动发布成交结果,调用了“发布成交结果”的操作, 若只有最后一次数据交换,则会对申购单先发布成交结果,再转一审,最终申购单会处于一审状态 (但实际上正确的状态应该是发布成交结果)。

    因此将即时数据交换操作添加到每一个子操作后,数据交换后, 将DTO中的交换数据列表清空,避免重复交换 (特别是会引发错误的数据,如果不清除,在接下来的子操作依然会引发错误)

Last Updated: 3/12/2020, 2:07:22 PM