Browse Source

公共询价服务提出方法

hejq 8 years ago
parent
commit
7a93d8f7aa
45 changed files with 5154 additions and 74 deletions
  1. 4 0
      pom.xml
  2. 1 1
      src/main/java/com/uas/ps/inquiry/Application.java
  3. 205 0
      src/main/java/com/uas/ps/inquiry/controller/PublicInquiryController.java
  4. 1 0
      src/main/java/com/uas/ps/inquiry/controller/readme.md
  5. 30 0
      src/main/java/com/uas/ps/inquiry/dao/ProductDao.java
  6. 39 0
      src/main/java/com/uas/ps/inquiry/dao/PublicInquiryDao.java
  7. 70 0
      src/main/java/com/uas/ps/inquiry/dao/PublicInquiryItemDao.java
  8. 15 0
      src/main/java/com/uas/ps/inquiry/dao/PublicInquiryReplyDao.java
  9. 24 0
      src/main/java/com/uas/ps/inquiry/dao/PurcInquiryDao.java
  10. 30 0
      src/main/java/com/uas/ps/inquiry/dao/PurcInquiryItemDao.java
  11. 1 0
      src/main/java/com/uas/ps/inquiry/dao/readme.md
  12. 74 0
      src/main/java/com/uas/ps/inquiry/entity/Attach.java
  13. 87 0
      src/main/java/com/uas/ps/inquiry/entity/BatchInProduct.java
  14. 264 0
      src/main/java/com/uas/ps/inquiry/entity/BatchInquiry.java
  15. 27 0
      src/main/java/com/uas/ps/inquiry/entity/Constant.java
  16. 157 0
      src/main/java/com/uas/ps/inquiry/entity/Inquiry.java
  17. 75 0
      src/main/java/com/uas/ps/inquiry/entity/InquiryDecide.java
  18. 325 0
      src/main/java/com/uas/ps/inquiry/entity/InquiryDetail.java
  19. 46 0
      src/main/java/com/uas/ps/inquiry/entity/InquiryDetailDet.java
  20. 142 0
      src/main/java/com/uas/ps/inquiry/entity/Product.java
  21. 45 0
      src/main/java/com/uas/ps/inquiry/entity/RemoteFile.java
  22. 1 0
      src/main/java/com/uas/ps/inquiry/entity/readme.md
  23. 143 0
      src/main/java/com/uas/ps/inquiry/model/Attach.java
  24. 15 0
      src/main/java/com/uas/ps/inquiry/model/FileUpload.java
  25. 345 0
      src/main/java/com/uas/ps/inquiry/model/PublicInquiry.java
  26. 686 0
      src/main/java/com/uas/ps/inquiry/model/PublicInquiryItem.java
  27. 63 0
      src/main/java/com/uas/ps/inquiry/model/PublicInquiryReply.java
  28. 377 0
      src/main/java/com/uas/ps/inquiry/model/PurcInquiry.java
  29. 549 0
      src/main/java/com/uas/ps/inquiry/model/PurcInquiryItem.java
  30. 62 0
      src/main/java/com/uas/ps/inquiry/model/PurchaseInquiryReply.java
  31. 5 0
      src/main/java/com/uas/ps/inquiry/model/readme.md
  32. 160 0
      src/main/java/com/uas/ps/inquiry/service/PublicInquiryService.java
  33. 500 0
      src/main/java/com/uas/ps/inquiry/service/impl/PublicInquiryServiceImpl.java
  34. 1 0
      src/main/java/com/uas/ps/inquiry/service/impl/readme.md
  35. 1 0
      src/main/java/com/uas/ps/inquiry/service/readme.md
  36. 0 72
      src/main/java/com/uas/ps/inquiry/util/ContextUtils.java
  37. 200 0
      src/main/java/com/uas/ps/inquiry/util/DateUtils.java
  38. 17 0
      src/main/java/com/uas/ps/inquiry/util/ICallable.java
  39. 34 0
      src/main/java/com/uas/ps/inquiry/util/ICallableAdapter.java
  40. 10 0
      src/main/java/com/uas/ps/inquiry/util/IRunnable.java
  41. 20 0
      src/main/java/com/uas/ps/inquiry/util/IRunnableAdapter.java
  42. 7 0
      src/main/java/com/uas/ps/inquiry/util/Listener.java
  43. 29 0
      src/main/java/com/uas/ps/inquiry/util/Listeners.java
  44. 266 0
      src/main/java/com/uas/ps/inquiry/util/ThreadUtils.java
  45. 1 1
      src/main/resources/application.yml

+ 4 - 0
pom.xml

@@ -20,6 +20,10 @@
             <groupId>com.uas.ps</groupId>
             <artifactId>ps-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.uas.ps</groupId>
+            <artifactId>ps-entity</artifactId>
+        </dependency>
 
         <!-- spring boot -->
         <dependency>

+ 1 - 1
src/main/java/com/uas/ps/inquiry/Application.java

@@ -1,6 +1,6 @@
 package com.uas.ps.inquiry;
 
-import com.uas.ps.inquiry.util.ContextUtils;
+import com.uas.ps.core.util.ContextUtils;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.event.ApplicationPreparedEvent;

+ 205 - 0
src/main/java/com/uas/ps/inquiry/controller/PublicInquiryController.java

@@ -0,0 +1,205 @@
+package com.uas.ps.inquiry.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.uas.ps.inquiry.entity.BatchInquiry;
+import com.uas.ps.inquiry.entity.Inquiry;
+import com.uas.ps.inquiry.entity.InquiryDecide;
+import com.uas.ps.inquiry.entity.InquiryDetail;
+import com.uas.ps.inquiry.model.FileUpload;
+import com.uas.ps.inquiry.model.PublicInquiryItem;
+import com.uas.ps.inquiry.model.PurcInquiry;
+import com.uas.ps.inquiry.service.PublicInquiryService;
+import javassist.NotFoundException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.ui.ModelMap;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.List;
+
+/**
+ * ERP上传公共询价信息
+ *
+ * Created by hejq on 2018-01-13.
+ */
+@RestController
+@RequestMapping("/public/Inquiry")
+public class PublicInquiryController {
+
+    @Autowired
+    private PublicInquiryService publicInquiryService;
+
+    /**
+     * 测试连接
+     *
+     * @return
+     */
+    @RequestMapping(value = "/hello", method = RequestMethod.GET)
+    public ModelMap test() {
+        return new ModelMap("data", "hello world");
+    }
+
+    /**
+     * 将买家ERP的公共询价写到平台
+     *
+     * @param data 封装的data
+     * @param enuu 询价企业UU
+     * @param address 询价企业地址信息
+     * @return
+     * @throws UnsupportedEncodingException
+     */
+    @RequestMapping(method = RequestMethod.POST)
+    public void saveInquiries(@RequestParam("data") String data, @RequestParam("enuu") Long enuu, @RequestParam("address") String address) throws NotFoundException, UnsupportedEncodingException {
+        String jsonStr = URLDecoder.decode(data, "UTF-8");
+        address = URLDecoder.decode(address, "UTF-8");
+        List<BatchInquiry> inquiries = JSONObject.parseArray(jsonStr, BatchInquiry.class);
+        publicInquiryService.save(inquiries, enuu, address);
+    }
+
+    /**
+     * erp的公共询价单提交待审核时,更新平台的单据设置为不能报价
+     *
+     * @param data 封装的数据信息
+     * @param enuu 询价企业UU
+     * @throws UnsupportedEncodingException
+     */
+    @RequestMapping(value = "/check", method = RequestMethod.POST)
+    public void updateInquiryStatus(@RequestParam("data") String data, @RequestParam("enuu") Long enuu) throws UnsupportedEncodingException {
+        String jsonStr = URLDecoder.decode(data, "UTF-8");
+        List<BatchInquiry> inquiries = JSONObject.parseArray(jsonStr, BatchInquiry.class);
+        publicInquiryService.updateStatus(inquiries, enuu);
+    }
+
+    /**
+     * (针对客户)获取平台供应商的报价信息
+     *
+     * @author hejq
+     * @date 2018-01-14 15:20
+     * @param enuu 询价企业UU
+     */
+    @RequestMapping(value = "/infos", method = RequestMethod.GET)
+    public List<InquiryDetail> getReply(Long enuu) {
+        List<InquiryDetail> details = publicInquiryService.findNotUploadReply(enuu);
+        return details;
+    }
+
+    /**
+     * 平台的报价信息传到买家ERP之后,修改平台里面的询价单明细的上传状态
+     *
+     * @param data 传回的id串
+     * @return
+     * @throws UnsupportedEncodingException
+     */
+    @RequestMapping(value = "/reply/back", method = RequestMethod.POST)
+    public void onReplySuccess(@RequestParam("data") String data) throws UnsupportedEncodingException {
+        String[] idArray = URLDecoder.decode(data, "UTF-8").split(",");
+        publicInquiryService.onReplyUploadSuccess(idArray);
+    }
+
+    /**
+     * 买家在收到报价信息后,点击提交按钮后,状态传至平台,至此平台的供应商不能再对这张询价单进行报价
+     *
+     * @param data 封装的data信息
+     * @throws UnsupportedEncodingException
+     */
+    @RequestMapping(value = "/checking", method = RequestMethod.POST)
+    public void checkInquiry(@RequestParam("data") String data) throws UnsupportedEncodingException {
+        String jsonStr = URLDecoder.decode(data, "UTF-8");
+        List<Inquiry> inquiries = JSONObject.parseArray(jsonStr, Inquiry.class);
+        publicInquiryService.updateInquiryStatus(inquiries);
+    }
+
+    /**
+     * 买家ERP(不)采纳了价格之后,修改平台里面的报价信息的状态
+     *
+     * @return 封装的data信息
+     * @throws UnsupportedEncodingException
+     */
+    @RequestMapping(value = "/reply/decide", method = RequestMethod.POST)
+    public void onReplyDecide(@RequestParam("data") String data, @RequestParam("enuu") Long enuu) throws UnsupportedEncodingException {
+        String jsonStr = URLDecoder.decode(data, "UTF-8");
+        List<InquiryDecide> decides = JSONObject.parseArray(jsonStr, InquiryDecide.class);
+        publicInquiryService.onReplyDecide(decides, enuu);
+    }
+
+    /**
+     * 买家ERP作废询价单后,修改平台里面的状态
+     *
+     * @param data 封装的询价信息
+     * @return
+     * @throws UnsupportedEncodingException
+     */
+    @RequestMapping(value = "/invalid", method = RequestMethod.POST)
+    public void onReplyInvalid(@RequestParam("data") String data, @RequestParam("enuu") Long enuu) throws UnsupportedEncodingException {
+        String jsonStr = URLDecoder.decode(data, "UTF-8");
+        List<Inquiry> inquiries = JSONObject.parseArray(jsonStr, Inquiry.class);
+        publicInquiryService.onReplyInvalid(inquiries, enuu);
+    }
+
+    /**
+     * 将客户的公共询价列表中一条数据转成询价报价单数据
+     *
+     * @author hejq
+     * @date 2018-01-14 15:20
+     * @param id 公共询价明细id
+     * @param enuu 报价企业UU
+     * @param useruu 报价个人UU
+     * @return
+     */
+    @RequestMapping(value = "/turntoInquiry", method = RequestMethod.POST)
+    private ModelMap transtoInquiry(Long id, Long enuu, Long useruu) {
+        return publicInquiryService.transtoInquiry(id, enuu, useruu);
+    }
+
+    /**
+     * 作为卖家,保存更新公共询价单
+     *
+     * @param item 前台数据
+     * @return
+     */
+    @RequestMapping(value = "/item/save", method = RequestMethod.POST)
+    public String saveInquiryItem(@RequestBody PublicInquiryItem item) throws Exception {
+        item = publicInquiryService.save(item);
+        if (null != item) {
+            return JSONObject.toJSONString(item);
+        } else {
+            throw new Exception("保存失败");
+        }
+    }
+
+    /**
+     * 作为卖家,保存更新公共询价单
+     *
+     * @param items 前台数据
+     * @return
+     */
+    @RequestMapping(value = "/items/save", method = RequestMethod.POST)
+    public String saveInquiryItems(@RequestBody List<PublicInquiryItem> items) throws Exception {
+        items = publicInquiryService.save(items);
+        if (!CollectionUtils.isEmpty(items)) {
+            return JSONObject.toJSONString(items.get(0));
+        } else {
+            throw new Exception("保存失败");
+        }
+    }
+
+    /**
+     * 作为买家,保存更新公共询价单
+     *
+     * @param inquiry 询价信息
+     * @return
+     */
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    public String saveInquiryItem(@RequestBody PurcInquiry inquiry) throws Exception {
+        inquiry = publicInquiryService.saveInquiry(inquiry);
+        if (null != inquiry) {
+            return JSONObject.toJSONString(inquiry);
+        } else {
+            throw new Exception("保存失败");
+        }
+    }
+}

+ 1 - 0
src/main/java/com/uas/ps/inquiry/controller/readme.md

@@ -0,0 +1 @@
+#这里是外部调用公共服务的接口路径

+ 30 - 0
src/main/java/com/uas/ps/inquiry/dao/ProductDao.java

@@ -0,0 +1,30 @@
+package com.uas.ps.inquiry.dao;
+
+import com.uas.ps.inquiry.entity.Product;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 关于物料的数据库实现方法
+ *
+ * @author hejq
+ * @date 2018-01-13 19:00
+ */
+@Repository
+public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaRepository<Product, Long> {
+
+    /**
+     * 通过企业UU号和物料编号查询物料信息
+     * <pre>
+     *     采用List是如果出现多个不会报错
+     * </pre>
+     *
+     * @param enuu 企业UU号
+     * @param code 物料编号
+     * @return
+     */
+    List<Product> findByEnUUAndCode(Long enuu, String code);
+}

+ 39 - 0
src/main/java/com/uas/ps/inquiry/dao/PublicInquiryDao.java

@@ -0,0 +1,39 @@
+package com.uas.ps.inquiry.dao;
+
+import com.uas.ps.inquiry.model.PublicInquiry;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 公共询价数据库操作
+ *
+ * Created by hejq on 2018-01-13.
+ */
+@Repository
+public interface PublicInquiryDao extends JpaSpecificationExecutor<PublicInquiry>, JpaRepository<PublicInquiry, Long> {
+
+    /**
+     * 通过企业UU和询价单号查询询价信息
+     *
+     * @author hejq
+     * @date 2018-01-14 12:35
+     * @param enuu 企业UU号
+     * @param code 询价编号
+     * @return
+     */
+    List<PublicInquiry> findByEnUUAndCode(Long enuu, String code);
+
+    /**
+     * 通过来源id和应用来源查询单据
+     *
+     * @author hejq
+     * @date 2018-01-14 14:51
+     * @param id 公共询价的主表id
+     * @param sourcerapp 应用来源
+     * @return
+     */
+    PublicInquiry findBySourceIdAndSourceApp(Long id, String sourcerapp);
+}

+ 70 - 0
src/main/java/com/uas/ps/inquiry/dao/PublicInquiryItemDao.java

@@ -0,0 +1,70 @@
+package com.uas.ps.inquiry.dao;
+
+import com.uas.ps.inquiry.model.PublicInquiryItem;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import javax.transaction.Transactional;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 公共询价报价信息表数据库操作
+ *
+ * Created by hejq on 2018-01-14.
+ */
+@Repository
+public interface PublicInquiryItemDao extends JpaRepository<PublicInquiryItem, Long>, JpaSpecificationExecutor<PublicInquiryItem> {
+
+    /**
+     * 通过企业UU和下载状态查询已报价未传回ERP的单据
+     *
+     * @param enUU 企业UU
+     * @param backStatus 未下载状态202
+     * @author hejq
+     * @date 2018-01-14 11:49
+     * @return
+     */
+    @Query("from PublicInquiryItem d where d.inquiry.enUU = :enUU and d.backStatus = :backStatus and nvl(d.sourceApp, ' ') <> 'B2B'")
+    List<PublicInquiryItem> findByEnUUAndBackStatus(@Param("enUU") Long enUU, @Param("backStatus") short backStatus);
+
+    /**
+     * 根据传回的id更新下载状态
+     *
+     * @param ids 询价明细idList
+     * @author hejq
+     * @date 2018-01-14 11:49
+     */
+    @Modifying
+    @Transactional
+    @Query("update PublicInquiryItem i set i.backStatus = 351 where i.id in (:ids)")
+    void updateBackStatus(@Param("ids") Set<Long> ids);
+
+    /**
+     * 按询价单明细ID更新采纳结果
+     *
+     * @author hejq
+     * @date 2018-01-14 15:03
+     * @param agreed 采纳结果
+     * @param decideStatus 采纳状态
+     * @param id 询价id
+     */
+    @Modifying(clearAutomatically = true)
+    @Query("update PublicInquiryItem p set p.agreed = :agreed, p.decideStatus = :decideStatus where p.id = :id")
+    void updateDecideStatusByID(@Param("agreed")Short agreed, @Param("decideStatus") Short decideStatus, @Param("id") Long id);
+
+    /**
+     * 通过供应商UU号和来源id查询单据明细
+     *
+     * @author hejq
+     * @date 2018-01-14 14:53
+     * @param enuu 供应商UU号
+     * @param id 来源id
+     * @return
+     */
+    PublicInquiryItem findByVendUUAndSourceId(Long enuu, Long id);
+}

+ 15 - 0
src/main/java/com/uas/ps/inquiry/dao/PublicInquiryReplyDao.java

@@ -0,0 +1,15 @@
+package com.uas.ps.inquiry.dao;
+
+import com.uas.ps.inquiry.model.PublicInquiryReply;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 供应商报价信息数据库操作
+ *
+ * Created by hejq on 2018-01-14.
+ */
+@Repository
+public interface PublicInquiryReplyDao extends JpaSpecificationExecutor<PublicInquiryReply>, JpaRepository<PublicInquiryReply, Long> {
+}

+ 24 - 0
src/main/java/com/uas/ps/inquiry/dao/PurcInquiryDao.java

@@ -0,0 +1,24 @@
+package com.uas.ps.inquiry.dao;
+
+import com.uas.ps.inquiry.model.PurcInquiry;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 公共询价临时表中间表数据库操作
+ *
+ * Created by hejq on 2018-01-14.
+ */
+@Repository
+public interface PurcInquiryDao extends JpaRepository<PurcInquiry, Long>, JpaSpecificationExecutor<PurcInquiry> {
+
+    /**
+     * 通过询价单号和企业UU查询询价单
+     *
+     * @param bi_code 询价单号
+     * @param enuu 企业UU
+     * @return
+     */
+    PurcInquiry findByCodeAndEnUU(String bi_code, Long enuu);
+}

+ 30 - 0
src/main/java/com/uas/ps/inquiry/dao/PurcInquiryItemDao.java

@@ -0,0 +1,30 @@
+package com.uas.ps.inquiry.dao;
+
+import com.uas.ps.inquiry.model.PurcInquiryItem;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import javax.transaction.Transactional;
+
+/**
+ * 公共询价明细的操作
+ *
+ * Created by hejq on 2018-01-14.
+ */
+@Repository
+public interface PurcInquiryItemDao extends JpaSpecificationExecutor<PurcInquiryItem>, JpaRepository<PurcInquiryItem, Long> {
+
+    /**
+     * 通过关联主表id更新询价明细状态
+     *
+     * @param sourceId 主表id
+     */
+    @Transactional
+    @Modifying(clearAutomatically = true)
+    @Query("update PurcInquiryItem set overdue = 1 where inquiry.id = :sourceId")
+    void updateStatus(@Param("sourceId") Long sourceId);
+}

+ 1 - 0
src/main/java/com/uas/ps/inquiry/dao/readme.md

@@ -0,0 +1 @@
+#公共询价服务的数据库操作

+ 74 - 0
src/main/java/com/uas/ps/inquiry/entity/Attach.java

@@ -0,0 +1,74 @@
+package com.uas.ps.inquiry.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 附件信息
+ *
+ * Created by hejq on 2018-01-13.
+ */
+public class Attach implements Serializable {
+
+    /**
+     * Default serialVersionUID
+     */
+    private static final long serialVersionUID = 1L;
+    /**
+     * ID
+     */
+    private Long fp_id;
+    /**
+     * 附件名称
+     */
+    private String fp_name;
+    /**
+     * 附件Url
+     */
+    private String fp_url;
+    /**
+     * 附件大小
+     */
+    private Long fp_size;
+
+    public Long getFp_id() {
+        return fp_id;
+    }
+    public void setFp_id(Long fp_id) {
+        this.fp_id = fp_id;
+    }
+    public String getFp_name() {
+        return fp_name;
+    }
+    public void setFp_name(String fp_name) {
+        this.fp_name = fp_name;
+    }
+    public String getFp_url() {
+        return fp_url;
+    }
+    public void setFp_url(String fp_url) {
+        this.fp_url = fp_url;
+    }
+    public Long getFp_size() {
+        return fp_size;
+    }
+    public void setFp_size(Long fp_size) {
+        this.fp_size = fp_size;
+    }
+
+    /**
+     * 转为平台的一条附件记录
+     *
+     * @param description
+     * @return
+     */
+    public com.uas.ps.inquiry.model.Attach convertToB2bAttach(String description) {
+        com.uas.ps.inquiry.model.Attach attach = new com.uas.ps.inquiry.model.Attach();
+        attach.setName(this.fp_name);
+        attach.setDate(new Date());
+        attach.setDescription(description);
+        attach.setPath(this.fp_url);
+        attach.setSize(this.fp_size);
+        return attach;
+    }
+}

+ 87 - 0
src/main/java/com/uas/ps/inquiry/entity/BatchInProduct.java

@@ -0,0 +1,87 @@
+package com.uas.ps.inquiry.entity;
+
+/**
+ * ERP公共询价物料信息
+ *
+ * Created by hejq on 2018-01-13.
+ */
+public class BatchInProduct {
+
+    /**
+     * 明细id
+     */
+    private Long bip_id;
+
+    /**
+     * 主表id
+     */
+    private Long bip_biid;
+
+    /**
+     * 序号
+     */
+    private Short bip_detno;
+
+    /**
+     * 物料编号
+     */
+    private String bip_prodcode;
+
+    /**
+     * 备注
+     */
+    private String bip_remark;
+
+    /**
+     * 币别
+     */
+    private String bip_currency;
+
+    public Long getBip_id() {
+        return bip_id;
+    }
+
+    public void setBip_id(Long bip_id) {
+        this.bip_id = bip_id;
+    }
+
+    public Long getBip_biid() {
+        return bip_biid;
+    }
+
+    public void setBip_biid(Long bip_biid) {
+        this.bip_biid = bip_biid;
+    }
+
+    public Short getBip_detno() {
+        return bip_detno;
+    }
+
+    public void setBip_detno(Short bip_detno) {
+        this.bip_detno = bip_detno;
+    }
+
+    public String getBip_prodcode() {
+        return bip_prodcode;
+    }
+
+    public void setBip_prodcode(String bip_prodcode) {
+        this.bip_prodcode = bip_prodcode;
+    }
+
+    public String getBip_remark() {
+        return bip_remark;
+    }
+
+    public void setBip_remark(String bip_remark) {
+        this.bip_remark = bip_remark;
+    }
+
+    public String getBip_currency() {
+        return bip_currency;
+    }
+
+    public void setBip_currency(String bip_currency) {
+        this.bip_currency = bip_currency;
+    }
+}

+ 264 - 0
src/main/java/com/uas/ps/inquiry/entity/BatchInquiry.java

@@ -0,0 +1,264 @@
+package com.uas.ps.inquiry.entity;
+
+import com.uas.ps.core.util.CollectionUtils;
+import com.uas.ps.entity.Status;
+import com.uas.ps.inquiry.model.PurcInquiry;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * ERP公共询价单信息
+ *
+ * Created by hejq on 2018-01-13.
+ */
+public class BatchInquiry {
+
+    /**
+     * erp id
+     */
+    private Long bi_id;
+
+    /**
+     * 询价单号
+     */
+    private String bi_code;
+
+    /**
+     * 时间
+     */
+    private Date bi_date;
+
+    /**
+     * 询价类型
+     */
+    private String bi_kind;
+
+    /**
+     * 环保需求
+     */
+    private String bi_environment;
+
+    /**
+     * 使用范围
+     */
+    private String bi_purpose;
+
+    /**
+     * 价格类型
+     */
+    private String bi_pricekind;
+
+    /**
+     * 录入人
+     */
+    private String bi_recorder;
+
+    /**
+     * 录入人uu
+     */
+    private Long bi_recorduu;
+
+    /**
+     * 录入时间
+     */
+    private String bi_recorddate;
+
+    /**
+     * 报价截止日期
+     */
+    private Date bi_enddate;
+
+    /**
+     * 备注
+     */
+    private String bi_remark;
+
+    /**
+     * 价格种类
+     */
+    private String bi_pricetype;
+
+    /**
+     * 询价物料
+     */
+    private List<BatchInProduct> inProducts;
+
+    /**
+     * 附件
+     */
+    private String in_attach;
+
+    /**
+     *  所有的附件信息
+     */
+    private List<Attach> attaches;
+
+    public Long getBi_id() {
+        return bi_id;
+    }
+
+    public void setBi_id(Long bi_id) {
+        this.bi_id = bi_id;
+    }
+
+    public String getBi_code() {
+        return bi_code;
+    }
+
+    public void setBi_code(String bi_code) {
+        this.bi_code = bi_code;
+    }
+
+    public Date getBi_date() {
+        return bi_date;
+    }
+
+    public void setBi_date(Date bi_date) {
+        this.bi_date = bi_date;
+    }
+
+    public String getBi_kind() {
+        return bi_kind;
+    }
+
+    public void setBi_kind(String bi_kind) {
+        this.bi_kind = bi_kind;
+    }
+
+    public String getBi_environment() {
+        return bi_environment;
+    }
+
+    public void setBi_environment(String bi_environment) {
+        this.bi_environment = bi_environment;
+    }
+
+    public String getBi_purpose() {
+        return bi_purpose;
+    }
+
+    public void setBi_purpose(String bi_purpose) {
+        this.bi_purpose = bi_purpose;
+    }
+
+    public String getBi_pricekind() {
+        return bi_pricekind;
+    }
+
+    public void setBi_pricekind(String bi_pricekind) {
+        this.bi_pricekind = bi_pricekind;
+    }
+
+    public String getBi_recorder() {
+        return bi_recorder;
+    }
+
+    public void setBi_recorder(String bi_recorder) {
+        this.bi_recorder = bi_recorder;
+    }
+
+    public Long getBi_recorduu() {
+        return bi_recorduu;
+    }
+
+    public void setBi_recorduu(Long bi_recorduu) {
+        this.bi_recorduu = bi_recorduu;
+    }
+
+    public String getBi_recorddate() {
+        return bi_recorddate;
+    }
+
+    public void setBi_recorddate(String bi_recorddate) {
+        this.bi_recorddate = bi_recorddate;
+    }
+
+    public Date getBi_enddate() {
+        return bi_enddate;
+    }
+
+    public void setBi_enddate(Date bi_enddate) {
+        this.bi_enddate = bi_enddate;
+    }
+
+    public String getBi_remark() {
+        return bi_remark;
+    }
+
+    public void setBi_remark(String bi_remark) {
+        this.bi_remark = bi_remark;
+    }
+
+    public String getBi_pricetype() {
+        return bi_pricetype;
+    }
+
+    public void setBi_pricetype(String bi_pricetype) {
+        this.bi_pricetype = bi_pricetype;
+    }
+
+    public List<BatchInProduct> getInProducts() {
+        return inProducts;
+    }
+
+    public void setInProducts(List<BatchInProduct> inProducts) {
+        this.inProducts = inProducts;
+    }
+
+    public String getIn_attach() {
+        return in_attach;
+    }
+
+    public void setIn_attach(String in_attach) {
+        this.in_attach = in_attach;
+    }
+
+    public List<Attach> getAttaches() {
+        return attaches;
+    }
+
+    public void setAttaches(List<Attach> attaches) {
+        this.attaches = attaches;
+    }
+
+    /**
+     * 将ERP公共询价信息转成公有库的询价信息
+     *
+     * @author hejq
+     * @date 2018-01-14 10:57
+     * @return
+     */
+    public PurcInquiry covert() {
+        PurcInquiry inquiry = new PurcInquiry();
+        inquiry.setEnteryStatus(Status.ENABLED.value());
+        inquiry.setCode(this.getBi_code());
+        inquiry.setPriceType(this.bi_pricetype);
+        inquiry.setDate(this.bi_date);
+        inquiry.setEndDate(this.bi_enddate);
+        inquiry.setEnvironment(this.bi_environment);
+        inquiry.setInquirytype("公共询价");
+        inquiry.setIsOpen(Constant.YES);
+        inquiry.setRemark(this.bi_remark);
+        inquiry.setRecorder(this.bi_recorder);
+        inquiry.setRecorderUU(this.bi_recorduu);
+        inquiry.setErpdate(new Date());
+        inquiry.setErpid(this.bi_id);
+        inquiry.setSourceapp("ERP");
+        if (!CollectionUtils.isEmpty(this.attaches)) {
+            Set<com.uas.ps.inquiry.model.Attach> b2bAttaches = new HashSet<com.uas.ps.inquiry.model.Attach>();
+            for (Attach attach : this.attaches) {
+                com.uas.ps.inquiry.model.Attach b2bAttach = attach.convertToB2bAttach("客户采购公共询价单附件");
+                b2bAttaches.add(b2bAttach);
+            }
+            inquiry.setAttachs(b2bAttaches);
+        }
+        return inquiry;
+    }
+
+    public BatchInquiry() {
+
+    }
+}

+ 27 - 0
src/main/java/com/uas/ps/inquiry/entity/Constant.java

@@ -0,0 +1,27 @@
+package com.uas.ps.inquiry.entity;
+
+/**
+ * 一些基本定义的常量
+ *
+ * Created by hejq on 2018-01-13.
+ */
+public class Constant {
+
+    /**
+     * 是
+     */
+    public static final short YES = 1;
+
+    /**
+     * 否
+     */
+    public static final short NO = 0;
+
+    /**
+     * 置顶
+     */
+    public static final short TOP = 9;
+
+    public Constant() {
+    }
+}

+ 157 - 0
src/main/java/com/uas/ps/inquiry/entity/Inquiry.java

@@ -0,0 +1,157 @@
+package com.uas.ps.inquiry.entity;
+
+import java.util.*;
+
+/**
+ * 买家ERP系统的采购询价单
+ * 
+ * @author yingp
+ * 
+ */
+public class Inquiry {
+
+	private Long in_id;
+	private String in_code;
+	private Date in_date;
+	private String in_recorder;
+	private Long in_recorderuu;
+	private String in_auditor;
+	private Date in_recorddate;
+	private String in_environment;//环保要求
+	private Date in_enddate;
+	private String in_remark;
+	private String in_pricetype;
+	private List<InquiryDetail> details;
+	private String in_kind; //询价类型
+	private Long in_buyeruu;
+	private List<Attach> attaches;
+	private Long en_uu;
+
+	public Long getIn_id() {
+		return in_id;
+	}
+
+	public void setIn_id(Long in_id) {
+		this.in_id = in_id;
+	}
+
+	public String getIn_code() {
+		return in_code;
+	}
+
+	public void setIn_code(String in_code) {
+		this.in_code = in_code;
+	}
+
+	public Date getIn_date() {
+		return in_date;
+	}
+	
+	public String getIn_pricetype() {
+		return in_pricetype;
+	}
+
+	public void setIn_pricetype(String in_pricetype) {
+		this.in_pricetype = in_pricetype;
+	}
+
+	public void setIn_date(Date in_date) {
+		this.in_date = in_date;
+	}
+
+	public String getIn_recorder() {
+		return in_recorder;
+	}
+
+	public void setIn_recorder(String in_recorder) {
+		this.in_recorder = in_recorder;
+	}
+
+	public String getIn_auditor() {
+		return in_auditor;
+	}
+
+	public void setIn_auditor(String in_auditor) {
+		this.in_auditor = in_auditor;
+	}
+
+	public Date getIn_recorddate() {
+		return in_recorddate;
+	}
+
+	public void setIn_recorddate(Date in_recorddate) {
+		this.in_recorddate = in_recorddate;
+	}
+
+	public Date getIn_enddate() {
+		return in_enddate;
+	}
+
+	public void setIn_enddate(Date in_enddate) {
+		this.in_enddate = in_enddate;
+	}
+
+	public String getIn_remark() {
+		return in_remark;
+	}
+
+	public void setIn_remark(String in_remark) {
+		this.in_remark = in_remark;
+	}
+
+	public List<InquiryDetail> getDetails() {
+		return details;
+	}
+
+	public void setDetails(List<InquiryDetail> details) {
+		this.details = details;
+	}
+
+	public Long getIn_buyeruu() {
+		return in_buyeruu;
+	}
+
+	public void setIn_buyeruu(Long in_buyeruu) {
+		this.in_buyeruu = in_buyeruu;
+	}
+
+	public Long getIn_recorderuu() {
+		return in_recorderuu;
+	}
+
+	public void setIn_recorderuu(Long in_recorderuu) {
+		this.in_recorderuu = in_recorderuu;
+	}
+
+	public String getIn_environment() {
+		return in_environment;
+	}
+
+	public void setIn_environment(String in_environment) {
+		this.in_environment = in_environment;
+	}
+
+	public List<Attach> getAttaches() {
+		return attaches;
+	}
+
+	public void setAttaches(List<Attach> attaches) {
+		this.attaches = attaches;
+	}
+
+	public String getIn_kind() {
+		return in_kind;
+	}
+
+	public void setIn_kind(String in_kind) {
+		this.in_kind = in_kind;
+	}
+
+	public Long getEn_uu() {
+		return en_uu;
+	}
+
+	public void setEn_uu(Long en_uu) {
+		this.en_uu = en_uu;
+	}
+}

+ 75 - 0
src/main/java/com/uas/ps/inquiry/entity/InquiryDecide.java

@@ -0,0 +1,75 @@
+package com.uas.ps.inquiry.entity;
+
+/**
+ * 买家ERP系统对报价单的采纳结果
+ * 
+ * @author yingp
+ * 
+ */
+public class InquiryDecide {
+
+	/**
+	 * 询价编号
+	 */
+	private String in_code;
+
+	/**
+	 * 明细序号
+	 */
+	private Short id_detno;
+
+	/**
+	 * 采纳状态
+	 */
+	private Short id_agreed;
+
+	/**
+	 * 针对主动报价,主动报价id
+	 */
+	private Long b2b_qu_id;
+
+	/**
+	 * 平台明细id
+	 */
+	private Long b2b_id;
+
+	public String getIn_code() {
+		return in_code;
+	}
+
+	public void setIn_code(String in_code) {
+		this.in_code = in_code;
+	}
+
+	public Short getId_detno() {
+		return id_detno;
+	}
+
+	public void setId_detno(Short id_detno) {
+		this.id_detno = id_detno;
+	}
+
+	public Short getId_agreed() {
+		return id_agreed == null ? Constant.NO : (short) Math.abs(id_agreed);
+	}
+
+	public void setId_agreed(Short id_agreed) {
+		this.id_agreed = id_agreed;
+	}
+
+	public Long getB2b_qu_id() {
+		return b2b_qu_id;
+	}
+
+	public void setB2b_qu_id(Long b2b_qu_id) {
+		this.b2b_qu_id = b2b_qu_id;
+	}
+
+	public Long getB2b_id() {
+		return b2b_id;
+	}
+
+	public void setB2b_id(Long b2b_id) {
+		this.b2b_id = b2b_id;
+	}
+}

+ 325 - 0
src/main/java/com/uas/ps/inquiry/entity/InquiryDetail.java

@@ -0,0 +1,325 @@
+package com.uas.ps.inquiry.entity;
+
+import com.uas.ps.core.util.CollectionUtils;
+import com.uas.ps.inquiry.model.PublicInquiryItem;
+import com.uas.ps.inquiry.model.PublicInquiryReply;
+
+import java.util.*;
+
+/**
+ * 买家ERP系统的采购询价单明细
+ * 
+ * @author yingp
+ * 
+ */
+public class InquiryDetail {
+
+	private Long b2b_id_id;
+	private short id_detno;
+	private String id_prodcode;
+	private String id_currency;
+	private Float id_rate;
+	private Long ve_uu;
+	private String ve_contact;
+	private Long ve_contactuu;
+	private String id_remark;
+	private Long id_id;
+	private Date id_myfromdate;
+	private Date id_mytodate;
+	private Date id_fromdate;
+	private Date id_todate;
+	private Double id_minbuyqty;
+	private Double id_minqty;
+	private String id_brand;//供应商物料品牌
+	private String id_vendorprodcode;//供应商物料编号
+	private Long id_leadtime;//供应商交互周期
+	private List<InquiryDetailDet> dets;
+	private List<RemoteFile> files;
+	private String id_attach;
+	private Long ve_buyeruu;
+	private String sourceApp;
+	private String id_vendname;// 供应商名称
+	private String id_vendyyzzh;// 供应商营业执照号
+	private String in_code;// 公共询价时epr没有表不同,这时,需要新建数据
+	private String in_inquirytype;// 询价类型,公共询价传回到ERP时进行特殊处理
+    private Integer id_quto;//给是否自动询价赋值
+
+	public Long getB2b_id_id() {
+		return b2b_id_id;
+	}
+
+	public void setB2b_id_id(Long b2b_id_id) {
+		this.b2b_id_id = b2b_id_id;
+	}
+
+	public short getId_detno() {
+		return id_detno;
+	}
+
+	public void setId_detno(short id_detno) {
+		this.id_detno = id_detno;
+	}
+
+	public String getId_prodcode() {
+		return id_prodcode;
+	}
+
+	public void setId_prodcode(String id_prodcode) {
+		this.id_prodcode = id_prodcode;
+	}
+
+	public String getId_currency() {
+		return id_currency;
+	}
+
+	public void setId_currency(String id_currency) {
+		this.id_currency = id_currency;
+	}
+
+	public Float getId_rate() {
+		return id_rate;
+	}
+
+	public void setId_rate(Float id_rate) {
+		this.id_rate = id_rate;
+	}
+
+	public Long getVe_uu() {
+		return ve_uu;
+	}
+
+	public void setVe_uu(Long ve_uu) {
+		this.ve_uu = ve_uu;
+	}
+
+	public String getVe_contact() {
+		return ve_contact;
+	}
+
+	public void setVe_contact(String ve_contact) {
+		this.ve_contact = ve_contact;
+	}
+
+	public Long getVe_contactuu() {
+		return ve_contactuu;
+	}
+
+	public void setVe_contactuu(Long ve_contactuu) {
+		this.ve_contactuu = ve_contactuu;
+	}
+
+	public String getId_remark() {
+		return id_remark;
+	}
+
+	public void setId_remark(String id_remark) {
+		this.id_remark = id_remark;
+	}
+
+	public Long getId_id() {
+		return id_id;
+	}
+
+	public void setId_id(Long id_id) {
+		this.id_id = id_id;
+	}
+
+	public List<InquiryDetailDet> getDets() {
+		return dets;
+	}
+
+	public void setDets(List<InquiryDetailDet> dets) {
+		this.dets = dets;
+	}
+
+	public Date getId_myfromdate() {
+		return id_myfromdate;
+	}
+
+	public void setId_myfromdate(Date id_myfromdate) {
+		this.id_myfromdate = id_myfromdate;
+	}
+
+	public Date getId_mytodate() {
+		return id_mytodate;
+	}
+
+	public void setId_mytodate(Date id_mytodate) {
+		this.id_mytodate = id_mytodate;
+	}
+
+	public Date getId_fromdate() {
+		return id_fromdate;
+	}
+
+	public void setId_fromdate(Date id_fromdate) {
+		this.id_fromdate = id_fromdate;
+	}
+
+	public Date getId_todate() {
+		return id_todate;
+	}
+
+	public void setId_todate(Date id_todate) {
+		this.id_todate = id_todate;
+	}
+
+	public Double getId_minbuyqty() {
+		return id_minbuyqty;
+	}
+
+	public void setId_minbuyqty(Double id_minbuyqty) {
+		this.id_minbuyqty = id_minbuyqty;
+	}
+
+	public Double getId_minqty() {
+		return id_minqty;
+	}
+
+	public void setId_minqty(Double id_minqty) {
+		this.id_minqty = id_minqty;
+	}
+
+	public Long getVe_buyeruu() {
+		return ve_buyeruu;
+	}
+
+	public void setVe_buyeruu(Long ve_buyeruu) {
+		this.ve_buyeruu = ve_buyeruu;
+	}
+
+	public String getId_brand() {
+		return id_brand;
+	}
+
+	public void setId_brand(String id_brand) {
+		this.id_brand = id_brand;
+	}
+
+	public String getId_vendorprodcode() {
+		return id_vendorprodcode;
+	}
+
+	public void setId_vendorprodcode(String id_vendorprodcode) {
+		this.id_vendorprodcode = id_vendorprodcode;
+	}
+
+	public Long getId_leadtime() {
+		return id_leadtime;
+	}
+
+	public void setId_leadtime(Long id_leadtime) {
+		this.id_leadtime = id_leadtime;
+	}
+
+	public String getSourceApp() {
+		return sourceApp;
+	}
+
+	public void setSourceApp(String sourceApp) {
+		this.sourceApp = sourceApp;
+	}
+
+	public List<RemoteFile> getFiles() {
+		return files;
+	}
+
+	public void setFiles(List<RemoteFile> files) {
+		this.files = files;
+	}
+
+	public String getId_attach() {
+		return id_attach;
+	}
+
+	public void setId_attach(String id_attach) {
+		this.id_attach = id_attach;
+	}
+
+	public String getId_vendname() {
+		return id_vendname;
+	}
+
+	public void setId_vendname(String id_vendname) {
+		this.id_vendname = id_vendname;
+	}
+
+	public String getId_vendyyzzh() {
+		return id_vendyyzzh;
+	}
+
+	public void setId_vendyyzzh(String id_vendyyzzh) {
+		this.id_vendyyzzh = id_vendyyzzh;
+	}
+
+	public String getIn_code() {
+		return in_code;
+	}
+
+	public void setIn_code(String in_code) {
+		this.in_code = in_code;
+	}
+
+	public String getIn_inquirytype() {
+		return in_inquirytype;
+	}
+
+	public void setIn_inquirytype(String in_inquirytype) {
+		this.in_inquirytype = in_inquirytype;
+	}
+
+    public Integer getId_quto() {
+        return id_quto;
+    }
+
+    public void setId_quto(Integer id_quto) {
+        this.id_quto = id_quto;
+    }
+
+	public InquiryDetail() {
+
+	}
+
+	/**
+	 * 将平台的公共询价信息转成ERP对应的字段
+     *
+	 * @param item 平台公共询价已转报价的报价单明细
+	 */
+	public InquiryDetail(PublicInquiryItem item) {
+        this.b2b_id_id = item.getId();
+        this.id_minbuyqty = item.getMinOrderQty();
+        this.id_minqty = item.getMinPackQty();
+        this.id_fromdate = item.getVendFromDate();
+        this.id_todate = item.getVendToDate();
+        this.id_id = item.getSourceId();
+        this.id_detno = item.getNumber();
+        this.id_brand = item.getBrand();
+        this.id_vendorprodcode = item.getVendorprodcode();
+        this.id_leadtime = item.getLeadtime();
+        this.sourceApp = item.getSourceApp();
+        this.id_rate = item.getTaxrate();
+        this.id_vendname = item.getVendName();
+        this.id_vendyyzzh = item.getBusinessCode();
+        this.in_code = item.getInquiry().getCode();
+        this.id_prodcode = item.getPrcode();
+        this.id_currency = item.getCurrency();
+        this.ve_uu = item.getVendUU();
+        this.in_inquirytype = item.getInquiry().getInquirytype();
+        if (!CollectionUtils.isEmpty(item.getReplies())) {
+            dets = new ArrayList<InquiryDetailDet>();
+            for (PublicInquiryReply reply : item.getReplies()) {
+                dets.add(new InquiryDetailDet(reply));
+            }
+        }
+        if (!CollectionUtils.isEmpty(item.getAttaches())) {
+            files = new ArrayList<>();
+            for (com.uas.ps.inquiry.model.Attach attach : item.getAttaches()) {
+                files.add(new RemoteFile(attach));
+            }
+        }
+        if ("自动询价".equals(item.getInquiry().getRemark())) {
+            this.id_quto = 1;
+        }
+	}
+
+}

+ 46 - 0
src/main/java/com/uas/ps/inquiry/entity/InquiryDetailDet.java

@@ -0,0 +1,46 @@
+package com.uas.ps.inquiry.entity;
+
+import com.uas.ps.inquiry.model.PublicInquiryReply;
+
+/**
+ * 买家ERP系统的采购询价单明细的分段报价明细
+ * 
+ * @author yingp
+ * 
+ */
+public class InquiryDetailDet {
+
+	private Double idd_lapqty;
+	private Double idd_price;
+
+	public Double getIdd_lapqty() {
+		return idd_lapqty;
+	}
+
+	public void setIdd_lapqty(Double idd_lapqty) {
+		this.idd_lapqty = idd_lapqty;
+	}
+
+	public Double getIdd_price() {
+		return idd_price;
+	}
+
+	public void setIdd_price(Double idd_price) {
+		this.idd_price = idd_price;
+	}
+
+	public InquiryDetailDet() {
+
+	}
+
+	/**
+	 * 平台的公共报价转报价单的报价信息转ERP对应的报价信息
+	 *
+	 * @param reply 平台的公共报价转报价单的报价信息
+	 */
+	public InquiryDetailDet(PublicInquiryReply reply) {
+		this.idd_lapqty = reply.getLapQty();
+		this.idd_price = reply.getPrice();
+	}
+
+}

+ 142 - 0
src/main/java/com/uas/ps/inquiry/entity/Product.java

@@ -0,0 +1,142 @@
+package com.uas.ps.inquiry.entity;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 询价所需的简单的物料信息
+ *
+ * @author hejq
+ * @date 2018-01-14 16:25
+ */
+@Entity
+@Table(name = "products")
+public class Product implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "pr_id")
+    private Long id;
+
+    /**
+     * 商品信息标题
+     */
+    @Column(name = "pr_title")
+    private String title;
+
+    /**
+     * TODO unknown?
+     */
+    @Column(name = "pr_detail")
+    private String detail;
+
+    /**
+     * 产品编号
+     */
+    @Column(name = "pr_code")
+    private String code;
+
+    /**
+     * 产品规格
+     */
+    @Column(name = "pr_spec")
+    private String spec;
+
+    /**
+     * 单位
+     */
+    @Column(name = "pr_unit")
+    private String unit;
+
+    /**
+     * 所属企业UU
+     */
+    @Column(name = "pr_enuu")
+    private Long enUU;
+
+    /**
+     * 个人UU 上传人的UU
+     */
+    @Column(name = "pr_useruu")
+    private Long userUU;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getDetail() {
+        return detail;
+    }
+
+    public void setDetail(String detail) {
+        this.detail = detail;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getSpec() {
+        return spec;
+    }
+
+    public void setSpec(String spec) {
+        this.spec = spec;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public Long getEnUU() {
+        return enUU;
+    }
+
+    public void setEnUU(Long enUU) {
+        this.enUU = enUU;
+    }
+
+    public Long getUserUU() {
+        return userUU;
+    }
+
+    public void setUserUU(Long userUU) {
+        this.userUU = userUU;
+    }
+
+    @Override
+    public String toString() {
+        return "Product{" +
+                "id=" + id +
+                ", title='" + title + '\'' +
+                ", detail='" + detail + '\'' +
+                ", code='" + code + '\'' +
+                ", spec='" + spec + '\'' +
+                ", unit='" + unit + '\'' +
+                ", enUU=" + enUU +
+                ", userUU=" + userUU +
+                '}';
+    }
+}

+ 45 - 0
src/main/java/com/uas/ps/inquiry/entity/RemoteFile.java

@@ -0,0 +1,45 @@
+package com.uas.ps.inquiry.entity;
+
+public class RemoteFile {
+
+	private String name;
+
+	private Long size;
+
+	private Long id;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Long getSize() {
+		return size;
+	}
+
+	public void setSize(Long size) {
+		this.size = size;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public RemoteFile() {
+
+	}
+
+	public RemoteFile(com.uas.ps.inquiry.model.Attach attach) {
+		this.id = attach.getId();
+		this.size = attach.getSize();
+		this.name = attach.getName();
+	}
+
+}

+ 1 - 0
src/main/java/com/uas/ps/inquiry/entity/readme.md

@@ -0,0 +1 @@
+#ERP实体类

+ 143 - 0
src/main/java/com/uas/ps/inquiry/model/Attach.java

@@ -0,0 +1,143 @@
+package com.uas.ps.inquiry.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 附件
+ *
+ * @author sunyj
+ * @since 2018/1/13 13:56
+ */
+@Entity
+@Table(name = "attachs")
+public class Attach implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "at_id")
+    private Long id;
+
+    /**
+     * 路径
+     */
+    @Column(name = "at_path")
+    private String path;
+
+    /**
+     * 描述语
+     */
+    @Column(name = "at_description")
+    private String description;
+
+    /**
+     * 文件名称
+     */
+    @Column(name = "at_name")
+    private String name;
+
+    /**
+     * 文件大小
+     */
+    @Column(name = "at_size")
+    private Long size;
+
+    /**
+     * 关联的表
+     */
+    @Column(name = "rel_table")
+    private String relatedTable;
+
+    /**
+     * 关联的数据主键值
+     */
+    @Column(name = "rel_key")
+    private Long relatedKey;
+
+    /**
+     * 保存时间
+     */
+    @Column(name = "at_date")
+    private Date date;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getSize() {
+        return size;
+    }
+
+    public void setSize(Long size) {
+        this.size = size;
+    }
+
+    public String getRelatedTable() {
+        return relatedTable;
+    }
+
+    public void setRelatedTable(String relatedTable) {
+        this.relatedTable = relatedTable;
+    }
+
+    public Long getRelatedKey() {
+        return relatedKey;
+    }
+
+    public void setRelatedKey(Long relatedKey) {
+        this.relatedKey = relatedKey;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+    @Override
+    public String toString() {
+        return "Attach{" +
+                "id=" + id +
+                ", path='" + path + '\'' +
+                ", description='" + description + '\'' +
+                ", name='" + name + '\'' +
+                ", size=" + size +
+                ", relatedTable='" + relatedTable + '\'' +
+                ", relatedKey=" + relatedKey +
+                ", date=" + date +
+                '}';
+    }
+}

+ 15 - 0
src/main/java/com/uas/ps/inquiry/model/FileUpload.java

@@ -0,0 +1,15 @@
+package com.uas.ps.inquiry.model;
+
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
+public class FileUpload {
+	private CommonsMultipartFile file;
+
+	public CommonsMultipartFile getFile() {
+		return file;
+	}
+
+	public void setFile(CommonsMultipartFile file) {
+		this.file = file;
+	}
+}

+ 345 - 0
src/main/java/com/uas/ps/inquiry/model/PublicInquiry.java

@@ -0,0 +1,345 @@
+package com.uas.ps.inquiry.model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
+
+/**
+ * 公共询价单主表
+ *    <pre>
+ *        这里是公共询价转成报价后存的数据信息,与以前的采购询价分开
+ *    </pre>
+ * @author hejq 2018-01-06
+ */
+@Table(name = "public$inquiry")
+@Entity
+public class PublicInquiry implements Serializable {
+
+	/**
+	 * 序列
+	 */
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * id
+	 */
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name = "in_id")
+	private Long id;
+
+	/**
+	 * 询价单所属企业UU
+	 */
+	@Column(name = "in_enuu")
+	private Long enUU;
+
+	/**
+	 * 询价单所属用户UU
+	 */
+	@Column(name = "in_recorderuu")
+	private Long recorderUU;
+
+	/**
+	 * 流水号
+	 */
+	@Column(name = "in_code")
+	private String code;
+
+	/**
+	 * 单据归属日期
+	 */
+	@Column(name = "in_date")
+	private Date date;
+
+	/**
+	 * 录入人
+	 */
+	@Column(name = "in_recorder")
+	private String recorder;
+
+	/**
+	 * 审核人
+	 */
+	@Column(name = "in_auditor")
+	private String auditor;
+
+	/**
+	 * 报价截止日期
+	 */
+	@Column(name = "in_enddate")
+	private Date endDate;
+
+	/**
+	 * 备注
+	 */
+	@Column(name = "in_remark")
+	private String remark;
+
+	/**
+	 * 环保要求
+	 */
+	@Column(name = "in_environment")
+	private String environment;
+
+	/**
+	 * 价格类型
+	 */
+	@Column(name = "in_pricetype")
+	private String priceType;
+
+	/**
+	 * 询价明细
+	 */
+	@OneToMany(mappedBy = "inquiry", cascade = { CascadeType.REFRESH, CascadeType.PERSIST, CascadeType.REMOVE,
+			CascadeType.MERGE }, fetch = FetchType.EAGER)
+	@OrderBy("number")
+	private Set<PublicInquiryItem> inquiryItems;
+
+	/**
+	 * 来源系统单据ID
+	 */
+	@Column(name = "in_sourceid")
+	private Long sourceId;
+
+	/**
+	 * 附件
+	 */
+	@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
+	@JoinTable(name = "publicinquiry$attach", joinColumns = @JoinColumn(name = "in_id", referencedColumnName = "in_id"), inverseJoinColumns = @JoinColumn(name="at_id", referencedColumnName = "at_id"))
+	private Set<Attach> attachs;
+
+	/**
+	 * 客户已提交
+	 */
+	@Column(name = "in_checked")
+	private Short check;
+
+	/**
+	 * 是否过期
+	 */
+	@Column(name = "in_overdue", insertable = false, updatable = false)
+	private Short overdue;
+
+	/**
+	 * 是否公开<br>
+	 * 1、 公共<br>
+	 * 0、 不用开
+	 */
+	@Column(name = "in_isopen")
+	private Short isOpen;
+
+	/**
+	 * 应用来源,主要是为了平台公共询价做处理
+	 */
+	@Column(name = "in_sourceapp")
+	private String sourceApp;
+
+	/**
+	 * 收货地址
+	 */
+	@Column(name = "in_ship")
+	private String ship;
+
+	/**
+	 * 是否开票<br>
+	 * 1. 是<br>
+	 * 0. 否
+	 */
+	@Column(name = "in_invoice")
+	private Short invoice;
+
+	/**
+	 * 询价类型
+	 */
+	@Column(name = "in_inquirytype")
+	private String inquirytype;
+
+	/**
+	 * 询价种类(公共或其他)
+	 */
+	@Column(name = "in_kind")
+	private String kind;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public String getPriceType() {
+		return priceType;
+	}
+
+	public void setPriceType(String priceType) {
+		this.priceType = priceType;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public Date getDate() {
+		return date;
+	}
+
+	public void setDate(Date date) {
+		this.date = date;
+	}
+
+	public String getRecorder() {
+		return recorder;
+	}
+
+	public void setRecorder(String recorder) {
+		this.recorder = recorder;
+	}
+
+	public String getAuditor() {
+		return auditor;
+	}
+
+	public void setAuditor(String auditor) {
+		this.auditor = auditor;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public Long getEnUU() {
+		return enUU;
+	}
+
+	public void setEnUU(Long enUU) {
+		this.enUU = enUU;
+	}
+
+	public Long getRecorderUU() {
+		return recorderUU;
+	}
+
+	public void setRecorderUU(Long recorderUU) {
+		this.recorderUU = recorderUU;
+	}
+
+	public Long getSourceId() {
+		return sourceId;
+	}
+
+	public void setSourceId(Long sourceId) {
+		this.sourceId = sourceId;
+	}
+
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public Set<PublicInquiryItem> getInquiryItems() {
+		return inquiryItems;
+	}
+
+	public void setInquiryItems(Set<PublicInquiryItem> inquiryItems) {
+		this.inquiryItems = inquiryItems;
+	}
+
+	public Set<Attach> getAttachs() {
+		return attachs;
+	}
+
+	public void setAttachs(Set<Attach> attachs) {
+		this.attachs = attachs;
+	}
+
+	public String getEnvironment() {
+		return environment;
+	}
+
+	public void setEnvironment(String environment) {
+		this.environment = environment;
+	}
+
+	public Short getCheck() {
+		return check;
+	}
+
+	public void setCheck(Short check) {
+		this.check = check;
+	}
+
+	public Short getOverdue() {
+		return overdue;
+	}
+
+	public void setOverdue(Short overdue) {
+		this.overdue = overdue;
+	}
+
+	public Short getIsOpen() {
+		return isOpen;
+	}
+
+	public void setIsOpen(Short isOpen) {
+		this.isOpen = isOpen;
+	}
+
+	public String getSourceApp() {
+		return sourceApp;
+	}
+
+	public void setSourceApp(String sourceApp) {
+		this.sourceApp = sourceApp;
+	}
+
+	public String getShip() {
+		return ship;
+	}
+
+	public void setShip(String ship) {
+		this.ship = ship;
+	}
+
+	public Short getInvoice() {
+		return invoice;
+	}
+
+	public void setInvoice(Short invoice) {
+		this.invoice = invoice;
+	}
+
+	public String getInquirytype() {
+		return inquirytype;
+	}
+
+	public void setInquirytype(String inquirytype) {
+		this.inquirytype = inquirytype;
+	}
+
+	public String getKind() {
+		return kind;
+	}
+
+	public void setKind(String kind) {
+		this.kind = kind;
+	}
+}

+ 686 - 0
src/main/java/com/uas/ps/inquiry/model/PublicInquiryItem.java

@@ -0,0 +1,686 @@
+package com.uas.ps.inquiry.model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.uas.ps.entity.Status;
+import com.uas.ps.inquiry.entity.Constant;
+import com.uas.ps.inquiry.util.DateUtils;
+import org.springframework.util.CollectionUtils;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * 公共询价单转报价后的询价单明细
+ *
+ * @author hejq 2018-01-06
+ */
+@Table(name = "public$inquiryitems")
+@Entity
+public class PublicInquiryItem implements Serializable {
+
+    /**
+     * default serialVersionUID
+     */
+    private static final long serialVersionUID = 1L;
+
+	/**
+	 * id
+	 */
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name = "id_id")
+	private Long id;
+
+	/**
+	 * 来源(买家ERP采购询价明细)的ID
+	 */
+	@Column(name = "id_sourceid", updatable = false)
+	private Long sourceId;
+
+	/**
+	 * 序号
+	 */
+	@Column(name = "id_number")
+	private Short number;
+
+	/**
+	 * 询价单
+	 */
+	@ManyToOne(cascade = CascadeType.ALL, optional = true)
+	@JoinColumn(name = "id_inid", nullable = false)
+	private PublicInquiry inquiry;
+
+	/**
+	 * 买家采购员UU
+	 */
+	@Column(name = "id_useruu")
+	private Long userUU;
+
+    /**
+     * 产品id
+     */
+	@Column(name = "id_prid")
+	private Long productId;
+
+    /**
+     * 物料编号,物料表加载不出来,这里用code去处理
+     */
+    @Column(name = "id_prcode")
+    private String prcode;
+
+	/**
+	 * 币种
+	 */
+	@Column(name = "id_currency")
+	private String currency;
+
+	/**
+	 * 税率
+	 */
+	@Column(name = "id_taxrate")
+	private Float taxrate;
+
+	/**
+	 * 备注
+	 */
+	@Column(name = "id_remark")
+	private String remark;
+
+	/**
+	 * 供应商UU
+	 */
+	@Column(name = "id_venduu")
+	private Long vendUU;
+
+	/**
+	 * 供应商联系人UU
+	 */
+	@Column(name = "id_venduseruu")
+	private Long vendUserUU;
+
+	/**
+	 * (买家预先提供的)有效期始
+	 */
+	@Column(name = "id_fromdate")
+	private Date fromDate;
+
+	/**
+	 * (买家预先提供的)有效期止
+	 */
+	@Column(name = "id_todate")
+	private Date toDate;
+
+	/**
+	 * (卖家报的)有效期始
+	 */
+	@Column(name = "id_vendfromdate")
+	private Date vendFromDate;
+
+	/**
+	 * (卖家报的)有效期止
+	 */
+	@Column(name = "id_vendtodate")
+	private Date vendToDate;
+
+	/**
+	 * (卖家报的)最小订购量
+	 */
+	@Column(name = "id_minorderqty")
+	private Double minOrderQty;
+
+	/**
+	 * (卖家报的)最小包装量
+	 */
+	@Column(name = "id_minpackqty")
+	private Double minPackQty;
+
+	/**
+	 * (卖家报的)物料品牌
+	 */
+	@Column(name = "id_brand")
+	private String brand;
+
+	/**
+	 * (卖家报的)供应商物料编号
+	 */
+	@Column(name = "id_vendorprodcode")
+	private String vendorprodcode;
+
+	/**
+	 * (卖家报的)交货周期(天数)
+	 */
+	@Column(name = "id_leadtime")
+	private Long leadtime;
+
+	/**
+	 * 分段报价明细
+	 */
+	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
+	@JoinColumn(name = "ir_idid")
+	@OrderBy("lapQty")
+	private Set<PublicInquiryReply> replies;
+
+	/**
+	 * {未回复、已回复}
+	 */
+	@Column(name = "id_status")
+	private Short status;
+
+	/**
+	 * (针对卖家的)询价传输状态{待上传、已下载}
+	 */
+	@Column(name = "id_sendstatus")
+	private Short sendStatus;
+
+	/**
+	 * (针对买家的)报价信息传输状态{待上传、已下载}
+	 */
+	@Column(name = "id_backstatus")
+	private Short backStatus;
+
+	/**
+	 * (针对卖家的)报价信息传输状态{待上传、已下载}
+	 */
+	@Column(name = "id_replysendstatus")
+	private Short replySendStatus;
+
+	/**
+	 * 是否采纳
+	 */
+	@Column(name = "id_agreed")
+	private Short agreed;
+
+	/**
+	 * (针对卖家的)是否采纳信息传输状态{待上传、已下载}
+	 */
+	@Column(name = "id_decidestatus")
+	private Short decideStatus;
+
+	/**
+	 * (针对卖家的)作废信息传输状态{待上传、已下载}
+	 */
+	@Column(name = "id_invalidstatus")
+	private Short invalidStatus;
+
+	/**
+	 * 是否买家已设置分段数
+	 */
+	@Column(name = "id_custlap")
+	private Short custLap;
+
+	/**
+	 * 保存erp传入数据的时间
+	 * 
+	 * @return
+	 */
+	@Column(name = "id_erpdate")
+	private Date erpDate;
+
+	/**
+	 * 录入时间(取主表日期字段)
+	 *
+	 * @return
+	 */
+	@Column(name = "id_date", insertable = false, updatable = false)
+	private Date date;
+
+	/**
+	 * search项目进行单据是否已过期时实际根据主表中enddate与当前时间的比较获取,但是数据库无字段会报“标识符无效”的错误
+	 * 所以建立此字段,但是此字段不会赋值。
+	 *   在建立索引时,overdue的值加入到了invalid(已失效)的判断条件中,所以此字段的值无实际意义,
+	 *   UAS询价单提交或反提交时,更新此字段,来使询价单明细更新触发器生效,更新询价单明细索引,
+	 *   才能使未过期未报价已提交单据进入失效列表,未过期未报价反提交单据从已失效列表回到待报价列表。
+	 *
+	 *   (1为已提交, 0为被反提交, null为未提交)
+	 */
+	@Column(name = "id_overdue", insertable = false, updatable = false)
+	private Short overdue;
+
+	/**
+	 * 报价是否已过期  根据vendToDate与当前时间的比较获取,但是数据库无字段会报“标识符无效”的错误
+	 * 所以建立此字段,此字段在视图中赋值。
+	 *
+	 */
+	@Column(name = "id_invalid", insertable = false, updatable = false)
+	private Short invalid;
+
+	/**
+	 * 应用来源ERP、B2B
+	 */
+	@Column(name = "id_sourceapp")
+	private String sourceApp;
+
+	/**
+	 * 报价附件
+	 */
+	@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
+	@JoinTable(name = "public$inquiryitems$attach", joinColumns = @JoinColumn(name = "id_id", referencedColumnName = "id_id"), inverseJoinColumns = @JoinColumn(name="at_id", referencedColumnName = "at_id"))
+	private Set<Attach> attaches;
+
+	/**
+	 * 需求数量
+	 */
+	@Column(name = "id_needquantity")
+	private Double needquantity;
+
+    /**
+     * erp传输状态
+     *
+     * <pre>erp发出数据传输请求时,赋给状态,完成后更新状态</pre>
+     *
+     * 1、 传输完成<br>
+     * 0、 正在传输
+     *
+     */
+	@Column(name = "id_erpstatus")
+    private Short erpstatus;
+
+	/**
+	 * 询价种类
+	 */
+	@Column(name = "id_kind")
+	private String kind;
+
+	/*这下面是供应商报价时存的相关信息;
+	* 因为存在非客户报价,而且公共服务里面没有企业信息,现存入相关字段,后续处理*/
+	/**
+	 * 供应商名称
+	 */
+	@Column(name = "id_vend_name")
+	private String vendName;
+
+	/**
+	 * 供应商营业执照
+	 */
+	@Column(name = "id_vend_businesscode")
+	private String businessCode;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public Long getSourceId() {
+		return sourceId;
+	}
+
+	public void setSourceId(Long sourceId) {
+		this.sourceId = sourceId;
+	}
+
+	public Short getNumber() {
+		return number;
+	}
+
+	public void setNumber(Short number) {
+		this.number = number;
+	}
+
+	public PublicInquiry getInquiry() {
+		return inquiry;
+	}
+
+	public void setInquiry(PublicInquiry inquiry) {
+		this.inquiry = inquiry;
+	}
+
+	public Long getProductId() {
+		return productId;
+	}
+
+	public void setProductId(Long productId) {
+		this.productId = productId;
+	}
+
+    public String getPrcode() {
+        return prcode;
+    }
+
+    public void setPrcode(String prcode) {
+        this.prcode = prcode;
+    }
+
+    public String getCurrency() {
+		return currency;
+	}
+
+	public void setCurrency(String currency) {
+		this.currency = currency;
+	}
+
+	public Float getTaxrate() {
+		return taxrate;
+	}
+
+	public void setTaxrate(Float taxrate) {
+		this.taxrate = taxrate;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public Date getFromDate() {
+		return fromDate;
+	}
+
+	public void setFromDate(Date fromDate) {
+		this.fromDate = fromDate;
+	}
+
+	public Date getToDate() {
+		return toDate;
+	}
+
+	public void setToDate(Date toDate) {
+		this.toDate = toDate;
+	}
+
+	public Date getVendFromDate() {
+		return vendFromDate;
+	}
+
+	public void setVendFromDate(Date vendFromDate) {
+		this.vendFromDate = vendFromDate;
+	}
+
+	public Date getVendToDate() {
+		return vendToDate;
+	}
+
+	public void setVendToDate(Date vendToDate) {
+		this.vendToDate = vendToDate;
+	}
+
+	public Long getVendUU() {
+		return vendUU;
+	}
+
+	public void setVendUU(Long vendUU) {
+		this.vendUU = vendUU;
+	}
+
+	public Set<PublicInquiryReply> getReplies() {
+		return replies;
+	}
+
+	public void setReplies(Set<PublicInquiryReply> replies) {
+		this.replies = replies;
+	}
+
+	public Long getVendUserUU() {
+		return vendUserUU;
+	}
+
+	public void setVendUserUU(Long vendUserUU) {
+		this.vendUserUU = vendUserUU;
+	}
+
+	public Short getAgreed() {
+		return agreed;
+	}
+
+	public void setAgreed(Short agreed) {
+		this.agreed = agreed;
+	}
+
+	public Short getStatus() {
+		return status;
+	}
+
+	public void setStatus(Short status) {
+		this.status = status;
+	}
+
+	public Short getSendStatus() {
+		return sendStatus;
+	}
+
+	public void setSendStatus(Short sendStatus) {
+		this.sendStatus = sendStatus;
+	}
+
+	public Double getMinOrderQty() {
+		return minOrderQty;
+	}
+
+	public void setMinOrderQty(Double minOrderQty) {
+		this.minOrderQty = minOrderQty;
+	}
+
+	public Double getMinPackQty() {
+		return minPackQty;
+	}
+
+	public void setMinPackQty(Double minPackQty) {
+		this.minPackQty = minPackQty;
+	}
+
+	public Short getBackStatus() {
+		return backStatus;
+	}
+
+	public void setBackStatus(Short backStatus) {
+		this.backStatus = backStatus;
+	}
+
+	public Short getReplySendStatus() {
+		return replySendStatus;
+	}
+
+	public void setReplySendStatus(Short replySendStatus) {
+		this.replySendStatus = replySendStatus;
+	}
+
+	public Short getDecideStatus() {
+		return decideStatus;
+	}
+
+	public void setDecideStatus(Short decideStatus) {
+		this.decideStatus = decideStatus;
+	}
+
+	public Short getCustLap() {
+		return custLap;
+	}
+
+	public void setCustLap(Short custLap) {
+		this.custLap = custLap;
+	}
+
+	public Long getUserUU() {
+		return userUU;
+	}
+
+	public void setUserUU(Long userUU) {
+		this.userUU = userUU;
+	}
+
+	public String getBrand() {
+		return brand;
+	}
+
+	public void setBrand(String brand) {
+		this.brand = brand;
+	}
+
+	public String getVendorprodcode() {
+		return vendorprodcode;
+	}
+
+	public void setVendorprodcode(String vendorprodcode) {
+		this.vendorprodcode = vendorprodcode;
+	}
+
+	public Long getLeadtime() {
+		return leadtime;
+	}
+
+	public void setLeadtime(Long leadtime) {
+		this.leadtime = leadtime;
+	}
+
+	public Date getErpDate() {
+		return erpDate;
+	}
+
+	public void setErpDate(Date erpDate) {
+		this.erpDate = erpDate;
+	}
+
+	public Date getDate() {
+		return date;
+	}
+
+	public void setDate(Date date) {
+		this.date = date;
+	}
+
+	public String getSourceApp() {
+		return sourceApp;
+	}
+
+	public void setSourceApp(String sourceApp) {
+		this.sourceApp = sourceApp;
+	}
+
+	public Short getInvalidStatus() {
+		return invalidStatus;
+	}
+
+	public void setInvalidStatus(Short invalidStatus) {
+		this.invalidStatus = invalidStatus;
+	}
+
+	public Set<Attach> getAttaches() {
+		return attaches;
+	}
+
+	public void setAttaches(Set<Attach> attaches) {
+		this.attaches = attaches;
+	}
+
+	public Double getNeedquantity() {
+		return needquantity;
+	}
+
+	public void setNeedquantity(Double needquantity) {
+		this.needquantity = needquantity;
+	}
+
+	public Short getOverdue() {
+		return overdue;
+	}
+
+	public void setOverdue(Short overdue) {
+		this.overdue = overdue;
+	}
+
+	public Short getInvalid() {
+		return invalid;
+	}
+
+	public void setInvalid(Short invalid) {
+		this.invalid = invalid;
+	}
+
+    public Short getErpstatus() {
+        return erpstatus;
+    }
+
+    public void setErpstatus(Short erpstatus) {
+
+	    this.erpstatus = erpstatus ;
+    }
+
+	public String getKind() {
+		return kind;
+	}
+
+	public void setKind(String kind) {
+		this.kind = kind;
+	}
+
+	public String getVendName() {
+		return vendName;
+	}
+
+	public void setVendName(String vendName) {
+		this.vendName = vendName;
+	}
+
+	public String getBusinessCode() {
+		return businessCode;
+	}
+
+	public void setBusinessCode(String businessCode) {
+		this.businessCode = businessCode;
+	}
+
+	/**
+	 * 回复记录的描述
+	 * 
+	 * @return
+	 */
+	public String replyDescription() {
+		if (!CollectionUtils.isEmpty(this.replies)) {
+			StringBuffer sb = new StringBuffer();
+			for (PublicInquiryReply reply : this.replies)
+				sb.append("分段数:").append(reply.getLapQty()).append(",").append("价格:").append(reply.getPrice())
+						.append(";");
+			return sb.toString();
+		}
+		return null;
+	}
+
+	/**
+	 * 是否可报价
+	 * <p>
+	 * 1.未报价,未截止报价
+	 * </p>
+	 * <p>
+	 * 2.已报价,未截止报价,客户未提交
+	 * </p>
+	 * 
+	 * @return
+	 */
+	public boolean isReplyable() {
+	    if(this.erpstatus == null) {
+	        this.erpstatus = Constant.YES;
+        }
+		if (this.inquiry.getEndDate() != null) {
+			return DateUtils
+					.compare(this.inquiry.getEndDate(), new Date(),
+							DateUtils.COMPARE_DAY) >= 0
+					&& (this.status == Status.NOT_REPLY.value() || (this.status == Status.REPLIED.value()
+							&& (this.inquiry.getCheck() == null || this.inquiry.getCheck() != Constant.YES)
+							&& this.agreed == null) && this.erpstatus != Constant.NO);
+		}
+		return this.status == Status.NOT_REPLY.value() || (this.status == Status.REPLIED.value()
+				&& (this.inquiry.getCheck() == null || this.inquiry.getCheck() != Constant.YES)
+				&& this.agreed == null) && this.erpstatus != Constant.NO;
+	}
+
+    public static List<PublicInquiry> distinct(List<PublicInquiryItem> purcitems) {
+		List<PublicInquiry> inquiries = new ArrayList<>();
+		Set<Long> keys = new HashSet<>();
+		for (PublicInquiryItem item : purcitems) {
+			if (!keys.contains(item.getInquiry().getId())) {
+				inquiries.add(item.getInquiry());
+				keys.add(item.getInquiry().getId());
+			}
+		}
+		return inquiries;
+    }
+}

+ 63 - 0
src/main/java/com/uas/ps/inquiry/model/PublicInquiryReply.java

@@ -0,0 +1,63 @@
+package com.uas.ps.inquiry.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 公共询价单报价明细
+ * @author hejq 2018-01-06
+ */
+@Table(name = "public$inquiryreply")
+@Entity
+public class PublicInquiryReply implements Serializable {
+
+	/**
+	 * 序列
+	 */
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * id
+	 */
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name = "ir_id")
+	private Long id;
+
+	/**
+	 * (买家或卖家定义的)分段数量
+	 */
+	@Column(name = "ir_lapqty")
+	private Double lapQty;
+
+	/**
+	 * (卖家报的)单价
+	 */
+	@Column(name = "ir_price")
+	private Double price;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Double getLapQty() {
+		return lapQty;
+	}
+
+	public void setLapQty(Double lapQty) {
+		this.lapQty = lapQty;
+	}
+
+	public Double getPrice() {
+		return price;
+	}
+
+	public void setPrice(Double price) {
+		this.price = price;
+	}
+
+}

+ 377 - 0
src/main/java/com/uas/ps/inquiry/model/PurcInquiry.java

@@ -0,0 +1,377 @@
+package com.uas.ps.inquiry.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
+
+/**
+ * 公共库新增的询价信息表中间表
+ *
+ * Created by hejq on 2018-01-13.
+ */
+@Entity
+@Table(name = "purc$puinquiry")
+public class PurcInquiry implements Serializable {
+
+    /**
+     * default serialVersionUID
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "in_id")
+    private Long id;
+
+    /**
+     * 询价单所属企业UU
+     */
+    @Column(name = "in_enuu")
+    private Long enUU;
+
+    /**
+     * 询价单所属用户UU
+     */
+    @Column(name = "in_recorderuu")
+    private Long recorderUU;
+
+    /**
+     * 流水号
+     */
+    @Column(name = "in_code")
+    private String code;
+
+    /**
+     * 单据归属日期
+     */
+    @Column(name = "in_date")
+    private Date date;
+
+    /**
+     * 录入人
+     */
+    @Column(name = "in_recorder")
+    private String recorder;
+
+    /**
+     * 审核人
+     */
+    @Column(name = "in_auditor")
+    private String auditor;
+
+    /**
+     * 报价截止日期
+     */
+    @Column(name = "in_enddate")
+    private Date endDate;
+
+    /**
+     * 备注
+     */
+    @Column(name = "in_remark")
+    private String remark;
+
+    /**
+     * 环保要求
+     */
+    @Column(name = "in_environment")
+    private String environment;
+
+    /**
+     * 价格类型
+     */
+    @Column(name = "in_pricetype")
+    private String priceType;
+
+    /**
+     * 询价明细
+     */
+    @OneToMany(mappedBy = "inquiry", cascade = { CascadeType.REFRESH }, fetch = FetchType.EAGER)
+    @OrderBy("number")
+    private Set<PurcInquiryItem> inquiryItems;
+
+    /**
+     * 附件
+     */
+    @OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
+    @JoinTable(name = "purc$puinquiryattach", joinColumns = @JoinColumn(name = "in_id", referencedColumnName = "in_id") , inverseJoinColumns = @JoinColumn(name = "at_id", referencedColumnName = "at_id") )
+    private Set<Attach> attachs;
+
+    /**
+     * 采纳结果
+     */
+    @Column(name = "in_checked")
+    private Short check;
+
+    /**
+     * 单据状态(已提交、在录入)
+     */
+    @Column(name = "in_enterystatus")
+    private Integer enteryStatus;
+
+    /**
+     * 是否过期
+     */
+    @Column(name = "in_overdue", insertable = false, updatable = false)
+    private Short overdue;
+
+    /**
+     * 是否公开
+     */
+    @Column(name = "in_isopen")
+    private Short isOpen;
+
+    /**
+     * 收货地址
+     */
+    @Column(name = "in_ship")
+    private String ship;
+
+    /**
+     * 是否开票<br>
+     * 1. 是<br>
+     * 0. 否
+     */
+    @Column(name = "in_invoice")
+    private Short invoice;
+
+    /**
+     * 是否含税
+     */
+    @Column(name = "in_iftax")
+    private Short ifTax;
+
+    /**
+     * 币别
+     */
+    @Column(name = "in_currency")
+    private String currency;
+
+    /**
+     * 询价类型
+     */
+    @Column(name = "in_inquirytype")
+    private String inquirytype;
+
+    /**
+     * 应用来源
+     */
+    @Column(name = "in_sourceapp")
+    private String sourceapp;
+
+    /**
+     * 如果从erp传过来的,记录id
+     */
+    @Column(name = "in_erpid")
+    private Long erpid;
+
+    /**
+     * erp传过来的记录时间
+     */
+    @Column(name = "in_erpdate")
+    private  Date erpdate;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getEnUU() {
+        return enUU;
+    }
+
+    public void setEnUU(Long enUU) {
+        this.enUU = enUU;
+    }
+
+    public Long getRecorderUU() {
+        return recorderUU;
+    }
+
+    public void setRecorderUU(Long recorderUU) {
+        this.recorderUU = recorderUU;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+    public String getRecorder() {
+        return recorder;
+    }
+
+    public void setRecorder(String recorder) {
+        this.recorder = recorder;
+    }
+
+    public String getAuditor() {
+        return auditor;
+    }
+
+    public void setAuditor(String auditor) {
+        this.auditor = auditor;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getEnvironment() {
+        return environment;
+    }
+
+    public void setEnvironment(String environment) {
+        this.environment = environment;
+    }
+
+    public String getPriceType() {
+        return priceType;
+    }
+
+    public void setPriceType(String priceType) {
+        this.priceType = priceType;
+    }
+
+    public Set<PurcInquiryItem> getInquiryItems() {
+        return inquiryItems;
+    }
+
+    public void setInquiryItems(Set<PurcInquiryItem> inquiryItems) {
+        this.inquiryItems = inquiryItems;
+    }
+
+    public Set<Attach> getAttachs() {
+        return attachs;
+    }
+
+    public void setAttachs(Set<Attach> attachs) {
+        this.attachs = attachs;
+    }
+
+    public Short getCheck() {
+        return check;
+    }
+
+    public void setCheck(Short check) {
+        this.check = check;
+    }
+
+    public Integer getEnteryStatus() {
+        return enteryStatus;
+    }
+
+    public void setEnteryStatus(Integer enteryStatus) {
+        this.enteryStatus = enteryStatus;
+    }
+
+    public Short getOverdue() {
+        return overdue;
+    }
+
+    public void setOverdue(Short overdue) {
+        this.overdue = overdue;
+    }
+
+    public Short getIsOpen() {
+        return isOpen;
+    }
+
+    public void setIsOpen(Short isOpen) {
+        this.isOpen = isOpen;
+    }
+
+    public String getShip() {
+        return ship;
+    }
+
+    public void setShip(String ship) {
+        this.ship = ship;
+    }
+
+    public Short getInvoice() {
+        return invoice;
+    }
+
+    public void setInvoice(Short invoice) {
+        this.invoice = invoice;
+    }
+
+    public Short getIfTax() {
+        return ifTax;
+    }
+
+    public void setIfTax(Short ifTax) {
+        this.ifTax = ifTax;
+    }
+
+    public String getCurrency() {
+        return currency;
+    }
+
+    public void setCurrency(String currency) {
+        this.currency = currency;
+    }
+
+    public String getInquirytype() {
+        return inquirytype;
+    }
+
+    public void setInquirytype(String inquirytype) {
+        this.inquirytype = inquirytype;
+    }
+
+    public String getSourceapp() {
+        return sourceapp;
+    }
+
+    public void setSourceapp(String sourceapp) {
+        this.sourceapp = sourceapp;
+    }
+
+    public Long getErpid() {
+        return erpid;
+    }
+
+    public void setErpid(Long erpid) {
+        this.erpid = erpid;
+    }
+
+    public Date getErpdate() {
+        return erpdate;
+    }
+
+    public void setErpdate(Date erpdate) {
+        this.erpdate = erpdate;
+    }
+}

+ 549 - 0
src/main/java/com/uas/ps/inquiry/model/PurcInquiryItem.java

@@ -0,0 +1,549 @@
+package com.uas.ps.inquiry.model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.uas.ps.entity.Product;
+
+import javax.persistence.*;
+import java.util.*;
+
+/**
+ * 平台新增询价单明细
+ * 
+ * @author hejq
+ * @date 2018-01-13 19:19
+ */
+@Entity
+@Table(name = "purc$puinquiryitems")
+public class PurcInquiryItem {
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name = "id_id")
+	private Long id;
+
+	/**
+	 * 序号
+	 */
+	@Column(name = "id_number")
+	private Short number;
+
+	/**
+	 * 询价单
+	 */
+	@ManyToOne(cascade = CascadeType.ALL, optional = true)
+	@JoinColumn(name = "id_inid", nullable = false)
+	private PurcInquiry inquiry;
+
+	/**
+	 * 买家采购员UU
+	 */
+	@Column(name = "id_useruu")
+	private Long userUU;
+
+	/**
+	 * 产品id
+	 */
+	@Column(name = "id_prid")
+	private Long productId;
+
+
+	/**
+	 * ************* 上传的物料信息,因为可能是手动输入的,物料款不存在,需要先进行保存物料 *************
+	 */
+	/**
+	 * 物料编号
+	 */
+	@Column(name = "id_prodcode")
+	private String prodCode;
+
+	/**
+	 * 名称
+	 */
+	@Column(name = "id_prodtitle")
+	private String prodTitle;
+
+	/**
+	 * 规格
+	 */
+	@Column(name = "id_prodspec")
+	private String spec;
+
+	/**
+	 * 单位
+	 */
+	@Column(name = "id_unit")
+	private String unit;
+
+	/**
+	 * 型号
+	 */
+	@Column(name = "id_cmpcode")
+	private String cmpCode;
+
+	/**
+	 * 品牌
+	 */
+	@Column(name = "id_inbrand")
+	private String inbrand;
+	/**
+	 * ******end*******
+	 */
+
+	/**
+	 * 币种
+	 */
+	@Column(name = "id_currency")
+	private String currency;
+
+	/**
+	 * 税率
+	 */
+	@Column(name = "id_taxrate")
+	private Float taxrate;
+
+	/**
+	 * 备注
+	 */
+	@Column(name = "id_remark")
+	private String remark;
+
+	/**
+	 * 供应商UU
+	 */
+	@Column(name = "id_venduu")
+	private Long vendUU;
+
+	/**
+	 * 供应商联系人UU
+	 */
+	@Column(name = "id_venduseruu")
+	private Long vendUserUU;
+
+	/**
+	 * (买家预先提供的)有效期始
+	 */
+	@Column(name = "id_fromdate")
+	private Date fromDate;
+
+	/**
+	 * (买家预先提供的)有效期止
+	 */
+	@Column(name = "id_todate")
+	private Date toDate;
+
+	/**
+	 * (卖家报的)有效期始
+	 */
+	@Column(name = "id_vendfromdate")
+	private Date vendFromDate;
+
+	/**
+	 * (卖家报的)有效期止
+	 */
+	@Column(name = "id_vendtodate")
+	private Date vendToDate;
+
+	/**
+	 * (卖家报的)最小订购量
+	 */
+	@Column(name = "id_minorderqty")
+	private Double minOrderQty;
+
+	/**
+	 * (卖家报的)最小包装量
+	 */
+	@Column(name = "id_minpackqty")
+	private Double minPackQty;
+
+	/**
+	 * (卖家报的)物料品牌
+	 */
+	@Column(name = "id_brand")
+	private String brand;
+
+	/**
+	 * (卖家报的)供应商物料编号
+	 */
+	@Column(name = "id_vendorprodcode")
+	private String vendorprodcode;
+
+	/**
+	 * (卖家报的)交货周期(天数)
+	 */
+	@Column(name = "id_leadtime")
+	private Long leadtime;
+
+	/**
+	 * 分段报价明细
+	 */
+	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
+	@JoinColumn(name = "ir_idid")
+	@OrderBy("lapQty")
+	private Set<PurchaseInquiryReply> replies;
+
+	/**
+	 * {未回复、已回复}
+	 */
+	@Column(name = "id_status")
+	private Short status;
+
+	/**
+	 * 是否采纳
+	 */
+	@Column(name = "id_agreed")
+	private Short agreed;
+
+	/**
+	 * 是否买家已设置分段数
+	 */
+	@Column(name = "id_custlap")
+	private Short custLap;
+
+	/**
+	 * search项目进行是否已过期时实际根据主表中enddate与当前时间的比较获取,但是数据库无字段会报“标识符无效”的错误
+	 * 所以建立此字段,但是此字段不会赋值。
+	 * 
+	 * @return
+	 */
+	@Column(name = "id_overdue")
+	private Short overdue;
+
+	/**
+	 * 来源ERP或B2B
+	 */
+	@Column(name = "id_source")
+	private String source;
+
+	/**
+	 * 是否公开
+	 */
+	@Column(name = "id_isopen")
+	private Short isOpen;
+
+	/**
+	 * 需求数量
+	 */
+	@Column(name = "id_needquantity")
+	private Double needquantity;
+
+	/**
+	 * 来源id,可能是ERP同步过来的单据
+	 */
+	@Column(name = "id_sourceid")
+	private Long sourceid;
+
+    /**
+     * 单据日期,索引过滤需要
+     */
+	@Column(name = "id_date")
+    private Date date;
+
+	/**
+	 * 企业uu,公共询价需要这个字段做标识
+	 */
+	@Transient
+	private Long enuu;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Short getNumber() {
+		return number;
+	}
+
+	public void setNumber(Short number) {
+		this.number = number;
+	}
+
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public PurcInquiry getInquiry() {
+		return inquiry;
+	}
+
+	public void setInquiry(PurcInquiry inquiry) {
+		this.inquiry = inquiry;
+	}
+
+	public Long getUserUU() {
+		return userUU;
+	}
+
+	public void setUserUU(Long userUU) {
+		this.userUU = userUU;
+	}
+
+	public Long getProductId() {
+		return productId;
+	}
+
+	public void setProductId(Long productId) {
+		this.productId = productId;
+	}
+
+	public String getCurrency() {
+		return currency;
+	}
+
+	public void setCurrency(String currency) {
+		this.currency = currency;
+	}
+
+	public Float getTaxrate() {
+		return taxrate;
+	}
+
+	public void setTaxrate(Float taxrate) {
+		this.taxrate = taxrate;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public Long getVendUU() {
+		return vendUU;
+	}
+
+	public void setVendUU(Long vendUU) {
+		this.vendUU = vendUU;
+	}
+
+	public Long getVendUserUU() {
+		return vendUserUU;
+	}
+
+	public void setVendUserUU(Long vendUserUU) {
+		this.vendUserUU = vendUserUU;
+	}
+
+	public Date getFromDate() {
+		return fromDate;
+	}
+
+	public void setFromDate(Date fromDate) {
+		this.fromDate = fromDate;
+	}
+
+	public Date getToDate() {
+		return toDate;
+	}
+
+	public void setToDate(Date toDate) {
+		this.toDate = toDate;
+	}
+
+	public Date getVendFromDate() {
+		return vendFromDate;
+	}
+
+	public void setVendFromDate(Date vendFromDate) {
+		this.vendFromDate = vendFromDate;
+	}
+
+	public Date getVendToDate() {
+		return vendToDate;
+	}
+
+	public void setVendToDate(Date vendToDate) {
+		this.vendToDate = vendToDate;
+	}
+
+	public Double getMinOrderQty() {
+		return minOrderQty;
+	}
+
+	public void setMinOrderQty(Double minOrderQty) {
+		this.minOrderQty = minOrderQty;
+	}
+
+	public Double getMinPackQty() {
+		return minPackQty;
+	}
+
+	public void setMinPackQty(Double minPackQty) {
+		this.minPackQty = minPackQty;
+	}
+
+	public String getBrand() {
+		return brand;
+	}
+
+	public void setBrand(String brand) {
+		this.brand = brand;
+	}
+
+	public String getVendorprodcode() {
+		return vendorprodcode;
+	}
+
+	public void setVendorprodcode(String vendorprodcode) {
+		this.vendorprodcode = vendorprodcode;
+	}
+
+	public Long getLeadtime() {
+		return leadtime;
+	}
+
+	public void setLeadtime(Long leadtime) {
+		this.leadtime = leadtime;
+	}
+
+	public Set<PurchaseInquiryReply> getReplies() {
+		return replies;
+	}
+
+	public void setReplies(Set<PurchaseInquiryReply> replies) {
+		this.replies = replies;
+	}
+
+	public Short getStatus() {
+		return status;
+	}
+
+	public void setStatus(Short status) {
+		this.status = status;
+	}
+
+	public Short getAgreed() {
+		return agreed;
+	}
+
+	public void setAgreed(Short agreed) {
+		this.agreed = agreed;
+	}
+
+	public Short getCustLap() {
+		return custLap;
+	}
+
+	public void setCustLap(Short custLap) {
+		this.custLap = custLap;
+	}
+
+	public Short getOverdue() {
+		return overdue;
+	}
+
+	public void setOverdue(Short overdue) {
+		this.overdue = overdue;
+	}
+
+	public String getSource() {
+		return source;
+	}
+
+	public void setSource(String source) {
+		this.source = source;
+	}
+
+	public Short getIsOpen() {
+		return isOpen;
+	}
+
+	public void setIsOpen(Short isOpen) {
+		this.isOpen = isOpen;
+	}
+
+	public String getProdCode() {
+		return prodCode;
+	}
+
+	public void setProdCode(String prodCode) {
+		this.prodCode = prodCode;
+	}
+
+	public String getProdTitle() {
+		return prodTitle;
+	}
+
+	public void setProdTitle(String prodTitle) {
+		this.prodTitle = prodTitle;
+	}
+
+	public String getSpec() {
+		return spec;
+	}
+
+	public void setSpec(String spec) {
+		this.spec = spec;
+	}
+
+	public String getUnit() {
+		return unit;
+	}
+
+	public void setUnit(String unit) {
+		this.unit = unit;
+	}
+
+	public String getCmpCode() {
+		return cmpCode;
+	}
+
+	public void setCmpCode(String cmpCode) {
+		this.cmpCode = cmpCode;
+	}
+
+	public String getInbrand() {
+		return inbrand;
+	}
+
+	public void setInbrand(String inbrand) {
+		this.inbrand = inbrand;
+	}
+
+	public Double getNeedquantity() {
+		return needquantity;
+	}
+
+	public void setNeedquantity(Double needquantity) {
+		this.needquantity = needquantity;
+	}
+
+	public Long getSourceid() {
+		return sourceid;
+	}
+
+	public void setSourceid(Long sourceid) {
+		this.sourceid = sourceid;
+	}
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+	public Long getEnuu() {
+		return enuu;
+	}
+
+	public void setEnuu(Long enuu) {
+		this.enuu = enuu;
+	}
+
+	public static List<PurcInquiry> distinct(List<PurcInquiryItem> inquiryItems) {
+		List<PurcInquiry> inquiries = new ArrayList<>();
+		Set<Long> keys = new HashSet<>();
+		for (PurcInquiryItem item : inquiryItems) {
+			if (!keys.contains(item.getInquiry().getId())) {
+				inquiries.add(item.getInquiry());
+				keys.add(item.getInquiry().getId());
+			}
+		}
+		return inquiries;
+    }
+}

+ 62 - 0
src/main/java/com/uas/ps/inquiry/model/PurchaseInquiryReply.java

@@ -0,0 +1,62 @@
+package com.uas.ps.inquiry.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 采购询价单明细的报价记录
+ *
+ * @author hejq
+ * @date 2018-01-13 19:23
+ */
+@Table(name = "purc$inquiryreply")
+@Entity
+public class PurchaseInquiryReply implements Serializable {
+
+	/**
+	 * default serialVersionUID
+	 */
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name = "ir_id")
+	private Long id;
+
+	/**
+	 * (买家或卖家定义的)分段数量
+	 */
+	@Column(name = "ir_lapqty")
+	private Double lapQty;
+
+	/**
+	 * (卖家报的)单价
+	 */
+	@Column(name = "ir_price")
+	private Double price;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Double getLapQty() {
+		return lapQty;
+	}
+
+	public void setLapQty(Double lapQty) {
+		this.lapQty = lapQty;
+	}
+
+	public Double getPrice() {
+		return price;
+	}
+
+	public void setPrice(Double price) {
+		this.price = price;
+	}
+
+}

+ 5 - 0
src/main/java/com/uas/ps/inquiry/model/readme.md

@@ -0,0 +1,5 @@
+#公共询价服务的实体,关联数据库
+
+#PurcInquiry公共询价保存数据的表,这张表里面的数据不进行操作,单独列出来是因为给所有用户展示时,不带有报价信息
+
+#PublicInquiry供应商转成报价单后存储相关信息的表

+ 160 - 0
src/main/java/com/uas/ps/inquiry/service/PublicInquiryService.java

@@ -0,0 +1,160 @@
+package com.uas.ps.inquiry.service;
+
+import com.uas.ps.inquiry.entity.BatchInquiry;
+import com.uas.ps.inquiry.entity.Inquiry;
+import com.uas.ps.inquiry.entity.InquiryDecide;
+import com.uas.ps.inquiry.entity.InquiryDetail;
+import com.uas.ps.inquiry.model.FileUpload;
+import com.uas.ps.inquiry.model.PublicInquiry;
+import com.uas.ps.inquiry.model.PublicInquiryItem;
+import com.uas.ps.inquiry.model.PurcInquiry;
+import javassist.NotFoundException;
+import org.springframework.ui.ModelMap;
+
+import java.util.List;
+
+/**
+ * 公共询价接口
+ *
+ * Created by hejq on 2018-01-13.
+ */
+public interface PublicInquiryService {
+
+    /**
+     * 保存公共询价信息
+     *
+     * @author hejq
+     * @date 2018-01-14 11:45
+     * @param inquiries erp传入公共询价的信息
+     * @param enuu 询价企业UU号
+     * @param address 询价企业地址
+     */
+    void save(List<BatchInquiry> inquiries, Long enuu, String address) throws NotFoundException;
+
+    /**
+     * 保存公共询价
+     *
+     * @param inquiry
+     */
+    PurcInquiry saveInquiry(PurcInquiry inquiry);
+
+    /**
+     * 将ERP传入的inquiry信息转成平台需要的信息
+     *
+     * @author hejq
+     * @date 2018-01-14 11:45
+     * @param inquiries 将ERP传入的inquiry信息
+     * @param enuu 询价企业UU号
+     * @return
+     */
+    List<PurcInquiry> covert(List<BatchInquiry> inquiries, Long enuu, String address) throws NotFoundException;
+
+    /**
+     * erp提交审核时,平台单据禁用报价功能
+     *
+     * @author hejq
+     * @date 2018-01-14 11:45
+     * @param inquiries erp询价信息
+     * @param enuu 询价企业UU号
+     */
+    void updateStatus(List<BatchInquiry> inquiries, Long enuu);
+
+    /**
+     * 查询供应商的报价信息
+     *
+     * @param enuu 企业uu
+     * @author hejq
+     * @date 2018-01-14 11:45
+     * @return
+     */
+    List<InquiryDetail> findNotUploadReply(Long enuu);
+
+    /**
+     * 将平台的公共询价转成ERP的对应的字段
+     *
+     * @param notUploadReply 未下载的供应商报价信息
+     * @author hejq
+     * @date 2018-01-14 11:51
+     * @return
+     */
+    List<InquiryDetail> convertPublicInquiryReply(List<PublicInquiryItem> notUploadReply);
+
+    /**
+     * 下载完成后更新平台询价单明细的下载状态
+     *
+     * @param idArray 询价单明细id
+     * @author hejq
+     * @date 2018-01-14 12:12
+     */
+    void onReplyUploadSuccess(String[] idArray);
+
+    /**
+     * ERP提交公共询价单之后,更新平台状态,让平台询价单不能进行报价操作
+     *
+     * @author hejq
+     * @date 2018-01-14 12:20
+     * @param inquiries 询价信息
+     */
+    void updateInquiryStatus(List<Inquiry> inquiries);
+
+    /**
+     * ERP对报价信息的采纳状态上传到平台
+     *
+     * @author hejq
+     * @date 2018-01-14 12:24
+     * @param decides 采纳信息
+     */
+    void onReplyDecide(List<InquiryDecide> decides, Long enuu);
+
+    /**
+     * 将ERP的报价采纳信息转为平台需要的信息
+     * 
+     * @author hejq
+     * @date 2018-01-14 12:26
+     * @param decides erp报价采纳信息
+     */
+    List<PublicInquiryItem> convertInquiryDecide(List<InquiryDecide> decides);
+
+    /**
+     * 买家ERP作废询价单后,修改平台里面的状态
+     *
+     * @author hejq
+     * @date 2018-01-14 12:28
+     * @param inquiries 询价信息
+     * @param enuu 企业UU
+     */
+    void onReplyInvalid(List<Inquiry> inquiries, Long enuu);
+
+    /**
+     * 将公共询价列表转成需要报价的询价单,类型是公共询价
+     *
+     * @author hejq
+     * @date 2018-01-14 14:46
+     * @param id 询价明细id
+     * @param enuu 报价企业UU
+     * @param useruu 报价人uu
+     * @return
+     */
+    ModelMap transtoInquiry(Long id, Long enuu, Long useruu);
+
+    /**
+     * 供应商保存报价信息
+     *
+     * @author hejq
+     * @date 2018-01-14 16:43
+     * @param item 报价信息
+     * @return
+     */
+    PublicInquiryItem save(PublicInquiryItem item);
+
+    /**
+     * 保存询价信息
+     * 
+     * @author hejq
+     * @date 2018-01-15 9:16
+     * @param items 询价信息
+     * @return
+     */
+    List<PublicInquiryItem> save(List<PublicInquiryItem> items);
+}
+

+ 500 - 0
src/main/java/com/uas/ps/inquiry/service/impl/PublicInquiryServiceImpl.java

@@ -0,0 +1,500 @@
+package com.uas.ps.inquiry.service.impl;
+
+import com.uas.ps.entity.Status;
+import com.uas.ps.inquiry.dao.*;
+import com.uas.ps.inquiry.entity.*;
+import com.uas.ps.inquiry.model.*;
+import com.uas.ps.inquiry.model.Attach;
+import com.uas.ps.inquiry.service.PublicInquiryService;
+import com.uas.ps.inquiry.util.IRunnable;
+import com.uas.ps.inquiry.util.ThreadUtils;
+import javassist.NotFoundException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.ModelMap;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+
+/**
+ * 公共询价接口实现
+ *
+ * Created by hejq on 2018-01-13.
+ */
+@Service
+public class PublicInquiryServiceImpl implements PublicInquiryService {
+
+    @Autowired
+    private PublicInquiryDao publicInquiryDao;
+
+    @Autowired
+    private PurcInquiryDao purcInquiryDao;
+
+    @Autowired
+    private ProductDao productDao;
+
+    @Autowired
+    private PurcInquiryItemDao purcInquiryItemDao;
+
+    @Autowired
+    private PublicInquiryItemDao publicInquiryItemDao;
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @Autowired
+    private PublicInquiryReplyDao publicInquiryReplyDao;
+
+    /**
+     * 应用来源
+     */
+    private final String SOURCERAPP = "B2B";
+
+    /**
+     * 询价种类
+     */
+    private final String INQUIRYKIND = "publicInquiry";
+
+    /**
+     * 保存公共询价信息
+     *
+     * @param inquiries erp传入公共询价的信息
+     * @param enuu 询价企业UU号
+     * @param address 询价企业地址
+     */
+    @Override
+    public void save(List<BatchInquiry> inquiries, Long enuu, String address) throws NotFoundException {
+        List<PurcInquiry> purcInquiries = covert(inquiries, enuu, address);
+        if (!CollectionUtils.isEmpty(purcInquiries)) {
+            purcInquiryDao.save(purcInquiries);
+        }
+    }
+
+    /**
+     * 保存公共询价
+     *
+     * @param inquiry
+     */
+    @Override
+    public PurcInquiry saveInquiry(PurcInquiry inquiry) {
+        return purcInquiryDao.save(inquiry);
+    }
+
+    /**
+     * 将ERP传入的inquiry信息转成平台需要的信息
+     *
+     * @param inquiries 将ERP传入的inquiry信息
+     * @param enuu 询价企业UU号
+     * @param address 询价企业地址
+     * @return
+     */
+    @Override
+    public List<PurcInquiry> covert(List<BatchInquiry> inquiries, Long enuu, String address) throws NotFoundException {
+        List<PurcInquiry>  purcInquiries = new ArrayList<PurcInquiry>();
+        if (!CollectionUtils.isEmpty(inquiries)) {
+            for(BatchInquiry inquiry : inquiries) {
+                PurcInquiry old = purcInquiryDao.findByCodeAndEnUU(inquiry.getBi_code(), enuu);
+                //先判断是否已经存在,不存在才进行存储
+                if(null == old) {
+                    PurcInquiry purcInquiry = inquiry.covert();
+                    purcInquiry.setEnUU(enuu);
+                    purcInquiry.setShip(address);
+                    Set<PurcInquiryItem> purcInquiryItems = new HashSet<PurcInquiryItem>();
+                    if(!CollectionUtils.isEmpty(inquiry.getInProducts())) {
+                        for(BatchInProduct batch : inquiry.getInProducts()) {
+                            PurcInquiryItem item = new PurcInquiryItem();
+                            item.setIsOpen(Constant.YES);
+                            List<Product> products = productDao.findByEnUUAndCode(enuu, batch.getBip_prodcode());
+                            if (CollectionUtils.isEmpty(products)) {
+                                throw new NotFoundException("编号为[" + batch.getBip_prodcode() + "]的物料未找到");
+                            }
+                            item.setProductId(products.get(0).getId());
+                            item.setRemark(batch.getBip_remark());
+                            item.setProdCode(products.get(0).getCode());
+                            item.setProdTitle(products.get(0).getTitle());
+                            item.setNumber(batch.getBip_detno());
+                            item.setFromDate(new Date());
+                            item.setToDate(purcInquiry.getEndDate());
+                            item.setStatus((short) Status.NOT_REPLY.value());
+                            item.setIsOpen(Constant.YES);
+                            item.setSource("ERP");
+                            item.setSourceid(batch.getBip_id());
+                            item.setCurrency(batch.getBip_currency());
+                            if(null != inquiry.getBi_date()) {
+                                item.setDate(inquiry.getBi_date());
+                            } else {
+                                item.setDate(new Date());
+                            }
+                            if(item.getCurrency() == null) {
+                                item.setCurrency("RMB");
+                            }
+                            purcInquiryItems.add(item);
+                        }
+                    }
+                    purcInquiry.setInquiryItems(purcInquiryItems);
+                    purcInquiries.add(purcInquiry);
+                }
+            }
+        }
+        return purcInquiries;
+    }
+
+    /**
+     * erp提交审核时,平台单据禁用报价功能
+     *
+     * @param inquiries erp询价信息
+     * @param enuu 询价企业UU号
+     */
+    @Override
+    public void updateStatus(List<BatchInquiry> inquiries, Long enuu) {
+        if (!CollectionUtils.isEmpty(inquiries)) {
+            for (BatchInquiry inquiry : inquiries) {
+                PurcInquiry purcInquiry = purcInquiryDao.findByCodeAndEnUU(inquiry.getBi_code(), enuu);
+                purcInquiryItemDao.updateStatus(purcInquiry.getId());
+            }
+        }
+    }
+
+    /**
+     * 查询供应商的报价信息
+     *
+     * @return
+     */
+    @Override
+    public List<InquiryDetail> findNotUploadReply(Long enuu) {
+        List<PublicInquiryItem> items =  publicInquiryItemDao.findByEnUUAndBackStatus(enuu, (short) Status.NOT_UPLOAD.value());
+        if (!CollectionUtils.isEmpty(items)) {
+            // 防止下载过程中进行操作,这里设置一个下载中的状态
+            Set<Long> ids = new HashSet<>();
+            for (PublicInquiryItem item : items) {
+                ids.add(item.getId());
+            }
+            if (ids.size() > 0) {
+                publicInquiryItemDao.updateBackStatus(ids);
+            }
+            return convertPublicInquiryReply(items);
+        }
+        return null;
+    }
+
+    /**
+     * 将平台的公共询价转成ERP的对应的字段
+     *
+     * @param notUploadReply 未下载的供应商报价信息
+     * @return
+     * @author hejq
+     * @date 2018-01-14 11:51
+     */
+    @Override
+    public List<InquiryDetail> convertPublicInquiryReply(List<PublicInquiryItem> notUploadReply) {
+        List<InquiryDetail> details = new ArrayList<InquiryDetail>();
+        if (!CollectionUtils.isEmpty(notUploadReply)) {
+            for (PublicInquiryItem item : notUploadReply) {
+                details.add(new InquiryDetail(item));
+            }
+        }
+        return details;
+    }
+
+    /**
+     * 下载完成后更新平台询价单明细的下载状态
+     *
+     * @param idArray 询价单明细id
+     * @author hejq
+     * @date 2018-01-14 12:12
+     */
+    @Override
+    public void onReplyUploadSuccess(String[] idArray) {
+        for (String id : idArray) {
+            PublicInquiryItem item = publicInquiryItemDao.findOne(Long.parseLong(id));
+            if (item != null) {
+                item.setBackStatus((short) Status.DOWNLOADED.value());
+                item.setErpstatus(Constant.YES);
+                publicInquiryItemDao.save(item);
+            }
+        }
+    }
+
+    /**
+     * ERP提交公共询价单之后,更新平台状态,让平台询价单不能进行报价操作
+     *
+     * @param inquiries 询价信息
+     * @author hejq
+     * @date 2018-01-14 12:20
+     */
+    @Override
+    public void updateInquiryStatus(List<Inquiry> inquiries) {
+        if(!CollectionUtils.isEmpty(inquiries)) {
+            for(Inquiry inquiry : inquiries) {
+                // 更新为过期状态,不能进行报价处理
+                String sql = "update purc$puinquiryitems set id_overdue = 1 where id_inid in ( select in_id from purc$puinquiry where in_enuu = "
+                        + inquiry.getEn_uu() + " and in_code = '" + inquiry.getIn_code() + "')";
+                jdbcTemplate.update(sql);
+                // 更新已转报价的询价单明细状态
+                jdbcTemplate.update("update public$inquiryItems set id_overdue = 1 where id_inid in " +
+                        "(select in_id from public$inquiry where in_enuu = " + inquiry.getEn_uu() + " and in_code = '" + inquiry.getIn_code() + "')");
+                // 更新已转报价的询价单主表check状态为已提交
+                jdbcTemplate.update("update public$inquiry set in_checked = 1 where in_enuu = " + inquiry.getEn_uu() + " and in_code = '" + inquiry.getIn_code() + "'");
+            }
+        }
+    }
+
+    /**
+     * ERP对报价信息的采纳状态上传到平台
+     *
+     * @param decides 采纳信息
+     */
+    @Override
+    public void onReplyDecide(List<InquiryDecide> decides, Long enuu) {
+        List<PublicInquiryItem> publicInquiryItems = convertInquiryDecide(decides);
+        if (!CollectionUtils.isEmpty(publicInquiryItems)) {
+            for (PublicInquiryItem inquiryItem : publicInquiryItems) {
+                publicInquiryItemDao.updateDecideStatusByID(inquiryItem.getAgreed(), inquiryItem.getDecideStatus(), inquiryItem.getId());
+            }
+        }
+    }
+
+    /**
+     * 将ERP的报价采纳信息转为平台需要的信息
+     *
+     * @param decides erp报价采纳信息
+     * @author hejq
+     * @date 2018-01-14 12:25
+     */
+    @Override
+    public List<PublicInquiryItem> convertInquiryDecide(List<InquiryDecide> decides) {
+        List<PublicInquiryItem> inquiryItems = new ArrayList<PublicInquiryItem>();
+        if (!CollectionUtils.isEmpty(decides)) {
+            for (InquiryDecide decide : decides) {
+                PublicInquiryItem item = publicInquiryItemDao.findOne(decide.getB2b_id());
+                if (null != item) {
+                    item.setAgreed(decide.getId_agreed());
+                    item.setDecideStatus((short) Status.NOT_UPLOAD.value());
+                    inquiryItems.add(item);
+                }
+            }
+        }
+        return inquiryItems;
+    }
+
+    /**
+     * 买家ERP作废询价单后,修改平台里面的状态
+     *
+     * @param inquiries 询价信息
+     * @param enuu 企业UU
+     * @author hejq
+     * @date 2018-01-14 12:28
+     */
+    @Override
+    public void onReplyInvalid(List<Inquiry> inquiries, final Long enuu) {
+        final List<PublicInquiryItem> newInquiryItems = new ArrayList<>();
+        ThreadUtils.tasks(new IRunnable<Inquiry>() {
+
+            @Override
+            public void run(Inquiry inquiry) {
+                List<PublicInquiry> purchaseInquiries = publicInquiryDao.findByEnUUAndCode(enuu, inquiry.getIn_code());
+                if (!CollectionUtils.isEmpty(purchaseInquiries)) {
+                    PublicInquiry publicInquiry = purchaseInquiries.get(0);
+                    for (PublicInquiryItem item : publicInquiry.getInquiryItems()) {
+                        item.setStatus((short) Status.DISABLED.value());
+                        // 获取作废信息时,更新作废上传状态为 待上传
+                        item.setInvalidStatus((short) Status.NOT_UPLOAD.value());
+                        synchronized (newInquiryItems) {
+                            newInquiryItems.add(item);
+                        }
+                    }
+                }
+            }
+
+        }, inquiries).run();
+    }
+
+    /**
+     * 将公共询价列表转成需要报价的询价单,类型是公共询价
+     *
+     * @param id     询价明细id
+     * @param enuu   报价企业UU
+     * @param useruu 报价人uu
+     * @return
+     * @author hejq
+     * @date 2018-01-14 14:46
+     */
+    @Override
+    public ModelMap transtoInquiry(Long id, Long enuu, Long useruu) {
+        ModelMap map = new ModelMap();
+        PurcInquiryItem purcInquiryItem = purcInquiryItemDao.findOne(id);
+        PurcInquiry purcInquiry = purcInquiryItem.getInquiry();
+        // 先判断客户询价单是否存在这张单据
+        PublicInquiry inquiry = publicInquiryDao.findBySourceIdAndSourceApp(purcInquiry.getId(), SOURCERAPP);
+        if (null == inquiry) {// 新增
+            PublicInquiry saleInquiry = new PublicInquiry();
+            saleInquiry.setDate(new Date());
+            saleInquiry.setCode(purcInquiry.getCode());
+            saleInquiry.setEnUU(purcInquiry.getEnUU());
+            saleInquiry.setRecorder(purcInquiry.getRecorder());
+            saleInquiry.setRecorderUU(purcInquiry.getRecorderUU());
+            saleInquiry.setAuditor(purcInquiry.getAuditor());
+            saleInquiry.setSourceApp(SOURCERAPP);
+            saleInquiry.setKind(INQUIRYKIND);
+            saleInquiry.setSourceId(purcInquiry.getId());
+            saleInquiry.setPriceType(purcInquiry.getPriceType());
+            saleInquiry.setInvoice(purcInquiry.getInvoice());
+            saleInquiry.setShip(purcInquiry.getShip());
+            saleInquiry.setEndDate(purcInquiry.getEndDate());
+            if (!CollectionUtils.isEmpty(purcInquiry.getAttachs())) {
+                Set<com.uas.ps.inquiry.model.Attach> attachs = new HashSet<com.uas.ps.inquiry.model.Attach>();
+                for (com.uas.ps.inquiry.model.Attach attach : purcInquiry.getAttachs()) {
+                    com.uas.ps.inquiry.model.Attach newAttach = new com.uas.ps.inquiry.model.Attach();
+                    newAttach.setDate(new Date());
+                    newAttach.setDescription(attach.getDescription());
+                    newAttach.setName(attach.getName());
+                    newAttach.setPath(attach.getPath());
+                    newAttach.setRelatedKey(attach.getRelatedKey());
+                    newAttach.setSize(attach.getSize());
+                    newAttach.setRelatedKey(attach.getRelatedKey());
+                    attachs.add(newAttach);
+                }
+                saleInquiry.setAttachs(attachs);
+
+            }
+            saleInquiry.setEnvironment(purcInquiry.getEnvironment());
+            saleInquiry.setRemark(purcInquiry.getRemark());
+            saleInquiry.setInquirytype(purcInquiry.getInquirytype());
+            Set<PublicInquiryItem> items = new HashSet<PublicInquiryItem>();
+            Short i = 0;
+            if (null != purcInquiryItem) {
+                PublicInquiryItem item = new PublicInquiryItem();
+                Product product = productDao.findOne(purcInquiryItem.getProductId());
+                item.setProductId(product.getId());
+                item.setInquiry(saleInquiry);
+                item.setNumber(i);
+                item.setCurrency(purcInquiryItem.getCurrency());
+                item.setFromDate(new Date());
+                item.setToDate(purcInquiryItem.getToDate());
+                item.setTaxrate(purcInquiryItem.getTaxrate());
+                item.setRemark(purcInquiryItem.getRemark());
+                item.setProductId(purcInquiryItem.getProductId());
+                item.setStatus((short) Status.NOT_REPLY.value());
+                item.setVendUU(enuu);
+                item.setVendUserUU(useruu);
+                item.setSourceApp(purcInquiryItem.getSource());
+                item.setCustLap(Constant.NO);
+                item.setSendStatus((short) Status.NOT_UPLOAD.value());
+                item.setSourceId(id);
+                Set<PublicInquiryReply> replies = new HashSet<PublicInquiryReply>();
+                PublicInquiryReply reply = new PublicInquiryReply();
+                reply.setLapQty((double) 0);
+                replies.add(reply);
+                item.setReplies(replies);
+                item.setNeedquantity(purcInquiryItem.getNeedquantity());
+                item.setKind(INQUIRYKIND);
+                item.setPrcode(purcInquiryItem.getProdCode());
+                items.add(item);
+                i++;
+            }
+            List<PublicInquiryItem> purcitems = publicInquiryItemDao.save(items);
+            if (purcitems.get(0).getId() != null) {
+                map.put("success", "转客户询价单成功");
+                map.put("id", purcitems.get(0).getInquiry().getId());
+            } else {
+                map.put("success", "转客户询价单失败");
+            }
+        } else {// 插入
+            PublicInquiryItem purcItem = publicInquiryItemDao.findByVendUUAndSourceId(enuu, id);
+            if (purcItem != null) {
+                map.put("info", "询价单已存在");
+                map.put("inid", purcItem.getId());
+            } else {
+                if (!CollectionUtils.isEmpty(purcInquiry.getInquiryItems())) {
+                    if (null != purcInquiryItem) {
+                        // 涉及到级联存储及ERP转入单据的操作,用主表id存储存在问题,这里先用sql语句直接插入
+                        PublicInquiryItem item = new PublicInquiryItem();
+                        Product product = productDao.findOne(purcInquiryItem.getProductId());
+                        item.setProductId(product.getId());
+                        item.setNumber((short) (purcInquiry.getInquiryItems().size() + 1));
+                        item.setCurrency(purcInquiryItem.getCurrency());
+                        item.setFromDate(new Date());
+                        item.setToDate(purcInquiryItem.getToDate());
+                        item.setTaxrate(purcInquiryItem.getTaxrate());
+                        item.setRemark(purcInquiryItem.getRemark());
+                        item.setProductId(purcInquiryItem.getProductId());
+                        item.setVendUU(enuu);
+                        item.setVendUserUU(useruu);
+                        item.setSourceApp(purcInquiryItem.getSource());
+                        item.setStatus((short) Status.NOT_REPLY.value());
+                        item.setCustLap(Constant.NO);
+                        item.setSendStatus((short) Status.NOT_UPLOAD.value());
+                        item.setSourceId(id);
+                        item.setPrcode(purcInquiryItem.getProdCode());
+                        item.setKind(INQUIRYKIND);
+                        item.setNeedquantity(purcInquiryItem.getNeedquantity());
+                        Set<PublicInquiryReply> replies = new HashSet<PublicInquiryReply>();
+                        List<PublicInquiryReply> purcReplies = new ArrayList<PublicInquiryReply>();
+                        PublicInquiryReply reply = new PublicInquiryReply();
+                        reply.setLapQty((double) 0);
+                        purcReplies.add(reply);
+                        purcReplies = publicInquiryReplyDao.save(purcReplies);
+                        replies.addAll(purcReplies);
+                        item.setReplies(replies);
+                        Long idid = jdbcTemplate.queryForObject("select public$inquiryitems_seq.nextval from dual", Long.class);
+                        try {
+                            jdbcTemplate.update(
+                                    "insert into public$inquiryitems(id_id,id_number,id_currency,id_fromdate,id_todate,id_taxrate,id_prid,id_venduu,"
+                                            + "id_venduseruu,id_sourceapp,id_status,id_custlap,id_sendstatus,id_sourceid,id_inid,id_kind) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
+                                    idid, item.getNumber(), item.getCurrency(), item.getFromDate(), item.getToDate(),
+                                    item.getTaxrate(), item.getProductId(), item.getVendUU(), item.getVendUserUU(),
+                                    item.getSourceApp(), item.getStatus(), item.getCustLap(), item.getSendStatus(),
+                                    item.getSourceId(), inquiry.getId(), inquiry.getKind());
+                        } catch (DataAccessException e) {
+                            map.put("info", "转客户询价单失败");
+                        }
+                        item = publicInquiryItemDao.findOne(idid);
+                        //回复清单更新
+                        if(replies.size() > 0) {
+                            for (PublicInquiryReply reply1 : replies) {
+                                jdbcTemplate.update("update public$inquiryreply set ir_idid = " + idid + "where ir_id = " + reply1.getId());
+                            }
+                        }
+                        if (item != null) {
+                            map.put("success", "转客户询价单成功");
+                            map.put("id", item.getInquiry().getId());
+                        } else {
+                            map.put("info", "转客户询价单失败");
+                        }
+                    }
+                }
+            }
+
+        }
+        return map;
+    }
+
+    /**
+     * 供应商保存报价信息
+     *
+     * @param item 报价信息
+     * @return
+     * @author hejq
+     * @date 2018-01-14 16:43
+     */
+    @Override
+    public PublicInquiryItem save(PublicInquiryItem item) {
+        return publicInquiryItemDao.save(item);
+    }
+
+    /**
+     * 保存询价信息
+     *
+     * @param items 询价信息
+     * @return
+     * @author hejq
+     * @date 2018-01-15 9:16
+     */
+    @Override
+    public List<PublicInquiryItem> save(List<PublicInquiryItem> items) {
+        return publicInquiryItemDao.save(items);
+    }
+
+}

+ 1 - 0
src/main/java/com/uas/ps/inquiry/service/impl/readme.md

@@ -0,0 +1 @@
+#公共询价服务实现层

+ 1 - 0
src/main/java/com/uas/ps/inquiry/service/readme.md

@@ -0,0 +1 @@
+#公共询价服务Service

+ 0 - 72
src/main/java/com/uas/ps/inquiry/util/ContextUtils.java

@@ -1,72 +0,0 @@
-package com.uas.ps.inquiry.util;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationEvent;
-
-/**
- * spring容器上下文对象
- *
- * @author yingp
- */
-public class ContextUtils {
-    private static ApplicationContext applicationContext;
-
-    private static Logger logger = LoggerFactory.getLogger(ContextUtils.class);
-
-    public static ApplicationContext getApplicationContext() {
-        synchronized (ContextUtils.class) {
-            while (applicationContext == null) {
-                try {
-                    logger.debug("getApplicationContext, wait...");
-                    ContextUtils.class.wait(60000);
-                    if (applicationContext == null) {
-                        logger.warn("Have been waiting for ApplicationContext to be set for 1 minute", new Exception());
-                    }
-                } catch (InterruptedException ex) {
-                    logger.debug("getApplicationContext, wait interrupted");
-                }
-            }
-            return applicationContext;
-        }
-    }
-
-    public static void setApplicationContext(ApplicationContext applicationContext) {
-        synchronized (ContextUtils.class) {
-            logger.debug("setApplicationContext, notifyAll");
-            ContextUtils.applicationContext = applicationContext;
-            ContextUtils.class.notifyAll();
-        }
-    }
-
-    /**
-     * 获取bean
-     *
-     * @param name
-     * @return
-     */
-    public static Object getBean(String name) {
-        return getApplicationContext().getBean(name);
-    }
-
-    /**
-     * 获取bean
-     *
-     * @param cls
-     * @return
-     */
-    public static <T> T getBean(Class<T> cls) {
-        return getApplicationContext().getBean(cls);
-    }
-
-    /**
-     * 触发事件
-     *
-     * @param event
-     */
-    public static void publishEvent(ApplicationEvent event) {
-        getApplicationContext().publishEvent(event);
-    }
-
-}

+ 200 - 0
src/main/java/com/uas/ps/inquiry/util/DateUtils.java

@@ -0,0 +1,200 @@
+package com.uas.ps.inquiry.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+public class DateUtils {
+
+	public static final int COMPARE_NONE = 0;
+	public static final int COMPARE_SECOND = 1;
+	public static final int COMPARE_MINUTE = 2;
+	public static final int COMPARE_HOUR = 3;
+	public static final int COMPARE_DAY = 4;
+	static final SimpleDateFormat ym = new SimpleDateFormat("yyyyMM");
+	static final SimpleDateFormat YM = new SimpleDateFormat("yyyy-MM");
+	static final SimpleDateFormat YMD = new SimpleDateFormat("yyyy-MM-dd");
+	static final SimpleDateFormat YMD_HMS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+	/**
+	 * 获取月份起始日期
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getMinMonthDate(Date date) {
+		date = date == null ? new Date() : date;
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
+		return calendar.getTime();
+	}
+
+	/**
+	 * 获取月份起始日期
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static String getMinMonthDateS(Date date) {
+		return YMD.format(getMinMonthDate(date));
+	}
+
+	/**
+	 * 获取月份最后日期
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getMaxMonthDate(Date date) {
+		date = date == null ? new Date() : date;
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+		return calendar.getTime();
+	}
+
+	/**
+	 * 获取月份最后日期
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static String getMaxMonthDateS(Date date) {
+		return YMD.format(getMaxMonthDate(date));
+	}
+
+	/**
+	 * 比较日期大小
+	 * 
+	 * @param dateParam1
+	 * @param dateParam2
+	 * @param compareType
+	 *            精确位(天、小时、分钟、秒)
+	 * @return 1表示dateParam1大于dateParam2,0表示等于,-1表示小于
+	 */
+	public static int compare(Date dateParam1, Date dateParam2, int compareType) {
+		Calendar calendar1 = Calendar.getInstance();
+		calendar1.setTime(dateParam1);
+		calendar1.clear(Calendar.MILLISECOND);
+		if (compareType >= COMPARE_SECOND)
+			calendar1.clear(Calendar.SECOND);
+		if (compareType >= COMPARE_MINUTE)
+			calendar1.clear(Calendar.MINUTE);
+		if (compareType >= COMPARE_HOUR) {
+			calendar1.clear(Calendar.HOUR_OF_DAY);
+			calendar1.clear(Calendar.HOUR);
+			calendar1.clear(Calendar.AM_PM);
+		}
+		if (compareType >= COMPARE_DAY)
+			calendar1.clear(Calendar.DAY_OF_MONTH);
+		Calendar calendar2 = Calendar.getInstance();
+		calendar2.setTime(dateParam2);
+		calendar2.clear(Calendar.MILLISECOND);
+		if (compareType >= COMPARE_SECOND)
+			calendar2.clear(Calendar.SECOND);
+		if (compareType >= COMPARE_MINUTE)
+			calendar2.clear(Calendar.MINUTE);
+		if (compareType >= COMPARE_HOUR) {
+			calendar2.clear(Calendar.HOUR_OF_DAY);
+			calendar2.clear(Calendar.HOUR);
+			calendar2.clear(Calendar.AM_PM);
+		}
+		if (compareType >= COMPARE_DAY)
+			calendar2.clear(Calendar.DAY_OF_MONTH);
+		return calendar1.compareTo(calendar2);
+	}
+
+	/**
+	 * 截取指定日期的年月
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Integer getYearmonth(Date date) {
+		if (date == null) {
+			date = new Date();
+		}
+		return Integer.parseInt(ym.format(date));
+	}
+
+	/**
+	 * 截取指定日期的年月
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Integer getYearmonth(String date) {
+		return Integer.parseInt(ym.format(parse(date, null)));
+	}
+
+	public static Date parse(String date, String f) {
+		if (date == null || "".equals(date)) {
+			return new Date();
+		}
+		if (f == null || "".equals(f)) {
+			try {
+				return date.contains(" ") ? YMD_HMS.parse(date) : YMD.parse(date);
+			} catch (ParseException e) {
+				return new Date();
+			}
+		}
+		SimpleDateFormat sdf = new SimpleDateFormat(f);
+		try {
+			return sdf.parse(date);
+		} catch (ParseException e) {
+			return new Date();
+		}
+	}
+
+	/**
+	 * 当前时间
+	 * 
+	 * @return <h3>String</h3>
+	 */
+	public static String getCurrentDate() {
+		return format(new Date(), null);
+	}
+
+	public static String format(Date date, String f) {
+		if (date == null) {
+			date = new Date();
+		}
+		if (f == null) {
+			return YMD.format(date);
+		}
+		SimpleDateFormat sdf = new SimpleDateFormat(f);
+		return sdf.format(date);
+	}
+
+	/**
+	 * 月份加减
+	 * 
+	 * @param date
+	 * @param increase
+	 *            加减月份数,负数表示减
+	 * @return
+	 */
+	public static Integer addMonth(Date date, int increase) {
+		if (date == null)
+			date = new Date();
+		Calendar calendar = new GregorianCalendar();
+		calendar.setTime(date);
+		calendar.add(Calendar.MONTH, increase);
+		return getYearmonth(calendar.getTime());
+	}
+
+	/**
+	 * 月份加减
+	 * 
+	 * @param date
+	 * @param increase
+	 *            加减月份数,负数表示减
+	 * @return
+	 */
+	public static Integer addMonth(String date, int increase) {
+		return addMonth(parse(date, null), increase);
+	}
+}

+ 17 - 0
src/main/java/com/uas/ps/inquiry/util/ICallable.java

@@ -0,0 +1,17 @@
+package com.uas.ps.inquiry.util;
+
+/**
+ * 能传入参数执行的callable
+ * 
+ * @author yingp
+ * 
+ * @param <V>
+ *            返回结果类型
+ * @param <T>
+ *            参数类型
+ */
+public abstract interface ICallable<V, T> {
+
+	public abstract V call(T param) throws Exception;
+
+}

+ 34 - 0
src/main/java/com/uas/ps/inquiry/util/ICallableAdapter.java

@@ -0,0 +1,34 @@
+package com.uas.ps.inquiry.util;
+
+import java.util.concurrent.Callable;
+
+/**
+ * 代理callable来执行
+ * 
+ * <pre>
+ * 涉及到一个callable对象调用不同参数循环执行的问题,不能直接在ICallable对象里面设置参数,需要代理执行
+ * </pre>
+ * 
+ * @author yingp
+ * 
+ * @param <V>
+ *            返回结果类型
+ * @param <T>
+ *            参数类型
+ */
+public final class ICallableAdapter<V, T> implements Callable<V> {
+
+	private final ICallable<V, T> task;
+	private final T param;
+
+	public ICallableAdapter(ICallable<V, T> task, T param) {
+		this.task = task;
+		this.param = param;
+	}
+
+	@Override
+	public V call() throws Exception {
+		return task.call(param);
+	}
+
+}

+ 10 - 0
src/main/java/com/uas/ps/inquiry/util/IRunnable.java

@@ -0,0 +1,10 @@
+package com.uas.ps.inquiry.util;
+
+/**
+ * 线程执行
+ *
+ * Created by hejq on 2018-01-14.
+ */
+public interface IRunnable<T> {
+    void run(T var1);
+}

+ 20 - 0
src/main/java/com/uas/ps/inquiry/util/IRunnableAdapter.java

@@ -0,0 +1,20 @@
+package com.uas.ps.inquiry.util;
+
+/**
+ * 线程方法
+ *
+ * Created by hejq on 2018-01-14.
+ */
+public class IRunnableAdapter<T> implements Runnable {
+    private final IRunnable<T> task;
+    private final T param;
+
+    public IRunnableAdapter(IRunnable<T> task, T param) {
+        this.task = task;
+        this.param = param;
+    }
+
+    public void run() {
+        this.task.run(this.param);
+    }
+}

+ 7 - 0
src/main/java/com/uas/ps/inquiry/util/Listener.java

@@ -0,0 +1,7 @@
+package com.uas.ps.inquiry.util;
+
+public abstract interface Listener {
+
+	void handler();
+
+}

+ 29 - 0
src/main/java/com/uas/ps/inquiry/util/Listeners.java

@@ -0,0 +1,29 @@
+package com.uas.ps.inquiry.util;
+
+import java.util.Vector;
+
+public class Listeners {
+
+	private Vector<Listener> listeners = new Vector<Listener>();
+
+	public synchronized void addListener(Listener e) {
+		listeners.addElement(e);
+	}
+
+	public synchronized void removeListener(Listener e) {
+		listeners.removeElement(e);
+	}
+
+	@SuppressWarnings("unchecked")
+	public void fire() {
+		Vector<Listener> currentListeners = null;
+		synchronized (this) {
+			currentListeners = (Vector<Listener>) listeners.clone();
+		}
+		for (int i = 0; i < currentListeners.size(); i++) {
+			Listener listener = (Listener) currentListeners.elementAt(i);
+			listener.handler();
+		}
+	}
+
+}

+ 266 - 0
src/main/java/com/uas/ps/inquiry/util/ThreadUtils.java

@@ -0,0 +1,266 @@
+package com.uas.ps.inquiry.util;
+
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * 多线程处理工具
+ */
+public class ThreadUtils {
+
+	public static <T> Runner<T> tasks(IRunnable<T> runnable, List<T> paramList) {
+		return new Runner<T>(runnable).tasks(paramList);
+	}
+
+	public static <T> void run(IRunnable<T> runnable, List<T> paramList) {
+		tasks(runnable, paramList).run();
+	}
+
+	public static <T> Runner<T> pool(IRunnable<T> runnable, int poolSize) {
+		return new Runner<T>(runnable, poolSize);
+	}
+
+	public static <V, T> Caller<V, T> tasks(ICallable<V, T> callable, List<T> paramList) {
+		return new Caller<V, T>(callable).tasks(paramList);
+	}
+
+	public static <V, T> List<V> call(ICallable<V, T> callable, List<T> paramList) {
+		return tasks(callable, paramList).call();
+	}
+
+	public static <V, T> Caller<V, T> pool(ICallable<V, T> callable, int poolSize) {
+		return new Caller<V, T>(callable, poolSize);
+	}
+
+	public static Executor task(Runnable runnable) {
+		return new Executor().task(runnable);
+	}
+
+	public static Executor pool(int poolSize) {
+		return new Executor(poolSize);
+	}
+
+	/**
+	 * @param <T>
+	 *            参数类型
+	 */
+	public static class Runner<T> {
+		private final ExecutorService threadPool;
+		private IRunnable<T> runner;
+		private int timeout = 900;
+		private int taskCount = 0;
+
+		public Runner() {
+			this.threadPool = Executors.newCachedThreadPool();
+		}
+
+		public Runner(int poolSize) {
+			this.threadPool = Executors.newFixedThreadPool(poolSize);
+		}
+
+		public Runner(IRunnable<T> runner) {
+			this();
+			this.runner = runner;
+		}
+
+		public Runner(IRunnable<T> runner, int poolSize) {
+			this(poolSize);
+			this.runner = runner;
+		}
+
+		public Runner<T> setTimeout(int timeout) {
+			this.timeout = timeout;
+			return this;
+		}
+
+		public Runner<T> task(T param) {
+			threadPool.execute(new IRunnableAdapter<T>(runner, param));
+			taskCount++;
+			return this;
+		}
+
+		public Runner<T> tasks(List<T> params) {
+			if (!CollectionUtils.isEmpty(params)) {
+				for (T param : params)
+					task(param);
+			}
+			return this;
+		}
+
+		public void run() {
+			if (taskCount > 0) {
+				threadPool.shutdown();
+				try {
+					threadPool.awaitTermination(timeout, TimeUnit.SECONDS);
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+		public Runner<T> shutdownIf(Listeners closer) {
+			closer.addListener(new Listener() {
+
+				@Override
+				public void handler() {
+					threadPool.shutdownNow();
+				}
+			});
+			return this;
+		}
+
+	}
+
+	/**
+	 * @param <V>
+	 *            返回类型
+	 * @param <T>
+	 *            参数类型
+	 */
+	public static class Caller<V, T> {
+		private final ExecutorService threadPool;
+		private final CompletionService<V> service;
+		private ICallable<V, T> caller;
+		private int taskCount = 0;
+		private AtomicBoolean closed = new AtomicBoolean(false);
+
+		public Caller() {
+			this.threadPool = Executors.newCachedThreadPool();
+			this.service = new ExecutorCompletionService<V>(threadPool);
+		}
+
+		public Caller(int poolSize) {
+			this.threadPool = Executors.newFixedThreadPool(poolSize);
+			this.service = new ExecutorCompletionService<V>(threadPool);
+		}
+
+		public Caller(ICallable<V, T> caller) {
+			this();
+			this.caller = caller;
+		}
+
+		public Caller(ICallable<V, T> caller, int poolSize) {
+			this(poolSize);
+			this.caller = caller;
+		}
+
+		public Caller<V, T> task(T param) {
+			service.submit(new ICallableAdapter<V, T>(caller, param));
+			taskCount++;
+			return this;
+		}
+
+		public Caller<V, T> tasks(List<T> params) {
+			if (!CollectionUtils.isEmpty(params)) {
+				for (T param : params)
+					task(param);
+			}
+			return this;
+		}
+
+		public List<V> call() {
+			threadPool.shutdown();
+			int finish = 0;
+			List<V> results = new ArrayList<V>();
+			while (finish < taskCount && !closed.get()) {
+				Future<V> val = service.poll();
+				// 采用非阻塞方式
+				if (null != val) {
+					try {
+						results.add(val.get());
+					} catch (InterruptedException e) {
+						e.printStackTrace();
+					} catch (ExecutionException e) {
+						e.printStackTrace();
+					}
+					finish++;
+				}
+				try {
+					TimeUnit.MILLISECONDS.sleep(50);
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+			}
+			closed.set(true);
+			return results;
+		}
+
+		public Caller<V, T> shutdownIf(Listeners closer) {
+			closer.addListener(new Listener() {
+
+				@Override
+				public void handler() {
+					if (!closed.get()) {
+						threadPool.shutdownNow();
+						closed.set(true);
+					}
+				}
+			});
+			return this;
+		}
+
+	}
+
+	/**
+	 * 无参、无返回执行
+	 */
+	public static class Executor {
+		private final ExecutorService threadPool;
+		private int timeout = 900;// 15 min
+		private int taskCount = 0;
+
+		public Executor() {
+			this.threadPool = Executors.newCachedThreadPool();
+		}
+
+		public Executor(int poolSize) {
+			this.threadPool = Executors.newFixedThreadPool(poolSize);
+		}
+
+		public Executor setTimeout(int timeout) {
+			this.timeout = timeout;
+			return this;
+		}
+
+		public Executor task(Runnable runnable) {
+			threadPool.execute(runnable);
+			taskCount++;
+			return this;
+		}
+
+		public Executor tasks(List<Runnable> runnables) {
+			if (!CollectionUtils.isEmpty(runnables)) {
+				for (Runnable runnable : runnables)
+					task(runnable);
+			}
+			return this;
+		}
+
+		public void run() {
+			if (taskCount > 0) {
+				threadPool.shutdown();
+				try {
+					threadPool.awaitTermination(timeout, TimeUnit.SECONDS);
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+		public Executor shutdownIf(Listeners closer) {
+			closer.addListener(new Listener() {
+
+				@Override
+				public void handler() {
+					threadPool.shutdownNow();
+				}
+			});
+			return this;
+		}
+
+	}
+}

+ 1 - 1
src/main/resources/application.yml

@@ -11,7 +11,7 @@ spring:
 security:
  basic:
   enabled: true
-  path: /**
+  path: /
  user:
   name: inquiry-admin
   password: select111***