فهرست منبع

uas招标接口

git-svn-id: svn+ssh://10.10.101.21/source/platform/platform-b2b@8195 f3bf4e98-0cf0-11e4-a00c-a99a8b9d557d
dongbw 8 سال پیش
والد
کامیت
7aaeeb18e4

+ 583 - 0
src/main/java/com/uas/platform/b2b/erp/controller/TenderController.java

@@ -0,0 +1,583 @@
+package com.uas.platform.b2b.erp.controller;
+
+import com.alibaba.dubbo.common.utils.CollectionUtils;
+import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2b.erp.service.TenderService;
+import com.uas.platform.b2b.model.*;
+import com.uas.platform.b2b.search.SearchService;
+import com.uas.platform.b2b.service.AttachService;
+import com.uas.platform.b2b.service.UserService;
+import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.core.model.Constant;
+import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
+import com.uas.search.b2b.model.MultiValue;
+import com.uas.search.b2b.model.SPage;
+import com.uas.search.b2b.model.Sort;
+import com.uas.search.b2b.util.SearchConstants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Created by dongbw
+ * 17/05/03 9:54.
+ */
+@Controller
+@RequestMapping(value = "/erp/tender")
+public class TenderController {
+
+    @Autowired
+    private TenderService tenderService;
+
+    @Autowired
+    private SearchService searchService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private AttachService attachService;
+
+    /**
+     * 作为采购方,发布招标单
+     *
+     * @param tender 招标单
+     */
+    @RequestMapping(value = "/publish", method = RequestMethod.POST)
+    @ResponseBody
+    @Transactional
+    public ResponseEntity<String> publishTender(String tender, String vendorUUs) {
+        PurchaseTender purchaseTender = FlexJsonUtils.fromJson(tender, PurchaseTender.class);
+        if (purchaseTender.getIfOpen() == Constant.YES) {
+            tenderService.publishOpen(purchaseTender);
+        } else {
+            if (null != vendorUUs) {
+                vendorUUs = "[".concat(vendorUUs);
+                vendorUUs = vendorUUs.concat("]");
+                List<Long> vendUUs = FlexJsonUtils.fromJsonArray(vendorUUs, Long.class);
+                tenderService.publish(purchaseTender, vendUUs);
+            }
+        }
+        return new ResponseEntity<String>(HttpStatus.OK);
+    }
+
+    /**
+     * 作为采购方,保存招标单
+     *
+     * @param tender    招标单
+     * @param vendorUUs 所选供应商uu
+     */
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @ResponseBody
+    @Transactional
+    public ModelMap saveTender(String tender, String vendorUUs) {
+        PurchaseTender purchaseTender = FlexJsonUtils.fromJson(tender, PurchaseTender.class);
+        if (purchaseTender.getIfOpen() == Constant.YES) {
+            return tenderService.saveOpen(purchaseTender);
+        } else {
+            if (null != vendorUUs) {
+                vendorUUs = "[".concat(vendorUUs);
+                vendorUUs = vendorUUs.concat("]");
+                List<Long> vendUUs = FlexJsonUtils.fromJsonArray(vendorUUs, Long.class);
+                return tenderService.save(purchaseTender, vendUUs);
+            }
+        }
+        ModelMap map = new ModelMap();
+        map.put("success", false);
+        return map;
+    }
+
+    /**
+     * 供应商投标
+     *
+     * @param enBaseInfo  投标企业信息
+     * @param tenderItems 投标明细
+     */
+    @RequestMapping(value = "/reply", method = RequestMethod.POST)
+    @ResponseBody
+    public ResponseEntity<String> replyTender(String tenderItems, String enBaseInfo, String attaches) {
+        tenderItems = "[".concat(tenderItems);
+        tenderItems = tenderItems.concat("]");
+        List<SaleTenderItem> saleTenderItems = FlexJsonUtils.fromJsonArray(tenderItems, SaleTenderItem.class);
+        EnterpriseBaseInfo vendor = FlexJsonUtils.fromJson(enBaseInfo, EnterpriseBaseInfo.class);
+        List<Attach> saleTenderAttaches = new ArrayList<>();
+        if (attaches != null && !Objects.equals(attaches, "")) {
+            attaches = "[".concat(attaches);
+            attaches = attaches.concat("]");
+            saleTenderAttaches = FlexJsonUtils.fromJsonArray(attaches, Attach.class);
+        }
+        tenderService.reply(saleTenderItems, vendor, saleTenderAttaches);
+        return new ResponseEntity<String>(HttpStatus.OK);
+    }
+
+
+    /**
+     * 查看招标单详情
+     *
+     * @param id 招标单id
+     */
+    @RequestMapping(value = "/detail", method = RequestMethod.GET)
+    @ResponseBody
+    public PurchaseTender getTenderById(Long id) {
+        return tenderService.findById(id);
+    }
+
+
+    /**
+     * 公开招标转投标单
+     *
+     * @param id 招标单id
+     * @return 投标单id 和code
+     */
+    @RequestMapping(value = "/addItems", method = RequestMethod.POST)
+    @ResponseBody
+    public ModelMap addTenderItemById(Long id) {
+        return tenderService.addTenderItemById(id);
+    }
+
+
+
+    /**
+     * 招标方定标
+     *
+     * @param json 招标单json
+     */
+    @RequestMapping(value = "/decide", method = RequestMethod.POST)
+    @ResponseBody
+    public ResponseEntity<String> decideTender(@RequestBody String json) {
+        PurchaseTender purchaseTender = FlexJsonUtils.fromJson(json, PurchaseTender.class);
+        tenderService.decide(purchaseTender);
+        return new ResponseEntity<String>(HttpStatus.OK);
+    }
+
+    /**
+     * 作为供应商,查看收到的招标单(全部)
+     *
+     * @param params 分页参数
+     * @return Spage
+     */
+    @RequestMapping(method = RequestMethod.GET)
+    @ResponseBody
+    public SPage<PurchaseTender> getAllTenders(PageParams params, String searchFilter) {
+        JSONObject jsonObject = JSONObject.parseObject(searchFilter);
+        String keyword = jsonObject.getString("keyword");
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 判断当前用户是否被客户分配
+        SearchFilter filter = userService.distribute();
+        if (filter != null && filter.getDistribute() == null) {
+            return null;
+        }
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("pt_id", false, Sort.Type.LONG, 1L));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        pageParams.getFilters().put("pt_ispublish", Constant.YES);
+//        pageParams.getFilters().put("pt_ifopen", Constant.NO);  // 现在公开的也在这个列表
+        pageParams.getFilters().put("tp_ptid", SystemSession.getUser().getEnterprise().getEnName());
+        return searchService.searchPurcTenderIds(keyword, pageParams);
+    }
+
+    /**
+     * 作为供应商,查看收到的招标单(已结标)
+     *
+     * @param params 分页参数
+     * @return Sapge
+     */
+    @RequestMapping(value="/done", method = RequestMethod.GET)
+    @ResponseBody
+    public SPage<PurchaseTender> getDoneTenders(PageParams params, String searchFilter) {
+        JSONObject jsonObject = JSONObject.parseObject(searchFilter);
+        String keyword = jsonObject.getString("keyword");
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 判断当前用户是否被客户分配
+        SearchFilter filter = userService.distribute();
+        if (filter != null && filter.getDistribute() == null) {
+            return null;
+        }
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("pt_id", false, Sort.Type.LONG, 1L));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        pageParams.getFilters().put("tp_ptid", SystemSession.getUser().getEnterprise().getEnName());
+        pageParams.getFilters().put("pt_ispublish", Constant.YES);
+        pageParams.getFilters().put("pt_result", Constant.YES);
+//        pageParams.getFilters().put("pt_ifopen", Constant.NO);
+        return searchService.searchPurcTenderIds(keyword, pageParams);
+    }
+
+    /**
+     * 作为供应商,查看收到的招标单(待评标)
+     *
+     * @param params 分页参数
+     * @return 招标单Spage
+     */
+    @RequestMapping(value="/waiting", method = RequestMethod.GET)
+    @ResponseBody
+    public SPage<PurchaseTender> getWaitingTenders(PageParams params, String searchFilter) {
+        JSONObject jsonObject = JSONObject.parseObject(searchFilter);
+        String keyword = jsonObject.getString("keyword");
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 判断当前用户是否被客户分配
+        SearchFilter filter = userService.distribute();
+        if (filter != null && filter.getDistribute() == null) {
+            return null;
+        }
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("pt_id", false, Sort.Type.LONG, 1L));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        pageParams.getFilters().put("tp_ptid", SystemSession.getUser().getEnterprise().getEnName());
+        pageParams.getFilters().put("pt_ispublish", Constant.YES);
+//        pageParams.getFilters().put("pt_ifopen", Constant.NO);
+        pageParams.getFilters().put("pt_overdue", Constant.YES);
+        pageParams.getFilters().put("pt_result", Constant.NO);
+        pageParams.getFilters().put("pt_status", "待评标");
+        return searchService.searchPurcTenderIds(keyword, pageParams);
+    }
+
+
+    /**
+     * 作为供应商,查看收到的招标单(待投标)
+     *
+     * @param params 分页参数
+     * @return 招标单Spage
+     */
+    @RequestMapping(value = "/todo", method = RequestMethod.GET)
+    @ResponseBody
+    public SPage<PurchaseTender> getTodoTenders(PageParams params, String searchFilter) {
+        JSONObject jsonObject = JSONObject.parseObject(searchFilter);
+        String keyword = jsonObject.getString("keyword");
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 判断当前用户是否被客户分配
+        SearchFilter filter = userService.distribute();
+        if (filter != null && filter.getDistribute() == null) {
+            return null;
+        }
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("pt_id", false, Sort.Type.LONG, 1L));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        pageParams.getFilters().put("tp_ptid", SystemSession.getUser().getEnterprise().getEnName());
+        pageParams.getFilters().put("pt_ispublish", Constant.YES);
+//        pageParams.getFilters().put("pt_ifopen", Constant.NO);
+        pageParams.getFilters().put("pt_overdue", Constant.NO);
+        return searchService.searchPurcTenderIds(keyword, pageParams);
+    }
+
+
+    /**
+     * 作为供应商,查看收到的招标单(过期)
+     *
+     * @param params 分页参数
+     * @return 招标单Spage
+     */
+    @RequestMapping(value = "/end", method = RequestMethod.GET)
+    @ResponseBody
+    public SPage<PurchaseTender> getEndTenders(PageParams params, String searchFilter) {
+        JSONObject jsonObject = JSONObject.parseObject(searchFilter);
+        String keyword = jsonObject.getString("keyword");
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 判断当前用户是否被客户分配
+        SearchFilter filter = userService.distribute();
+        if (filter != null && filter.getDistribute() == null) {
+            return null;
+        }
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("pt_id", false, Sort.Type.LONG, 1L));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        pageParams.getFilters().put("tp_ptid", SystemSession.getUser().getEnterprise().getEnName());
+        pageParams.getFilters().put("pt_ispublish", Constant.YES);
+//        pageParams.getFilters().put("pt_ifopen", Constant.NO);
+        pageParams.getFilters().put("pt_status", "待投标");
+        pageParams.getFilters().put("pt_overdue", Constant.YES);
+        return searchService.searchPurcTenderIds(keyword, pageParams);
+    }
+
+
+    /**
+     * 作为供应商,查看平台开放招标单(全部)
+     *
+     * @param params 分页参数
+     * @return 招标单Spage
+     */
+    @RequestMapping(value = "/open", method = RequestMethod.GET)
+    @ResponseBody
+    public SPage<PurchaseTender> getAllOpenTenders(PageParams params, String searchFilter) {
+        JSONObject jsonObject = JSONObject.parseObject(searchFilter);
+        String keyword = jsonObject.getString("keyword");
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("pt_id", false, Sort.Type.LONG, 1L));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        pageParams.getFilters().put("pt_ispublish", Constant.YES);
+        pageParams.getFilters().put("pt_ifopen", Constant.YES);
+        return searchService.searchOpenPurcTenderIds(keyword, pageParams);
+    }
+
+
+
+    /**
+     * 作为采购方,查看发出的招标单
+     *
+     * @param params
+     * @return
+     */
+    @RequestMapping(value = "/purc", method = RequestMethod.GET)
+    @ResponseBody
+    public SPage<PurchaseTender> getMyAllTenders(PageParams params, String searchFilter) {
+        JSONObject jsonObject = JSONObject.parseObject(searchFilter);
+        String keyword = jsonObject.getString("keyword");
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 当前登录企业作为客户
+        SearchFilter filter = userService.distribute();
+        if (filter != null && filter.getDistribute() == null) {
+            return null;
+        }
+        buildFilter(filter, pageParams);
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("pt_id", false, Sort.Type.LONG, 1L));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        pageParams.getFilters().put("pt_enuu", SystemSession.getUser().getEnterprise().getUu());
+        return searchService.searchPurcTenderIds(keyword, pageParams);
+    }
+
+    /**
+     * filter处理
+     *
+     * @param filter     拦截器
+     * @param pageParams 分页参数
+     */
+    private void buildFilter(SearchFilter filter, com.uas.search.b2b.model.PageParams pageParams) {
+        if (filter != null && !CollectionUtils.isEmpty(filter.getDistribute())) {
+            List<Object> list = new ArrayList<>();
+            list.addAll(filter.getDistribute());
+            pageParams.getFilters().put("pti_venduu", new MultiValue(list, true));
+        }
+    }
+
+    /**
+     * 作为采购方,查看发出的招标单(待评标)
+     *
+     * @param params
+     * @return
+     */
+    @RequestMapping(value = "/purc/done", method = RequestMethod.GET)
+    @ResponseBody
+    public SPage<PurchaseTender> getMyDoneTenders(PageParams params, String searchFilter) {
+        JSONObject jsonObject = JSONObject.parseObject(searchFilter);
+        String keyword = jsonObject.getString("keyword");
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 当前登录企业作为客户
+        SearchFilter filter = userService.distribute();
+        if (filter != null && filter.getDistribute() == null) {
+            return null;
+        }
+        buildFilter(filter, pageParams);
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("pt_id", false, Sort.Type.LONG, 1L));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        pageParams.getFilters().put("pt_enuu", SystemSession.getUser().getEnterprise().getUu());
+        pageParams.getFilters().put("pt_ispublish", Constant.YES);
+        pageParams.getFilters().put("pt_status", "待评标");
+        pageParams.getFilters().put("pt_overdue", Constant.YES);
+        pageParams.getFilters().put("pt_result", Constant.NO);
+        return searchService.searchPurcTenderIds(keyword, pageParams);
+    }
+
+    /**
+     * 作为采购方,查看发出的招标单(待投标)
+     *
+     * @param params 参数
+     * @return 单据
+     */
+    @RequestMapping(value = "/purc/todo", method = RequestMethod.GET)
+    @ResponseBody
+    public SPage<PurchaseTender> getMyTodoTenders(PageParams params, String searchFilter) {
+        JSONObject jsonObject = JSONObject.parseObject(searchFilter);
+        String keyword = jsonObject.getString("keyword");
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 当前登录企业作为客户
+        SearchFilter filter = userService.distribute();
+        if (filter != null && filter.getDistribute() == null) {
+            return null;
+        }
+        buildFilter(filter, pageParams);
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("pt_id", false, Sort.Type.LONG, 1L));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        pageParams.getFilters().put("pt_enuu", SystemSession.getUser().getEnterprise().getUu());
+        pageParams.getFilters().put("pt_ispublish", Constant.YES);
+        pageParams.getFilters().put("pt_overdue", Constant.NO);
+        return searchService.searchPurcTenderIds(keyword, pageParams);
+    }
+
+
+    /**
+     * 作为客户,查看发出的招标单(待发布)
+     *
+     * @param params       参数
+     * @param searchFilter 搜索参数
+     */
+    @RequestMapping(value = "/purc/waiting", method = RequestMethod.GET)
+    @ResponseBody
+    public SPage<PurchaseTender> getWaitingPTenders(PageParams params, String searchFilter) {
+        JSONObject jsonObject = JSONObject.parseObject(searchFilter);
+        String keyword = jsonObject.getString("keyword");
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 当前登录企业作为客户
+
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("pt_id", false, Sort.Type.LONG, 1L));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        pageParams.getFilters().put("pt_enuu", SystemSession.getUser().getEnterprise().getUu());
+        SearchFilter filter = userService.distribute();
+        if (filter != null && filter.getDistribute() == null) {
+            return null;
+        }
+        buildFilter(filter, pageParams);
+        pageParams.getFilters().put("pt_ispublish", Constant.NO);
+        pageParams.getFilters().put("pt_status", "待发布");
+        return searchService.searchPurcTenderIds(keyword, pageParams);
+    }
+
+    /**
+     * 招标附件上传
+     *
+     * @return attach
+     */
+    @RequestMapping(value = "/addTenderAttach", method = RequestMethod.POST)
+    @ResponseBody
+    public Attach addTenderAttaches(FileUpload uploadItem) throws Exception {
+        return tenderService.addTenderAttaches(uploadItem);
+    }
+
+    /**
+     * 投标附件上传
+     *
+     * @return attach
+     */
+    @RequestMapping(value = "/addTenderItemAttach", method = RequestMethod.POST)
+    @ResponseBody
+    public Attach addTenderItemAttaches(FileUpload uploadItem) throws Exception {
+        return tenderService.addTenderItemAttaches(uploadItem);
+    }
+
+    /**
+     * 查看最近公开招标
+     *
+     * @return 招标单List
+     */
+    @RequestMapping(value = "/latestOpenTender", method = RequestMethod.GET)
+    @ResponseBody
+    public List<PurchaseTender> getLatestOpenTender() {
+//        PageInfo info = new PageInfo(params);
+//        info.sorting("date", Direction.DESC); // 按发布日期倒序
+        return tenderService.findOpen();
+    }
+
+    /**
+     * 删除在录入的单据
+     *
+     * @param id 招标单id
+     */
+    @RequestMapping(value = "/delete", method = RequestMethod.DELETE)
+    @ResponseBody
+    public ModelMap deleteTender(Long id) {
+        return tenderService.delete(id);
+    }
+
+    /**
+     * 发布在录入单据
+     *
+     * @param tender 招标单json
+     */
+    @RequestMapping(value = "/publishSaved", method = RequestMethod.POST)
+    @ResponseBody
+    @Transactional
+    public ModelMap publishSavedTender(String tender, String vendorUUs) {
+        PurchaseTender purchaseTender = FlexJsonUtils.fromJson(tender, PurchaseTender.class);
+        if (purchaseTender.getIfOpen() == Constant.YES) {
+            return tenderService.publishSavedOpen(purchaseTender);
+        } else {
+            if (null != vendorUUs) {
+                vendorUUs = "[".concat(vendorUUs);
+                vendorUUs = vendorUUs.concat("]");
+                List<Long> vendUUs = FlexJsonUtils.fromJsonArray(vendorUUs, Long.class);
+                return tenderService.publishSaved(purchaseTender, vendUUs);
+            }
+        }
+        ModelMap map = new ModelMap();
+        map.put("success", false);
+        return map;
+    }
+
+    /**
+     * 更新在录入单据
+     *
+     * @param tender    招标单
+     * @param vendorUUs 供应商uu
+     */
+    @RequestMapping(value = "/updateSaved", method = RequestMethod.POST)
+    @ResponseBody
+    @Transactional
+    public ModelMap updateSavedTender(String tender, String vendorUUs) {
+        PurchaseTender purchaseTender = FlexJsonUtils.fromJson(tender, PurchaseTender.class);
+        if (purchaseTender.getIfOpen() == Constant.YES) { // 开放时进另外的方法
+            return tenderService.updateSavedOpen(purchaseTender);
+        } else {
+            if (null != vendorUUs) {
+                vendorUUs = "[".concat(vendorUUs);
+                vendorUUs = vendorUUs.concat("]");
+                List<Long> vendUUs = FlexJsonUtils.fromJsonArray(vendorUUs, Long.class);
+                return tenderService.updateSaved(purchaseTender, vendUUs);
+            }
+        }
+        ModelMap map = new ModelMap();
+        map.put("success", false);
+        return map;
+    }
+
+    /**
+     * 删除对应产品明细
+     *
+     * @param tenderProdId 招标产品明细id
+     */
+    @RequestMapping(value = "/deleteProd", method = RequestMethod.POST)
+    @ResponseBody
+    public ResponseEntity<String> deleteProd(Long tenderProdId) {
+        tenderService.deleteProd(tenderProdId);
+        return new ResponseEntity<String>(HttpStatus.OK);
+    }
+
+    /**
+     * 删除对应供应商投标单
+     *
+     * @param id     招标单id
+     * @param vendUU 删除的投标单的供应商UU
+     */
+    @RequestMapping(value = "/removeSaleTender", method = RequestMethod.POST)
+    @ResponseBody
+    public ResponseEntity<String> removeSaleTender(Long id, Long vendUU) {
+        tenderService.removeSaleTender(id, vendUU);
+        return new ResponseEntity<String>(HttpStatus.OK);
+    }
+
+    /**
+     * 删除单个附件
+     *
+     * @param attachId 附件id
+     */
+    @RequestMapping(value = "/removeAttach", method = RequestMethod.POST)
+    public void deleteAttach(Long attachId) {
+        tenderService.deleteAttach(attachId);
+    }
+
+}

+ 140 - 0
src/main/java/com/uas/platform/b2b/erp/service/TenderService.java

@@ -0,0 +1,140 @@
+package com.uas.platform.b2b.erp.service;
+
+import com.uas.platform.b2b.model.*;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.ui.ModelMap;
+
+import java.util.List;
+
+/**
+ * Created by dongbw on 17/03/07 14:15.
+ */
+public interface TenderService {
+
+    /**
+     * 保存招标单
+     *
+     * @param tender
+     * @return
+     */
+    ModelMap save(PurchaseTender tender, List<Long> vendUUs);
+
+    /**
+     * 发布招标单
+     *
+     * @param tender
+     * @return
+     */
+    ModelMap publish(PurchaseTender tender, List<Long> vendUUs);
+
+    /**
+     * 投标
+     *
+     *
+     * @param tenderItems
+     * @param enBaseInfo
+     * @return
+     */
+    void reply(List<SaleTenderItem> tenderItems, EnterpriseBaseInfo enBaseInfo, List<Attach> attaches);
+
+    /**
+     * 采购方定标操作
+     *
+     * @param purchaseTender
+     * @return
+     */
+    void decide(PurchaseTender purchaseTender);
+
+    /**
+     * 根据id获取招标单
+     *
+     * @param bidId
+     * @return
+     */
+    PurchaseTender findById(Long bidId);
+
+
+    ModelMap publishOpen(PurchaseTender purchaseTender);
+    /**
+     *  保存公开招标单
+     * @param purchaseTender
+     */
+    ModelMap saveOpen(PurchaseTender purchaseTender);
+
+    Attach addTenderAttaches(FileUpload uploadItem) throws Exception;
+
+    Attach addTenderItemAttaches(FileUpload uploadItem) throws Exception;
+
+    /**
+     *  获取最近指定招标
+     *
+     * @return
+     */
+    List<PurchaseTender> findAll();
+
+    List<PurchaseTender> findOpen();
+
+    /**
+     *  删除指定id招标单
+     * @param id
+     */
+    ModelMap delete(Long id);
+
+    /**
+     * 根据id删除单个附件
+     *
+     * @param attachId
+     */
+    void deleteAttach(Long attachId);
+
+    ModelMap releaseByWorkbook(Workbook workbook);
+
+    /**
+     * 公开招标单转投标单操作
+     *
+     * @param id
+     * @return
+     */
+    ModelMap addTenderItemById(Long id);
+
+    /**
+     *  发布已保存单据
+     * @param purchaseTender
+     * @param vendUUs
+     */
+    ModelMap publishSaved(PurchaseTender purchaseTender, List<Long> vendUUs);
+
+    /**
+     *  发布已保存单据为公开招标
+     * @param purchaseTender
+     */
+    ModelMap publishSavedOpen(PurchaseTender purchaseTender);
+
+    /**
+     *  更新已保存单据
+     * @param purchaseTender
+     * @param vendUUs
+     */
+    ModelMap updateSaved(PurchaseTender purchaseTender, List<Long> vendUUs);
+
+    /**
+     *  更新已保存单据为公开
+     * @param purchaseTender
+     */
+    ModelMap updateSavedOpen(PurchaseTender purchaseTender);
+
+    /**
+     *  删除产品明细
+     * @param tenderProdId
+     */
+    void deleteProd(Long tenderProdId);
+
+    /**
+     * 删除对应供应商的
+     * @param id
+     * @param vendUU
+     */
+    void removeSaleTender(Long id, Long vendUU);
+
+
+}

+ 609 - 0
src/main/java/com/uas/platform/b2b/erp/service/impl/TenderServiceImpl.java

@@ -0,0 +1,609 @@
+package com.uas.platform.b2b.erp.service.impl;
+
+import com.uas.platform.b2b.dao.*;
+import com.uas.platform.b2b.erp.service.TenderService;
+import com.uas.platform.b2b.model.*;
+import com.uas.platform.b2b.service.AttachService;
+import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.b2b.temporary.model.PurcTenderProd;
+import com.uas.platform.core.model.Constant;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.ModelMap;
+import org.springframework.util.CollectionUtils;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.*;
+
+/**
+ * Created by dongbw on 17/03/07 14:16.
+ */
+@Service
+public class TenderServiceImpl implements TenderService {
+
+    @Autowired
+    private PurchaseTenderDao purchaseTenderDao;
+
+    @Autowired
+    private PurchaseTenderProdDao purchaseTenderProdDao;
+
+    @Autowired
+    private SaleTenderDao saleTenderDao;
+
+    @Autowired
+    private SaleTenderItemDao saleTenderItemDao;
+
+    @Autowired
+    private AttachDao attachDao;
+
+    @Autowired
+    private AttachService attachService;
+
+    @Autowired
+    private EnterpriseDao enterpriseDao;
+
+    @Autowired
+    private EnterpriseBaseInfoDao enterpriseBaseInfoDao;
+
+    @Autowired
+    private CommonDao commonDao;
+
+    /**
+     * 保存招标单
+     *
+     * @param tender
+     * @return
+     */
+    @Override
+    public ModelMap save(PurchaseTender tender, List<Long> vendUUs) {
+        tender.setIsPublish(Constant.NO);
+        tender.setStatus("待发布");
+        tender.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+        tender.setEnterprise(SystemSession.getUser().getEnterprise());
+        return saveTenderItem(tender, vendUUs);
+    }
+
+    /**
+     * 发布招标单
+     *
+     * @param tender
+     * @return
+     */
+    @Override
+    public ModelMap publish(PurchaseTender tender, List<Long> vendUUs) {
+        tender.setIsPublish(Constant.YES);
+        tender.setStatus("待投标");
+        tender.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+        tender.setEnterprise(SystemSession.getUser().getEnterprise());
+        return saveTenderItem(tender, vendUUs);
+    }
+
+    private ModelMap saveTenderItem(PurchaseTender tender, List<Long> vendUUs) {
+        Set<PurchaseTenderProd> tenderProds = tender.getPurchaseTenderProds();
+        for (PurchaseTenderProd tenderProd : tenderProds) {
+            tenderProd.setTender(tender);
+            purchaseTenderProdDao.save(tenderProd);
+            addSaleTender(tender, vendUUs, tenderProd);
+        }
+        ModelMap map = new ModelMap();
+        map.put("id", tender.getId());
+        map.put("code", tender.getCode());
+        return map;
+    }
+
+    @Override
+    public ModelMap publishOpen(PurchaseTender tender) {
+        tender.setIsPublish(Constant.YES);
+        tender.setStatus("待投标");
+        tender.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+        purchaseTenderDao.save(tender);
+        Set<PurchaseTenderProd> tenderProds = tender.getPurchaseTenderProds();
+        for (PurchaseTenderProd tenderProd : tenderProds) {
+            tenderProd.setTender(tender);
+            purchaseTenderProdDao.save(tenderProd);
+        }
+        ModelMap map = new ModelMap();
+        map.put("id", tender.getId());
+        map.put("code", tender.getCode());
+        return map;
+    }
+
+    @Override
+    public ModelMap saveOpen(PurchaseTender tender) {
+        tender.setIsPublish(Constant.NO);
+        tender.setStatus("待发布");
+        tender.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+        purchaseTenderDao.save(tender);
+        Set<PurchaseTenderProd> tenderProds = tender.getPurchaseTenderProds();
+        for (PurchaseTenderProd tenderProd : tenderProds) {
+            tenderProd.setTender(tender);
+            purchaseTenderProdDao.save(tenderProd);
+        }
+        ModelMap map = new ModelMap();
+        map.put("id", tender.getId());
+        map.put("code", tender.getCode());
+        return map;
+    }
+
+    @Override
+    public Attach addTenderAttaches(FileUpload uploadItem) throws Exception {
+        if (uploadItem.getFile() == null) {
+            throw new Exception("没有附件");
+        }
+        Attach attach = attachService.upload(uploadItem, "purchaseTenderAttaches", "招标附件");
+        if (attach == null) {
+            throw new Exception("文件太大");
+        }
+        return attachDao.save(attach);
+    }
+
+    @Override
+    public Attach addTenderItemAttaches(FileUpload uploadItem) throws Exception {
+        if (uploadItem.getFile() == null) {
+            throw new Exception("没有附件");
+        }
+        Attach attach = attachService.upload(uploadItem, "saleTenderAttaches", "投标附件");
+        if (attach == null) {
+            throw new Exception("文件太大");
+        }
+        return attachDao.save(attach);
+    }
+
+    @Override
+    public List<PurchaseTender> findAll() {
+        List<SaleTender> saleTenders = saleTenderDao.findAll(new Specification<SaleTender>() {
+            @Override
+            public Predicate toPredicate(Root<SaleTender> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                // 根据供应商企业uu为本企业uu筛选
+                Predicate myTender = cb.equal(root.get("enterpriseBaseInfo").get("uu"), SystemSession.getUser().getEnterprise().getUu());
+                query.where(myTender);
+                return query.getRestriction();
+            }
+        });
+        List<PurchaseTender> tenderList = new ArrayList<>();
+        for (SaleTender saleTender : saleTenders) {
+            // 理论上根据企业uu和单号可以找到唯一单据,防止数据出错,取list第一个
+            PurchaseTender purchaseTender = purchaseTenderDao.findByEnUUAndCode(saleTender.getEnUU(), saleTender.getCode()).get(0);
+            if (purchaseTender.getIfOpen() == Constant.NO && purchaseTender.getIsPublish() == Constant.YES && purchaseTender.getStatus().equals("待投标")) { //显示发布的待投标状态的指定招标
+                tenderList.add(purchaseTender);
+            }
+        }
+        return tenderList;
+    }
+
+    @Override
+    public List<PurchaseTender> findOpen() {
+        return purchaseTenderDao.findAll(new Specification<PurchaseTender>() {
+
+            public Predicate toPredicate(Root<PurchaseTender> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+                Predicate p1 = builder.equal(root.get("ifOpen"), Constant.YES);
+                Predicate p2 = builder.equal(root.get("isPublish"), Constant.YES);
+                Predicate p3 = builder.notEqual(root.get("enUU"), SystemSession.getUser().getEnterprise().getUu());
+                Predicate p4 = builder.equal(root.get("overdue"), Constant.NO);
+                Predicate p5 = builder.equal(root.get("status"), "待投标");
+                Predicate predicate = builder.and(p1, p2, p3, p4, p5);
+                query.where(predicate);
+                return null;
+            }
+        });
+    }
+
+    @Override
+    public ModelMap delete(Long id) {
+        PurchaseTender tender = purchaseTenderDao.findOne(id);
+        if (null != tender) {
+            List<SaleTender> saleTenders = saleTenderDao.findByEnUUAndCode(tender.getEnUU(), tender.getCode());
+            if (!CollectionUtils.isEmpty(saleTenders)) {
+                for (SaleTender saleTender : saleTenders) {
+                    if (!CollectionUtils.isEmpty(saleTender.getSaleTenderItems())) {
+                        for (SaleTenderItem saleTenderItem : saleTender.getSaleTenderItems()) {
+                            SaleTenderItem oldItem = saleTenderItemDao.findOne(saleTenderItem.getId());
+                            if (oldItem != null) {
+                                saleTenderItemDao.delete(oldItem);
+                            }
+                        }
+                    }
+                    SaleTender oldSaleTender = saleTenderDao.findOne(saleTender.getId());
+                    if (oldSaleTender != null) {
+                        saleTenderDao.delete(oldSaleTender);
+                    }
+                }
+            }
+            if (!CollectionUtils.isEmpty(tender.getPurchaseTenderProds())) {
+                for (PurchaseTenderProd tenderProd : tender.getPurchaseTenderProds()) {
+                    PurchaseTenderProd oldtenderProd = purchaseTenderProdDao.findOne(tenderProd.getId());
+                    if (oldtenderProd != null) {
+                        purchaseTenderProdDao.delete(oldtenderProd);
+                    }
+                }
+            }
+            PurchaseTender oldTender = purchaseTenderDao.findOne(tender.getId());
+            if (oldTender != null) {
+                purchaseTenderDao.delete(oldTender);
+            }
+        }
+        ModelMap map = new ModelMap();
+        map.put("success", true);
+        return map;
+    }
+
+    @Override
+    public void deleteAttach(Long attachId) {
+        Attach attach = attachDao.findOne(attachId);
+        if (attach != null) {
+            attachDao.delete(attach);
+        }
+    }
+
+    @Override
+    public ModelMap releaseByWorkbook(Workbook workbook) {
+        ModelMap modelMap = new ModelMap();
+        List<String> alters = new ArrayList<String>();
+        List<PurcTenderProd> tenderProds = new ArrayList<PurcTenderProd>();
+        Sheet sheet = workbook.getSheetAt(0);
+        int rowNum = sheet.getLastRowNum();
+        Row headerRow = sheet.getRow(0);
+        int total = 0;
+        if (headerRow != null) {
+            for (int r = 3; r <= rowNum; r++) {
+                Row row = sheet.getRow(r);
+                if (row != null && row.getCell(0) != null && row.getCell(1).getCellType() != Cell.CELL_TYPE_BLANK) {
+                    total++;
+                    PurcTenderProd info = new PurcTenderProd();
+                    // 商品名称
+                    if (row.getCell(0) != null) {
+                        row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
+                        info.setProdTitle(row.getCell(0).getStringCellValue().trim());
+                    }
+
+                    // 型号
+                    if (row.getCell(1) != null) {
+                        row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
+                        info.setProdCode(row.getCell(1).getStringCellValue().trim());
+                    }
+
+                    // 品牌
+                    if (row.getCell(2) != null) {
+                        row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
+                        info.setBrand(row.getCell(2).getStringCellValue().trim());
+                    }
+
+                    // 单位
+                    if (row.getCell(3) != null) {
+                        row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
+                        info.setUnit(row.getCell(3).getStringCellValue().trim());
+                    }
+
+                    // 采购数量
+                    if (row.getCell(4) != null) {
+                        row.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
+                        info.setQty(Integer.valueOf(row.getCell(4).getStringCellValue()));
+                    }
+
+                    if (info.getProdTitle() != null && info.getQty() != null && info.getProdCode() != null) {
+                        modelMap.put("total", total);
+                        modelMap.put("success", total - alters.size());
+                        tenderProds.add(info);
+                        modelMap.put("items", tenderProds);
+                    }
+                }
+            }
+        }
+        return modelMap;
+    }
+
+
+    @Override
+    public PurchaseTender findById(Long id) {
+        return purchaseTenderDao.findOne(id);
+    }
+
+    /**
+     * 公开招标单转投标单
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public ModelMap addTenderItemById(Long id) {
+        PurchaseTender tender = purchaseTenderDao.findOne(id);
+        SaleTender saleTender = new SaleTender();
+        for (PurchaseTenderProd tenderProd : tender.getPurchaseTenderProds()) {
+            Long vendUU = SystemSession.getUser().getEnterprise().getUu();
+            EnterpriseBaseInfo enBaseInfo = enterpriseBaseInfoDao.findOne(vendUU);
+            if (null == enBaseInfo) {
+                Enterprise enterprise = enterpriseDao.findOne(vendUU);
+                enBaseInfo = new EnterpriseBaseInfo(enterprise.getUu(), enterprise.getEnBussinessCode(), enterprise.getEnName(), enterprise.getEnAddress());
+                enterpriseBaseInfoDao.save(enBaseInfo);
+            }
+            SaleTenderItem tenderItem = new SaleTenderItem();
+            // 找不到投标单主表才新建一个
+            if (tender.getEnUU() != null && tender.getCode() != null) {
+                saleTender = saleTenderDao.findByEnUUAndVendUUAndCode(tender.getEnUU(), vendUU, tender.getCode());
+                if (null == saleTender) { // 不存在投标单说明未转投标单,进行新增投标单操作
+                    saleTender = new SaleTender(tender);
+                    saleTender.setVendUU(vendUU);
+//                    saleTender.setEnterpriseBaseInfo(enBaseInfo); // 投标单主表构造完毕
+                    saleTenderDao.save(saleTender);
+                }
+                tenderItem.setSaleTender(saleTender);
+                tenderItem.setTenderProd(tenderProd);
+                saleTenderItemDao.save(tenderItem);
+            }
+        }
+        tender.setModified(new Date());
+        purchaseTenderDao.save(tender);
+        ModelMap map = new ModelMap();
+        map.put("id", saleTender.getId());
+        map.put("code", saleTender.getCode());
+        return map;
+    }
+
+    /**
+     * 发布已保存单据
+     *
+     * @param purchaseTender
+     * @param vendUUs
+     */
+    @Override
+    public ModelMap publishSaved(PurchaseTender purchaseTender, List<Long> vendUUs) {
+        return publishOrSave(purchaseTender, vendUUs, true, false);
+    }
+
+    /**
+     * 发布已保存单据为公开招标
+     *
+     * @param purchaseTender
+     */
+    @Override
+    public ModelMap publishSavedOpen(PurchaseTender purchaseTender) {
+        return publishOrSave(purchaseTender, null, true, true);
+    }
+
+    /**
+     * 更新已保存单据
+     *
+     * @param purchaseTender
+     * @param vendUUs
+     */
+    @Override
+    public ModelMap updateSaved(PurchaseTender purchaseTender, List<Long> vendUUs) {
+        return publishOrSave(purchaseTender, vendUUs, false, false);
+    }
+
+    /**
+     * 更新已保存单据为公开
+     *
+     * @param purchaseTender
+     */
+    @Override
+    public ModelMap updateSavedOpen(PurchaseTender purchaseTender) {
+        return publishOrSave(purchaseTender, null, false, true);
+    }
+
+    /**
+     * 发布或保存方法(针对保存的单据)
+     *
+     * @param purchaseTender
+     * @param vendUUs
+     * @param isPublish
+     * @param ifOpen
+     */
+    private ModelMap publishOrSave(PurchaseTender purchaseTender, List<Long> vendUUs, boolean isPublish, boolean ifOpen) {
+        PurchaseTender oldTender = purchaseTenderDao.findOne(purchaseTender.getId());
+        ModelMap map = new ModelMap();
+        if (null != oldTender) {
+            if (isPublish) {
+                oldTender.setIsPublish(Constant.YES);
+                oldTender.setStatus("待投标");
+            } else {
+                oldTender.setIsPublish(Constant.NO);
+            }
+            if (ifOpen) {
+                oldTender.setIfOpen(Constant.YES);
+            } else {
+                oldTender.setIfOpen(Constant.NO);
+            }
+            oldTender.setModified(new Date());
+            if (null != purchaseTender.getCertificate()) {
+                oldTender.setCertificate(purchaseTender.getCertificate());
+            } else {
+                oldTender.setCertificate("");
+            }
+            oldTender.setCurrency(purchaseTender.getCurrency());
+            oldTender.setEndDate(purchaseTender.getEndDate());
+            oldTender.setPublishDate(purchaseTender.getPublishDate());
+            oldTender.setIfTax(purchaseTender.getIfTax());
+            oldTender.setInvoiceType(purchaseTender.getInvoiceType());
+            oldTender.setPayment(purchaseTender.getPayment());
+            oldTender.setShipAddress(purchaseTender.getShipAddress());
+            oldTender.setTitle(purchaseTender.getTitle());
+            oldTender.setUser(purchaseTender.getUser());
+            oldTender.setUserTel(purchaseTender.getUserTel());
+            oldTender.setTenderAttaches(purchaseTender.getTenderAttaches());
+            purchaseTenderDao.save(oldTender);
+            // 先清除掉所有存在的投标单
+            List<SaleTender> oldSaleTenders = saleTenderDao.findByEnUUAndCode(oldTender.getEnUU(), oldTender.getCode());
+            for (SaleTender saleTender : oldSaleTenders) {
+                for (SaleTenderItem saleTenderItem : saleTender.getSaleTenderItems()) {
+                    saleTenderItemDao.delete(saleTenderItem.getId());
+                }
+                saleTenderDao.delete(saleTender.getId());
+            }
+            // 新的招标产品明细
+            Set<PurchaseTenderProd> tenderProds = purchaseTender.getPurchaseTenderProds();
+            for (PurchaseTenderProd tenderProd : tenderProds) {
+                if (tenderProd.getId() != null) { // 存在id的是修改的
+                    PurchaseTenderProd oldTenderProd = purchaseTenderProdDao.findOne(tenderProd.getId());
+                    oldTenderProd.setBrand(tenderProd.getBrand());
+                    oldTenderProd.setProdCode(tenderProd.getProdCode());
+                    oldTenderProd.setProdTitle(tenderProd.getProdTitle());
+                    oldTenderProd.setUnit(tenderProd.getUnit());
+                    oldTenderProd.setQty(tenderProd.getQty());
+                    Set<SaleTenderItem> saleTenderItems = new HashSet<>();
+                    oldTenderProd.setSaleTenderItems(saleTenderItems);
+                    purchaseTenderProdDao.save(oldTenderProd);
+                } else { // 新增的
+                    tenderProd.setTender(oldTender);
+                    purchaseTenderProdDao.save(tenderProd);
+                }
+                if (!ifOpen) { // 指定招标的增加招标单
+                    addSaleTender(oldTender, vendUUs, tenderProd);
+                }
+            }
+            map.put("id", oldTender.getId());
+            map.put("code", oldTender.getCode());
+            return map;
+        }
+        map.put("success", false);
+        return map;
+    }
+
+    /**
+     * 根据供应商信息和招标单新增投标单
+     *
+     * @param tender
+     * @param vendUUs
+     * @param tenderProd
+     */
+    private void addSaleTender(PurchaseTender tender, List<Long> vendUUs, PurchaseTenderProd tenderProd) {
+        List<Enterprise> vendors = new ArrayList<>();
+        for (Long vendUU : vendUUs) {
+            Enterprise vendor = enterpriseDao.findOne(vendUU);
+            vendors.add(vendor);
+        }
+        for (Enterprise enterprise : vendors) {
+            EnterpriseBaseInfo enBaseInfo = enterpriseBaseInfoDao.findOne(enterprise.getUu());
+            if (null == enBaseInfo) {
+                enBaseInfo = new EnterpriseBaseInfo(enterprise.getUu(), enterprise.getEnBussinessCode(), enterprise.getEnName(), enterprise.getEnAddress());
+            }
+            SaleTenderItem tenderItem = new SaleTenderItem();
+            // 找不到投标单主表才新建一个,确保只有一个投标单
+            if (tender.getEnUU() != null && enBaseInfo.getUu() != null && tender.getCode() != null) {
+                SaleTender saleTender = saleTenderDao.findByEnUUAndVendUUAndCode(tender.getEnUU(), enBaseInfo.getUu(), tender.getCode());
+                if (null == saleTender) {
+                    saleTender = new SaleTender(tender);
+                    saleTender.setVendUU(enBaseInfo.getUu());
+                    saleTender.setEnterpriseBaseInfo(enBaseInfo); // 投标单主表构造完毕
+                    saleTenderDao.save(saleTender);
+                }
+                tenderItem.setSaleTender(saleTender);
+            }
+            tenderItem.setTenderProd(tenderProd);
+            saleTenderItemDao.save(tenderItem);
+        }
+    }
+
+
+    /**
+     * 删除产品明细
+     *
+     * @param tenderProdId
+     */
+    @Override
+    public void deleteProd(Long tenderProdId) {
+        PurchaseTenderProd tenderProd = purchaseTenderProdDao.findOne(tenderProdId);
+        if (null != tenderProd) {
+            for (SaleTenderItem saleTenderItem : tenderProd.getSaleTenderItems()) {
+                saleTenderItemDao.delete(saleTenderItem.getId());
+            }
+            purchaseTenderProdDao.delete(tenderProd.getId());
+        }
+    }
+
+    /**
+     * 删除对应供应商的投标单
+     *
+     * @param id
+     * @param vendUU
+     */
+    @Override
+    public void removeSaleTender(Long id, Long vendUU) {
+        PurchaseTender purchaseTender = purchaseTenderDao.findOne(id);
+        if (purchaseTender != null) {
+            SaleTender saleTender = saleTenderDao.findByEnUUAndVendUUAndCode(purchaseTender.getEnUU(), vendUU, purchaseTender.getCode());
+            if (saleTender != null) {
+                for (SaleTenderItem saleTenderItem : saleTender.getSaleTenderItems()) {
+                    saleTenderItemDao.delete(saleTenderItem.getId());
+                }
+                SaleTender oldSaleTender = saleTenderDao.findOne(saleTender.getId());
+                if (oldSaleTender != null) {
+                    saleTenderDao.delete(oldSaleTender);
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 投标
+     *
+     * @param tenderItems
+     * @param enBaseInfo
+     * @return
+     */
+    @Override
+    public void reply(List<SaleTenderItem> tenderItems, EnterpriseBaseInfo enBaseInfo, List<Attach> attaches) {
+        enterpriseBaseInfoDao.save(enBaseInfo);
+        SaleTenderItem item = saleTenderItemDao.findOne(tenderItems.get(0).getId());
+        SaleTender saleTender = item.getSaleTender();
+        saleTender.setStatus("已投标");
+        Set<Attach> attachSet = new HashSet<>();
+        attachSet.addAll(attaches);
+        saleTender.setBidAttaches(attachSet);
+        saleTenderDao.save(saleTender);
+        for (SaleTenderItem tenderItem : tenderItems) {
+            SaleTenderItem saleTenderItem = saleTenderItemDao.findOne(tenderItem.getId());
+            // 需要修改见索引主表中的字段来触发索引更新
+            saleTenderItem.getTenderProd().getTender().setModified(new Date());
+            saleTenderItem.getTenderProd().getTender().setStatus("待评标");
+            saleTenderItem.setPrice(tenderItem.getPrice());
+            saleTenderItem.setTaxrate(tenderItem.getTaxrate());
+            saleTenderItem.setCycle(tenderItem.getCycle());
+            saleTenderItemDao.save(saleTenderItem);
+        }
+
+    }
+
+
+    /**
+     * 采购方定标操作
+     *
+     * @param purchaseTender
+     * @return
+     */
+    @Override
+    public void decide(PurchaseTender purchaseTender) {
+        boolean isApply = false;
+        for (PurchaseTenderProd tenderProd : purchaseTender.getPurchaseTenderProds()) {
+            for (SaleTenderItem tenderItem : tenderProd.getSaleTenderItems()) {
+                if (tenderItem.getApplyStatus() != null && tenderItem.getApplyStatus() == Constant.YES) {
+                    isApply = true; // 只要有定标的明细,就确认状态为已结标
+                }
+            }
+        }
+        if (isApply) {
+            purchaseTender.setStatus("已结标");
+        } else {
+            purchaseTender.setStatus("流标");
+        }
+        for (PurchaseTenderProd tenderProd : purchaseTender.getPurchaseTenderProds()) {
+            tenderProd.setTender(purchaseTender);
+            purchaseTenderProdDao.save(tenderProd);
+            for (SaleTenderItem tenderItem : tenderProd.getSaleTenderItems()) {
+                tenderItem.setTenderProd(tenderProd);
+                saleTenderItemDao.save(tenderItem);
+            }
+        }
+    }
+
+}
+