Browse Source

商城订单对接

chenw 7 years ago
parent
commit
8ee6fde943

+ 26 - 1
src/main/java/com/uas/erp/schedular/b2b/domain/Customer.java

@@ -75,7 +75,32 @@ public class Customer {
 	private int b2b;
 	private String cu_uu;
 	private Long b2b_vendor_id;
-	public Integer getCu_id() {
+    /**
+     * 应收客户编号
+     */
+	private String cu_arcode;
+    /**
+     * 应收客户名称
+     */
+	private String cu_arname;
+
+    public String getCu_arcode() {
+        return cu_arcode;
+    }
+
+    public void setCu_arcode(String cu_arcode) {
+        this.cu_arcode = cu_arcode;
+    }
+
+    public String getCu_arname() {
+        return cu_arname;
+    }
+
+    public void setCu_arname(String cu_arname) {
+        this.cu_arname = cu_arname;
+    }
+
+    public Integer getCu_id() {
 		return cu_id;
 	}
 

+ 60 - 0
src/main/java/com/uas/erp/schedular/b2b/domain/Vendor.java

@@ -80,6 +80,66 @@ public class Vendor {
      * @return
      */
     private String ve_industry;
+    /**
+     * 应付供应商编号
+     */
+    private String ve_apvendcode;
+    /**
+     * 应付供应商名称
+     */
+    private String ve_apvendname;
+    /**
+     * 付款方式ID
+     */
+    private Integer ve_paymentid;
+    /**
+     * 付款方式编号
+     */
+    private String ve_paymentcode;
+    /**
+     * 付款方式
+     */
+    private String ve_payment;
+
+    public String getVe_apvendcode() {
+        return ve_apvendcode;
+    }
+
+    public void setVe_apvendcode(String ve_apvendcode) {
+        this.ve_apvendcode = ve_apvendcode;
+    }
+
+    public String getVe_apvendname() {
+        return ve_apvendname;
+    }
+
+    public void setVe_apvendname(String ve_apvendname) {
+        this.ve_apvendname = ve_apvendname;
+    }
+
+    public Integer getVe_paymentid() {
+        return ve_paymentid;
+    }
+
+    public void setVe_paymentid(Integer ve_paymentid) {
+        this.ve_paymentid = ve_paymentid;
+    }
+
+    public String getVe_paymentcode() {
+        return ve_paymentcode;
+    }
+
+    public void setVe_paymentcode(String ve_paymentcode) {
+        this.ve_paymentcode = ve_paymentcode;
+    }
+
+    public String getVe_payment() {
+        return ve_payment;
+    }
+
+    public void setVe_payment(String ve_payment) {
+        this.ve_payment = ve_payment;
+    }
 
     public Short getVendorSwitch() {
         return vendorSwitch;

+ 1 - 1
src/main/java/com/uas/erp/schedular/diymall/domain/GetOrdersByPage.java → src/main/java/com/uas/erp/schedular/diymall/domain/OrdersInfo.java

@@ -8,7 +8,7 @@ import java.util.List;
  * @author zhaoy
  * @create 2019-05-09 9:49
  */
-public class GetOrdersByPage {
+public class OrdersInfo {
 
     private PagingInfo pagingInfo; // 分页信息
     private List<Order> order; // 订单列表

+ 22 - 0
src/main/java/com/uas/erp/schedular/mall/domain/DeliverResp.java

@@ -0,0 +1,22 @@
+package com.uas.erp.schedular.mall.domain;
+
+import com.uas.erp.schedular.finance.domain.ERPRespHeader;
+
+import java.io.Serializable;
+
+/**
+ * @Author chenwei
+ * @Date 2019-05-21
+ */
+public class DeliverResp implements Serializable {
+
+    private ERPRespHeader respHeader;
+
+    public ERPRespHeader getRespHeader() {
+        return respHeader;
+    }
+
+    public void setRespHeader(ERPRespHeader respHeader) {
+        this.respHeader = respHeader;
+    }
+}

+ 56 - 0
src/main/java/com/uas/erp/schedular/mall/domain/OrderDeliver.java

@@ -0,0 +1,56 @@
+package com.uas.erp.schedular.mall.domain;
+
+import java.io.Serializable;
+
+/**
+ * @Author chenwei
+ * @Date 2019-05-21
+ */
+public class OrderDeliver implements Serializable {
+
+    private String orderCode; // 订单编号
+    private String expressInc;//物流公司
+    private String expressCode;//物流编号
+    private String contact;//联系人
+    private String phone;//电话
+
+    public String getOrderCode() {
+        return orderCode;
+    }
+
+    public void setOrderCode(String orderCode) {
+        this.orderCode = orderCode;
+    }
+
+    public String getExpressInc() {
+        return expressInc;
+    }
+
+    public void setExpressInc(String expressInc) {
+        this.expressInc = expressInc;
+    }
+
+    public String getExpressCode() {
+        return expressCode;
+    }
+
+    public void setExpressCode(String expressCode) {
+        this.expressCode = expressCode;
+    }
+
+    public String getContact() {
+        return contact;
+    }
+
+    public void setContact(String contact) {
+        this.contact = contact;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+}

+ 419 - 0
src/main/java/com/uas/erp/schedular/mall/task/OrderTask.java

@@ -0,0 +1,419 @@
+package com.uas.erp.schedular.mall.task;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.uas.erp.schedular.b2b.domain.Customer;
+import com.uas.erp.schedular.b2b.domain.Vendor;
+import com.uas.erp.schedular.diymall.domain.Order;
+import com.uas.erp.schedular.diymall.domain.OrderInvoice;
+import com.uas.erp.schedular.diymall.domain.OrderProduct;
+import com.uas.erp.schedular.diymall.domain.OrdersInfo;
+import com.uas.erp.schedular.entity.Master;
+import com.uas.erp.schedular.finance.mq.HttpsClientRequestFactory;
+import com.uas.erp.schedular.mall.domain.DeliverResp;
+import com.uas.erp.schedular.mall.domain.OrderDeliver;
+import com.uas.erp.schedular.mall.domain.PagingInfo;
+import com.uas.erp.schedular.task.support.TaskMapping;
+import com.uas.erp.schedular.util.ContextHolder;
+import com.uas.erp.schedular.util.ObjectUtil;
+import com.uas.erp.schedular.util.StringUtil;
+import com.usoft.security.utils.OpenApiSignUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.DefaultUriTemplateHandler;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author chenwei
+ * @Date 2019-05-21
+ */
+@Component
+@TaskMapping(title = "商城订单")
+public class OrderTask extends AbstractTask {
+
+    private static final String BASEPATH_TRADE = "https://malltraderest.usoftchina.com";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(OrderTask.class);
+
+    @TaskMapping(title = "上传出货单过账状态到商城")
+    public void uploadPoststatus() throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
+        Master master = ContextHolder.getMaster();
+        //获取需要上传的数据
+        List<OrderDeliver> orderDeliverList = jdbcTemplate.queryForBeanList("SELECT SA_POCODE as orderCode FROM SALE WHERE NVL(SA_SENDPOSTSTATUS,' ') = '待上传' AND SA_KIND = '商城订单'", OrderDeliver.class);
+        if (!CollectionUtils.isEmpty(orderDeliverList)) {
+            //发送同步数据
+            JSONObject json = new JSONObject();
+            json.put("secretId", master.getMa_uu());
+            json.put("signature", "");
+            json.put("DeliverReq", orderDeliverList);
+            String signatureValues = OpenApiSignUtil.sign(JSON.toJSONString(json), master.getMa_accesssecret());
+            json.put("signature", signatureValues);
+
+            RestTemplate restTemp = new RestTemplate(new HttpsClientRequestFactory());
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
+            HttpEntity<String> requestEntity = new HttpEntity<String>(json.toJSONString(), headers);
+            String response = restTemp.postForObject(BASEPATH_TRADE + "/openapi/trade/order/deliver", requestEntity, String.class);
+            LOGGER.info("response={}", response);
+            DeliverResp deliverResp = JSON.parseObject(response, DeliverResp.class);
+            //成功后,更新上传状态
+            if (deliverResp.getRespHeader().getCode() == 0) {
+                StringBuilder sb = new StringBuilder();
+                for (OrderDeliver orderDeliver : orderDeliverList) {
+                    sb.append("'" + orderDeliver.getOrderCode() + "',");
+                }
+                String pocodes = sb.substring(0, sb.length() - 1);
+                jdbcTemplate.execute("UPDATE SALE SET SA_SENDPOSTSTATUS = '已上传' WHERE SA_KIND = '商城订单' AND SA_POCODE IN (" + pocodes +")");
+            }
+        }
+    }
+
+    @TaskMapping(title = "下载已过账销售订单,生成采购/销售/入库/出货单据")
+    public void downloadOrder() throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
+        String url = BASEPATH_TRADE + "/openapi/trade/order/page/get?";
+        Long updateTime = System.currentTimeMillis() - 24 * 60 * 60 * 1000;
+        //获取需要生成数据的供应商
+        List<Map<String, Object>> vendorList = jdbcTemplate.queryForList("SELECT VE_UU,VE_ACCESSSECRET FROM VENDOR WHERE VE_ENABLE");
+        if (CollectionUtils.isEmpty(vendorList)) {
+            LOGGER.error("没有启用的供应商");
+            return;
+        }
+        for (Map<String, Object> map : vendorList){
+            Object vendUU = map.get("VE_UU"), vendAccessSecret = map.get("VE_ACCESSSECRET");
+            OrdersInfo ordersInfo = getOrdersByUU(url, String.valueOf(vendUU), String.valueOf(vendAccessSecret), updateTime, 30, 1);
+            PagingInfo pageInfo = ordersInfo.getPagingInfo();
+            if (!ObjectUtils.isEmpty(pageInfo) && pageInfo.getTotalCount() > 0) {
+                int totalCount = pageInfo.getTotalCount();
+                if (totalCount > 30) {
+                    //生成单据
+                    generateOrder(ordersInfo.getOrder());
+                    //获取额外部分的数据
+                    int endCount = Double.valueOf(Math.ceil(totalCount / 30.0)).intValue();
+                    for (int i = 2; i <= endCount; i++) {
+                        ordersInfo = getOrdersByUU(url, String.valueOf(vendUU), String.valueOf(vendAccessSecret), updateTime, 30, i);
+                        generateOrder(ordersInfo.getOrder());
+                    }
+                }else {
+                    //生成单据
+                    generateOrder(ordersInfo.getOrder());
+                }
+            }
+
+        }
+    }
+
+    /**
+     * 生成订单数据
+     * @param orderList
+     */
+    private void generateOrder(List<Order> orderList) {
+        for (Order order : orderList) {
+            //取已发货状态的订单生成
+            if (order.getStatus() == 141040 || order.getStatus() == 141050 || order.getStatus() == 141091) {
+                String purchaseCode = jdbcTemplate.generateCode("Purchase", 2);
+                String saleCode = jdbcTemplate.generateCode("Sale", 2);
+                //1.生成采购订单
+                boolean success = generatePurchase(order, purchaseCode, saleCode);
+                if (success) {
+                    //2.生成销售订单
+                    generateSale(order, saleCode);
+                    //3.生成采购验收单
+                    Map<String, String> purchaseInMap = purcahseIn(purchaseCode);
+                    //4.生成销售出货单
+                    String saleOutCode = saleOut(saleCode, purchaseInMap.get("batchCode"));
+                    //5.过账
+                    postPurchaseAndSale(purchaseInMap.get("inoutno"), saleOutCode);
+                }
+            }
+        }
+
+    }
+
+    private void postPurchaseAndSale(String purchaseInCode, String saleOutCode) {
+        String message = jdbcTemplate.callForString("{call SP_COMMITPRODINOUT(?,?,?,?)}", "采购验收单", purchaseInCode, "ADMIN");
+        if (StringUtils.isEmpty(message)) {
+            jdbcTemplate.callForString("{call SP_COMMITPRODINOUT(?,?,?,?)}", "出货单", saleOutCode, "ADMIN");
+        }
+
+    }
+
+    /**
+     * 生成销售出货单并过账
+     * @param saleCode
+     */
+    private String saleOut(String saleCode,String batchCode) {
+        String saleOutCode = jdbcTemplate.generateCode("ProdInOut!Sale", 2);
+        Integer saleOutId = jdbcTemplate.generate("prodinout_seq.nextval");
+        //主表
+        String mainSql = "INSERT INTO PRODINOUT(pi_id,pi_inoutno,pi_class,pi_date,pi_currency,pi_rate,pi_cardid,pi_cardcode,pi_title,pi_arcode,pi_arname,pi_paymentcode,pi_payment,pi_emcode,pi_emname,"
+                        + "pi_departmentcode,pi_departmentname,pi_address,pi_invostatus,pi_invostatuscode,pi_status,pi_statuscode,pi_purposename,pi_expresscode,pi_tocode,pi_recordman,pi_recorddate,"
+                        + "pi_auditman,pi_auditdate,pi_printstatus,pi_printstatuscode) SELECT " + saleOutId + ",'"+ saleOutCode +"','出货单',SYSDATE,'RMB','1',sa_custid,sa_custcode,sa_custname,"
+                        + "sa_apcustcode,sa_apcustname,sa_departmentcode,sa_departmentname,sa_toplace,'在录入','ENTERING','未过账','UNPOST',sa_need1,sa_need2,'普通','ADMIN',SYSDATE,'ADMIN',SYSDATE,'未打印','UNPRINT' "
+                        + " FROM SALE WHERE SA_CODE = ?";
+        //明细表
+        String detailSql = "INSERT INTO PRODIODETAIL(pd_id,pd_piid,pd_pdno,pd_inoutno,pd_piclass,pd_auditstatus,pd_outqty,pd_ordercode,pd_orderdetno,pd_prodcode,pd_prodid,pd_whcode,pd_whname,pd_sendprice,pd_taxrate,pd_batchCode) "
+                        + " SELECT PRODIODETAIL_SEQ.NEXTVAL," + saleOutId + ",ROWNUM,'" + saleOutCode + "','出货单','ENTERING',SD_QTY,SA_CODE,SD_DETNO,SD_PRODCODE,SD_PRODID,'SZ001','深圳仓',SD_PRICE,'13','"+ batchCode +"' "
+                        + " FROM SALE LEFT JOIN SALEDETAIL ON SA_ID = SD_SAID WHERE SA_CODE = ?";
+
+        jdbcTemplate.execute(mainSql, saleCode);
+        jdbcTemplate.execute(detailSql, saleCode);
+        return saleOutCode;
+    }
+
+    /**
+     * 生成采购验收单
+     * @param purchaseCode
+     */
+    private Map<String, String> purcahseIn(String purchaseCode) {
+        Map<String, String> resultMap = new HashMap<>(2);
+        String purcCheckinCode = jdbcTemplate.generateCode("ProdInOut!PurcCheckin",2);
+        Integer purcCheckinId = jdbcTemplate.getInt("SELECT PRODINOUT_SEQ.NEXTVAL FROM DUAL");
+        Double total = jdbcTemplate.getDouble("select sum(pd_price * pd_qty) from purchase left join purchaseDetail on pu_id = pd_puid where pu_code = ?", purchaseCode);
+        // 1.主表数据
+        String mainSql = "INSERT INTO prodinout(pi_id,pi_inoutno,pi_class,pi_date,pi_currency,pi_rate,pi_cardcode,pi_title,pi_receivecode,pi_receivename,pi_paymentcode,pi_payment,pi_emcode,pi_emname,"
+                + "pi_departmentcode,pi_departmentname,pi_total,pi_invostatus,pi_invostatuscode,pi_status,pi_statuscode,pi_recordman,pi_recorddate,pi_auditman,pi_auditdate,pi_updateman,pi_updatedate,pi_printstatus,pi_printstatuscode) "
+                + "SELECT '" + purcCheckinId + "','" + purcCheckinCode + "','采购验收单',SYSDATE,'RMB','1',pu_vendcode,pu_vendname,pu_receivecode,pu_receivename,pu_paymentscode,pu_payments,'ADMIN','管理员',"
+                + "'B15','优软云运营组','"+ total +"','已审核','AUDITED','未过账','UNPOST','ADMIN',SYSDATE,'ADMIN',SYSDATE,'ADMIN',SYSDATE,'未打印','UNPRINT' FROM PURCHASE WHERE PU_CODE = ?";
+        // 2.明细表数据
+        //取批号
+        String batchCode = jdbcTemplate.callForString("{call utl_rseq(?,?,?)}", "BatchCode", "/yyMMdd/5");
+        String detailSql = "insert into prodiodetail(pd_id,pd_piid,pd_pdno,pd_inoutno,pd_piclass,pd_accountstatus,pd_accountstatuscode,pd_ordercode,pd_orderdetno,pd_prodcode,pd_prodid,pd_whcode,pd_whname,pd_inqty,pd_orderprice,pd_taxrate,pd_batchcode) "
+                        + " select prodiodetail_seq.nextval," + purcCheckinId + ",rownum,'"+ purcCheckinCode +"','采购验收单','未核算','UNACCOUNT',pu_code,pd_detno,pd_prodcode,pd_prodid,'SZ01','深圳仓',pd_qty,pd_price,'13','"+batchCode+"' from purchase left join purchaseDetail on pu_id = pd_puid where pu_code = ?";
+
+        jdbcTemplate.execute(mainSql, purchaseCode);
+        jdbcTemplate.execute(detailSql, purchaseCode);
+        resultMap.put("batchCode", batchCode);
+        resultMap.put("inoutno", purcCheckinCode);
+        return resultMap;
+    }
+
+    /**
+     * 生成销售订单
+     * @param order
+     * @param saleCode
+     */
+    private void generateSale(Order order,String saleCode) {
+        int saleId = jdbcTemplate.getInt("SELECT SALE_SEQ.NEXTVAL FROM DUAL");
+        //客户资料
+        Customer customer = generateCustomer(order);
+        //销售订单主表
+        String insertSaleSql = "INSERT INTO SALE(SA_ID,SA_CODE,SA_DATE,SA_KIND,SA_CURRENCY,SA_RATE,SA_CUSTID,SA_CUSTCODE,SA_CUSTNAME,SA_APCUSTCODE,"
+                + "SA_APCUSTNAME,SA_PAYMENTSCODE,SA_PAYMENTS,SA_SELLERCODE,SA_SELLER,SA_DEPARTMENTCODE,SA_DEPARTMENTNAME,"
+                + "SA_TOPLACE,SA_POCODE,SA_STATUS,SA_STATUSCODE,SA_RECORDER,SA_RECORDDATE,SA_AUDITMAN,SA_AUDITDATE,SA_NEED1,SA_NEED2) "
+                + "VALUES(?,?,SYSDATE,'代运营订单','RMB','1',?,?,?,?,?,'PC31','CBD(款到发货)','ADMIN','管理员','B15','优软云运营组',?,?,'已审核','AUDITED','ADMIN',SYSDATE,'ADMIN',SYSDATE,?,?)";
+        //销售订单明细表
+        String insertDetailSql = "INSERT INTO SALEDETAIL(SD_ID, SD_SAID, SD_CODE, SD_DETNO, SD_PRODID, SD_PRODCODE, SD_QTY, SD_PRICE, SD_TAXRATE, SD_DELIVERY) "
+                + "SELECT SALEDETAIL_SEQ.NEXTVAL,'"+saleId+"','"+saleCode+"',pd_detno,pd_prodid,pd_prodcode,pd_qty,pd_price,pd_rate,pd_delivery FROM PURCHASE LEFT JOIN PURCHASEDETAIL ON PU_ID = PD_PUID WHERE PU_REFCODE = '"+saleCode+"'";
+
+        jdbcTemplate.execute(insertSaleSql, saleId, saleCode, customer.getCu_id(), customer.getCu_code(), customer.getCu_name(), customer.getCu_arcode(), customer.getCu_arname(),
+                order.getOrderDeliveryAddr().getDeliveryAddress(), order.getCode(), order.getBuyerMobile(), order.getBuyerMobile());
+        jdbcTemplate.execute(insertDetailSql);
+    }
+
+    /**
+     * 生成客户资料
+     */
+    private Customer generateCustomer(Order order) {
+        Customer customer = null;
+        if (order.getEnuu() == null || order.getEnuu() == 0) {
+            OrderInvoice orderInvoice = order.getOrderInvoice();
+            if (ObjectUtils.isEmpty(orderInvoice)) {
+                //虚拟客户
+            }else {
+                customer = jdbcTemplate.queryForBean("SELECT * FROM CUSTOMER WHERE CU_NAME = ? AND CU_BUSINESSCODE = ?", Customer.class, orderInvoice.getName(), orderInvoice.getIdentityNum());
+                if (!ObjectUtils.isEmpty(customer)){
+                    return customer;
+                }else {
+                    int id = jdbcTemplate.getInt("SELECT CUSTOMER_SEQ.NEXTVAL FROM DUAL");
+                    String customerCode = jdbcTemplate.generateCode("Customer!Base", 2);
+                    String insertCustomerSql = "insert into customer(cu_id,cu_code,cu_name,cu_shortname,cu_businesscode,cu_uu,cu_paymentscode,cu_payments,cu_sellercode,cu_sellername,cu_servicecode,"
+                            + "cu_servicename,cu_agenttype,cu_cop,cu_enablecredit,cu_shipment,cu_email,cu_tel,cu_contact,cu_recordman,cu_recorddate,cu_auditman,cu_auditdate)"
+                            + "values(" + id + ",'" + customerCode + "','" + orderInvoice.getName() + "','" + orderInvoice.getName() + "','" + orderInvoice.getIdentityNum() + "',null,'SK004','款到发货','ADMIN','管理员','ADMIN','管理员',"
+                            + "'普通客户','深圳怡海能达','否','快递',null,null,null,'ADMIN',sysdate,'ADMIN',sysdate)";
+                    jdbcTemplate.execute(insertCustomerSql);
+                    customer = jdbcTemplate.queryForBean("SELECT * FROM CUSTOMER WHERE CU_ID = ?", Customer.class, id);
+                    return customer;
+                }
+            }
+        }else {
+            customer = jdbcTemplate.queryForBean("select * from CUSTOMER where CU_UU = ? and nvl(cu_uu,' ') <> 0 and CU_AUDITSTATUS = '已审核'",
+                    Customer.class, order.getEnuu());
+            if (ObjectUtils.isEmpty(customer)) {
+                customer = jdbcTemplate.queryForBean("select * from CUSTOMER where CU_NAME = ? and CU_AUDITSTATUS = '已审核'",
+                        Customer.class, order.getBuyerEnName());
+                if (ObjectUtils.isEmpty(customer)) {
+                    //未找到对应的客户资料,新建一个
+                    int id = jdbcTemplate.getInt("SELECT CUSTOMER_SEQ.NEXTVAL FROM DUAL");
+                    String customerCode = jdbcTemplate.generateCode("Customer!Base", 2);
+                    //营业执照号
+                    String identityNum = "";
+                    OrderInvoice orderInvoice = order.getOrderInvoice();
+                    if (!ObjectUtils.isEmpty(orderInvoice)) {
+                        identityNum = orderInvoice.getIdentityNum();
+                    }
+                    String insertCustomerSql = "insert into customer(cu_id,cu_code,cu_name,cu_shortname,cu_businesscode,cu_uu,cu_paymentscode,cu_payments,cu_sellercode,cu_sellername,cu_servicecode,"
+                            + "cu_servicename,cu_agenttype,cu_cop,cu_enablecredit,cu_shipment,cu_email,cu_tel,cu_contact,cu_recordman,cu_recorddate,cu_auditman,cu_auditdate)"
+                            + "values(" + id + ",'" + customerCode + "','" + order.getBuyerEnName() + "','" + order.getBuyerEnName() + "','" + identityNum + "','" + order.getEnuu() + "','SK004','款到发货','ADMIN','管理员','ADMIN','管理员',"
+                            + "'普通客户','深圳怡海能达','否','快递','" + order.getBuyerEmail() + "','" + order.getBuyerMobile() + "','" + order.getBuyerName() + "','ADMIN',sysdate,'ADMIN',sysdate)";
+                    jdbcTemplate.execute(insertCustomerSql);
+                    customer = jdbcTemplate.queryForBean("SELECT * FROM CUSTOMER WHERE CU_ID = ?", Customer.class, id);
+                }
+            }
+        }
+        return customer;
+    }
+
+    /**
+     * 生成采购订单
+     * @param order
+     */
+    private boolean generatePurchase(Order order,String purchaseCode, String saleCode) {
+        int purchaseId = jdbcTemplate.getInt("select purchase_seq.nextval from dual");
+        String insertMainSql = "insert into purchase(pu_id,pu_code,pu_date,pu_kind,pu_currency,pu_rate,pu_refcode,pu_vendcode,pu_vendname,pu_receivecode,pu_receivename,ve_uu,"
+                        + "pu_paymentscode,pu_payments,pu_buyercode,pu_buyername,pu_departmentcode,pu_departmentname,pu_shipaddresscode,pu_pocode,pu_status,pu_statuscode,"
+                        + "pu_recordman,pu_indate,pu_auditman,pu_auditdate,pu_getprice,pu_isadvance) values(?,?,sysdate,'代运营订单','RMB','1',?,?,?,?,?,?,?,?,'ADMIN','管理员','B15','优软云运营组',?,?,'已审核','AUDITED','ADMIN',sysdate,'ADMIN',sysdate,'0','unadvance')";
+        //供应商资料生成逻辑
+        Vendor vendor = getVendorByUUOrName(order.getCode(), order.getSellerEnuu(), order.getSellerName());
+        if (null == vendor) {
+            return false;
+        }
+        List<OrderProduct> productList = order.getOrderProduct();
+        List<String> insertDetailSqlList = new ArrayList<>(productList.size());
+        for (int i = 0, len = productList.size(); i < len; i++) {
+            OrderProduct product = productList.get(i);
+            String prodCode = "";
+            Integer prodId = null;
+            //物料生成逻辑
+            Map<String, Object> productMap = generateProduct(product, order.getCode(), vendor);
+            if (!CollectionUtils.isEmpty(productMap)) {
+                prodCode = String.valueOf(productMap.get("prodCode"));
+                prodId = Integer.valueOf(String.valueOf(productMap.get("prodId")));
+            }else {
+                return false;
+            }
+            String insertDetailSql = "insert into PurchaseDetail(pd_id,pd_puid,pd_detno,pd_code,pd_prodcode,pd_prodid,pd_qty,pd_price,pd_rate,pd_delivery) "
+                    + " value(PurchaseDetail_seq.nextval,"+ purchaseId +","+ (i+1) +",'"+ purchaseCode +"','"+ prodCode +"',"+prodId+",'"+ product.getAmount() +"','"+ product.getUnitPrice() +"','13',sysdate+"+product.getMaxDelivery()+")";
+            insertDetailSqlList.add(insertDetailSql);
+        }
+
+        jdbcTemplate.execute(insertMainSql, purchaseId, purchaseCode, saleCode, vendor.getVe_code(), vendor.getVe_name(), vendor.getVe_apvendcode(), vendor.getVe_apvendname(), vendor.getVe_uu(),
+                vendor.getVe_paymentcode(), vendor.getVe_payment(), order.getOrderDeliveryAddr(), order.getCode());
+        jdbcTemplate.batchExecute(insertDetailSqlList);
+        return true;
+    }
+
+    /**
+     * 生成物料资料
+     * @param product
+     * @param orderCode
+     * @param vendor
+     * @return
+     */
+    private Map<String, Object> generateProduct(OrderProduct product, String orderCode, Vendor vendor){
+        Map<String, Object> productMap = jdbcTemplate.queryForMap("SELECT PV_PRODCODE AS prodCode,PV_PRODID AS prodId FROM PRODUCTVENDOR WHERE PV_VENDPRODCODE = ? AND PV_VENDCODE = ?", product.getMaterialCode(), vendor.getVe_code());
+        if (!CollectionUtils.isEmpty(productMap)) {
+            return productMap;
+        }else {
+            int count = jdbcTemplate.getInt("SELECT COUNT(*) FROM PRODUCT WHERE PR_ORISPECCODE = ? AND PR_BRAND = ?", product.getModel(), product.getBrand());
+            if (count > 1) {
+                //不生成订单并生成日志
+                String logOrderSql = "INSERT INTO LOGORDER(LO_ID, ORDERCODE , STATUS , SALESTIME , ORDERNUMBER , REMARK) "
+                        + "VALUES(LOGORDER_SEQ.NEXTVAL,'"  + orderCode + "', '失败', SYSDATE, null, '根据平台订单物料的型号+品牌未在物料资料找到唯一对照关系')";
+                jdbcTemplate.execute(logOrderSql);
+                return null;
+            }else if (count == 1) {
+                //返回物料信息
+                productMap = jdbcTemplate.queryForMap("SELECT PR_CODE AS prodCode,PR_ID as prodId FROM PRODUCT WHERE PR_ORISPECCODE = ? AND PR_BRAND = ?", product.getModel(), product.getBrand());
+                //生成供应商物料对照关系
+                String insertProductVendorSql = "insert into productVendor(pv_id,pv_prodid,pv_detno,pv_vendid,pv_vendcode,pv_vendprodcode,pv_vendprodspec,pv_vendprodunit,pv_vendname,pv_prodcode,pv_zxbzs) "
+                        + "values(productVendor_seq.nextval, ?, 1, ?, ?, ?, ?, ?, ?, ?, ?)";
+                jdbcTemplate.execute(insertProductVendorSql, productMap.get("prodId"), vendor.getVe_id(), vendor.getVe_code(), product.getMaterialCode(), product.getSpec(), product.getUnit(), vendor.getVe_name(), productMap.get("prodCode"), product.getMpq());
+            }else if (count == 0) {
+                String code = "YS" + product.getMaterialCode();
+                int id = jdbcTemplate.getInt("SELECT PRODUCT_SEQ.NEXTVAL FROM DUAL");
+                //生成物料资料
+                String insertProductSql = "INSERT INTO PRODUCT(PR_ID,PR_CODE,PR_DETAIL,PR_SPEC,PR_UNIT,PR_ORISPECCODE,PR_BRAND,PR_MAKETYPE,PR_PURCHASEPOLICY,PR_SUPPLYTYPE,PR_ZXBZS,PR_ZXDHL,PR_ACCEPTMETHOD,"
+                                        + "PR_RECORDMAN,PR_DOCDATE,PR_AUDITMAN,PR_AUDITDATE,PR_STATUS,PR_STATUSCODE) VALUES(?,?,?,?,?,?,?,'外购','MRP','推式',?,?,'不检验','ADMIN',SYSDATE,'ADMIN',SYSDATE,'已审核','AUDITED')";
+                jdbcTemplate.execute(insertProductSql, id, code, product.getModel(), product.getSpec(), product.getUnit(), product.getModel(), product.getBrand(), product.getMpq(), product.getMoq());
+                //生成供应商物料对照关系
+                jdbcTemplate.execute("insert into productVendor(pv_id,pv_prodid,pv_detno,pv_vendid,pv_vendcode,pv_vendprodcode,pv_vendprodspec,pv_vendprodunit,pv_vendname,pv_prodcode,pv_zxbzs) "
+                        + "values(productVendor_seq.nextval, ?, 1, ?, ?, ?, ?, ?, ?, ?, ?)", id, vendor.getVe_id(), vendor.getVe_code(), product.getMaterialCode(), product.getSpec(), product.getUnit(), vendor.getVe_name(), code, product.getMpq());
+                productMap.put("prodCode", code);
+                productMap.put("prodId", id);
+            }
+        }
+        return productMap;
+    }
+
+    /**
+     * 获取供应商资料
+     * @param enUU
+     */
+    private Vendor getVendorByUUOrName(String orderCode, Integer enUU, String enName){
+        Vendor vendor = jdbcTemplate.queryForBean("select * from vendor where ve_uu = ? and rownum = 1", Vendor.class, enUU);
+        if (!ObjectUtils.isEmpty(vendor)) {
+            return vendor;
+        }else {
+            vendor = jdbcTemplate.queryForBean("SELECT * FROM VENDOR WHERE VE_NAME = ? AND ROWNUM = 1", Vendor.class, enName);
+            if (!ObjectUtils.isEmpty(vendor)) {
+                return vendor;
+            }else {
+                //记录日志
+                String logOrderSql = "insert into LOGORDER(LO_ID, ORDERCODE , STATUS , SALESTIME , ORDERNUMBER , REMARK)" +
+                        "values(LOGORDER_SEQ.NEXTVAL,'" + orderCode + "', '失败', sysdate, null, '未找到对应的供应商资料!')";
+                jdbcTemplate.execute(logOrderSql);
+                return null;
+            }
+        }
+    }
+
+    /**
+     * 取销售订单数据
+     * @param requestURL
+     * @param vendUU
+     * @param updateTime
+     * @param pageSize
+     * @param pageNumber
+     * @return
+     * @throws NoSuchAlgorithmException
+     * @throws InvalidKeyException
+     * @throws UnsupportedEncodingException
+     */
+    private OrdersInfo getOrdersByUU(String requestURL, String vendUU, String vendAccessSecret, Long updateTime, int pageSize, int pageNumber) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
+        String paramStr = "secretId=" + vendUU + "&"+ "materialCode=" + "" + "&" + "updateTime=" + updateTime + "&" + "pageSize=" + pageSize +"&" + "pageNumber=" + pageNumber;
+        //进行签名
+        String signatureValue = OpenApiSignUtil.sign(paramStr,vendAccessSecret);
+        signatureValue = URLEncoder.encode(signatureValue, "UTF-8");
+        String signatureKV = OpenApiSignUtil.SIGNATURE_KEY + "=" + signatureValue;
+        paramStr += "&" + signatureKV;
+        requestURL = requestURL + paramStr;
+
+        DefaultUriTemplateHandler uriTemplateHandler = new DefaultUriTemplateHandler();
+        uriTemplateHandler.setStrictEncoding(true);
+
+        RestTemplate restTemp = new RestTemplate(new HttpsClientRequestFactory());
+        restTemp.setUriTemplateHandler(uriTemplateHandler);
+        String result = restTemp.getForObject(requestURL, String.class);
+        LOGGER.info("result={}", result);
+        OrdersInfo ordersInfo = JSON.parseObject(result, OrdersInfo.class);
+        return ordersInfo;
+    }
+
+
+}

+ 42 - 47
src/main/java/com/uas/erp/schedular/mall/task/ProductTask.java

@@ -6,7 +6,7 @@ import com.uas.api.b2c_erp.baisc.service.ComponentService;
 import com.uas.api.b2c_erp.seller.model.Prod;
 import com.uas.api.b2c_erp.seller.service.ProdService;
 import com.uas.erp.schedular.b2b.domain.Customer;
-import com.uas.erp.schedular.diymall.domain.GetOrdersByPage;
+import com.uas.erp.schedular.diymall.domain.OrdersInfo;
 import com.uas.erp.schedular.diymall.domain.LoggingOrder;
 import com.uas.erp.schedular.diymall.domain.Order;
 import com.uas.erp.schedular.diymall.domain.OrderProduct;
@@ -29,7 +29,6 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.util.DefaultUriTemplateHandler;
 
-import javax.transaction.Transactional;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.security.InvalidKeyException;
@@ -111,48 +110,48 @@ public class ProductTask extends AbstractTask {
 //        }
     }
 
-        /**
-         * 解析物料编号
-         * @param sqls
-         * @return
-         */
-        public List<String> analyzeMaterialNum(List<String> sqls) {
-            List<String> list = new ArrayList<>();
-            if (!CollectionUtils.isEmpty(sqls)) {
-                for (String sql : sqls) {
-                    String substring = sql.substring(220);
-                    String[] split = substring.split("'");
-                    if (!StringUtils.isEmpty(split[0])) {
-                        list.add(split[0]);
-                    }
+    /**
+     * 解析物料编号
+     * @param sqls
+     * @return
+     */
+    public List<String> analyzeMaterialNum(List<String> sqls) {
+        List<String> list = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(sqls)) {
+            for (String sql : sqls) {
+                String substring = sql.substring(220);
+                String[] split = substring.split("'");
+                if (!StringUtils.isEmpty(split[0])) {
+                    list.add(split[0]);
                 }
             }
-            return list;
         }
+        return list;
+    }
 
-        /**
-         * 解析型号和品牌,用中划线链接
-         * @param sqls
-         * @return
-         */
-        public List<String> analyzeMaterialCodeAndBrand(List<String> sqls) {
-            List<String> list = new ArrayList<>();
-            if (!CollectionUtils.isEmpty(sqls)) {
-                for (String sql : sqls) {
-                    String code = analyzeMaterialCode(sql);
-                    String brand = analyzeMaterialBrand(sql);
-                    list.add(code + "-----" + brand);
-                }
+    /**
+     * 解析型号和品牌,用中划线链接
+     * @param sqls
+     * @return
+     */
+    public List<String> analyzeMaterialCodeAndBrand(List<String> sqls) {
+        List<String> list = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(sqls)) {
+            for (String sql : sqls) {
+                String code = analyzeMaterialCode(sql);
+                String brand = analyzeMaterialBrand(sql);
+                list.add(code + "-----" + brand);
             }
-            return list;
         }
+        return list;
+    }
 
 
-        /**
-         * 解析出型号
-         * @param sql 拼接的插入数据库
-         * @return
-         */
+    /**
+     * 解析出型号
+     * @param sql 拼接的插入数据库
+     * @return
+     */
     public String analyzeMaterialCode(String sql) {
         if (!StringUtils.isEmpty(sql)) {
             String[] split = sql.split("','已审核','余佳','");
@@ -290,7 +289,7 @@ public class ProductTask extends AbstractTask {
     public void getMallProductToErpProduct() throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
         //查询中间表 库存取整
         List<Stock> stock = jdbcTemplate.queryForBeanList("select TSS_PRODCODE,round(tss_amount,0) tss_amount, TSS_DATE ,pr_zxdhl moq,pr_zxbzs mpq,getsaleprice_hkd(pr_code) saleprice,pr_remark_sale invoiceModel" +
-                        "FROM TT_SHOP_STOCK LEFT JOIN PRODUCT ON TSS_PRODCODE=pr_code",Stock.class);
+                "FROM TT_SHOP_STOCK LEFT JOIN PRODUCT ON TSS_PRODCODE=pr_code",Stock.class);
         String jsons = JSON.toJSONString(stock);
 
         if (!CollectionUtils.isEmpty(stock)) {
@@ -392,23 +391,19 @@ public class ProductTask extends AbstractTask {
             updateTime = 0L;
         }
 
-        if(materialCod != ""){
-            return;
-        }
-
         // 查询出数据总条数
         Integer totalCount = gstOrderList(url,materialCod,updateTime,pageSize,pageNumber).getPagingInfo().getTotalCount();
 
         // 按页数拿数据
-        GetOrdersByPage getOrdersByPage = null;
+        OrdersInfo ordersInfo = null;
         List<Order> orders = null;
         Integer page = Double.valueOf(Math.ceil(totalCount/pageSize.doubleValue())).intValue();
         if(totalCount/pageSize < 1){
             page = 1;
         }
         for(int i = 0 ; i < page ; i ++ ){
-            getOrdersByPage = gstOrderList(url,materialCod,updateTime,pageSize,i+1);
-            orders = getOrdersByPage.getOrder();
+            ordersInfo = gstOrderList(url,materialCod,updateTime,pageSize,i+1);
+            orders = ordersInfo.getOrder();
 
             if(StringUtils.isEmpty(orders)) {
                 continue ;
@@ -520,7 +515,7 @@ public class ProductTask extends AbstractTask {
     }
 
 
-    private GetOrdersByPage gstOrderList(String requestURL, String materialCode, Long updateTime, Integer pageSize, Integer pageNumber) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
+    private OrdersInfo gstOrderList(String requestURL, String materialCode, Long updateTime, Integer pageSize, Integer pageNumber) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
         String paramStr = "secretId=" + SECRETUU + "&"+ "materialCode=" + materialCode + "&" + "updateTime=" + updateTime + "&" + "pageSize=" + pageSize +"&" + "pageNumber=" + pageNumber;
         //进行签名
         String signatureValue = OpenApiSignUtil.sign(paramStr,SECRETKEY);
@@ -536,8 +531,8 @@ public class ProductTask extends AbstractTask {
         restTemp.setUriTemplateHandler(uriTemplateHandler);
         String result = restTemp.getForObject(requestURL, String.class);
         //System.out.println(result);
-        GetOrdersByPage getOrdersByPage = JSON.parseObject(result, GetOrdersByPage.class);
-        return getOrdersByPage;
+        OrdersInfo ordersInfo = JSON.parseObject(result, OrdersInfo.class);
+        return ordersInfo;
     }
 
 }