Browse Source

Merge branch 'diymall' into dev

# Conflicts:
#	src/main/java/com/uas/erp/schedular/diymall/task/DiymallApplyTask.java
huangct 8 years ago
parent
commit
69d11c8603

+ 521 - 0
src/main/java/com/uas/erp/schedular/diymall/domain/DiymallOrder.java

@@ -0,0 +1,521 @@
+package com.uas.erp.schedular.diymall.domain;
+
+import com.uas.erp.schedular.util.DateUtil;
+import com.uas.erp.schedular.util.NumberUtil;
+import com.uas.erp.schedular.util.StringUtil;
+
+import java.util.Date;
+import java.util.Set;
+
+/**
+ * 定制商城订单主表数据
+ * 
+ * @author huangct
+ * @time 创建时间:2017年12月25日
+ */
+public class DiymallOrder {
+	private Long id;
+
+	//订单号
+	private String code;//SA_CODE
+
+	//付款方式
+	private Integer payment;
+
+	//用户id
+	private Integer userId;
+
+	//订单状态
+	private Integer status;
+
+	//删除   管理后台能否查询的到,类似可用状态(展示状态) 0隐藏  1展示
+	private Integer display;
+
+	//收件人
+	private String takeName;
+
+	//收件人电话 手机号
+	private String takePhone;
+
+	//收件人邮政编码(展示在收件地址中)
+	private String takePostCode;
+
+	//收件地区
+	private Integer takeAreaId;
+
+	//地区名称 收件人地区(省市区)
+	private String takeAreaMsg;
+
+	//详细地址 收件人地址(街道之类)
+	private String takeAddress;
+
+	//收款账号
+	private String toBankNumber;
+
+	//收款人
+	private String toBankName;
+
+	//收款银行
+	private String toBankType;
+
+	//收款开户行
+	private String toBbankAddress;
+
+	//付款人
+	private String fromBankNumber;
+
+	//付款账号
+	private String fromBankName;
+
+	//备注
+	private String remark;
+
+	//订单备注(管理员备注)
+	private String adminRemark;
+
+	//发票抬头 发票信息  名
+	private String invoiceName;
+
+	//发票税号 发票信息  号
+	private String invoiceNumber;
+
+	//运费表主键id
+	private Integer freightId;
+
+	//运费 运费价格
+	private Double freightPrice;
+
+	//小计
+	private Double subtotal;
+
+	//总计
+	private Double grandTotal;
+
+	//运单号
+	private String trackingCode;
+
+	//承运公司
+	private String trackingCompany;
+
+	//承运公司编号
+	private String trackingKdnCode;
+
+	//运单状态  都为0了
+	private Integer trackingStatus;
+
+	//运单最新更新时间
+	private Date trackingUpdateDate;
+
+	//下单时间(创建时间)
+	private Date createDate;
+
+	//付款时间
+	private Date paymentDate;
+
+	//发货时间
+	private Date trackingDate;
+
+	//收货时间
+	private Date receivedDate;
+
+	//完成时间
+	private Date finishDate;
+
+	//申请退款时间
+	private Date refundDate;
+
+	private Integer synData;
+
+	private Set<DiymallOrderItem> diymallOrderItems;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public Integer getPayment() {
+		return payment;
+	}
+
+	public void setPayment(Integer payment) {
+		this.payment = payment;
+	}
+
+	public Integer getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public Integer getDisplay() {
+		return display;
+	}
+
+	public void setDisplay(Integer display) {
+		this.display = display;
+	}
+
+	public String getTakeName() {
+		return takeName;
+	}
+
+	public void setTakeName(String takeName) {
+		this.takeName = takeName;
+	}
+
+	public String getTakePhone() {
+		return takePhone;
+	}
+
+	public void setTakePhone(String takePhone) {
+		this.takePhone = takePhone;
+	}
+
+	public String getTakePostCode() {
+		return takePostCode;
+	}
+
+	public void setTakePostCode(String takePostCode) {
+		this.takePostCode = takePostCode;
+	}
+
+	public Integer getTakeAreaId() {
+		return takeAreaId;
+	}
+
+	public void setTakeAreaId(Integer takeAreaId) {
+		this.takeAreaId = takeAreaId;
+	}
+
+	public String getTakeAreaMsg() {
+		return takeAreaMsg;
+	}
+
+	public void setTakeAreaMsg(String takeAreaMsg) {
+		this.takeAreaMsg = takeAreaMsg;
+	}
+
+	public String getTakeAddress() {
+		return takeAddress;
+	}
+
+	public void setTakeAddress(String takeAddress) {
+		this.takeAddress = takeAddress;
+	}
+
+	public String getToBankNumber() {
+		return toBankNumber;
+	}
+
+	public void setToBankNumber(String toBankNumber) {
+		this.toBankNumber = toBankNumber;
+	}
+
+	public String getToBankName() {
+		return toBankName;
+	}
+
+	public void setToBankName(String toBankName) {
+		this.toBankName = toBankName;
+	}
+
+	public String getToBankType() {
+		return toBankType;
+	}
+
+	public void setToBankType(String toBankType) {
+		this.toBankType = toBankType;
+	}
+
+	public String getToBbankAddress() {
+		return toBbankAddress;
+	}
+
+	public void setToBbankAddress(String toBbankAddress) {
+		this.toBbankAddress = toBbankAddress;
+	}
+
+	public String getFromBankNumber() {
+		return fromBankNumber;
+	}
+
+	public void setFromBankNumber(String fromBankNumber) {
+		this.fromBankNumber = fromBankNumber;
+	}
+
+	public String getFromBankName() {
+		return fromBankName;
+	}
+
+	public void setFromBankName(String fromBankName) {
+		this.fromBankName = fromBankName;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public String getAdminRemark() {
+		return adminRemark;
+	}
+
+	public void setAdminRemark(String adminRemark) {
+		this.adminRemark = adminRemark;
+	}
+
+	public String getInvoiceName() {
+		return invoiceName;
+	}
+
+	public void setInvoiceName(String invoiceName) {
+		this.invoiceName = invoiceName;
+	}
+
+	public String getInvoiceNumber() {
+		return invoiceNumber;
+	}
+
+	public void setInvoiceNumber(String invoiceNumber) {
+		this.invoiceNumber = invoiceNumber;
+	}
+
+	public Integer getFreightId() {
+		return freightId;
+	}
+
+	public void setFreightId(Integer freightId) {
+		this.freightId = freightId;
+	}
+
+	public Double getFreightPrice() {
+		return freightPrice;
+	}
+
+	public void setFreightPrice(Double freightPrice) {
+		this.freightPrice = freightPrice;
+	}
+
+	public Double getSubtotal() {
+		return subtotal;
+	}
+
+	public void setSubtotal(Double subtotal) {
+		this.subtotal = subtotal;
+	}
+
+	public Double getGrandTotal() {
+		return grandTotal;
+	}
+
+	public void setGrandTotal(Double grandTotal) {
+		this.grandTotal = grandTotal;
+	}
+
+	public String getTrackingCode() {
+		return trackingCode;
+	}
+
+	public void setTrackingCode(String trackingCode) {
+		this.trackingCode = trackingCode;
+	}
+
+	public String getTrackingCompany() {
+		return trackingCompany;
+	}
+
+	public void setTrackingCompany(String trackingCompany) {
+		this.trackingCompany = trackingCompany;
+	}
+
+	public String getTrackingKdnCode() {
+		return trackingKdnCode;
+	}
+
+	public void setTrackingKdnCode(String trackingKdnCode) {
+		this.trackingKdnCode = trackingKdnCode;
+	}
+
+	public Integer getTrackingStatus() {
+		return trackingStatus;
+	}
+
+	public void setTrackingStatus(Integer trackingStatus) {
+		this.trackingStatus = trackingStatus;
+	}
+
+	public Date getTrackingUpdateDate() {
+		return trackingUpdateDate;
+	}
+
+	public void setTrackingUpdateDate(Date trackingUpdateDate) {
+		this.trackingUpdateDate = trackingUpdateDate;
+	}
+
+	public Date getCreateDate() {
+		return createDate;
+	}
+
+	public void setCreateDate(Date createDate) {
+		this.createDate = createDate;
+	}
+
+	public Date getPaymentDate() {
+		return paymentDate;
+	}
+
+	public void setPaymentDate(Date paymentDate) {
+		this.paymentDate = paymentDate;
+	}
+
+	public Date getTrackingDate() {
+		return trackingDate;
+	}
+
+	public void setTrackingDate(Date trackingDate) {
+		this.trackingDate = trackingDate;
+	}
+
+	public Date getReceivedDate() {
+		return receivedDate;
+	}
+
+	public void setReceivedDate(Date receivedDate) {
+		this.receivedDate = receivedDate;
+	}
+
+	public Date getFinishDate() {
+		return finishDate;
+	}
+
+	public void setFinishDate(Date finishDate) {
+		this.finishDate = finishDate;
+	}
+
+	public Date getRefundDate() {
+		return refundDate;
+	}
+
+	public void setRefundDate(Date refundDate) {
+		this.refundDate = refundDate;
+	}
+
+	public Integer getSynData() {
+		return synData;
+	}
+
+	public void setSynData(Integer synData) {
+		this.synData = synData;
+	}
+
+	public Set<DiymallOrderItem> getDiymallOrderItems() {
+		return diymallOrderItems;
+	}
+
+	public void setDiymallOrderItems(Set<DiymallOrderItem> diymallOrderItems) {
+		this.diymallOrderItems = diymallOrderItems;
+	}
+
+	public String toSqlString(int primaryKey) {
+		return "INSERT INTO SALE (SA_ID,SA_CODE,SA_TOPLACE,SA_DATE,SA_TOTAL,SA_FARE,SA_REMARK,SA_SHCUSTNAME) VALUES ("
+				+ primaryKey
+				+ ",'"
+				+ StringUtil.nvl(code, "")
+				+ "','"
+				+ StringUtil.nvl(takeAreaMsg, "") + StringUtil.nvl(takeAddress, "")
+				+ "',"
+				+ DateUtil.parseDateToOracleString(null, createDate)
+				+ ","
+				+ NumberUtil.nvl(grandTotal, 0)
+				+ ", "
+				+ NumberUtil.nvl(freightPrice, 0)
+				+ ",'"
+				+ StringUtil.nvl(remark, "")
+				+ "','"
+				+ StringUtil.nvl(takeName, "")
+
+
+//				+ "', "
+//				+ StringUtil.nvl(payment, "")
+//				+ ",'"
+//				+ StringUtil.nvl(userId, "")
+//				+ ",'"
+//				+ StringUtil.nvl(status, "")
+//				+ "', "
+//				+ StringUtil.nvl(display, "")
+//				+ ",'"
+//				+ StringUtil.nvl(takePhone, "")
+//				+ "', "
+//				+ StringUtil.nvl(takePostCode, "")
+//				+ ",'"
+//				+ StringUtil.nvl(takeAreaId, "")
+//				+ ",'"
+//				+ StringUtil.nvl(toBankNumber, "")
+//				+ ",'"
+//				+ StringUtil.nvl(toBankName, "")
+//				+ "', "
+//				+ StringUtil.nvl(toBankType, "")
+//				+ ",'"
+//				+ StringUtil.nvl(toBbankAddress, "")
+//				+ ",'"
+//				+ StringUtil.nvl(fromBankNumber, "")
+//				+ "', "
+//				+ StringUtil.nvl(fromBankName, "")
+//				+ ",'"
+//				+ StringUtil.nvl(adminRemark, "")
+//				+ "', "
+//				+ StringUtil.nvl(invoiceName, "")
+//				+ ",'"
+//				+ StringUtil.nvl(invoiceNumber, "")
+//				+ ",'"
+//				+ StringUtil.nvl(freightId, "")
+//				+ ",'"
+//				+ StringUtil.nvl(subtotal, "")
+//				+ "', "
+//				+ StringUtil.nvl(trackingCode, "")
+//				+ ",'"
+//				+ StringUtil.nvl(trackingCompany, "")
+//				+ ",'"
+//				+ StringUtil.nvl(trackingKdnCode, "")
+//				+ "', "
+//				+ StringUtil.nvl(trackingStatus, "")
+//				+ ",'"
+//				+ StringUtil.nvl(trackingUpdateDate, "")
+//				+ "', "
+//				+ StringUtil.nvl(paymentDate, "")
+//				+ ",'"
+//				+ StringUtil.nvl(trackingDate, "")
+//				+ ",'"
+//				+ StringUtil.nvl(receivedDate, "")
+//				+ "', "
+//				+ StringUtil.nvl(finishDate, "")
+//				+ ",'"
+//				+ StringUtil.nvl(refundDate, "")
+
+				+ "')";
+	}
+}

+ 204 - 0
src/main/java/com/uas/erp/schedular/diymall/domain/DiymallOrderItem.java

@@ -0,0 +1,204 @@
+package com.uas.erp.schedular.diymall.domain;
+
+import com.uas.erp.schedular.util.NumberUtil;
+import com.uas.erp.schedular.util.StringUtil;
+
+/**
+ * 定制商城订单从表数据
+ *
+ * @author huangct
+ * @time 创建时间:2017年12月25日
+ */
+public class DiymallOrderItem {
+
+    private Integer id;
+
+    private Integer ordersId;
+
+    //用户定制id
+    private Integer userDiyId;
+
+    //定制标题
+    private String diyTitle;
+
+    //定制简介
+    private String diyRemark;
+
+    //定制图片
+    private String diyImgUrl;
+
+    //定制内容
+    private String diyContent;
+
+    //瓶子id
+    private Integer bottleId;
+
+    //瓶子名称
+    private String bottleTitle;
+
+    //瓶子重量
+    private Double bottleWeight;
+
+    //水源id
+    private Integer bottleTypeId;
+
+    //水源名称
+    private String bottleTypeTitle;
+
+    //单价
+    private Double itemPrice;
+
+    //数量(箱)
+    private Integer itemNumber;
+
+    //小计
+    private Double subtotal;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getOrdersId() {
+        return ordersId;
+    }
+
+    public void setOrdersId(Integer ordersId) {
+        this.ordersId = ordersId;
+    }
+
+    public Integer getUserDiyId() {
+        return userDiyId;
+    }
+
+    public void setUserDiyId(Integer userDiyId) {
+        this.userDiyId = userDiyId;
+    }
+
+    public String getDiyTitle() {
+        return diyTitle;
+    }
+
+    public void setDiyTitle(String diyTitle) {
+        this.diyTitle = diyTitle;
+    }
+
+    public String getDiyRemark() {
+        return diyRemark;
+    }
+
+    public void setDiyRemark(String diyRemark) {
+        this.diyRemark = diyRemark;
+    }
+
+    public String getDiyImgUrl() {
+        return diyImgUrl;
+    }
+
+    public void setDiyImgUrl(String diyImgUrl) {
+        this.diyImgUrl = diyImgUrl;
+    }
+
+    public String getDiyContent() {
+        return diyContent;
+    }
+
+    public void setDiyContent(String diyContent) {
+        this.diyContent = diyContent;
+    }
+
+    public Integer getBottleId() {
+        return bottleId;
+    }
+
+    public void setBottleId(Integer bottleId) {
+        this.bottleId = bottleId;
+    }
+
+    public String getBottleTitle() {
+        return bottleTitle;
+    }
+
+    public void setBottleTitle(String bottleTitle) {
+        this.bottleTitle = bottleTitle;
+    }
+
+    public Double getBottleWeight() {
+        return bottleWeight;
+    }
+
+    public void setBottleWeight(Double bottleWeight) {
+        this.bottleWeight = bottleWeight;
+    }
+
+    public Integer getBottleTypeId() {
+        return bottleTypeId;
+    }
+
+    public void setBottleTypeId(Integer bottleTypeId) {
+        this.bottleTypeId = bottleTypeId;
+    }
+
+    public String getBottleTypeTitle() {
+        return bottleTypeTitle;
+    }
+
+    public void setBottleTypeTitle(String bottleTypeTitle) {
+        this.bottleTypeTitle = bottleTypeTitle;
+    }
+
+    public Double getItemPrice() {
+        return itemPrice;
+    }
+
+    public void setItemPrice(Double itemPrice) {
+        this.itemPrice = itemPrice;
+    }
+
+    public Integer getItemNumber() {
+        return itemNumber;
+    }
+
+    public void setItemNumber(Integer itemNumber) {
+        this.itemNumber = itemNumber;
+    }
+
+    public Double getSubtotal() {
+        return subtotal;
+    }
+
+    public void setSubtotal(Double subtotal) {
+        this.subtotal = subtotal;
+    }
+
+    public String toSqlString(int primaryKey, int saleId, int prodId, String code, int dentNo) {
+        return "INSERT INTO SALEDETAIL (SD_ID,SD_SAID,SD_PRODID,SD_CODE,SD_DETNO,SD_DESCRIPTION,SD_REMARK,SD_QTY,SD_PRICE,SD_TOTAL,SD_PRODNAME,SD_PRODSPEC) VALUES ("
+                + primaryKey
+                + ","
+                + saleId
+                + ","
+                + prodId
+                + ",'"
+                + code
+                + "',"
+                + dentNo
+                + ",'"
+                + StringUtil.nvl(diyTitle, "")
+                + "','"
+                + StringUtil.nvl(diyRemark, "")
+                + "',"
+                + NumberUtil.nvl(itemNumber, 0)
+                + ", "
+                + NumberUtil.nvl(itemPrice, 0)
+                + ", "
+                + NumberUtil.nvl(subtotal, 0)
+                + ",'"
+                + StringUtil.nvl(bottleTypeTitle, "")
+                + "','"
+                + StringUtil.nvl(bottleTitle, "")
+                + "')";
+    }
+}

+ 324 - 0
src/main/java/com/uas/erp/schedular/diymall/task/AbstractTask.java

@@ -0,0 +1,324 @@
+package com.uas.erp.schedular.diymall.task;
+
+import com.alibaba.fastjson.JSON;
+import com.uas.erp.schedular.agent.v1.AbstractAgent;
+import com.uas.erp.schedular.b2b.domain.Attach;
+import com.uas.erp.schedular.b2b.domain.KeyEntity;
+import com.uas.erp.schedular.b2b.domain.Prod;
+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.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;
+
+/**
+ * Created by Pro1 on 2017/7/26.
+ */
+public class AbstractTask extends AbstractAgent {
+
+    // 数据传输单次大小限制
+    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.diymall.test.url" : "api.diymall.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) {
+            super("product", "pr_id", "PR_SENDSTATUS", "/erp/product", 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.execute("{call SP_CREATEINFO(?,'ADMIN',?,?)}",
+                    mid, sourceIds, DateUtil.parseDateToOracleString(Constant.YMD_HMS, new Date()));
+        }
+    }
+
+}

+ 120 - 0
src/main/java/com/uas/erp/schedular/diymall/task/DiymallApplyTask.java

@@ -0,0 +1,120 @@
+package com.uas.erp.schedular.diymall.task;
+
+import com.uas.erp.schedular.diymall.domain.DiymallOrder;
+import com.uas.erp.schedular.diymall.domain.DiymallOrderItem;
+import com.uas.erp.schedular.task.support.Method;
+import com.uas.erp.schedular.task.support.Role;
+import com.uas.erp.schedular.task.support.TaskMapping;
+import com.uas.erp.schedular.util.CollectionUtil;
+import com.uas.erp.schedular.util.ContextHolder;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Created by huangct on 2017/12/26.
+ */
+@Component
+@TaskMapping(title = "定制商城", role = Role.SELLER)
+public class DiymallApplyTask extends AbstractTask {
+    @TaskMapping(title = "从定制商城下载客户的订单数据", fixedDelay = 60000, method = Method.DOWNLOAD)
+    public void downloadDiymallOrder() {
+        List<DiymallOrder> diymallOrders = getForList("/erp/loan", DiymallOrder.class);
+        if (!CollectionUtils.isEmpty(diymallOrders)) {
+            ContextHolder.setDataSize(diymallOrders.size());
+            saveSale(diymallOrders);
+            // TODO notice++
+            // 回执
+            onSaleSuccess(diymallOrders);
+        }
+    }
+
+    /**
+     * 保存Sale
+     *
+     * @param diymallOrders
+     */
+    private void saveSale(List<DiymallOrder> diymallOrders) {
+        //List<Long> idList = new ArrayList<Long>();
+        for (DiymallOrder diymallOrder : diymallOrders) {
+            int count = jdbcTemplate.count("from sale where SA_CODE=?", diymallOrder.getCode());
+            if (count == 0) {
+                int saleId = jdbcTemplate.generate("sale_seq");
+                //idList.add(Long.valueOf(saleId));
+                //TODO sale主从表 product物料表
+                String sql = diymallOrder.toSqlString(saleId);
+                jdbcTemplate.execute(sql);
+                saveSaleDetail(saleId, diymallOrder);
+            }
+        }
+    }
+
+    /**
+     * 保存SaleDetail
+     *
+     * @param saleId 主表id
+     * @param diymallOrder 定制商城订单
+     */
+    private void saveSaleDetail(int saleId,DiymallOrder diymallOrder) {
+        List<String> sqls = new ArrayList<>();
+        Set<DiymallOrderItem> diymallOrderItems =  diymallOrder.getDiymallOrderItems();
+        if (!diymallOrderItems.isEmpty()) {
+            int dentNo = 1;
+            for (DiymallOrderItem diymallOrderItem : diymallOrderItems) {
+
+                String bottleTitle = diymallOrderItem.getBottleTitle();
+                String bottleTypeTitle = diymallOrderItem.getBottleTypeTitle();
+                int productId = saveProduct(bottleTitle, bottleTypeTitle);
+                int saleDetailId = jdbcTemplate.generate("SALEDETAIL_SEQ");
+                // 保存从表数据
+                String sql = diymallOrderItem.toSqlString(saleDetailId, saleId, productId, diymallOrder.getCode(), dentNo);
+                sqls.add(sql);
+                dentNo ++;
+            }
+
+            if (sqls.size() > 0) {
+                jdbcTemplate.batchExecute(sqls);
+            }
+        }
+    }
+
+    /**
+     * 保存Product
+     *
+     * @param bottleTitle 物料规格
+     * @param bottleTypeTitle 物料详情
+     */
+    private int saveProduct(String bottleTitle, String bottleTypeTitle) {
+        int productId;
+        //int count = jdbcTemplate.count("from product where PR_SPEC=? and PR_DETAIL=?", bottleTitle, bottleTypeTitle);
+        String prId  = jdbcTemplate.getString("select PR_ID from product where PR_SPEC='" + bottleTitle +"' and PR_DETAIL='" + bottleTypeTitle + "'");
+        if (StringUtils.isEmpty(prId)) {
+            //TODO 插入物料
+            productId = jdbcTemplate.generate("PRODUCT_SEQ");
+            String sql = "insert into PRODUCT (PR_ID, PR_SPEC, PR_DETAIL) values ('" + productId + "','"+ bottleTitle + "','" + bottleTypeTitle + "')";
+            jdbcTemplate.execute(sql);
+        } else {
+            productId = Integer.parseInt(prId);
+        }
+        return productId;
+    }
+
+    /**
+     * 保存Sale成功,修改定制商城的订单为已下载
+     *
+     * @param diymallOrders
+     */
+    private void onSaleSuccess(List<DiymallOrder> diymallOrders) {
+        String idStr = CollectionUtil.getKeyString(diymallOrders, new CollectionUtil.KeyIterator<DiymallOrder>() {
+            @Override
+            public Object getKey(DiymallOrder obj) {
+                return obj.getId();
+            }
+        });
+        post("/erp/loan/back", dataWrap(idStr));
+    }
+}

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

@@ -25,4 +25,12 @@
   "key": "api.finance.url",
   "description": "金融保理平台正式接口地址",
   "value": "http://10.10.100.178:23000"
+},{
+  "key": "api.diymall.test.url",
+  "description": "定制商城本地测试接口地址",
+  "value": "http://10.10.100.23:20215"
+},{
+  "key": "api.diymall.url",
+  "description": "定制商城正式接口地址",
+  "value": "http://10.10.100.23:20215"
 }]