Browse Source

物料上传

chenw 7 years ago
parent
commit
ceec0ccf1b

+ 20 - 1
applications/document/document-api/src/main/java/com/usoftchina/saas/document/api/ProductApi.java

@@ -1,10 +1,13 @@
 package com.usoftchina.saas.document.api;
 
 import com.usoftchina.saas.auth.client.interceptor.ServiceFeignInterceptor;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.document.dto.ProductDTO;
+import com.usoftchina.saas.document.dto.ProductUploadDTO;
 import com.usoftchina.saas.page.PageRequest;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
@@ -31,5 +34,21 @@ public interface ProductApi {
     * @Date: 2018/10/16
     */
     @RequestMapping("/product/updateLatestPurchasePrice")
-    public void updateLatestPurchasePrice(@RequestParam(value = "id") Long pu_id);
+    void updateLatestPurchasePrice(@RequestParam(value = "id") Long pu_id);
+
+    /**
+     * 获取需要上传的物料数据
+     * @return
+     */
+    @GetMapping("/b2b/upload/data")
+    Result<List<ProductUploadDTO>> getUploadData();
+
+    /**
+     * 批量更新物料上传状态
+     * @param ids
+     * @param status
+     * @return
+     */
+    @PostMapping("/b2b/status/update")
+    Result updateStatus(@RequestParam("ids") String ids, @RequestParam("status") String status);
 }

+ 94 - 0
applications/document/document-dto/src/main/java/com.usoftchina.saas.document.dto/ProductUploadDTO.java

@@ -0,0 +1,94 @@
+package com.usoftchina.saas.document.dto;
+
+import java.io.Serializable;
+
+/**
+ * @Description 上传B2B 物料对象
+ * @Author chenwei
+ * @Date 2019/01/10
+ */
+public class ProductUploadDTO implements Serializable {
+
+    private String pr_code;
+    private String pr_detail;
+    private Double pr_leadtime;
+    private String pr_spec;
+    private String pr_unit;
+    private Double pr_zxbzs;
+    private Long pr_id;
+    private Double pr_zxdhl;
+    private String pr_orispeccode;
+
+    public String getPr_code() {
+        return pr_code;
+    }
+
+    public void setPr_code(String pr_code) {
+        this.pr_code = pr_code;
+    }
+
+    public String getPr_detail() {
+        return pr_detail;
+    }
+
+    public void setPr_detail(String pr_detail) {
+        this.pr_detail = pr_detail;
+    }
+
+    public Double getPr_leadtime() {
+        return pr_leadtime;
+    }
+
+    public void setPr_leadtime(Double pr_leadtime) {
+        this.pr_leadtime = pr_leadtime;
+    }
+
+    public String getPr_spec() {
+        return pr_spec;
+    }
+
+    public void setPr_spec(String pr_spec) {
+        this.pr_spec = pr_spec;
+    }
+
+    public String getPr_unit() {
+        return pr_unit;
+    }
+
+    public void setPr_unit(String pr_unit) {
+        this.pr_unit = pr_unit;
+    }
+
+    public Double getPr_zxbzs() {
+        return pr_zxbzs;
+    }
+
+    public void setPr_zxbzs(Double pr_zxbzs) {
+        this.pr_zxbzs = pr_zxbzs;
+    }
+
+    public Long getPr_id() {
+        return pr_id;
+    }
+
+    public void setPr_id(Long pr_id) {
+        this.pr_id = pr_id;
+    }
+
+    public Double getPr_zxdhl() {
+        return pr_zxdhl;
+    }
+
+    public void setPr_zxdhl(Double pr_zxdhl) {
+        this.pr_zxdhl = pr_zxdhl;
+    }
+
+    public String getPr_orispeccode() {
+        return pr_orispeccode;
+    }
+
+    public void setPr_orispeccode(String pr_orispeccode) {
+        this.pr_orispeccode = pr_orispeccode;
+    }
+
+}

+ 5 - 0
applications/document/document-server/pom.xml

@@ -83,6 +83,11 @@
             <groupId>com.usoftchina.saas</groupId>
             <artifactId>account-dto</artifactId>
         </dependency>
+        <dependency>
+          <groupId>com.usoftchina.saas</groupId>
+          <artifactId>transfers-api</artifactId>
+          <version>1.0.0-SNAPSHOT</version>
+        </dependency>
         <dependency>
             <groupId>com.usoftchina.saas</groupId>
             <artifactId>datacenter-client</artifactId>

+ 31 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/ProductController.java

@@ -10,6 +10,7 @@ import com.usoftchina.saas.commons.dto.DocBaseDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.document.dto.ProductDTO;
 import com.usoftchina.saas.document.dto.ProductListDTO;
+import com.usoftchina.saas.document.dto.ProductUploadDTO;
 import com.usoftchina.saas.document.entities.Product;
 import com.usoftchina.saas.document.service.ProductService;
 import com.usoftchina.saas.page.PageRequest;
@@ -122,4 +123,34 @@ public class ProductController {
         return Result.success();
     }
 
+    /**
+     * 上传至B2B平台
+     * @return
+     */
+    @PostMapping("/b2b/upload")
+    public Result uploadToB2B(){
+        productService.uploadToB2B();
+        return Result.success();
+    }
+
+    /**
+     * 获取需要上传的物料数据
+     * @return
+     */
+    @GetMapping("/b2b/upload/data")
+    public Result<List<ProductUploadDTO>> getUploadData(){
+        return Result.success(productService.getUploadData());
+    }
+
+    /**
+     * 批量更新物料上传状态
+     * @param ids
+     * @param status
+     * @return
+     */
+    @PostMapping("/b2b/status/update")
+    public Result updateStatus(@RequestParam("ids") String ids, @RequestParam("status") String status){
+        productService.updateB2BStatus(ids, status);
+        return Result.success();
+    }
 }

+ 5 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/ProductMapper.java

@@ -4,6 +4,7 @@ import com.usoftchina.saas.base.mapper.CommonBaseMapper;
 import com.usoftchina.saas.commons.dto.ComboDTO;
 import com.usoftchina.saas.document.dto.ProductDTO;
 import com.usoftchina.saas.document.dto.ProductReserveCostDTO;
+import com.usoftchina.saas.document.dto.ProductUploadDTO;
 import com.usoftchina.saas.document.entities.ProdIODetail;
 import com.usoftchina.saas.document.entities.ProdInOut;
 import com.usoftchina.saas.document.entities.Product;
@@ -62,4 +63,8 @@ public interface ProductMapper extends CommonBaseMapper<Product> {
     int selectSale(Long id);
 
     int selectPurchase(Long id);
+
+    List<ProductUploadDTO> selectUploadProdByCompanyId(@Param("companyId") Long companyId);
+
+    void updateB2BStatus(List<String> idsList, @Param("status") String status);
 }

+ 18 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/ProductService.java

@@ -11,6 +11,7 @@ import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.document.dto.ProductDTO;
 import com.usoftchina.saas.document.dto.ProductListDTO;
 import com.usoftchina.saas.document.dto.ProductReserveCostDTO;
+import com.usoftchina.saas.document.dto.ProductUploadDTO;
 import com.usoftchina.saas.document.entities.Product;
 import com.usoftchina.saas.document.mapper.ProductMapper;
 
@@ -120,4 +121,21 @@ public interface ProductService extends CommonBaseService<ProductMapper, Product
     boolean deleteDetailById(Long id);
 
     void saveToFormal(Integer id, boolean update);
+
+    /**
+     * 上传至B2B
+     */
+    void uploadToB2B();
+
+    /**
+     * 获取需要上传的数据
+     */
+    List<ProductUploadDTO> getUploadData();
+
+    /**
+     * 批量更新物料上传状态
+     * @param ids
+     * @param status
+     */
+    void updateB2BStatus(String ids, String status);
 }

+ 31 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/ProductServiceImpl.java

@@ -21,6 +21,7 @@ import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.document.dto.ProductDTO;
 import com.usoftchina.saas.document.dto.ProductListDTO;
 import com.usoftchina.saas.document.dto.ProductReserveCostDTO;
+import com.usoftchina.saas.document.dto.ProductUploadDTO;
 import com.usoftchina.saas.document.entities.*;
 import com.usoftchina.saas.document.mapper.DataImportMapper;
 import com.usoftchina.saas.document.mapper.ProductDetailMapper;
@@ -29,6 +30,8 @@ import com.usoftchina.saas.document.mapper.WarehouseMapper;
 import com.usoftchina.saas.document.service.*;
 import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.page.PageRequest;
+import com.usoftchina.saas.transfers.api.SendMessageApi;
+import com.usoftchina.saas.transfers.dto.MessageInfo;
 import com.usoftchina.saas.utils.CollectionUtils;
 import com.usoftchina.saas.utils.ObjectUtils;
 import com.usoftchina.saas.utils.RegexpUtils;
@@ -39,6 +42,8 @@ import org.springframework.util.StringUtils;
 
 import java.util.*;
 
+import static java.util.Arrays.asList;
+
 @Service
 public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Product> implements ProductService {
 
@@ -60,6 +65,8 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
     private ProductunitService productunitService;
     @Autowired
     private ProducttypeService producttypeService;
+    @Autowired
+    private SendMessageApi sendMessageApi;
 
     @Override
     public PageInfo<ProductDTO> getProductsByCondition(PageRequest page, ListReqDTO listReqDTO) {
@@ -737,6 +744,30 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
         }
     }
 
+    /**
+     * 生成物料上传的消息
+     */
+    @Override
+    public void uploadToB2B() {
+        MessageInfo messageInfo = new MessageInfo(BaseContextHolder.getUserId(), BillCodeSeq.PRODUCT.name(), "", BaseContextHolder.getCompanyId());
+        sendMessageApi.sendMsg(messageInfo);
+    }
+
+    /**
+     * 获取需要上传的数据, 上传状态为待上传
+     * @return
+     */
+    @Override
+    public List<ProductUploadDTO> getUploadData(){
+        return getMapper().selectUploadProdByCompanyId(BaseContextHolder.getCompanyId());
+    }
+
+    @Override
+    public void updateB2BStatus(String ids, String status){
+        List<String> idsList = new ArrayList<String>(Arrays.asList(ids.split(",")));
+        getMapper().updateB2BStatus(idsList, status);
+    }
+
     private List<ProductReserveCostDTO> geReserveCost(ListReqDTO listReqDTO) {
         Long companyId = BaseContextHolder.getCompanyId();
         String condition = listReqDTO.getFinalCondition();

+ 10 - 0
applications/document/document-server/src/main/resources/mapper/ProductMapper.xml

@@ -960,5 +960,15 @@
     <select id="selectPurchase" resultType="int">
         SELECT COUNT(*) FROM PURCHASE LEFT JOIN PURCHASEDETAIL ON PU_ID = PD_PUID WHERE IFNULL(PU_ACCEPTSTATUS,' ') != '已出库' AND IFNULL(PU_ACCEPTSTATUSCODE,' ') != '已关闭' AND IFNULL(PD_PRODID,0) = #{id}
     </select>
+    <select id="selectUploadProdByCompanyId" resultType="com.usoftchina.saas.document.dto.ProductUploadDTO">
+        SELECT pr_id,pr_code,pr_spec,pr_detail,pr_leadtime,pr_unit,pr_zxbzs,pr_brand,pr_orispeccode
+        FROM PRODUCT WHERE COMPANYID = #{companyId} AND IFNULL(B2BSTATUS, '待上传') = '待上传'
+    </select>
+    <update id="updateB2BStatus">
+        UPDATE PRODUCT SET B2BSTATUS = #{status} WHERE PR_ID IN
+        <foreach collection="list" item="id" index="index" open="(" close=")" separator=",">
+          #{id}
+        </foreach>
+    </update>
 </mapper>
 

+ 13 - 0
applications/transfers/transfers-server/pom.xml

@@ -56,6 +56,19 @@
             <groupId>com.usoftchina.saas</groupId>
             <artifactId>transfers-dto</artifactId>
         </dependency>
+        <dependency>
+          <groupId>com.usoftchina.saas</groupId>
+          <artifactId>document-api</artifactId>
+        </dependency>
+        <dependency>
+          <groupId>com.usoftchina.saas</groupId>
+          <artifactId>account-api</artifactId>
+        </dependency>
+        <dependency>
+          <groupId>com.usoftchina.saas</groupId>
+          <artifactId>mall-api</artifactId>
+          <version>1.0.0-SNAPSHOT</version>
+        </dependency>
         <!-- db -->
         <dependency>
             <groupId>mysql</groupId>

+ 3 - 0
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/service/ReceiveService.java

@@ -65,6 +65,9 @@ public class ReceiveService {
                case PURCHASEOUT:
                    task = new SendPurchaseOutTask();
                    break;
+               case PRODUCT:        //物料库上传
+                   task = new SendProductTask();
+                   break;
            }
 
            task.execute(info);

+ 115 - 0
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendProductTask.java

@@ -0,0 +1,115 @@
+package com.usoftchina.saas.transfers.task;
+
+import com.usoftchina.inquiry.api.PublicProductApi;
+import com.usoftchina.saas.account.api.CompanyApi;
+import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.document.api.ProductApi;
+import com.usoftchina.saas.document.dto.ProductUploadDTO;
+import com.usoftchina.saas.transfers.dto.MessageInfo;
+import com.usoftchina.saas.transfers.service.SendService;
+import com.usoftchina.saas.utils.CollectionUtils;
+import com.usoftchina.saas.utils.DateUtils;
+import com.usoftchina.saas.utils.JsonUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.*;
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * @Description 物料上传
+ * @Author chenwei
+ * @Date 2019/01/09
+ */
+public class SendProductTask extends Executable{
+
+    @Autowired
+    private ProductApi productApi;
+    @Autowired
+    private PublicProductApi publicProductApi;
+    @Autowired
+    private CompanyApi companyApi;
+    @Autowired
+    private SendService sendService;
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(SendProductTask.class);
+
+    @Override
+    public void execute(MessageInfo messageInfo) {
+        Long enUU = companyApi.getCompanyById(BaseContextHolder.getCompanyId()).getData().getUu();
+        //需要上传的物料信息
+        List<ProductUploadDTO> productUploadDTOList = productApi.getUploadData().getData();
+        //上传结果反馈
+        List<Long> successIds = new ArrayList<Long>();
+        List<Long> failedIds = new ArrayList<Long>();
+        if (!CollectionUtils.isEmpty(productUploadDTOList)){
+            //分批次上传,每次50条. 物料服务提供接口采用@requestParam接收物料数据,存在数据长度限制
+            if (productUploadDTOList.size() >= 50){
+                int count = (int) Math.ceil(productUploadDTOList.size() / 50.0);
+                CountDownLatch latch = new CountDownLatch(count);
+                for (int i = 0; i < count; i++) {
+                    //第loop次循环
+                    int loop = i;
+                    new Thread(new Runnable() {
+                        @Override
+                        public void run() {
+                            int startPoint = loop * 50;
+                            int endPoint = 0;
+                            if (loop + 1 == count) {
+                                endPoint = productUploadDTOList.size() - 1;
+                            }else{
+                                endPoint = (loop + 1) * 50;
+                            }
+                            List<ProductUploadDTO> subList = productUploadDTOList.subList(startPoint, endPoint);
+                            try {
+                                publicProductApi.saveProducts(JsonUtils.toJsonString(subList), enUU);
+                                subList.forEach(ProductUploadDTO -> successIds.add(ProductUploadDTO.getPr_id()));
+                                LOGGER.info("本批次第{}至{},物料上传成功, 发起时间 {}",startPoint, endPoint, DateUtils.format(new Date(System.currentTimeMillis()), "yyyy-MM-dd hh:mm:ss"));
+                            }catch (Exception e){
+                                subList.forEach(ProductUploadDTO -> failedIds.add(ProductUploadDTO.getPr_id()));
+                                LOGGER.info("本批次第{}至{},物料上传失败,原因:{}, 发起时间 {}",startPoint, endPoint, e.getMessage(), DateUtils.format(new Date(System.currentTimeMillis()), "yyyy-MM-dd hh:mm:ss"));
+                            }finally {
+                                latch.countDown();
+                            }
+                        }
+                    }).start();
+                }
+                try {
+                    latch.await();
+                    LOGGER.info("物料上传完成, 成功{}条,失败{}条", successIds.size(), failedIds.size());
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }else{
+                try {
+                    publicProductApi.saveProducts(JsonUtils.toJsonString(productUploadDTOList), enUU);
+                    productUploadDTOList.forEach(productUploadDTO -> successIds.add(productUploadDTO.getPr_id()));
+                    LOGGER.info(",物料上传成功,条数{}, 发起时间 {}",productUploadDTOList.size(), DateUtils.format(new Date(System.currentTimeMillis()), "yyyy-MM-dd hh:mm:ss"));
+                }catch (Exception e){
+                    productUploadDTOList.forEach(productUploadDTO -> failedIds.add(productUploadDTO.getPr_id()));
+                    LOGGER.info("物料上传失败,条数{},原因:{}, 发起时间 {}", productUploadDTOList.size(), e.getMessage(), DateUtils.format(new Date(System.currentTimeMillis()), "yyyy-MM-dd hh:mm:ss"));
+                }
+            }
+            //更新物料状态
+            if (successIds.size() > 0) {
+                Iterator<Long> it = successIds.iterator();
+                StringBuilder success = new StringBuilder();
+                while (it.hasNext()){
+                    success.append(it.next() + ",");
+                }
+                productApi.updateStatus(success.substring(0, success.length() - 1), "已上传");
+            }
+            if (failedIds.size() > 0){
+                Iterator<Long> it = failedIds.iterator();
+                StringBuilder failed = new StringBuilder();
+                while (it.hasNext()){
+                    failed.append(it.next() + ",");
+                }
+                String failedStr = failed.substring(0, failed.length() - 1);
+                MessageInfo newMessageInfo = new MessageInfo(messageInfo.getUserId(), messageInfo.getBizType(), failedStr, messageInfo.getCompanyId());
+                sendService.sendMessage(newMessageInfo);
+            }
+        }
+    }
+}