1个文件已删除
	
		
		13个文件已修改
	
		
		1 文件已重命名
	
		
		12个文件已添加
	
	
 
	
	
	
	
	
	
	
	
 |  |  | 
 |  |  |             <artifactId>easyexcel</artifactId> | 
 |  |  |             <version>2.2.6</version> | 
 |  |  |         </dependency> | 
 |  |  |         <!-- okHttp3 --> | 
 |  |  |         <dependency> | 
 |  |  |             <groupId>com.squareup.okhttp3</groupId> | 
 |  |  |             <artifactId>okhttp</artifactId> | 
 |  |  |             <version>3.10.0</version> | 
 |  |  |         </dependency> | 
 |  |  |     </dependencies> | 
 |  |  |  | 
 |  |  |     <build> | 
 
| New file | 
 |  |  | 
 |  |  | package com.zy.asrs.common.domain.enums; | 
 |  |  |  | 
 |  |  | public enum ApiType { | 
 |  |  |  | 
 |  |  |     ORDER_COMPLETE("order_complete", "订单完成"), | 
 |  |  |     ORDER_CANCEL("order_cancel", "订单取消"), | 
 |  |  |     REPORT_STOCK("report_stock", "库存上报"), | 
 |  |  |     ; | 
 |  |  |     public String type; | 
 |  |  |     public String desc; | 
 |  |  |  | 
 |  |  |     ApiType(String type, String desc) { | 
 |  |  |         this.type = type; | 
 |  |  |         this.desc = desc; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static ApiType get(String id) { | 
 |  |  |         if (null == id) { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         for (ApiType type : ApiType.values()) { | 
 |  |  |             if (type.type.equals(id)) { | 
 |  |  |                 return type; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static ApiType get(ApiType type) { | 
 |  |  |         if (null == type) { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         for (ApiType type1 : ApiType.values()) { | 
 |  |  |             if (type1 == type) { | 
 |  |  |                 return type1; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     REPORT_COMPLETE(6, "上报完成") | 
 |  |  |     ; | 
 |  |  |  | 
 |  |  |     private Integer id; | 
 |  |  |     private String desc; | 
 |  |  |     public Integer id; | 
 |  |  |     public String desc; | 
 |  |  |  | 
 |  |  |     OrderSettleType(Integer id, String desc) { | 
 |  |  |         this.id = id; | 
 
| New file | 
 |  |  | 
 |  |  | package com.zy.asrs.common.openapi.entity; | 
 |  |  |  | 
 |  |  | import java.text.SimpleDateFormat; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | import com.zy.asrs.common.domain.enums.ApiType; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.IdType; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableId; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableLogic; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableName; | 
 |  |  | import io.swagger.annotations.ApiModel; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import com.zy.asrs.framework.common.Cools; | 
 |  |  | import com.zy.asrs.framework.common.SpringUtils; | 
 |  |  | import com.zy.asrs.common.sys.entity.User; | 
 |  |  | import com.zy.asrs.common.sys.entity.Host; | 
 |  |  | import com.zy.asrs.common.sys.service.UserService; | 
 |  |  | import com.zy.asrs.common.sys.service.HostService; | 
 |  |  |  | 
 |  |  | import java.io.Serializable; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | @TableName("openapi_api_list") | 
 |  |  | public class ApiList implements Serializable { | 
 |  |  |  | 
 |  |  |     private static final long serialVersionUID = 1L; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ID | 
 |  |  |      */ | 
 |  |  |     @ApiModelProperty(value= "ID") | 
 |  |  |     @TableId(value = "id", type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 上报URL | 
 |  |  |      */ | 
 |  |  |     @ApiModelProperty(value= "上报URL") | 
 |  |  |     private String url; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 上报类型 | 
 |  |  |      */ | 
 |  |  |     @ApiModelProperty(value= "上报类型") | 
 |  |  |     private String type; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 是否开启 0: 关闭  1: 开启   | 
 |  |  |      */ | 
 |  |  |     @ApiModelProperty(value= "是否开启 0: 关闭  1: 开启  ") | 
 |  |  |     private Integer status; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 授权商户 | 
 |  |  |      */ | 
 |  |  |     @ApiModelProperty(value= "授权商户") | 
 |  |  |     private Long hostId; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 创建时间 | 
 |  |  |      */ | 
 |  |  |     @ApiModelProperty(value= "创建时间") | 
 |  |  |     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private Date createTime; | 
 |  |  |  | 
 |  |  |     public ApiList() {} | 
 |  |  |  | 
 |  |  |     public ApiList(String url,String type,Integer status,Long hostId,Date createTime) { | 
 |  |  |         this.url = url; | 
 |  |  |         this.type = type; | 
 |  |  |         this.status = status; | 
 |  |  |         this.hostId = hostId; | 
 |  |  |         this.createTime = createTime; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | //    ApiList apiList = new ApiList( | 
 |  |  | //            null,    // 上报URL | 
 |  |  | //            null,    // 上报类型 | 
 |  |  | //            null,    // 是否开启 | 
 |  |  | //            null,    // 授权商户 | 
 |  |  | //            null    // 创建时间 | 
 |  |  | //    ); | 
 |  |  |  | 
 |  |  |     public String getStatus$(){ | 
 |  |  |         if (null == this.status){ return null; } | 
 |  |  |         switch (this.status){ | 
 |  |  |             case 0: | 
 |  |  |                 return "关闭"; | 
 |  |  |             case 1: | 
 |  |  |                 return "开启"; | 
 |  |  |             default: | 
 |  |  |                 return String.valueOf(this.status); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getHostId$(){ | 
 |  |  |         HostService service = SpringUtils.getBean(HostService.class); | 
 |  |  |         Host host = service.getById(this.hostId); | 
 |  |  |         if (!Cools.isEmpty(host)){ | 
 |  |  |             return String.valueOf(host.getName()); | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getCreateTime$(){ | 
 |  |  |         if (Cools.isEmpty(this.createTime)){ | 
 |  |  |             return ""; | 
 |  |  |         } | 
 |  |  |         return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getType$() { | 
 |  |  |         if (this.type == null) { | 
 |  |  |             return ""; | 
 |  |  |         } | 
 |  |  |         return ApiType.get(this.type).desc; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.zy.asrs.common.openapi.mapper; | 
 |  |  |  | 
 |  |  | import com.zy.asrs.common.openapi.entity.ApiList; | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import org.apache.ibatis.annotations.Mapper; | 
 |  |  | import org.springframework.stereotype.Repository; | 
 |  |  |  | 
 |  |  | @Mapper | 
 |  |  | @Repository | 
 |  |  | public interface ApiListMapper extends BaseMapper<ApiList> { | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.zy.asrs.common.openapi.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.zy.asrs.common.openapi.entity.ApiList; | 
 |  |  |  | 
 |  |  | public interface ApiListService extends IService<ApiList> { | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.zy.asrs.common.openapi.service.impl; | 
 |  |  |  | 
 |  |  | import com.zy.asrs.common.openapi.mapper.ApiListMapper; | 
 |  |  | import com.zy.asrs.common.openapi.entity.ApiList; | 
 |  |  | import com.zy.asrs.common.openapi.service.ApiListService; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | @Service("apiListService") | 
 |  |  | public class ApiListServiceImpl extends ServiceImpl<ApiListMapper, ApiList> implements ApiListService { | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.zy.asrs.common.utils; | 
 |  |  |  | 
 |  |  | import okhttp3.*; | 
 |  |  |  | 
 |  |  | import java.io.IOException; | 
 |  |  | import java.util.Map; | 
 |  |  | import java.util.Optional; | 
 |  |  | import java.util.concurrent.TimeUnit; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Http协议客户端 | 
 |  |  |  * @author luxiaotao | 
 |  |  |  * @date 2018-9-27 | 
 |  |  |  */ | 
 |  |  | public class HttpHandler { | 
 |  |  |  | 
 |  |  |     private static final Integer DEFAULT_TIMEOUT_SECONDS = 5; | 
 |  |  |     private static final MediaType MEDIA_TYPE = MediaType.parse("application/json;charset=utf-8"); | 
 |  |  |  | 
 |  |  |     private String uri; | 
 |  |  |     private String path; | 
 |  |  |     private String json; | 
 |  |  |     private Map<String, Object> params; | 
 |  |  |     private Map<String, Object> headers; | 
 |  |  |     private boolean https; | 
 |  |  |     private Integer timeout; | 
 |  |  |     private TimeUnit timeUnit; | 
 |  |  |  | 
 |  |  |     public HttpHandler(Builder builder){ | 
 |  |  |         this.uri = builder.uri; | 
 |  |  |         this.path = builder.path; | 
 |  |  |         this.json = builder.json; | 
 |  |  |         this.params = builder.params; | 
 |  |  |         this.headers = builder.headers; | 
 |  |  |         this.https = builder.https; | 
 |  |  |         this.timeout = builder.timeout; | 
 |  |  |         this.timeUnit = builder.timeUnit; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * GET请求执行 | 
 |  |  |      * @return the HttpHandler response | 
 |  |  |      */ | 
 |  |  |     public String doGet() throws IOException { | 
 |  |  |         String url = paramsToUrl(uri, path, params, https); | 
 |  |  |         Request.Builder headerBuilder = new Request.Builder(); | 
 |  |  |         if (headers != null && headers.size()>0){ | 
 |  |  |             for (Map.Entry<String, Object> entry : headers.entrySet()){ | 
 |  |  |                 headerBuilder.addHeader(entry.getKey(), String.valueOf(entry.getValue())); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         Request request = headerBuilder.url(url).build(); | 
 |  |  |         Response response = getClient(timeout, timeUnit).newCall(request).execute(); | 
 |  |  |         return response.isSuccessful() ? response.body().string() : null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * POST请求执行 | 
 |  |  |      * @return the HttpHandler response | 
 |  |  |      */ | 
 |  |  |     public String doPost() throws IOException { | 
 |  |  |         Request request; | 
 |  |  |         Request.Builder headerBuilder = new Request.Builder(); | 
 |  |  |         if (headers != null && headers.size()>0){ | 
 |  |  |             for (Map.Entry<String, Object> entry : headers.entrySet()){ | 
 |  |  |                 headerBuilder.addHeader(entry.getKey(), String.valueOf(entry.getValue())); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if (json == null || "".equals(json)){ | 
 |  |  |             FormBody.Builder builder = new FormBody.Builder(); | 
 |  |  |             for (Map.Entry<String, Object> entry : params.entrySet()){ | 
 |  |  |                 builder.add(entry.getKey(), String.valueOf(entry.getValue())); | 
 |  |  |             } | 
 |  |  |             FormBody body = builder.build(); | 
 |  |  |             request = headerBuilder | 
 |  |  |                     .url((https?"https://":"http://")+uri+path) | 
 |  |  |                     .post(body) | 
 |  |  |                     .build(); | 
 |  |  |         } else { | 
 |  |  |             RequestBody body = RequestBody.create(MEDIA_TYPE, json); | 
 |  |  |             Request.Builder builder = headerBuilder.url((https?"https://":"http://")+uri+path); | 
 |  |  |             builder.header("Content-Type", "application/json;charset=UTF-8"); | 
 |  |  |             request = builder.post(body).build(); | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |         Call call = getClient(timeout, timeUnit).newCall(request); | 
 |  |  |         Response response = call.execute(); | 
 |  |  |         return response.body().string(); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * get请求参数拼接方法 | 
 |  |  |      * @return 请求行 | 
 |  |  |      */ | 
 |  |  |     private String paramsToUrl(String uri, String path, Map<String, Object> params, boolean isHttps) { | 
 |  |  |         StringBuilder res = new StringBuilder(); | 
 |  |  |         res.append(isHttps ? "https://" : "http://"); | 
 |  |  |         res.append(uri); | 
 |  |  |         if (path.length() > 0 && !(path.charAt(0) == '/')){ | 
 |  |  |             res.append("/"); | 
 |  |  |         } | 
 |  |  |         res.append(path); | 
 |  |  |         Optional.ofNullable(params).ifPresent( | 
 |  |  |                 args -> { | 
 |  |  |                     res.append("?"); | 
 |  |  |                     args.forEach((key, value) -> { | 
 |  |  |                         res.append(key); | 
 |  |  |                         res.append("="); | 
 |  |  |                         res.append(value); | 
 |  |  |                         res.append("&"); | 
 |  |  |                     }); | 
 |  |  |                 } | 
 |  |  |         ); | 
 |  |  |         String url = res.toString(); | 
 |  |  |         if ("&".equals(url.substring(url.length()-1, url.length()))){ | 
 |  |  |             url = url.substring(0, url.length()-1); | 
 |  |  |         } | 
 |  |  |         return url; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取 okHttpClient | 
 |  |  |      * @return the HttpHandler instance | 
 |  |  |      */ | 
 |  |  |     private OkHttpClient getClient(Integer timeout, TimeUnit timeUnit){ | 
 |  |  |         return new OkHttpClient | 
 |  |  |                 .Builder() | 
 |  |  |                 .connectTimeout(timeout, timeUnit) | 
 |  |  |                 .readTimeout(timeout, timeUnit) | 
 |  |  |                 .build(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * Http协议报文建造者 | 
 |  |  |      */ | 
 |  |  |     public static class Builder { | 
 |  |  |  | 
 |  |  |         private String uri; | 
 |  |  |         private String path; | 
 |  |  |         private String json; | 
 |  |  |         private Map<String, Object> params; | 
 |  |  |         private Map<String, Object> headers; | 
 |  |  |         private boolean https; | 
 |  |  |         private Integer timeout; | 
 |  |  |         private TimeUnit timeUnit; | 
 |  |  |  | 
 |  |  |         { | 
 |  |  |             // 默认5s超时 | 
 |  |  |             timeout = DEFAULT_TIMEOUT_SECONDS; | 
 |  |  |             timeUnit = TimeUnit.SECONDS; | 
 |  |  |             path = ""; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 建造器 | 
 |  |  |          * @return the HttpHandler instance | 
 |  |  |          */ | 
 |  |  |         public HttpHandler build(){ | 
 |  |  |             if (null == this.uri || "".equals(this.uri)){ | 
 |  |  |                 throw new RuntimeException("uri is null"); | 
 |  |  |             } | 
 |  |  |             if (this.uri.startsWith("http://")){ | 
 |  |  |                 this.uri = this.uri.substring(6,uri.length()); | 
 |  |  |             } else if (this.uri.startsWith("https://")){ | 
 |  |  |                 this.uri = this.uri.substring(7,uri.length()); | 
 |  |  |             } | 
 |  |  |             return new HttpHandler(this); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public Builder setUri(String uri) { | 
 |  |  |             this.uri = uri; | 
 |  |  |             return this; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public Builder setPath(String path) { | 
 |  |  |             if (!path.startsWith("/")){ | 
 |  |  |                 path = "/" + path; | 
 |  |  |             } | 
 |  |  |             this.path = path; | 
 |  |  |             return this; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public Builder setTimeout(Integer timeout, TimeUnit timeUnit) { | 
 |  |  |             this.timeout = timeout; | 
 |  |  |             this.timeUnit = timeUnit; | 
 |  |  |             return this; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public Builder setParams(Map<String, Object> params) { | 
 |  |  |             this.params = params; | 
 |  |  |             return this; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public Builder setHeaders(Map<String, Object> headers) { | 
 |  |  |             this.headers = headers; | 
 |  |  |             return this; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public Builder setHttps(boolean https) { | 
 |  |  |             this.https = https; | 
 |  |  |             return this; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public Builder setJson(String json) { | 
 |  |  |             this.json = json; | 
 |  |  |             return this; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | <?xml version="1.0" encoding="UTF-8"?> | 
 |  |  | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | 
 |  |  | <mapper namespace="com.zy.asrs.common.openapi.mapper.ApiListMapper"> | 
 |  |  |  | 
 |  |  | </mapper> | 
 
 |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ApiService apiService; | 
 |  |  |  | 
 |  |  |     @PostMapping("/test") | 
 |  |  |     public R test() { | 
 |  |  |         return R.ok(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 生成入库订单 | 
 |  |  |      */ | 
 
| New file | 
 |  |  | 
 |  |  | package com.zy.asrs.openapi.controller; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSONArray; | 
 |  |  | import com.alibaba.fastjson.JSONObject; | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.zy.asrs.common.openapi.entity.ApiList; | 
 |  |  | import com.zy.asrs.common.openapi.service.ApiListService; | 
 |  |  | import com.zy.asrs.framework.annotations.ManagerAuth; | 
 |  |  | import com.zy.asrs.framework.common.Cools; | 
 |  |  | import com.zy.asrs.framework.common.R; | 
 |  |  | import com.zy.asrs.framework.domain.KeyValueVo; | 
 |  |  | import com.zy.asrs.framework.common.DateUtils; | 
 |  |  | import com.zy.asrs.common.web.BaseController; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import java.util.*; | 
 |  |  |  | 
 |  |  | @RestController | 
 |  |  | public class ApiListController extends BaseController { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ApiListService apiListService; | 
 |  |  |  | 
 |  |  |     @RequestMapping(value = "/apiList/{id}/auth") | 
 |  |  |     @ManagerAuth | 
 |  |  |     public R get(@PathVariable("id") String id) { | 
 |  |  |         return R.ok(apiListService.getById(String.valueOf(id))); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @RequestMapping(value = "/apiList/page/auth") | 
 |  |  |     @ManagerAuth | 
 |  |  |     public R page(@RequestParam(defaultValue = "1") Integer curr, | 
 |  |  |                   @RequestParam(defaultValue = "10") Integer limit, | 
 |  |  |                   @RequestParam(required = false) String condition, | 
 |  |  |                   @RequestParam(required = false) String timeRange, | 
 |  |  |                   @RequestParam Map<String, Object> param) { | 
 |  |  |         LambdaQueryWrapper<ApiList> wrapper = new LambdaQueryWrapper<>(); | 
 |  |  |         if (!Cools.isEmpty(condition)) { | 
 |  |  |             wrapper.like(ApiList::getId, condition); | 
 |  |  |         } | 
 |  |  |         if (!Cools.isEmpty(timeRange)) { | 
 |  |  |             String[] range = timeRange.split(RANGE_TIME_LINK); | 
 |  |  |             wrapper.ge(ApiList::getCreateTime, DateUtils.convert(range[0])); | 
 |  |  |             wrapper.le(ApiList::getCreateTime, DateUtils.convert(range[1])); | 
 |  |  |         } | 
 |  |  |         if (!Cools.isEmpty(param.get("url"))) { | 
 |  |  |             wrapper.eq(ApiList::getUrl, param.get("url")); | 
 |  |  |         } | 
 |  |  |         if (!Cools.isEmpty(param.get("type"))) { | 
 |  |  |             wrapper.eq(ApiList::getType, param.get("type")); | 
 |  |  |         } | 
 |  |  |         if (!Cools.isEmpty(param.get("status"))) { | 
 |  |  |             wrapper.eq(ApiList::getStatus, param.get("status")); | 
 |  |  |         } | 
 |  |  |         if (!Cools.isEmpty(param.get("hostId"))) { | 
 |  |  |             wrapper.eq(ApiList::getHostId, param.get("hostId")); | 
 |  |  |         } | 
 |  |  |         return R.ok(apiListService.page(new Page<>(curr, limit), wrapper)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @RequestMapping(value = "/apiList/add/auth") | 
 |  |  |     @ManagerAuth | 
 |  |  |     public R add(ApiList apiList) { | 
 |  |  |         ApiList one = apiListService.getOne(new LambdaQueryWrapper<ApiList>() | 
 |  |  |                 .eq(ApiList::getUrl, apiList.getUrl()) | 
 |  |  |                 .eq(ApiList::getType, apiList.getType()) | 
 |  |  |                 .eq(ApiList::getHostId, apiList.getHostId())); | 
 |  |  |         if (one != null) { | 
 |  |  |             apiListService.removeById(one.getId()); | 
 |  |  |         } | 
 |  |  |         apiList.setCreateTime(new Date()); | 
 |  |  |         apiListService.save(apiList); | 
 |  |  |         return R.ok(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @RequestMapping(value = "/apiList/update/auth") | 
 |  |  |     @ManagerAuth | 
 |  |  |     public R update(ApiList apiList){ | 
 |  |  |         if (Cools.isEmpty(apiList) || null==apiList.getId()){ | 
 |  |  |             return R.error(); | 
 |  |  |         } | 
 |  |  |         apiList.setCreateTime(new Date()); | 
 |  |  |         apiListService.updateById(apiList); | 
 |  |  |         return R.ok(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @RequestMapping(value = "/apiList/delete/auth") | 
 |  |  |     @ManagerAuth | 
 |  |  |     public R delete(@RequestParam(value="ids[]") Long[] ids){ | 
 |  |  |          for (Long id : ids){ | 
 |  |  |             apiListService.removeById(id); | 
 |  |  |         } | 
 |  |  |         return R.ok(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @RequestMapping(value = "/apiListQuery/auth") | 
 |  |  |     @ManagerAuth | 
 |  |  |     public R query(String condition) { | 
 |  |  |         LambdaQueryWrapper<ApiList> wrapper = new LambdaQueryWrapper<>(); | 
 |  |  |         wrapper.like(ApiList::getId, condition); | 
 |  |  |         Page<ApiList> page = apiListService.page(new Page<>(0, 10), wrapper); | 
 |  |  |         List<Map<String, Object>> result = new ArrayList<>(); | 
 |  |  |         for (ApiList apiList : page.getRecords()){ | 
 |  |  |             Map<String, Object> map = new HashMap<>(); | 
 |  |  |             map.put("id", apiList.getId()); | 
 |  |  |             map.put("value", apiList.getId()); | 
 |  |  |             result.add(map); | 
 |  |  |         } | 
 |  |  |         return R.ok(result); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @RequestMapping("/apiList/all/get/kv") | 
 |  |  |     @ManagerAuth | 
 |  |  |     public R getDataKV(@RequestParam(required = false) String condition) { | 
 |  |  |         List<KeyValueVo> vos = new ArrayList<>(); | 
 |  |  |         LambdaQueryWrapper<ApiList> wrapper = new LambdaQueryWrapper<>(); | 
 |  |  |         if (!Cools.isEmpty(condition)) { | 
 |  |  |             wrapper.like(ApiList::getId, condition); | 
 |  |  |         } | 
 |  |  |         apiListService.page(new Page<>(1, 30), wrapper).getRecords().forEach(item -> vos.add(new KeyValueVo(String.valueOf(item.getId()), item.getId()))); | 
 |  |  |         return R.ok().add(vos); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| File was renamed from zy-asrs-common/src/main/java/com/zy/asrs/common/openapi/controller/ApiLogController.java | 
 |  |  | 
 |  |  | package com.zy.asrs.common.openapi.controller; | 
 |  |  | package com.zy.asrs.openapi.controller; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSONArray; | 
 |  |  | import com.alibaba.fastjson.JSONObject; | 
 
 |  |  | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.zy.asrs.common.openapi.entity.HostKey; | 
 |  |  | import com.zy.asrs.common.openapi.service.HostKeyService; | 
 |  |  | import com.zy.asrs.common.sys.service.HostService; | 
 |  |  | import com.zy.asrs.common.utils.Utils; | 
 |  |  | import com.zy.asrs.framework.annotations.ManagerAuth; | 
 |  |  | import com.zy.asrs.framework.common.Cools; | 
 |  |  | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private HostKeyService hostKeyService; | 
 |  |  |     @Autowired | 
 |  |  |     private HostService hostService; | 
 |  |  |  | 
 |  |  |     @RequestMapping(value = "/hostKey/{id}/auth") | 
 |  |  |     @ManagerAuth | 
 |  |  | 
 |  |  |         return R.ok().add(vos); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @RequestMapping("/host/list") | 
 |  |  |     public R getHostList() { | 
 |  |  |         return R.ok().add(hostService.list()); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.zy.asrs.openapi.task; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSON; | 
 |  |  | import com.alibaba.fastjson.JSONObject; | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.zy.asrs.common.domain.enums.ApiType; | 
 |  |  | import com.zy.asrs.common.domain.enums.OrderSettleType; | 
 |  |  | import com.zy.asrs.common.openapi.entity.ApiList; | 
 |  |  | import com.zy.asrs.common.openapi.entity.HostKey; | 
 |  |  | import com.zy.asrs.common.openapi.service.ApiListService; | 
 |  |  | import com.zy.asrs.common.openapi.service.HostKeyService; | 
 |  |  | import com.zy.asrs.common.utils.HttpHandler; | 
 |  |  | import com.zy.asrs.common.wms.entity.Order; | 
 |  |  | import com.zy.asrs.common.wms.entity.OrderDetl; | 
 |  |  | import com.zy.asrs.common.wms.service.OrderDetlService; | 
 |  |  | import com.zy.asrs.common.wms.service.OrderService; | 
 |  |  | import org.apache.commons.codec.digest.DigestUtils; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.scheduling.annotation.Scheduled; | 
 |  |  | import org.springframework.stereotype.Component; | 
 |  |  |  | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.HashMap; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Map; | 
 |  |  |  | 
 |  |  | @Component | 
 |  |  | public class ReportApiScheduler { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ApiListService apiListService; | 
 |  |  |     @Autowired | 
 |  |  |     private OrderService orderService; | 
 |  |  |     @Autowired | 
 |  |  |     private OrderDetlService orderDetlService; | 
 |  |  |     @Autowired | 
 |  |  |     private HostKeyService hostKeyService; | 
 |  |  |  | 
 |  |  |     @Scheduled(cron = "0/3 * * * * ? ") | 
 |  |  |     public void orderComplete() { | 
 |  |  |         //订单完成上报 | 
 |  |  |  | 
 |  |  |         //获取已完成订单 | 
 |  |  |         List<Order> list = orderService.list(new LambdaQueryWrapper<Order>() | 
 |  |  |                 .eq(Order::getSettle, OrderSettleType.COMPLETE.id)); | 
 |  |  |         for (Order order : list) { | 
 |  |  |             //查询是否需要上报 | 
 |  |  |             ApiList apiList = apiListService.getOne(new LambdaQueryWrapper<ApiList>() | 
 |  |  |                     .eq(ApiList::getType, ApiType.ORDER_COMPLETE.type) | 
 |  |  |                     .eq(ApiList::getStatus, 1) | 
 |  |  |                     .eq(ApiList::getHostId,order.getHostId())); | 
 |  |  |             if (apiList == null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //获取订单明细 | 
 |  |  |             List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>() | 
 |  |  |                     .eq(OrderDetl::getOrderId, order.getId())); | 
 |  |  |  | 
 |  |  |             //封装数据 | 
 |  |  |             HashMap<String, Object> data = new HashMap<>(); | 
 |  |  |             data.put("order", order); | 
 |  |  |             data.put("orderDetls", orderDetls); | 
 |  |  |  | 
 |  |  |             getSign(data, order.getHostId());//获取签名 | 
 |  |  |  | 
 |  |  |             try { | 
 |  |  |                 String response = new HttpHandler.Builder() | 
 |  |  |                         .setUri(apiList.getUrl()) | 
 |  |  |                         .setJson(JSON.toJSONString(data)) | 
 |  |  |                         .build() | 
 |  |  |                         .doPost(); | 
 |  |  |                 JSONObject result = JSON.parseObject(response); | 
 |  |  |                 if (result.getOrDefault("code", 0).equals(200)) { | 
 |  |  |                     order.setSettle(OrderSettleType.REPORT_COMPLETE.id.longValue()); | 
 |  |  |                     order.setUpdateTime(new Date()); | 
 |  |  |                     orderService.updateById(order);//更新订单状态 | 
 |  |  |                 } | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 e.printStackTrace(); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Scheduled(cron = "0/3 * * * * ? ") | 
 |  |  |     public void orderCancel() { | 
 |  |  |         //订单取消上报 | 
 |  |  |  | 
 |  |  |         //获取已取消订单 | 
 |  |  |         List<Order> list = orderService.list(new LambdaQueryWrapper<Order>() | 
 |  |  |                 .eq(Order::getSettle, OrderSettleType.CANCEL.id)); | 
 |  |  |         for (Order order : list) { | 
 |  |  |             //查询是否需要上报 | 
 |  |  |             ApiList apiList = apiListService.getOne(new LambdaQueryWrapper<ApiList>() | 
 |  |  |                     .eq(ApiList::getType, ApiType.ORDER_CANCEL.type) | 
 |  |  |                     .eq(ApiList::getStatus, 1) | 
 |  |  |                     .eq(ApiList::getHostId,order.getHostId())); | 
 |  |  |             if (apiList == null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //获取订单明细 | 
 |  |  |             List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>() | 
 |  |  |                     .eq(OrderDetl::getOrderId, order.getId())); | 
 |  |  |  | 
 |  |  |             //封装数据 | 
 |  |  |             HashMap<String, Object> data = new HashMap<>(); | 
 |  |  |             data.put("order", order); | 
 |  |  |             data.put("orderDetls", orderDetls); | 
 |  |  |  | 
 |  |  |             getSign(data, order.getHostId());//获取签名 | 
 |  |  |  | 
 |  |  |             try { | 
 |  |  |                 String response = new HttpHandler.Builder() | 
 |  |  |                         .setUri(apiList.getUrl()) | 
 |  |  |                         .setJson(JSON.toJSONString(data)) | 
 |  |  |                         .build() | 
 |  |  |                         .doPost(); | 
 |  |  |                 JSONObject result = JSON.parseObject(response); | 
 |  |  |                 if (result.getOrDefault("code", 0).equals(200)) { | 
 |  |  |                     order.setSettle(OrderSettleType.REPORT_COMPLETE.id.longValue()); | 
 |  |  |                     order.setUpdateTime(new Date()); | 
 |  |  |                     orderService.updateById(order);//更新订单状态 | 
 |  |  |                 } | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 e.printStackTrace(); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Scheduled(cron = "* 30 23 * * ? ") | 
 |  |  |     public void reportStock() { | 
 |  |  |         //库存上报 | 
 |  |  |         //每天晚上11点半执行 | 
 |  |  |  | 
 |  |  |         //查询是否需要上报 | 
 |  |  |         List<ApiList> list = apiListService.list(new LambdaQueryWrapper<ApiList>() | 
 |  |  |                 .eq(ApiList::getType, ApiType.REPORT_STOCK.type) | 
 |  |  |                 .eq(ApiList::getStatus, 1)); | 
 |  |  |         for (ApiList apiList : list) { | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //获取签名 | 
 |  |  |     public String getSign(HashMap<String, Object> data, Long hostId) { | 
 |  |  |         HostKey hostKey = hostKeyService.getOne(new LambdaQueryWrapper<HostKey>() | 
 |  |  |                 .eq(HostKey::getHostId, hostId)); | 
 |  |  |         if (hostKey == null) { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (hostKey.getSignStatus() == 0) {//没有开启签名 | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //创建自然排序map | 
 |  |  |         JSONObject param = new JSONObject(true); | 
 |  |  |         for (Map.Entry<String, Object> entry : data.entrySet()) { | 
 |  |  |             if (!entry.getKey().equals("sign")) {//剔除sign | 
 |  |  |                 param.put(entry.getKey(), entry.getValue()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         param.put("signKey", hostKey.getSignKey()); | 
 |  |  |         String md5Hex = DigestUtils.md5Hex(param.toJSONString()); | 
 |  |  |         data.put("sign", md5Hex); | 
 |  |  |         return md5Hex; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  |         <div class="slider"> | 
 |  |  |             <div><el-button type="text" @click="switchPage('index.html')">规范说明</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">订单完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCancel.html')">订单取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportStock.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportApiManage.html')">上报API管理</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderType.html')">获取订单类型</el-button></div> | 
 
 |  |  | 
 |  |  |         <div class="slider"> | 
 |  |  |             <div><el-button type="text" @click="switchPage('index.html')">规范说明</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">订单完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCancel.html')">订单取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportStock.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportApiManage.html')">上报API管理</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderType.html')">获取订单类型</el-button></div> | 
 
 |  |  | 
 |  |  |         <div class="slider"> | 
 |  |  |             <div><el-button type="text" @click="switchPage('index.html')">规范说明</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">订单完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCancel.html')">订单取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportStock.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportApiManage.html')">上报API管理</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderType.html')">获取订单类型</el-button></div> | 
 
 |  |  | 
 |  |  |         <div class="slider"> | 
 |  |  |             <div><el-button type="text" @click="switchPage('index.html')">规范说明</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">订单完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCancel.html')">订单取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportStock.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportApiManage.html')">上报API管理</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderType.html')">获取订单类型</el-button></div> | 
 
 |  |  | 
 |  |  |         <div class="slider"> | 
 |  |  |             <div><el-button type="text" @click="switchPage('index.html')">规范说明</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">订单完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCancel.html')">订单取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportStock.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportApiManage.html')">上报API管理</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderType.html')">获取订单类型</el-button></div> | 
 
 |  |  | 
 |  |  |         <div class="slider"> | 
 |  |  |             <div><el-button type="text" @click="switchPage('index.html')">规范说明</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">订单完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCancel.html')">订单取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportStock.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportApiManage.html')">上报API管理</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderType.html')">获取订单类型</el-button></div> | 
 
 |  |  | 
 |  |  |         <div class="slider"> | 
 |  |  |             <div><el-button type="text" @click="switchPage('index.html')">规范说明</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">订单完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCancel.html')">订单取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportStock.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportApiManage.html')">上报API管理</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderType.html')">获取订单类型</el-button></div> | 
 
| New file | 
 |  |  | 
 |  |  |  | 
 |  |  | ## 订单取消上报 | 
 |  |  | - **接口说明:** 订单取消上报 | 
 |  |  |  | 
 |  |  | 上报示例: | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | { | 
 |  |  |     "orderDetls": [ | 
 |  |  |         { | 
 |  |  |             "anfme": 10, | 
 |  |  |             "barcode": "", | 
 |  |  |             "createBy": 9527, | 
 |  |  |             "createTime": 1704343061787, | 
 |  |  |             "createTime$": "2024-01-04 12:37:41", | 
 |  |  |             "enableQty": 0, | 
 |  |  |             "hostId": 1, | 
 |  |  |             "hostId$": "中扬储存设备", | 
 |  |  |             "id": 25, | 
 |  |  |             "maktx": "尼龙头(灰白)5.2x50", | 
 |  |  |             "matnr": "LSH90152050", | 
 |  |  |             "orderId": 11, | 
 |  |  |             "orderId$": "11", | 
 |  |  |             "orderNo": "2024010311062542", | 
 |  |  |             "qty": 10, | 
 |  |  |             "specs": "17.18", | 
 |  |  |             "status": 1, | 
 |  |  |             "status$": "正常", | 
 |  |  |             "unit": "箱", | 
 |  |  |             "updateBy": 9527, | 
 |  |  |             "updateTime": 1704343061787, | 
 |  |  |             "updateTime$": "2024-01-04 12:37:41" | 
 |  |  |         } | 
 |  |  |     ], | 
 |  |  |     "order": { | 
 |  |  |         "createBy": 9527, | 
 |  |  |         "createTime": 1704343061787, | 
 |  |  |         "createTime$": "2024-01-04 12:37:41", | 
 |  |  |         "docType": 1, | 
 |  |  |         "docType$": "采购入库", | 
 |  |  |         "hostId": 1, | 
 |  |  |         "hostId$": "中扬储存设备", | 
 |  |  |         "id": 11, | 
 |  |  |         "orderNo": "2024010311062542", | 
 |  |  |         "orderTime": "2024-01-04 12:37:41", | 
 |  |  |         "payTime$": "", | 
 |  |  |         "sendTime$": "", | 
 |  |  |         "settle": 4, | 
 |  |  |         "settle$": "已完成", | 
 |  |  |         "status": 1, | 
 |  |  |         "status$": "正常", | 
 |  |  |         "updateBy": 26, | 
 |  |  |         "updateBy$": "root", | 
 |  |  |         "updateTime": 1704697086580, | 
 |  |  |         "updateTime$": "2024-01-08 14:58:06", | 
 |  |  |         "uuid": "1192446758383255552" | 
 |  |  |     }, | 
 |  |  |     "sign": "8a7036cfe218e12f50f9107e9eb4a437" | 
 |  |  | } | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  | #### 返回结果 | 
 |  |  | 系统上报后,请求方必须马上返回以下结果集,否则视为上报失败。 | 
 |  |  |  | 
 |  |  | 参数名称                        |类型        |出现要求    |描述   | 
 |  |  | :----                        |:---        |:------    |:---	 | 
 |  |  | code                        |int        |R            |响应码,代码定义请见“附录A 响应吗说明” | 
 |  |  | msg                            |string        |R            |  | 
 |  |  |  | 
 |  |  | 示例: | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | { | 
 |  |  |     "code":200, | 
 |  |  |     "msg":"success", | 
 |  |  | } | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  | ## 附录A 响应码说明 | 
 |  |  |  | 
 |  |  | 响应码    |说明   | 
 |  |  | :----    |:--- | 
 |  |  | 200        |处理成功 | 
 |  |  | 500        |系统内部错误 | 
 
| New file | 
 |  |  | 
 |  |  |  | 
 |  |  | ## 订单完成上报 | 
 |  |  | - **接口说明:** 订单完成上报 | 
 |  |  |  | 
 |  |  | 上报示例: | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | { | 
 |  |  |     "orderDetls": [ | 
 |  |  |         { | 
 |  |  |             "anfme": 10, | 
 |  |  |             "barcode": "", | 
 |  |  |             "createBy": 9527, | 
 |  |  |             "createTime": 1704343061787, | 
 |  |  |             "createTime$": "2024-01-04 12:37:41", | 
 |  |  |             "enableQty": 0, | 
 |  |  |             "hostId": 1, | 
 |  |  |             "hostId$": "中扬储存设备", | 
 |  |  |             "id": 25, | 
 |  |  |             "maktx": "尼龙头(灰白)5.2x50", | 
 |  |  |             "matnr": "LSH90152050", | 
 |  |  |             "orderId": 11, | 
 |  |  |             "orderId$": "11", | 
 |  |  |             "orderNo": "2024010311062542", | 
 |  |  |             "qty": 10, | 
 |  |  |             "specs": "17.18", | 
 |  |  |             "status": 1, | 
 |  |  |             "status$": "正常", | 
 |  |  |             "unit": "箱", | 
 |  |  |             "updateBy": 9527, | 
 |  |  |             "updateTime": 1704343061787, | 
 |  |  |             "updateTime$": "2024-01-04 12:37:41" | 
 |  |  |         } | 
 |  |  |     ], | 
 |  |  |     "order": { | 
 |  |  |         "createBy": 9527, | 
 |  |  |         "createTime": 1704343061787, | 
 |  |  |         "createTime$": "2024-01-04 12:37:41", | 
 |  |  |         "docType": 1, | 
 |  |  |         "docType$": "采购入库", | 
 |  |  |         "hostId": 1, | 
 |  |  |         "hostId$": "中扬储存设备", | 
 |  |  |         "id": 11, | 
 |  |  |         "orderNo": "2024010311062542", | 
 |  |  |         "orderTime": "2024-01-04 12:37:41", | 
 |  |  |         "payTime$": "", | 
 |  |  |         "sendTime$": "", | 
 |  |  |         "settle": 4, | 
 |  |  |         "settle$": "已完成", | 
 |  |  |         "status": 1, | 
 |  |  |         "status$": "正常", | 
 |  |  |         "updateBy": 26, | 
 |  |  |         "updateBy$": "root", | 
 |  |  |         "updateTime": 1704697086580, | 
 |  |  |         "updateTime$": "2024-01-08 14:58:06", | 
 |  |  |         "uuid": "1192446758383255552" | 
 |  |  |     }, | 
 |  |  |     "sign": "8a7036cfe218e12f50f9107e9eb4a437" | 
 |  |  | } | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  | #### 返回结果 | 
 |  |  | 系统上报后,请求方必须马上返回以下结果集,否则视为上报失败。 | 
 |  |  |  | 
 |  |  | 参数名称                        |类型        |出现要求    |描述   | 
 |  |  | :----                        |:---        |:------    |:---	 | 
 |  |  | code                        |int        |R            |响应码,代码定义请见“附录A 响应吗说明” | 
 |  |  | msg                            |string        |R            |  | 
 |  |  |  | 
 |  |  | 示例: | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | { | 
 |  |  |     "code":200, | 
 |  |  |     "msg":"success", | 
 |  |  | } | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  | ## 附录A 响应码说明 | 
 |  |  |  | 
 |  |  | 响应码    |说明   | 
 |  |  | :----    |:--- | 
 |  |  | 200        |处理成功 | 
 |  |  | 500        |系统内部错误 | 
 
 |  |  | 
 |  |  |             <el-card class="box-card"> | 
 |  |  |                 <el-form :inline="true" :model="tableSearchParam" class="demo-form-inline"> | 
 |  |  |                     <el-form-item label=""> | 
 |  |  |                         <el-input v-model="tableSearchParam.task_no" placeholder="任务号"></el-input> | 
 |  |  |                         <el-input v-model="tableSearchParam.url" placeholder="URL"></el-input> | 
 |  |  |                     </el-form-item> | 
 |  |  |                     <el-form-item label=""> | 
 |  |  |                         <el-select v-model="tableSearchParam.type" placeholder="请选择上报类型"> | 
 |  |  |                             <el-option label="订单完成" value="order_complete"></el-option> | 
 |  |  |                             <el-option label="订单取消" value="order_cancel"></el-option> | 
 |  |  |                             <el-option label="库存上报" value="report_stock"></el-option> | 
 |  |  |                         </el-select> | 
 |  |  |                     </el-form-item> | 
 |  |  |                     <el-form-item> | 
 |  |  |                         <el-select v-model="tableSearchParam.status" placeholder="请选择是否开启"> | 
 |  |  |                             <el-option label="开启" value="1"></el-option> | 
 |  |  |                             <el-option label="关闭" value="0"></el-option> | 
 |  |  |                         </el-select> | 
 |  |  |                     </el-form-item> | 
 |  |  |                     <el-form-item label=""> | 
 |  |  |                         <el-select v-model="tableSearchParam.hostId" placeholder="请选择选择仓库"> | 
 |  |  |                             <el-option v-for="item in hostList" :label="item.name" :value="item.id"></el-option> | 
 |  |  |                         </el-select> | 
 |  |  |                     </el-form-item> | 
 |  |  |                     <el-form-item> | 
 |  |  |                         <el-button type="primary" @click="getTableData">查询</el-button> | 
 |  |  |                         <el-button type="primary" @click="resetParam">重置</el-button> | 
 |  |  |                         <el-button type="success" @click="showAddApi()">添加接口</el-button> | 
 |  |  |                     </el-form-item> | 
 |  |  |                 </el-form> | 
 |  |  |                 <el-table ref="singleTable" :data="tableData" style="width: 100%;"> | 
 |  |  |                     <el-table-column property="id" label="#ID"> | 
 |  |  |                     <el-table-column property="url" label="URL"> | 
 |  |  |                     </el-table-column> | 
 |  |  |                     <el-table-column property="wrkNo" label="工作号"> | 
 |  |  |                     <el-table-column property="type$" label="上报类型"> | 
 |  |  |                     </el-table-column> | 
 |  |  |                     <el-table-column property="taskNo" label="任务号"> | 
 |  |  |                     <el-table-column property="status$" label="是否开启"> | 
 |  |  |                     </el-table-column> | 
 |  |  |                     <el-table-column property="commandStatus$" label="指令状态"> | 
 |  |  |                     <el-table-column property="hostId$" label="仓库"> | 
 |  |  |                     </el-table-column> | 
 |  |  |                     <el-table-column show-overflow-tooltip property="durationTime" label="持续时长"> | 
 |  |  |                     </el-table-column> | 
 |  |  |                     <el-table-column property="commandType" label="指令类型"> | 
 |  |  |                     </el-table-column> | 
 |  |  |                     <el-table-column property="device" label="设备"> | 
 |  |  |                     </el-table-column> | 
 |  |  |                     <el-table-column property="deviceLog" label="设备执行信息"> | 
 |  |  |                     </el-table-column> | 
 |  |  |                     <el-table-column property="commandDesc" label="命令描述"> | 
 |  |  |                     </el-table-column> | 
 |  |  |                     <el-table-column show-overflow-tooltip property="startTime$" label="开始时间"> | 
 |  |  |                     </el-table-column> | 
 |  |  |                     <el-table-column show-overflow-tooltip property="executeTime$" label="执行时间"> | 
 |  |  |                     </el-table-column> | 
 |  |  |                     <el-table-column show-overflow-tooltip property="completeTime$" label="完成时间"> | 
 |  |  |                     </el-table-column> | 
 |  |  |                     <el-table-column show-overflow-tooltip property="command" label="命令报文" width="250"> | 
 |  |  |                     <el-table-column | 
 |  |  |                             fixed="right" | 
 |  |  |                             label="操作" | 
 |  |  |                             width="100"> | 
 |  |  |                         <template slot-scope="scope"> | 
 |  |  |                             <el-button @click="showAddApi(scope.row)" type="text" size="small">编辑</el-button> | 
 |  |  |                             <el-button @click="deleteApi(scope.row)" type="text" size="small">删除</el-button> | 
 |  |  |                         </template> | 
 |  |  |                     </el-table-column> | 
 |  |  |                 </el-table> | 
 |  |  |  | 
 |  |  | 
 |  |  |             </el-card> | 
 |  |  |         </div> | 
 |  |  |  | 
 |  |  |         <div style="position: fixed;top: 20px;right: 20px;width: 150px;border-left: 3px solid #f0f0f0;padding-left: 15px;"> | 
 |  |  |         <div class="slider"> | 
 |  |  |             <div><el-button type="text" @click="switchPage('index.html')">规范说明</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">库存上报</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">订单完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCancel.html')">订单取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportStock.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportApiManage.html')">上报API管理</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderType.html')">获取订单类型</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderStatus.html')">获取订单状态列表</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderList.html')">获取订单列表</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('generateOrderPakIn.html')">生成入库订单</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('generateOrderPakOut.html')">生成出库订单</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('createMat.html')">添加物料信息</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="keyList()">密钥管理</el-button></div> | 
 |  |  |         </div> | 
 |  |  |  | 
 |  |  |         <el-dialog title="接口管理" :visible.sync="formVisible"> | 
 |  |  |             <el-form ref="form" :model="formData" label-width="80px"> | 
 |  |  |                 <el-form-item label="URL"> | 
 |  |  |                     <el-input v-model="formData.url" placeholder="请输入上报URL"></el-input> | 
 |  |  |                 </el-form-item> | 
 |  |  |                 <el-form-item label="上报类型"> | 
 |  |  |                     <el-select v-model="formData.type" placeholder="请选择上报类型"> | 
 |  |  |                         <el-option label="订单完成" value="order_complete"></el-option> | 
 |  |  |                         <el-option label="订单取消" value="order_cancel"></el-option> | 
 |  |  |                         <el-option label="库存上报" value="report_stock"></el-option> | 
 |  |  |                     </el-select> | 
 |  |  |                 </el-form-item> | 
 |  |  |                 <el-form-item label="是否开启"> | 
 |  |  |                     <el-select v-model="formData.status" placeholder="请选择是否开启"> | 
 |  |  |                         <el-option label="开启" value="1"></el-option> | 
 |  |  |                         <el-option label="关闭" value="0"></el-option> | 
 |  |  |                     </el-select> | 
 |  |  |                 </el-form-item> | 
 |  |  |                 <el-form-item label="选择仓库"> | 
 |  |  |                     <el-select v-model="formData.hostId" placeholder="请选择选择仓库"> | 
 |  |  |                         <el-option v-for="item in hostList" :label="item.name" :value="item.id"></el-option> | 
 |  |  |                     </el-select> | 
 |  |  |                 </el-form-item> | 
 |  |  |                 <el-form-item> | 
 |  |  |                     <el-button v-if="formData.id == null" type="success" @click="addApi()">添加</el-button> | 
 |  |  |                     <el-button v-else type="primary" @click="updateApi()">更新</el-button> | 
 |  |  |                 </el-form-item> | 
 |  |  |             </el-form> | 
 |  |  |         </el-dialog> | 
 |  |  |     </div> | 
 |  |  |  | 
 |  |  |     <script> | 
 |  |  | 
 |  |  |                 pageSize: 16, | 
 |  |  |                 pageTotal: 0, | 
 |  |  |                 tableSearchParam: { | 
 |  |  |                     task_no: null, | 
 |  |  |                     url: "", | 
 |  |  |                     type: "", | 
 |  |  |                     status: "", | 
 |  |  |                     hostId: "" | 
 |  |  |                 }, | 
 |  |  |                 tableData: [], | 
 |  |  |                 formVisible: false, | 
 |  |  |                 formData: { | 
 |  |  |                     id: null, | 
 |  |  |                     url: "", | 
 |  |  |                     type: "", | 
 |  |  |                     status: "", | 
 |  |  |                     hostId: "" | 
 |  |  |                 }, | 
 |  |  |                 hostList: [] | 
 |  |  |             }, | 
 |  |  |             created() { | 
 |  |  |                 this.init() | 
 |  |  | 
 |  |  |             methods: { | 
 |  |  |                 init() { | 
 |  |  |                     this.getTableData() | 
 |  |  |                     this.getHostList() | 
 |  |  |                 }, | 
 |  |  |                 getTableData() { | 
 |  |  |                     let that = this; | 
 |  |  | 
 |  |  |                     data.curr = this.currentPage | 
 |  |  |                     data.limit = this.pageSize | 
 |  |  |                     $.ajax({ | 
 |  |  |                         url: baseUrl + "/commandInfoLog/list/auth", | 
 |  |  |                         url: baseUrl + "/apiList/page/auth", | 
 |  |  |                         headers: { | 
 |  |  |                             'token': localStorage.getItem('token') | 
 |  |  |                         }, | 
 |  |  | 
 |  |  |                 }, | 
 |  |  |                 switchPage(url) { | 
 |  |  |                     location.href = url | 
 |  |  |                 }, | 
 |  |  |                 showAddApi(data) { | 
 |  |  |                     this.formVisible = true; | 
 |  |  |                     if (data != null) { | 
 |  |  |                         this.formData = { | 
 |  |  |                             id: data.id, | 
 |  |  |                             url: data.url, | 
 |  |  |                             type: data.type, | 
 |  |  |                             status: "" + data.status, | 
 |  |  |                             hostId: data.hostId | 
 |  |  |                         } | 
 |  |  |                     }else { | 
 |  |  |                         this.formData = { | 
 |  |  |                             id: null, | 
 |  |  |                             url: "", | 
 |  |  |                             type: "", | 
 |  |  |                             status: "", | 
 |  |  |                             hostId: "" | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 }, | 
 |  |  |                 addApi() { | 
 |  |  |                     let that = this; | 
 |  |  |                     if(this.formData.url == '' || this.formData.type == '' || this.formData.status == '' || this.formData.hostId == ''){ | 
 |  |  |                         this.$message({ | 
 |  |  |                             message: '参数不能为空', | 
 |  |  |                             type: 'error' | 
 |  |  |                         }); | 
 |  |  |                         return; | 
 |  |  |                     } | 
 |  |  |                     $.ajax({ | 
 |  |  |                         url: baseUrl + "/apiList/add/auth", | 
 |  |  |                         headers: { | 
 |  |  |                             'token': localStorage.getItem('token') | 
 |  |  |                         }, | 
 |  |  |                         data: this.formData, | 
 |  |  |                         dataType: 'json', | 
 |  |  |                         contentType: 'application/json;charset=UTF-8', | 
 |  |  |                         method: 'GET', | 
 |  |  |                         success: function(res) { | 
 |  |  |                             if (res.code == 200) { | 
 |  |  |                                 that.formVisible = false; | 
 |  |  |                                 that.formData = { | 
 |  |  |                                     id: null, | 
 |  |  |                                     url: "", | 
 |  |  |                                     type: "", | 
 |  |  |                                     status: "", | 
 |  |  |                                     hostId: "" | 
 |  |  |                                 } | 
 |  |  |                                 that.getTableData() | 
 |  |  |                                 that.$message({ | 
 |  |  |                                     message: '添加成功', | 
 |  |  |                                     type: 'success' | 
 |  |  |                                 }); | 
 |  |  |                             }else { | 
 |  |  |                                 that.$message({ | 
 |  |  |                                     message: res.msg, | 
 |  |  |                                     type: 'error' | 
 |  |  |                                 }); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     }); | 
 |  |  |                 }, | 
 |  |  |                 updateApi() { | 
 |  |  |                     let that = this; | 
 |  |  |                     if(this.formData.id == null || this.formData.url == '' || this.formData.type == '' || this.formData.status == '' || this.formData.hostId == ''){ | 
 |  |  |                         this.$message({ | 
 |  |  |                             message: '参数不能为空', | 
 |  |  |                             type: 'error' | 
 |  |  |                         }); | 
 |  |  |                         return; | 
 |  |  |                     } | 
 |  |  |                     $.ajax({ | 
 |  |  |                         url: baseUrl + "/apiList/update/auth", | 
 |  |  |                         headers: { | 
 |  |  |                             'token': localStorage.getItem('token') | 
 |  |  |                         }, | 
 |  |  |                         data: this.formData, | 
 |  |  |                         dataType: 'json', | 
 |  |  |                         contentType: 'application/json;charset=UTF-8', | 
 |  |  |                         method: 'GET', | 
 |  |  |                         success: function(res) { | 
 |  |  |                             if (res.code == 200) { | 
 |  |  |                                 that.formVisible = false; | 
 |  |  |                                 that.formData = { | 
 |  |  |                                     id: null, | 
 |  |  |                                     url: "", | 
 |  |  |                                     type: "", | 
 |  |  |                                     status: "", | 
 |  |  |                                     hostId: "" | 
 |  |  |                                 } | 
 |  |  |                                 that.getTableData() | 
 |  |  |                                 that.$message({ | 
 |  |  |                                     message: '更新成功', | 
 |  |  |                                     type: 'success' | 
 |  |  |                                 }); | 
 |  |  |                             }else { | 
 |  |  |                                 that.$message({ | 
 |  |  |                                     message: res.msg, | 
 |  |  |                                     type: 'error' | 
 |  |  |                                 }); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     }); | 
 |  |  |                 }, | 
 |  |  |                 deleteApi(data) { | 
 |  |  |                     let that = this; | 
 |  |  |                     $.ajax({ | 
 |  |  |                         url: baseUrl + "/apiList/delete/auth", | 
 |  |  |                         headers: { | 
 |  |  |                             'token': localStorage.getItem('token') | 
 |  |  |                         }, | 
 |  |  |                         data: { | 
 |  |  |                             ids: [data.id] | 
 |  |  |                         }, | 
 |  |  |                         dataType: 'json', | 
 |  |  |                         contentType: 'application/json;charset=UTF-8', | 
 |  |  |                         method: 'GET', | 
 |  |  |                         success: function(res) { | 
 |  |  |                             if (res.code == 200) { | 
 |  |  |                                 that.getTableData() | 
 |  |  |                                 that.$message({ | 
 |  |  |                                     message: '删除成功', | 
 |  |  |                                     type: 'success' | 
 |  |  |                                 }); | 
 |  |  |                             }else { | 
 |  |  |                                 that.$message({ | 
 |  |  |                                     message: res.msg, | 
 |  |  |                                     type: 'error' | 
 |  |  |                                 }); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     }); | 
 |  |  |                 }, | 
 |  |  |                 getHostList() { | 
 |  |  |                     let that = this; | 
 |  |  |                     $.ajax({ | 
 |  |  |                         url: baseUrl + "/host/list", | 
 |  |  |                         headers: { | 
 |  |  |                             'token': localStorage.getItem('token') | 
 |  |  |                         }, | 
 |  |  |                         dataType: 'json', | 
 |  |  |                         contentType: 'application/json;charset=UTF-8', | 
 |  |  |                         method: 'GET', | 
 |  |  |                         success: function(res) { | 
 |  |  |                             that.hostList = res.data | 
 |  |  |                         } | 
 |  |  |                     }); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }) | 
 
| New file | 
 |  |  | 
 |  |  | <!DOCTYPE html> | 
 |  |  | <html lang="en"> | 
 |  |  | <head> | 
 |  |  |     <meta charset="UTF-8"> | 
 |  |  |     <title>API开放平台</title> | 
 |  |  |     <link rel="stylesheet" href="../static/css/element.css"> | 
 |  |  |     <link rel="stylesheet" href="../static/css/common.css"> | 
 |  |  |     <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script> | 
 |  |  |     <script type="text/javascript" src="../static/js/vue.min.js"></script> | 
 |  |  |     <script type="text/javascript" src="../static/js/showdown.min.js"></script> | 
 |  |  |     <script type="text/javascript" src="../static/js/common.js"></script> | 
 |  |  |     <script type="text/javascript" src="../static/js/element.js"></script> | 
 |  |  | </head> | 
 |  |  | <body> | 
 |  |  |     <div id="app"> | 
 |  |  |         <div id="content"></div> | 
 |  |  |         <div class="slider"> | 
 |  |  |             <div><el-button type="text" @click="switchPage('index.html')">规范说明</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">订单完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCancel.html')">订单取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportStock.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportApiManage.html')">上报API管理</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderType.html')">获取订单类型</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderStatus.html')">获取订单状态列表</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderList.html')">获取订单列表</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('generateOrderPakIn.html')">生成入库订单</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('generateOrderPakOut.html')">生成出库订单</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('createMat.html')">添加物料信息</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="keyList()">密钥管理</el-button></div> | 
 |  |  |         </div> | 
 |  |  |  | 
 |  |  |         <el-dialog title="密钥管理" :visible.sync="keyTableVisible"> | 
 |  |  |             <el-table :data="keyTableData" v-loading="loading"> | 
 |  |  |                 <el-table-column property="hostId$" label="仓库"></el-table-column> | 
 |  |  |                 <el-table-column property="signKey" label="签名密钥" width="150"></el-table-column> | 
 |  |  |                 <el-table-column property="appKey" label="接口请求密钥" width="250"></el-table-column> | 
 |  |  |                 <el-table-column property="createTime$" label="时间" width="200"></el-table-column> | 
 |  |  |                 <el-table-column label="操作" width="400"> | 
 |  |  |                     <template slot-scope="scope"> | 
 |  |  |                         <el-button size="mini" @click="generateSignKey(scope.row.hostId)">签名密钥</el-button> | 
 |  |  |                         <el-button size="mini" @click="generateAppKey(scope.row.hostId)">接口密钥</el-button> | 
 |  |  |                         <el-switch | 
 |  |  |                                 v-model="scope.row.signStatus" | 
 |  |  |                                 @change="switchChange(scope.row.hostId,scope.row.signStatus)" | 
 |  |  |                                 active-text="开启签名" | 
 |  |  |                                 inactive-text="关闭签名"> | 
 |  |  |                         </el-switch> | 
 |  |  |                     </template> | 
 |  |  |                 </el-table-column> | 
 |  |  |             </el-table> | 
 |  |  |         </el-dialog> | 
 |  |  |     </div> | 
 |  |  |  | 
 |  |  |     <script> | 
 |  |  |         showdown.setOption('tables', true); | 
 |  |  |         var converter = new showdown.Converter() | 
 |  |  |  | 
 |  |  |         var app = new Vue({ | 
 |  |  |             el: '#app', | 
 |  |  |             data: { | 
 |  |  |                 keyTableVisible: false, | 
 |  |  |                 keyTableData: [], | 
 |  |  |                 loading: true | 
 |  |  |             }, | 
 |  |  |             created() { | 
 |  |  |                 this.init() | 
 |  |  |             }, | 
 |  |  |             methods: { | 
 |  |  |                 init() { | 
 |  |  |                     this.introduceClick() | 
 |  |  |                 }, | 
 |  |  |                 introduceClick() { | 
 |  |  |                     $.ajax({ | 
 |  |  |                         url: "md/reportCancel.md", | 
 |  |  |                         headers: {'token': localStorage.getItem('token')}, | 
 |  |  |                         method: 'GET', | 
 |  |  |                         success: function (res) { | 
 |  |  |                             // $("#content").html(marked.parse(res)) | 
 |  |  |                             // console.log(converter.makeHtml(res)) | 
 |  |  |                             $("#content").html(converter.makeHtml(res)) | 
 |  |  |                         } | 
 |  |  |                     }); | 
 |  |  |                 }, | 
 |  |  |                 keyList() { | 
 |  |  |                     let that = this | 
 |  |  |                     this.keyTableVisible = true | 
 |  |  |                     $.ajax({ | 
 |  |  |                         url: baseUrl + "/hostKey/list/auth", | 
 |  |  |                         headers: {'token': localStorage.getItem('token')}, | 
 |  |  |                         data: {}, | 
 |  |  |                         dataType:'json', | 
 |  |  |                         contentType:'application/json;charset=UTF-8', | 
 |  |  |                         method: 'POST', | 
 |  |  |                         success: function (res) { | 
 |  |  |                             let tmp = [] | 
 |  |  |                             res.data.forEach((item, index) => { | 
 |  |  |                                 item.signStatus = item.signStatus == 1 ? true : false; | 
 |  |  |                                 tmp.push(item) | 
 |  |  |                             }); | 
 |  |  |                             that.keyTableData = tmp | 
 |  |  |                             that.loading = false | 
 |  |  |                         } | 
 |  |  |                     }); | 
 |  |  |                 }, | 
 |  |  |                 generateSignKey(hostId) { | 
 |  |  |                     let that = this | 
 |  |  |                     this.$confirm('此操作将覆盖原签名密钥, 是否继续?', '提示', { | 
 |  |  |                         confirmButtonText: '确定', | 
 |  |  |                         cancelButtonText: '取消', | 
 |  |  |                         type: 'warning' | 
 |  |  |                     }).then(() => { | 
 |  |  |                         $.ajax({ | 
 |  |  |                             url: baseUrl + "/hostKey/generateSignKey/auth", | 
 |  |  |                             headers: {'token': localStorage.getItem('token')}, | 
 |  |  |                             data: { | 
 |  |  |                                 hostId: hostId | 
 |  |  |                             }, | 
 |  |  |                             dataType: 'json', | 
 |  |  |                             contentType: 'application/json;charset=UTF-8', | 
 |  |  |                             method: 'GET', | 
 |  |  |                             success: function (res) { | 
 |  |  |                                 if (res.code === 200) { | 
 |  |  |                                     that.$message({ | 
 |  |  |                                         type: 'success', | 
 |  |  |                                         message: '生成成功' | 
 |  |  |                                     }); | 
 |  |  |  | 
 |  |  |                                     that.keyTableData.forEach((item, index) => { | 
 |  |  |                                         if (item.hostId == hostId) { | 
 |  |  |                                             item.signKey = res.data.signKey | 
 |  |  |                                         } | 
 |  |  |                                     }); | 
 |  |  |                                 } else { | 
 |  |  |                                     that.$message({ | 
 |  |  |                                         type: 'error', | 
 |  |  |                                         message: res.msg | 
 |  |  |                                     }); | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         }); | 
 |  |  |                     }).catch(() => { | 
 |  |  |                         //取消 | 
 |  |  |                     }); | 
 |  |  |                 }, | 
 |  |  |                 generateAppKey(hostId) { | 
 |  |  |                     let that = this | 
 |  |  |                     this.$confirm('此操作将覆盖原接口密钥, 是否继续?', '提示', { | 
 |  |  |                         confirmButtonText: '确定', | 
 |  |  |                         cancelButtonText: '取消', | 
 |  |  |                         type: 'warning' | 
 |  |  |                     }).then(() => { | 
 |  |  |                         $.ajax({ | 
 |  |  |                             url: baseUrl + "/hostKey/generateAppKey/auth", | 
 |  |  |                             headers: {'token': localStorage.getItem('token')}, | 
 |  |  |                             data: { | 
 |  |  |                                 hostId: hostId | 
 |  |  |                             }, | 
 |  |  |                             dataType: 'json', | 
 |  |  |                             contentType: 'application/json;charset=UTF-8', | 
 |  |  |                             method: 'GET', | 
 |  |  |                             success: function (res) { | 
 |  |  |                                 if (res.code === 200) { | 
 |  |  |                                     that.$message({ | 
 |  |  |                                         type: 'success', | 
 |  |  |                                         message: '生成成功' | 
 |  |  |                                     }); | 
 |  |  |  | 
 |  |  |                                     that.keyTableData.forEach((item, index) => { | 
 |  |  |                                         if (item.hostId == hostId) { | 
 |  |  |                                             item.appKey = res.data.appKey | 
 |  |  |                                         } | 
 |  |  |                                     }); | 
 |  |  |                                 } else { | 
 |  |  |                                     that.$message({ | 
 |  |  |                                         type: 'error', | 
 |  |  |                                         message: res.msg | 
 |  |  |                                     }); | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         }); | 
 |  |  |                     }).catch(() => { | 
 |  |  |                         //取消 | 
 |  |  |                     }); | 
 |  |  |                 }, | 
 |  |  |                 switchChange(hostId, signStatus) { | 
 |  |  |                     let that = this | 
 |  |  |                     //签名校验开关 | 
 |  |  |                     $.ajax({ | 
 |  |  |                         url: baseUrl + "/hostKey/switchSign/auth", | 
 |  |  |                         headers: {'token': localStorage.getItem('token')}, | 
 |  |  |                         data: { | 
 |  |  |                             hostId: hostId, | 
 |  |  |                             signStatus: signStatus ? 1 : 0, | 
 |  |  |                         }, | 
 |  |  |                         dataType: 'json', | 
 |  |  |                         contentType: 'application/json;charset=UTF-8', | 
 |  |  |                         method: 'GET', | 
 |  |  |                         success: function (res) { | 
 |  |  |                             if (res.code === 200) { | 
 |  |  |                                 that.$message({ | 
 |  |  |                                     type: 'success', | 
 |  |  |                                     message: '切换成功' | 
 |  |  |                                 }); | 
 |  |  |                             } else { | 
 |  |  |                                 that.$message({ | 
 |  |  |                                     type: 'error', | 
 |  |  |                                     message: res.msg | 
 |  |  |                                 }); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     }); | 
 |  |  |                 }, | 
 |  |  |                 switchPage(url) { | 
 |  |  |                     location.href = url | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }) | 
 |  |  |     </script> | 
 |  |  | </body> | 
 |  |  | </html> | 
 
 |  |  | 
 |  |  | <body> | 
 |  |  |     <div id="app"> | 
 |  |  |         <div id="content"></div> | 
 |  |  |         <div style="position: fixed;top: 20px;right: 20px;width: 100px;"> | 
 |  |  |             <div style="position: fixed;top: 20px;right: 20px;width: 150px;border-left: 3px solid #f0f0f0;padding-left: 15px;"> | 
 |  |  |                 <div><el-button type="text" @click="switchPage('index.html')">规范说明</el-button></div> | 
 |  |  |                 <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务完成上报</el-button></div> | 
 |  |  |                 <div><el-button type="text" @click="switchPage('reportCompleted.html')">任务取消上报</el-button></div> | 
 |  |  |                 <div><el-button type="text" @click="switchPage('reportCompleted.html')">库存上报</el-button></div> | 
 |  |  |                 <div><el-button type="text" @click="reportApiManage()">上报接口管理</el-button></div> | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                 <div><el-button type="text" @click="keyList()">密钥管理</el-button></div> | 
 |  |  |             </div> | 
 |  |  |         <div class="slider"> | 
 |  |  |             <div><el-button type="text" @click="switchPage('index.html')">规范说明</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCompleted.html')">订单完成上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportCancel.html')">订单取消上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportStock.html')">库存上报</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('reportApiManage.html')">上报API管理</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderType.html')">获取订单类型</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderStatus.html')">获取订单状态列表</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('getOrderList.html')">获取订单列表</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('generateOrderPakIn.html')">生成入库订单</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('generateOrderPakOut.html')">生成出库订单</el-button></div> | 
 |  |  |             <div><el-button type="text" @click="switchPage('createMat.html')">添加物料信息</el-button></div> | 
 |  |  |             <el-divider></el-divider> | 
 |  |  |             <div><el-button type="text" @click="keyList()">密钥管理</el-button></div> | 
 |  |  |         </div> | 
 |  |  |  | 
 |  |  |         <el-dialog title="密钥管理" :visible.sync="keyTableVisible"> | 
 |  |  | 
 |  |  |                 }, | 
 |  |  |                 introduceClick() { | 
 |  |  |                     $.ajax({ | 
 |  |  |                         url: "md/introduce.md", | 
 |  |  |                         url: "md/reportCompleted.md", | 
 |  |  |                         headers: {'token': localStorage.getItem('token')}, | 
 |  |  |                         method: 'GET', | 
 |  |  |                         success: function (res) { |