package com.uas.ps.inquiry.service.impl; import com.uas.ps.core.util.CollectionUtils; import com.uas.ps.entity.Product; import com.uas.ps.inquiry.dao.*; 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 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.ui.ModelMap; 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; /** * 查询公共询价列表信息 * * @param info 分页新 * @param filter 过滤条件 * @param state 过滤状态 * @return */ @Override public Page findTodoByPageInfo(final PageInfo info, SearchFilter filter, String state) { 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); } } 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); 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); } purcInquiryItemDao.save(items); } 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); } /** * 针对客户,查询供应商报价详情 * * @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()) { idList.add(item.getProductId()); ids.addAll(idList); } } 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(); 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(productInfo.getCmpCode()); productInfo.setInquiryItems(new HashSet(items)); } return productInfo; } }