package com.uas.ps.inquiry.service.impl; import com.uas.ps.core.util.CollectionUtils; import com.uas.ps.entity.Product; import com.uas.ps.entity.Status; import com.uas.ps.inquiry.dao.*; import com.uas.ps.inquiry.domain.IPage; import com.uas.ps.inquiry.entity.Constant; import com.uas.ps.inquiry.entity.InquiryDetailInfo; import com.uas.ps.inquiry.entity.InquiryProductInfo; import com.uas.ps.inquiry.entity.OrderStatus; import com.uas.ps.inquiry.model.*; import com.uas.ps.inquiry.page.PageInfo; import com.uas.ps.inquiry.page.SearchFilter; import com.uas.ps.inquiry.page.criteria.CriterionExpression; import com.uas.ps.inquiry.page.criteria.LogicalExpression; import com.uas.ps.inquiry.page.criteria.PredicateUtils; import com.uas.ps.inquiry.page.criteria.SimpleExpression; import com.uas.ps.inquiry.page.exception.IllegalOperatorException; import com.uas.ps.inquiry.service.InquiryService; import com.uas.ps.inquiry.service.PublicInquiryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; 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 hejq on 2018-01-17. */ @Service public class InquiryServiceImpl implements InquiryService { @Autowired private PublicInquiryItemDao itemDao; @Autowired private PurcInquiryItemInfoDao inquiryItemDao; @Autowired private PurcInquiryDao purcInquiryDao; @Autowired private PublicInquiryDao inquiryDao; @Autowired private ProductDao productDao; @Autowired private PurcInquiryItemDao purcInquiryItemDao; @Autowired private PublicInquiryService inquiryService; @Autowired private InquiryRemindDao inquiryRemindDao; /** * 查询公共询价列表信息 * * @param info 分页新 * @param filter 过滤条件 * @param state 过滤状态 * @param overdue 是否过期 1、已过期;0、未过期 * @return */ @Override public Page findTodoByPageInfo(final PageInfo info, SearchFilter filter, String state, Integer overdue) { if (null != filter) { if (StringUtils.hasText(filter.getKeyword())) { SimpleExpression cmpCode = new SimpleExpression("cmpCode", filter.getKeyword(), CriterionExpression.Operator.LIKE); SimpleExpression brand = new SimpleExpression("inbrand", filter.getKeyword(), CriterionExpression.Operator.LIKE); SimpleExpression code = new SimpleExpression("product.cmpCode", filter.getKeyword(), CriterionExpression.Operator.LIKE); SimpleExpression[] simpleExpressions = new SimpleExpression[]{cmpCode, brand, code}; LogicalExpression logicalExpression = PredicateUtils.or(simpleExpressions); info.expression(logicalExpression); } if (filter.getFromDate() != null) { info.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false)); } if (filter.getEndDate() != null) { info.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false)); } } if (null != state) { // 待报价 if (state.equals(OrderStatus.todo.name())) { SimpleExpression amount = new SimpleExpression("offerAmount", Constant.NO, CriterionExpression.Operator.EQ); SimpleExpression[] simpleExpressions = new SimpleExpression[]{amount}; LogicalExpression logicalExpression = PredicateUtils.and(simpleExpressions); info.expression(logicalExpression); } // 已报价 if (state.equals(OrderStatus.done.name())) { SimpleExpression amount = new SimpleExpression("offerAmount", Constant.YES, CriterionExpression.Operator.GTE); SimpleExpression[] simpleExpressions = new SimpleExpression[]{amount}; LogicalExpression logicalExpression = PredicateUtils.and(simpleExpressions); info.expression(logicalExpression); } // 已超过截止日期 if (state.equals(OrderStatus.end.name())) { SimpleExpression date = new SimpleExpression("endDate", new Date(System.currentTimeMillis()), CriterionExpression.Operator.LT); SimpleExpression[] simpleExpressions = new SimpleExpression[]{date}; LogicalExpression logicalExpression = PredicateUtils.and(simpleExpressions); info.expression(logicalExpression); } } if (null != overdue) { // 已超过截止日期 if (overdue.equals(Constant.YES)) { SimpleExpression date = new SimpleExpression("endDate", new Date(System.currentTimeMillis()), CriterionExpression.Operator.LT); SimpleExpression[] simpleExpressions = new SimpleExpression[]{date}; LogicalExpression logicalExpression = PredicateUtils.and(simpleExpressions); info.expression(logicalExpression); } } return inquiryItemDao.findAll(new Specification() { public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) { query.where(info.getPredicates(root, query, builder)); return null; } }, info); } /** * 保存公共询价 * * @param currentInquiry 询价信息 */ @Override public PurcInquiry saveInquiry(PurcInquiry currentInquiry) { PurcInquiry existInquiry = purcInquiryDao.findByCodeAndEnUU(currentInquiry.getCode(), currentInquiry.getEnUU()); if (null != existInquiry) { throw new IllegalOperatorException("单号重复"); } else { PurcInquiry inquiry = purcInquiryDao.save(currentInquiry); if (!CollectionUtils.isEmpty(currentInquiry.getInquiryItems())) { List items = new ArrayList(); for (PurcInquiryItem item : currentInquiry.getInquiryItems()) { item.setInquiry(inquiry); item.setOfferAmount(0); item.setStatus((short) Status.NOT_REPLY.value()); item.setIsOpen(Constant.YES); if (null == item.getDate()) { item.setDate(new Date(System.currentTimeMillis())); } // 这里设置物料信息的冗余字段 if (null != item.getProduct()) { item.setProdTitle(item.getProduct().getTitle()); item.setProdCode(item.getProduct().getCode()); item.setSpec(item.getProduct().getSpec()); item.setInbrand(item.getProduct().getBrand()); } items.add(item); } items = purcInquiryItemDao.save(items); // 消息推送 if (null != inquiry.getSourceapp()) { try { inquiryService.notify(items, inquiry.getSourceapp()); } catch (Exception e) { e.printStackTrace(); } } } return inquiry; } } /** * 通过报价明细id对供应商报价进行相关审核操作 * * @param id 报价明细id * @param status 状态 */ @Override public void decideQuote(Long id, Short status) { PublicInquiryItem item = itemDao.findOne(id); item.setAgreed(status); itemDao.save(item); // 更新询价推荐表相关信息 if (status.equals(Constant.YES)) { inquiryRemindDao.updateStatus(item.getSourceId(), Status.ALLOW.value(), item.getVendUU()); } else if (status.equals(Constant.NO)) { inquiryRemindDao.updateStatus(item.getSourceId(), Status.NOTALLOW.value(), item.getVendUU()); } } /** * 针对客户,查询供应商报价详情 * * @param id 主表id * @param enuu 企业UU * @return */ @Override public InquiryDetailInfo findById(Long id, Long enuu) { PublicInquiry inquiry = inquiryDao.findOne(id); InquiryDetailInfo inquiryInfo = new InquiryDetailInfo(); if (inquiry != null) { inquiryInfo.setAttachs(inquiry.getAttachs()); inquiryInfo.setAuditor(inquiry.getAuditor()); inquiryInfo.setCheck(inquiry.getCheck()); inquiryInfo.setCode(inquiry.getCode()); inquiryInfo.setDate(inquiry.getDate()); inquiryInfo.setEndDate(inquiry.getEndDate()); inquiryInfo.setEnterprise(inquiry.getEnterprise()); inquiryInfo.setEnUU(inquiry.getEnUU()); inquiryInfo.setEnvironment(inquiry.getEnvironment()); inquiryInfo.setId(inquiry.getId()); inquiryInfo.setIsOpen(inquiry.getIsOpen()); inquiryInfo.setOverdue(inquiry.getOverdue()); inquiryInfo.setPriceType(inquiry.getPriceType()); inquiryInfo.setRecorder(inquiry.getRecorder()); inquiryInfo.setRecorderUU(inquiry.getRecorderUU()); inquiryInfo.setRemark(inquiry.getRemark()); inquiryInfo.setSourceApp(inquiry.getSourceApp()); inquiryInfo.setSourceId(inquiry.getSourceId()); inquiryInfo.setShip(inquiry.getShip()); inquiryInfo.setInvoice(inquiry.getInvoice()); inquiryInfo.setInquirytype(inquiry.getInquirytype()); Set ids = new HashSet(); List idList = new ArrayList<>(); Set products = new HashSet(); if (!CollectionUtils.isEmpty(inquiry.getInquiryItems())) { for (PublicInquiryItem item : inquiry.getInquiryItems()) { if (item.getProductId() != null) { idList.add(item.getProductId()); ids.addAll(idList); } else { InquiryProductInfo productInfo = new InquiryProductInfo(); Set items = new HashSet(); productInfo.setBrand(item.getBrand()); productInfo.setSpec(item.getSpec()); productInfo.setCode(item.getProdCode()); productInfo.setTitle(item.getProdTitle()); productInfo.setUnit(item.getUnit()); productInfo.setCmpCode(item.getCmpCode()); products.add(productInfo); for (PublicInquiryItem item1 : inquiry.getInquiryItems()) { if (item1.getCmpCode() != null && item1.getCmpCode().equals(productInfo.getCmpCode())) { items.add(item1); } } productInfo.setInquiryItems(items); inquiryInfo.setProducts(products); } } } if (!CollectionUtils.isEmpty(ids)) { for (Long idInfo : ids) { InquiryProductInfo productInfo = new InquiryProductInfo(); Set items = new HashSet(); Product product = productDao.findOne(idInfo); productInfo.setBrand(product.getBrand()); productInfo.setId(product.getId()); productInfo.setSpec(product.getSpec()); productInfo.setCode(product.getCode()); productInfo.setTitle(product.getTitle()); productInfo.setUnit(product.getUnit()); for (PublicInquiryItem item : inquiry.getInquiryItems()) { if (item.getProductId().equals(idInfo)) { items.add(item); } } productInfo.setInquiryItems(items); products.add(productInfo); inquiryInfo.setProducts(products); } } } return inquiryInfo; } /** * 通过企业UU和分页信息等查询已发布信息 * * @param info 分页信息 * @param filter 过滤条件 * @return */ @Override public Page findByPageInfo(final PageInfo info, SearchFilter filter) { if (null != filter) { if (!StringUtils.isEmpty(filter.getKeyword())) { SimpleExpression code = new SimpleExpression("remark", filter.getKeyword(), CriterionExpression.Operator.LIKE); SimpleExpression[] simpleExpressions = new SimpleExpression[]{code}; LogicalExpression logicalExpression = PredicateUtils.or(simpleExpressions); info.expression(logicalExpression); } if (filter.getFromDate() != null) { info.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false)); } if (filter.getEndDate() != null) { info.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false)); } } SimpleExpression amount = new SimpleExpression("amount", Constant.YES, CriterionExpression.Operator.GT); SimpleExpression[] simpleExpressions = new SimpleExpression[]{amount}; LogicalExpression logicalExpression = PredicateUtils.and(simpleExpressions); info.expression(logicalExpression); return purcInquiryDao.findAll(new Specification() { public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) { query.where(info.getPredicates(root, query, builder)); return null; } }, info); } /** * 针对客户,查询单个物料的报价情况 * * @param id 明细id * @param enuu 当前企业UU * @return */ @Override public InquiryProductInfo findInquiryDetailById(Long id, Long enuu) { List items = itemDao.findBySourceId(id); InquiryProductInfo productInfo = new InquiryProductInfo(); if (!CollectionUtils.isEmpty(items)) { Long prId = items.get(0).getProductId(); if (null != prId) { Product product = productDao.findOne(prId); productInfo.setBrand(product.getBrand()); productInfo.setCode(product.getCode()); productInfo.setTitle(product.getTitle()); productInfo.setSpec(product.getSpec()); productInfo.setUnit(product.getUnit()); productInfo.setCmpCode(product.getCmpCode()); } else { productInfo.setCmpCode(items.get(0).getCmpCode()); productInfo.setBrand(items.get(0).getInbrand()); } productInfo.setInquiryItems(new HashSet(items)); } return productInfo; } /** * 针对客户查询供应商报价信息 * * @param pageInfo 分页信息 * @param filter 过滤条件 * @return */ @Override public Page findQuotationsByPage(final PageInfo pageInfo, final SearchFilter filter) { if (StringUtils.hasText(filter.getKeyword())) { SimpleExpression cmpCode = new SimpleExpression("cmpCode", filter.getKeyword(), CriterionExpression.Operator.LIKE); SimpleExpression offerAmount = new SimpleExpression("offerAmount", Constant.NO, CriterionExpression.Operator.GT); SimpleExpression[] simpleExpressions = new SimpleExpression[]{offerAmount, cmpCode}; LogicalExpression logicalExpression = PredicateUtils.and(simpleExpressions); pageInfo.expression(logicalExpression); } else { SimpleExpression offerAmount = new SimpleExpression("offerAmount", Constant.NO, CriterionExpression.Operator.GT); SimpleExpression[] simpleExpressions = new SimpleExpression[]{offerAmount}; LogicalExpression logicalExpression = PredicateUtils.and(simpleExpressions); pageInfo.expression(logicalExpression); } Page items = inquiryItemDao.findAll(new Specification() { public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) { query.where(pageInfo.getPredicates(root, query, builder)); return null; } }, pageInfo); if (!CollectionUtils.isEmpty(items.getContent())) { for (PurcInquiryItemInfo itemInfo : items.getContent()) { List itemList = itemDao.findBySourceId(itemInfo.getId()); itemInfo.setQutations(itemList); itemInfo.setAgreed(Constant.NO); if (!CollectionUtils.isEmpty(itemList)) { for (PublicInquiryItem i : itemList) { if (i.getAgreed() != null && i.getAgreed().equals(Constant.YES)) { itemInfo.setAgreed(Constant.YES); break; } } } } } return items; } }