Skip to content

任务驿站

任务驿站是自上而下开展任务交办数据采集类的统一化平台,平台提供统一的发布流程,统一的进度控制。接入时提供任务采集、编辑、查看等功能,并遵守相应的流程规范。
原理: 用户点击应用时平台服务目录时自动追加stoken/sroute/sobject参数,对接应用通过接口解析用户信息,路由信息、对象信息,自行设置本应用登录状态并跳转相应的视图页面。
登录用户stoken参数通过 “2.3.1用户信息接口” 进行解析并设置登录状态;
视图路由sroute参数通过约定标识自行处理页面路由,如:fwez/rwez等;
数据对象sobject参数通过将必要的参数转码后传递,转码规则如下:
对象转密文方法:btoa(encodeURIComponent(JSON.stringify(sobject)))
密文转对象方法:JSON.parse(decodeURIComponent(atob(sobject)))


  1. 通过应用配置获取应用地址并追加相应参数;
  2. 前端接收参数设置登录状态并跳转对应页面;
  3. 后端接收参数并提供登录等相关服务的接口。
http
https://www.app.com?stoken=xxxx&sroute=rwez&sobject=xxxx
vue
<template>
	<v-app>
		<v-overlay opacity="0">加载中......</v-overlay>
	</v-app>
</template>
<script>
import Request from "@/commons/request";
import Storage from "@/commons/storage";
export default {
	name: "App",
	data: () => ({ valid: null, note: "授权登录中..." }),
	async mounted() {
		// 1.授权用户登录
		let stoken = this.GetQueryString("stoken");
		await this.UserLoginByData(stoken);

        // 2.解析服务对象
        let sobject = this.GetQueryString("sobject");
        let jobject = JSON.parse(decodeURIComponent(atob(sobject)));
        Storage.set("sobject", jobject);

        // 3.跳转对应页面
        let sroute = this.GetQueryString("sroute");
        switch (sroute) {
            case "fwez": this.$router.push("/service/fwez"); break;
            case "fwsh": this.$router.push("/service/fwsh"); break;
            case "fwss": this.$router.push("/service/fwss"); break;
            default: this.$router.push("/service/index");
        }
	},
	methods: {
	  async	UserLoginByData(stoken) {
            if (!stoken) {
                this.valid = false;
                this.note = "授权登录错误,用户令牌不能为空,请关闭页面后重试!";
                return;
            }
			Request.postJson('/admin/login', { stoken: stoken }).then((res) => {
				if (res.meta.success && res.data) {
					//1.获取用户信息成功
                    Storage.set("token", res.data.token);
					this.valid = true;
					this.note = "授权登录成功,正在跳转请稍后...";
				} else {
					//2.获取用户信息失败
					this.valid = false;
					this.note = "授权登录失败,请关闭页面后重试!";
				}
			});
		},
		GetQueryString(name) {
			var reg = new RegExp("[?&]" + name + "=([^&^#^/]*)", "i");
			var res = window.location.href.match(reg);
			return res != null ? unescape(res[1]) : "";
		},
	},
};
</script>
<style>
body { background-size: cover; }
</style>
java
package cn.liangthink.xxx.service.impl;

import java.util.Date;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import cn.liangthink.xxx.service.AcisService;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class AcisServiceImpl implements AcisService {
    private RestTemplate rest = new RestTemplate();
    private String mp = "https://xxxxxx/";
    private String ak = "xxxxxx";
    private String sk = "xxxxxx";

    @Override
    public String token() {
        String uri = mp + "/sure/oauth/access_token";
        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
        long ts = (new Date()).getTime();
        String si = String.format("AK:%s/TS:%s/SK:%s", ak, ts, sk);
        params.add("client_id", ak);
        params.add("timestamp", ts);
        params.add("signature", DigestUtils.md5DigestAsHex(si.getBytes()));
        JSONObject json = rest.postForObject(uri, params, JSONObject.class);
        return json.getJSONObject("data").getString("access_token");
    }

    @Override
    public Object userinfo(String userinfo) {
        JSONObject result = new JSONObject();
        String uri = mp + "/open/api/acis/udsa/userbytoken";
        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
        params.add("stoken", JSON.parseObject(userinfo).getString("stoken"));
        params.add("access_token", this.token());
        JSONObject json = rest.postForObject(uri, params, JSONObject.class);
        log.debug(json.toJSONString());
        JSONObject user = json.getJSONObject("data");
        if (user == null) {
            return result.fluentPut("meta", false).fluentPut("data", "获取失败!");
        }
        return result.fluentPut("meta", true).fluentPut("data", user);
    }
}

1.采集接入

采集(调查)是任务驿站在治理端为基层提供的统一任务采集入口平台,支持电脑版和手机版,采集操作时平台将stoken/sroute/sobject参数在地址栏带入应用中,应用处理后跳转采集页面,完成对象状况采集。视图代码:rwez

http
https://www.app.com?stoken=xxxx&sroute=rwez&sobject=xxxx

2.数据反馈

任务驿站场景接入是为基层提供统一的任务对象采集入口,简化任务操作过程;与此同时,任务中心提供统一的数据汇集接口,实现数据规范化的汇集。任务数据汇集主要包括:任务创建统一赋码、任务对象推送部署、任务状态开始关闭、任务采集结果反馈等四个接口,详见 “5.3 任务结果反馈”部分。