Browse Source

增加同步物料到公共物料方法,增加同步公共询价到公共询价方法

hejq 8 years ago
parent
commit
528058eb2f

+ 1 - 1
src/main/java/com/uas/erp/schedular/ps/domain/Attach.java → src/main/java/com/uas/erp/schedular/psInquiry/domain/Attach.java

@@ -1,4 +1,4 @@
-package com.uas.erp.schedular.ps.domain;
+package com.uas.erp.schedular.psInquiry.domain;
 
 import java.io.Serializable;
 

+ 1 - 1
src/main/java/com/uas/erp/schedular/ps/domain/BatchInProduct.java → src/main/java/com/uas/erp/schedular/psInquiry/domain/BatchInProduct.java

@@ -1,4 +1,4 @@
-package com.uas.erp.schedular.ps.domain;
+package com.uas.erp.schedular.psInquiry.domain;
 
 /**
  * 公共询价物料信息

+ 1 - 1
src/main/java/com/uas/erp/schedular/ps/domain/BatchInquiry.java → src/main/java/com/uas/erp/schedular/psInquiry/domain/BatchInquiry.java

@@ -1,4 +1,4 @@
-package com.uas.erp.schedular.ps.domain;
+package com.uas.erp.schedular.psInquiry.domain;
 
 import com.uas.erp.schedular.b2b.domain.KeyEntity;
 

+ 1 - 1
src/main/java/com/uas/erp/schedular/ps/domain/Enterprise.java → src/main/java/com/uas/erp/schedular/psInquiry/domain/Enterprise.java

@@ -1,4 +1,4 @@
-package com.uas.erp.schedular.ps.domain;
+package com.uas.erp.schedular.psInquiry.domain;
 
 /**
  * 企业信息

+ 7 - 7
src/main/java/com/uas/erp/schedular/ps/task/AbstractTask.java → src/main/java/com/uas/erp/schedular/psInquiry/task/AbstractTask.java

@@ -1,14 +1,13 @@
-package com.uas.erp.schedular.ps.task;
+package com.uas.erp.schedular.psInquiry.task;
 
 import com.alibaba.fastjson.JSON;
-import com.uas.api.crypto.util.FlexJsonUtils;
 import com.uas.erp.schedular.b2b.domain.KeyEntity;
 import com.uas.erp.schedular.core.Constant;
 import com.uas.erp.schedular.database.RestJdbcTemplate;
 import com.uas.erp.schedular.entity.Master;
-import com.uas.erp.schedular.ps.domain.Attach;
-import com.uas.erp.schedular.ps.domain.Enterprise;
-import com.uas.erp.schedular.ps.domain.Prod;
+import com.uas.erp.schedular.psInquiry.domain.Attach;
+import com.uas.erp.schedular.psInquiry.domain.Enterprise;
+import com.uas.erp.schedular.psProduct.domain.Prod;
 import com.uas.erp.schedular.service.SettingService;
 import com.uas.erp.schedular.util.CollectionUtil;
 import com.uas.erp.schedular.util.ContextHolder;
@@ -34,7 +33,7 @@ import java.util.Date;
 import java.util.List;
 
 /**
- * 公共服务的轮询配置
+ * 公共询价的轮询配置
  * 
  * @author hejq
  * @date 2018-01-17 14:25
@@ -60,7 +59,7 @@ public class AbstractTask {
      * @return
      */
     private String getApiDomain() {
-        String key = "test".equals(ContextHolder.getMaster().getMa_env()) ? "api.ps.test.url" : "api.ps.url";
+        String key = "test".equals(ContextHolder.getMaster().getMa_env()) ? "api.psInquiry.test.url" : "api.psInquiry.url";
         return settingService.getValue(key);
     }
 
@@ -286,6 +285,7 @@ public class AbstractTask {
      * 处理物料上传的工具
      */
     protected final class ProductHandler extends StatusBasedHandler<Prod>{
+
         public ProductHandler(List<Prod> data, Enterprise enterprise) {
             super("product", "pr_id", "PR_SENDSTATUS", "/erp/product?enuu=" + enterprise.getEn_uu(), data);
         }

+ 5 - 5
src/main/java/com/uas/erp/schedular/ps/task/InquiryTask.java → src/main/java/com/uas/erp/schedular/psInquiry/task/InquiryTask.java

@@ -1,14 +1,14 @@
-package com.uas.erp.schedular.ps.task;
+package com.uas.erp.schedular.psInquiry.task;
 
 import com.uas.erp.schedular.b2b.domain.Inquiry;
 import com.uas.erp.schedular.b2b.domain.InquiryDecide;
 import com.uas.erp.schedular.b2b.domain.InquiryDetail;
 import com.uas.erp.schedular.b2b.domain.RemoteFile;
 import com.uas.erp.schedular.database.SqlTemplate;
-import com.uas.erp.schedular.ps.domain.BatchInProduct;
-import com.uas.erp.schedular.ps.domain.BatchInquiry;
-import com.uas.erp.schedular.ps.domain.Enterprise;
-import com.uas.erp.schedular.ps.domain.Prod;
+import com.uas.erp.schedular.psInquiry.domain.BatchInProduct;
+import com.uas.erp.schedular.psInquiry.domain.BatchInquiry;
+import com.uas.erp.schedular.psInquiry.domain.Enterprise;
+import com.uas.erp.schedular.psProduct.domain.Prod;
 import com.uas.erp.schedular.task.support.Method;
 import com.uas.erp.schedular.task.support.TaskMapping;
 import com.uas.erp.schedular.util.CollectionUtil;

+ 1 - 1
src/main/java/com/uas/erp/schedular/ps/domain/Prod.java → src/main/java/com/uas/erp/schedular/psProduct/domain/Prod.java

@@ -1,4 +1,4 @@
-package com.uas.erp.schedular.ps.domain;
+package com.uas.erp.schedular.psProduct.domain;
 
 import com.uas.erp.schedular.b2b.domain.KeyEntity;
 

+ 327 - 0
src/main/java/com/uas/erp/schedular/psProduct/task/AbstractTask.java

@@ -0,0 +1,327 @@
+package com.uas.erp.schedular.psProduct.task;
+
+import com.alibaba.fastjson.JSON;
+import com.uas.erp.schedular.b2b.domain.KeyEntity;
+import com.uas.erp.schedular.core.Constant;
+import com.uas.erp.schedular.database.RestJdbcTemplate;
+import com.uas.erp.schedular.entity.Master;
+import com.uas.erp.schedular.psInquiry.domain.Attach;
+import com.uas.erp.schedular.psInquiry.domain.Enterprise;
+import com.uas.erp.schedular.psProduct.domain.Prod;
+import com.uas.erp.schedular.service.SettingService;
+import com.uas.erp.schedular.util.CollectionUtil;
+import com.uas.erp.schedular.util.ContextHolder;
+import com.uas.erp.schedular.util.DateUtil;
+import com.uas.erp.schedular.util.HmacUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.util.StringUtils;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URLEncoder;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 公共物料的轮询配置
+ * 
+ * @author hejq
+ * @date 2018-01-17 14:25
+ */
+public class AbstractTask {
+
+    // 数据传输单次大小限制
+    protected static final int DATA_SIZE_LIMIT = 500;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    protected RestJdbcTemplate jdbcTemplate;
+
+    @Autowired
+    protected SettingService settingService;
+
+    protected Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    /**
+     * 按账套环境,使用不同接口地址
+     * @return
+     */
+    private String getApiDomain() {
+        String key = "test".equals(ContextHolder.getMaster().getMa_env()) ? "api.psProduct.test.url" : "api.psProduct.url";
+        return settingService.getValue(key);
+    }
+
+    /**
+     * UAS系统外网地址
+     * @return
+     */
+    private String getUASUrl() {
+        return settingService.getValue("api.uas.outer.url");
+    }
+
+    /**
+     * URI加身份签名
+     * @param url
+     * @param vars
+     * @return
+     */
+    private String getURI(String url, Object... vars) {
+        Master master = ContextHolder.getMaster();
+        if (null == master.getMa_uu() || StringUtils.isEmpty(master.getMa_accesssecret())) {
+            throw new RuntimeException("未设置企业UU和私钥");
+        }
+        StringBuffer accessUrl = new StringBuffer(url);
+        accessUrl.append(url.contains("?") ? "&" : "?");
+        // 身份ID
+        accessUrl.append("access_id=").append(master.getMa_uu());
+        // 时间戳
+        accessUrl.append("&_timestamp=").append(System.currentTimeMillis());
+        URI uri = restTemplate.getUriTemplateHandler().expand(getApiDomain() + accessUrl.toString(), vars);
+        url = uri.toString();
+        // 签名
+        return url + "&_signature=" + HmacUtils.encode(url, master.getMa_accesssecret());
+    }
+
+    protected <T> T getForObject(String url, Class<T> objectClass, Object... vars) {
+        return restTemplate.getForObject(getURI(url, vars), objectClass);
+    }
+
+    protected <T> List<T> getForList(String url, Class<T> objectClass, Object... vars) {
+        String resultStr = restTemplate.getForObject(getURI(url, vars), String.class);
+        return JSON.parseArray(resultStr, objectClass);
+    }
+
+    /**
+     * b2b当前版本的接口只支持以form-data方式提交,requestBody方式暂不支持
+     * @param url
+     * @param vars
+     */
+    protected void post(String url, MultiValueMap<String, String> vars) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(vars, headers);
+        restTemplate.postForLocation(getURI(url), request);
+    }
+
+    protected ResponseEntity postForEntity(String url, MultiValueMap<String, String> vars) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(vars, headers);
+        return restTemplate.postForEntity(getURI(url), request, String.class);
+    }
+
+    protected <T> List<T> postForList(String url, Class<T> objectClass, MultiValueMap<String, String> vars) {
+        ResponseEntity<String> resultEntity = postForEntity(url, vars);
+        return JSON.parseArray(resultEntity.getBody(), objectClass);
+    }
+
+    /**
+     * 封装成平台接口数据格式
+     * @param data
+     * @return
+     */
+    protected static MultiValueMap<String, String> dataWrap(Object data) {
+        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
+        String dataStr = null;
+        Class<?> cls = data.getClass();
+        if (cls.isAssignableFrom(String.class) || cls.isAssignableFrom(Number.class) ||
+                cls.isAssignableFrom(Character.class)) {
+            dataStr = data.toString();
+        } else {
+            dataStr = JSON.toJSONString(data);
+        }
+        try {
+            dataStr = URLEncoder.encode(dataStr, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+
+        }
+        map.set("data", dataStr);
+        return map;
+    }
+
+    /**
+     * 数据上传工具,封装了处理前、后置、错误处理方法
+     * @param <T>
+     */
+    protected abstract class AbstractHandler<T> {
+
+        private List<T> data;
+
+        public AbstractHandler(List<T> data) {
+            this.data = data;
+        }
+
+        /**
+         * onHandler方法前执行
+         */
+        protected void onBefore(){
+
+        }
+
+        protected abstract ResponseEntity onHandler(List<T> data);
+
+        /**
+         * onHandler方法执行成功后执行
+         */
+        protected void onSuccess(){
+
+        }
+
+        /**
+         * onHandler方法执行失败后执行
+         */
+        protected void onError(String message){
+            throw new RuntimeException(message);
+        }
+
+        /**
+         * 所有方法执行完成后执行
+         */
+        protected void onAfter(){
+
+        }
+
+        public void run() {
+            String errMsg = null;
+            onBefore();
+            try {
+                ResponseEntity response = onHandler(data);
+                if (!response.getStatusCode().is2xxSuccessful()) {
+                    errMsg = String.valueOf(response.getBody());
+                }
+            } catch (Exception e) {
+                errMsg = e.getMessage();
+            }
+            try {
+                if (null == errMsg) {
+                    onSuccess();
+                } else {
+                    onError(errMsg);
+                }
+            } finally {
+                onAfter();
+            }
+        }
+    }
+
+    /**
+     * POST方式处理工具
+     * @param <T>
+     */
+    protected class AbstractPostHandler<T> extends AbstractHandler<T> {
+        private String postUri;
+
+        public AbstractPostHandler(String postUri, List<T> data) {
+            super(data);
+            this.postUri = postUri;
+        }
+
+        @Override
+        protected ResponseEntity onHandler(List<T> data) {
+            return postForEntity(postUri, dataWrap(data));
+        }
+    }
+
+    /**
+     * 基于状态控制的处理工具
+     * @param <T>
+     */
+    protected abstract class AbstractStatusBasedHandler<T extends KeyEntity> extends AbstractPostHandler<T> {
+
+        private String idStr;
+        private String tableName;
+        private String idColumn;
+        private String statusColumn;
+
+        public AbstractStatusBasedHandler(String tableName, String idColumn, String statusColumn, String postUri, List<T> data) {
+            super(postUri, data);
+            this.idStr = CollectionUtil.getKeyString(data);
+            this.tableName = tableName;
+            this.idColumn = idColumn;
+            this.statusColumn = statusColumn;
+        }
+
+        @Override
+        protected void onBefore() {
+            jdbcTemplate.execute(String.format("update %s set %s='上传中' where %s in (%s)", tableName, statusColumn, idColumn, idStr));
+        }
+
+        @Override
+        protected void onSuccess() {
+            jdbcTemplate.execute(String.format("update %s set %s='已上传' where %s in (%s)", tableName, statusColumn, idColumn, idStr));
+        }
+
+        @Override
+        protected void onError(String message) {
+            jdbcTemplate.execute(String.format("update %s set %s='待上传' where %s in (%s) and %s='上传中'", tableName, statusColumn, idColumn, idStr, statusColumn));
+            super.onError(message);
+        }
+    }
+
+    /**
+     * 基于状态控制的处理工具
+     * @param <T>
+     */
+    protected class StatusBasedHandler<T extends KeyEntity> extends AbstractStatusBasedHandler<T> {
+
+        public StatusBasedHandler(String tableName, String idColumn, String statusColumn, String postUri, List<T> data) {
+            super(tableName, idColumn, statusColumn, postUri, data);
+        }
+    }
+
+    /**
+     * 处理物料上传的工具
+     */
+    protected final class ProductHandler extends StatusBasedHandler<Prod>{
+
+        public ProductHandler(List<Prod> data, Enterprise enterprise) {
+            super("product", "pr_id", "PR_SENDSTATUS", "/erp/product?enuu=" + enterprise.getEn_uu(), data);
+        }
+    }
+
+    /**
+     * 查找附件
+     * @param attachIds 附件ID
+     * @return
+     */
+    protected List<Attach> getAttachs(String[] attachIds) {
+        String erpUrl = getUASUrl();
+        List<Attach> attaches = jdbcTemplate.queryForBeanList("select fp_id, fp_size, fp_name from filepath where fp_id in ("
+                + StringUtils.arrayToDelimitedString(attachIds, ",") + ")", Attach.class);
+        if (!CollectionUtils.isEmpty(attaches)) {
+            for (Attach attach : attaches) {
+                attach.setFp_url(erpUrl + Attach.DOWN_FILE_ACTION + attach.getFp_id());
+            }
+        }
+        return attaches;
+    }
+
+    /**
+     * 创建消息
+     *
+     * @param caller
+     * @param sourceIds
+     * @param type
+     */
+    protected void createMessage(String caller, String sourceIds, String type) {
+        Integer mid = jdbcTemplate.getInt("select max(mm_id) from MESSAGEMODEL left join MESSAGEROLE on mm_id=mr_mmid where MR_ISUSED=-1 AND MM_ISUSED=-1 and mm_caller=? and MM_OPERATE='b2b' AND MM_ACTION=?",
+                caller, type);
+        if (null != mid) {
+            jdbcTemplate.callForString("{call SP_CREATEINFO(?,'ADMIN',?,?,?)}",
+                    mid, sourceIds, DateUtil.parseDateToOracleString(Constant.YMD_HMS, new Date()));
+        }
+    }
+
+}

+ 8 - 8
src/main/java/com/uas/erp/schedular/ps/task/ProdTask.java → src/main/java/com/uas/erp/schedular/psProduct/task/ProdTask.java

@@ -1,7 +1,7 @@
-package com.uas.erp.schedular.ps.task;
+package com.uas.erp.schedular.psProduct.task;
 
-import com.uas.erp.schedular.ps.domain.Enterprise;
-import com.uas.erp.schedular.ps.domain.Prod;
+import com.uas.erp.schedular.psInquiry.domain.Enterprise;
+import com.uas.erp.schedular.psProduct.domain.Prod;
 import com.uas.erp.schedular.task.support.Method;
 import com.uas.erp.schedular.task.support.TaskMapping;
 import com.uas.erp.schedular.util.CollectionUtil;
@@ -33,7 +33,7 @@ public class ProdTask extends AbstractTask {
                     Prod.class);
             if (!CollectionUtils.isEmpty(prods)) {
                 ContextHolder.increaseDataSize(prods.size());
-                new StatusBasedHandler<Prod>("product", "pr_id", "PR_SENDSTATUS", "/erp/product/cycleupdate", prods).run();
+                new StatusBasedHandler<Prod>("product", "pr_id", "PR_SENDSTATUS", "/product/cycleupdate", prods).run();
                 if (prods.size() == DATA_SIZE_LIMIT) {
                     // 递归,直到没有需要上传的数据
                     uploadProduct();
@@ -49,7 +49,7 @@ public class ProdTask extends AbstractTask {
     public void downloadProduct() {
         Enterprise enterprise = getEnterprise();
         if (null != enterprise) {
-            List<Prod> prods = getForList("/erp/product/backtouas", Prod.class);
+            List<Prod> prods = getForList("/product/backtouas", Prod.class);
             if (!CollectionUtils.isEmpty(prods)) {
                 ContextHolder.setDataSize(prods.size());
                 saveProdDown(prods);
@@ -84,7 +84,7 @@ public class ProdTask extends AbstractTask {
                 return obj.getB2b_id();
             }
         });
-        post("/erp/product/refreshDownloadstatus", dataWrap(idStr));
+        post("/product/refreshDownloadstatus", dataWrap(idStr));
     }
 
     /**
@@ -92,8 +92,8 @@ public class ProdTask extends AbstractTask {
      *
      * @return
      */
-    public com.uas.erp.schedular.ps.domain.Enterprise getEnterprise() {
-        Enterprise enterprise = jdbcTemplate.queryForBean("select en_address, en_uu, en_name from enterprise where en_uu is not null", com.uas.erp.schedular.ps.domain.Enterprise.class);
+    public com.uas.erp.schedular.psInquiry.domain.Enterprise getEnterprise() {
+        Enterprise enterprise = jdbcTemplate.queryForBean("select en_address, en_uu, en_name from enterprise where en_uu is not null", com.uas.erp.schedular.psInquiry.domain.Enterprise.class);
         return enterprise;
     }
 }

+ 14 - 0
src/main/resources/init/setting.json

@@ -40,4 +40,18 @@
   "key": "api.diymall.url",
   "description": "定制商城正式接口地址",
   "value": "http://10.10.100.23:20215"
+},{
+  "key": "api.psInquiry.test.url",
+  "description": "公共询价测试地址",
+  "value": "http://192.168.253.12:24001"
+},{
+  "key": "api.psInquiry.url",
+  "description": "公共询价正式地址"
+},{
+  "key": "api.psProduct.test.url",
+  "description": "公共物料测试地址",
+  "value": "http://218.17.158.219:24000"
+},{
+  "key": "api.psProduct.url",
+  "description": "公共物料正式地址"
 }]