package com.uas.ps.inquiry.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.uas.ps.core.util.ContextUtils;
import com.uas.ps.entity.Product;
import com.uas.ps.entity.ProductUsers;
import com.uas.ps.entity.Status;
import com.uas.ps.inquiry.AccessConfiguration;
import com.uas.ps.inquiry.dao.*;
import com.uas.ps.inquiry.domain.IPage;
import com.uas.ps.inquiry.entity.*;
import com.uas.ps.inquiry.exception.NotFoundException;
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.*;
import com.uas.ps.inquiry.page.exception.IllegalOperatorException;
import com.uas.ps.inquiry.service.PublicInquiryService;
import com.uas.ps.inquiry.util.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.http.HttpStatus;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.ModelMap;
import org.springframework.util.CollectionUtils;
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.text.SimpleDateFormat;
import java.util.*;
/**
* 公共询价接口实现
*
* Created by hejq on 2018-01-13.
*/
@Service
@Transactional
public class PublicInquiryServiceImpl implements PublicInquiryService {
@Autowired
private PublicInquiryDao publicInquiryDao;
@Autowired
private PurcInquiryDao purcInquiryDao;
@Autowired
private ProductDao productDao;
@Autowired
private PurcInquiryItemDao purcInquiryItemDao;
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private PublicInquiryReplyDao publicInquiryReplyDao;
@Autowired
private PurcInquiryItemInfoDao inquiryItemInfoDao;
@Autowired
private PublicInquiryItemInfoDao itemInfoDao;
@Autowired
private PublicInquiryItemDao publicInquiryItemDao;
@Autowired
private UserDao userDao;
@Autowired
private EnterpriseDao enterpriseDao;
@Autowired
private InquiryRemindDao remindDao;
@Autowired
private ProductReplaceDao productReplaceDao;
@Autowired
private InquiryEnRemindDao inquiryEnRemindDao;
@Autowired
private KindConcernDao kindConcernDao;
@Autowired
private InquiryDataDao inquiryDataDao;
/**
* 应用来源
*/
private final String SOURCERAPP = "B2B";
/**
* 接收应用(以","拼接应用名称)
*/
private final String CONSUMERAPP = "MALL,B2B";
/**
* 消息类型 (在B2B消息中拼接跳转单据详情url请求时需要)
*/
private final String INQUIRY_TYPE = "公共询价";
/**
* 消息类型 (在B2B消息中拼接跳转单据详情url请求时需要)
*/
private final String INQUIRY_TYPE_MALL = "MALL跳转买家已报价页面";
/**
* 消息类型 (在MALL消息中拼接求购询价待报价)
*/
private final String INQUIRY_TYPE_SELLER_MALL = "MALL公共询价";
/**
* 消息类型,公共询价的采纳结果
*/
private final String INQUIRY_DECIDE_TYPE = "公共询价采纳结果";
/**
* 消息类型,公共询价的采纳结果
*/
private final String INQUIRY_DECIDE_TYPE_MALL = "商城公共询价采纳结果";
/**
* 询价种类
*/
private final String INQUIRYKIND = "publicInquiry";
/**
* 消息推送邮件模板id
*/
private final String MAIL_TEMP_ID = "d94e931b-b699-46d7-8bb2-94604a3352c0";
/**
* 消息推送短信模板id
*/
private final String SMS_TEMP_ID = "6e094dcf-f2c7-462a-9686-b2d32d684a78";
/**
* 消息推送方式:邮件、短信、im
*/
private final String SMS_TYPE = "MAIL_AND_SM_AND_IM";
/**
* 来源应用,ERP
*/
private final String PRODUCERAPP = "ERP";
/**
* 消费类型: 多个,MULTI
*/
private final String CUST_TYPE = "MULTI";
/**
* 公共物料访问地址
*/
private final String PS_PRODUCT_URL = ContextUtils.getBean(AccessConfiguration.class).getPsProductUrl();
/**
* 公共消息访问地址
*/
private final String PS_MESSAGE_URL = ContextUtils.getBean(AccessConfiguration.class).getPsMessageUrl();
/**
* 商城链接
*/
private final String USOFTMALL_URL = ContextUtils.getBean(AccessConfiguration.class).getMallUrl();
/**
* 日志
*/
private static final Logger log = LoggerFactory.getLogger(PublicInquiryServiceImpl.class);
/**
* 保存公共询价信息
*
* @param inquiries erp传入公共询价的信息
* @param enuu 询价企业UU号
* @param address 询价企业地址
*/
@Override
public void save(List inquiries, Long enuu, String address) throws NotFoundException {
List purcInquiries = covert(inquiries, enuu, address);
if (!CollectionUtils.isEmpty(purcInquiries)) {
for (PurcInquiry inquiry : purcInquiries) {
// 判断单号是否已存在
List old = purcInquiryDao.findByCodeAndEnUU(inquiry.getCode(), enuu);
List items = new ArrayList();
if (CollectionUtils.isEmpty(old) && !CollectionUtils.isEmpty(inquiry.getInquiryItems())) {
for (PurcInquiryItem item : inquiry.getInquiryItems()) {
item.setInquiry(inquiry);
item.setValid(1);
items.add(item);
}
}
try {
items = purcInquiryItemDao.save(items);
if (!CollectionUtils.isEmpty(items)) {
final List purcInquiryItems = items;
ThreadUtils.task(new Runnable() {
@Override
public void run() {
try {
notifyMessage(purcInquiryItems, PRODUCERAPP);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 消息推送
*
* @param inquiryItems 询价明细
* @param sourceApp 消息来源应用
*/
@Override
public void notifyMessage(List inquiryItems, String sourceApp) throws Exception {
for (PurcInquiryItem item : inquiryItems) {
String cmpCode = null;
if (item.getCmpCode() != null) {
cmpCode = item.getCmpCode();
} else if (null != item.getProductId()) {
Product product = productDao.findOne(item.getProductId());
cmpCode = product.getCmpCode();
}
if (null != cmpCode) {
String url = PS_PRODUCT_URL + "/productuser/getProductUsersByEnUUAndCmpCode";
JSONObject formData = new JSONObject();
formData.put("enUU", item.getInquiry().getEnUU());
formData.put("cmpCode", cmpCode);
try {
long start = System.currentTimeMillis();
HttpUtil.Response res = HttpUtil.sendGetRequest(url, formData);
log.info("/productuser/getProductUsersByEnUUAndCmpCode,耗时:{}", (System.currentTimeMillis() - start));
if (res.getStatusCode() == 200) {
List users = FlexJsonUtils.fromJsonArray(res.getResponseText(), ProductUsers.class);
users = getProductReplaceByEnUUAndCmpCode(item.getInquiry().getRecorderUU(), cmpCode, users);
if (!CollectionUtils.isEmpty(users)) {
List models = new ArrayList();
User buyerUser = userDao.findOne(null != item.getInquiry().getRecorderUU() ? item.getInquiry().getRecorderUU() : 0L);
Enterprise buyerEnterprise = enterpriseDao.findOne(item.getInquiry().getEnUU());
for (ProductUsers user : users) {
String cmp = cmpCode.length() > 10 ? cmpCode.substring(0, 10).concat("...") : cmpCode;
String content = "发布关于“型号:" + cmp + "”的公共询价信息,邀请您参与报价。";
MessageModel model = new MessageModel();
if (null != buyerEnterprise) {
content = buyerEnterprise.getEnName() + content;
model.setBuyerName(buyerEnterprise.getEnName());
} else if (null != buyerUser) {
content = buyerUser.getUserName() + content;
model.setBuyerName(buyerUser.getUserName());
}
// 询价方信息
if (null != item.getUserUU() || null != item.getInquiry().getRecorderUU()) {
model.setSenderUu(item.getUserUU() != null ? item.getUserUU() : item.getInquiry().getRecorderUU());
} else {
model.setSenderUu(null != buyerEnterprise ? buyerEnterprise.getAdminUU() : 0L);
}
model.setSenderEnuu(item.getInquiry().getEnUU());
model.setCmpCode(cmpCode);
model.setType(INQUIRY_TYPE);
model.setType(INQUIRY_TYPE_SELLER_MALL);
model.setProducerApp(sourceApp);
model.setConsumerType(CUST_TYPE);
model.setConsumerApp(CONSUMERAPP);
model.setContent(content);
model.setRemark(String.valueOf(item.getInquiry().getId()));
model.setSourceId(item.getId());
// 供应商信息
Enterprise vendEnterprise = enterpriseDao.findOne(user.getEnuu());
if (vendEnterprise != null) {
model.setVendName(vendEnterprise.getEnName());
}
model.setReceiverEnuu(user.getEnuu());
model.setReceiverUu(user.getUseruu());
model.setSmsType("DONT_SEND");
model.setMailTemplate(MAIL_TEMP_ID);
model.setSmTemplate(SMS_TEMP_ID);
models.add(model);
// log.info("公共询价产生消息", "根据物料型号【{}】查询接收人,关联询价单明细【{}】,UserUU:{},Enuu:{},报价的应用来源:{}", cmpCode, item.getId(), user.getUseruu(), user.getEnuu(), InquirySource.ERP.name());
}
if (!CollectionUtils.isEmpty(models)) {
sendMessage(models);
sendWechatMessage(models);
}
}
// 生成推荐信息
remindInquiry(item, users);
}
} catch (Exception e) {
String reason = e.getMessage().length() > 10 ? e.getMessage().substring(0, 1000).concat("") : e.getMessage();
log.info("公共询价产生消息,根据物料型号【{}】查询接收人失败,id:{},原因:{}, Constant:{}, 报价的应用来源:{}", cmpCode, item.getId(), reason, Constant.UU, InquirySource.ERP.name());
e.printStackTrace();
}
}
}
}
/**
* 微信消息发送
* @param models
*/
private void sendWechatMessage(final List models) {
ThreadUtils.task(new Runnable() {
@Override
public void run() {
try {
long start = System.currentTimeMillis();
log.info("发送微信消息");
String res = HttpUtil.doPost(USOFTMALL_URL + "/wx/sendTemplateMessage", FlexJsonUtils.toJsonDeep(models));
log.info("微信消息请求发送日志, {}", res);
log.info("微信消息请求发送,数量:{}, 耗时:{}", models.size(), (System.currentTimeMillis() - start));
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* 根据企业UU和物料原厂型号cmpCode获取替代物料信息
*
* @param cmpCode 物料原厂型号
* @return
*/
public List getProductReplaceByEnUUAndCmpCode(final Long userUU, final String cmpCode, List productUsers) {
List productReplacesList = productReplaceDao.findAll(new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cb) {
final PredicateFactory factory = new PredicateFactory<>();
factory.add(PredicateUtils.ne("userUU", userUU, false));
factory.add(PredicateUtils.and(PredicateUtils.isNotNull("ptrCmpcode"), PredicateUtils.eq("ptrCmpcode", cmpCode, false)));
query.where(factory.toPredicate(root, query, cb));
return null;
}
});
if (!CollectionUtils.isEmpty(productReplacesList)) {
for (ProductReplace productReplace : productReplacesList) {
ProductUsers user = new ProductUsers();
user.setEnuu(productReplace.getEnuu());
user.setUseruu(productReplace.getUserUU());
productUsers.add(user);
}
}
// 去掉同一企业下同一个人相同原厂型号的不同物料的记录,保证一个原厂型号只发一条
List returnList = new ArrayList<>();
Set enUUAndUserUUs = new HashSet<>();
for (ProductUsers user : productUsers) {
String receiverInfo = user.getEnuu().toString() + user.getUseruu().toString();
if (!enUUAndUserUUs.contains(receiverInfo)) {
returnList.add(user);
enUUAndUserUUs.add(receiverInfo);
}
}
return returnList;
}
/**
* 通过查询的个人物料相关联的信息,自动生成推荐的报价的数据
*
* @param item 报价明细
* @param users 用户信息
*/
private void remindInquiry(final PurcInquiryItem item, final List users) {
ThreadUtils.task(new Runnable() {
@Override
public void run() {
try {
Map productUsersMap = new HashMap<>();
Enterprise enterprise = enterpriseDao.findOne(item.getInquiry().getEnUU());
if (!CollectionUtils.isEmpty(users)) {
List inquiryReminds = new ArrayList<>();
for (ProductUsers u : users) {
List remindList = remindDao.findByVendUserUUAndVendUUAndItemId(u.getUseruu(), u.getEnuu(), item.getId());
if (remindList.size() == 0 && item.getInquiry().getEnUU() != null) {
productUsersMap.put(u.getEnuu(), u);
InquiryRemind remind = new InquiryRemind();
remind.setEnName(enterprise.getEnName());
remind.setEnUU(item.getInquiry().getEnUU());
remind.setUserName(item.getUserName());
remind.setUserTel(item.getUserTel());
remind.setCode(item.getInquiry().getCode());
remind.setBrand(item.getInbrand());
remind.setInbrand(item.getInbrand());
remind.setCmpCode(item.getCmpCode());
remind.setSpec(item.getSpec());
remind.setProdTitle(item.getProdTitle());
remind.setInid(item.getInquiry().getId());
if (item.getProduct() != null) {
remind.setBrand(item.getProduct().getBrand());
remind.setCmpCode(item.getProduct().getCmpCode());
remind.setSpec(item.getProduct().getSpec());
remind.setProdTitle(item.getProduct().getTitle());
}
remind.setItemId(item.getId());
remind.setNeedQty(item.getNeedquantity());
remind.setReDate(item.getInquiry().getDate());
remind.setEndDate(item.getInquiry().getEndDate());
remind.setVendUU(u.getEnuu());
remind.setVendUserUU(u.getUseruu());
remind.setDate(new Date(System.currentTimeMillis()));
remind.setStatus(Status.INPUTTING.value());
inquiryReminds.add(remind);
}
}
if (!CollectionUtils.isEmpty(inquiryReminds)) {
remindDao.save(inquiryReminds);
}
}
// 查询已关注类目中是否有当前类目
String kind = item.getProdTitle();
Set enuuSet = new HashSet<>();
if (!StringUtils.isEmpty(kind)) {
enuuSet = kindConcernDao.findByNameCnAndNeEnuu(kind, item.getInquiry().getEnUU());
}
String url = PS_PRODUCT_URL + "/product/businessOpportunity";
JSONObject formData = new JSONObject();
formData.put("enUU", item.getInquiry().getEnUU());
formData.put("pCmpCode", item.getCmpCode());
long start = System.currentTimeMillis();
HttpUtil.Response res = HttpUtil.sendGetRequest(url, formData);
log.info("/product/businessOpportunity , 型号:{}, 耗时:{}", item.getCmpCode(), (System.currentTimeMillis() - start));
if (res.getStatusCode() == HttpStatus.OK.value()) {
Map result = FlexJsonUtils.fromJson(res.getResponseText());
if (!StringUtils.isEmpty(result.get("enUUs"))) {
List enuus = (List) result.get("enUUs");
enuuSet.addAll(enuus);
}
if (!CollectionUtils.isEmpty(enuuSet)) {
List inquiryEnReminds = new ArrayList<>();
for (Long enuu : enuuSet) {
InquiryEnRemind remind = new InquiryEnRemind();
remind.setEnName(enterprise.getEnName());
remind.setEnUU(item.getInquiry().getEnUU());
remind.setUserName(item.getUserName());
remind.setUserTel(item.getUserTel());
remind.setCode(item.getInquiry().getCode());
remind.setBrand(item.getInbrand());
remind.setInbrand(item.getInbrand());
remind.setCmpCode(item.getCmpCode());
remind.setSpec(item.getSpec());
remind.setProdTitle(item.getProdTitle());
remind.setInid(item.getInquiry().getId());
if (item.getProduct() != null) {
remind.setBrand(item.getProduct().getBrand());
remind.setCmpCode(item.getProduct().getCmpCode());
remind.setSpec(item.getProduct().getSpec());
remind.setProdTitle(item.getProduct().getTitle());
}
remind.setItemId(item.getId());
remind.setNeedQty(item.getNeedquantity());
remind.setReDate(item.getInquiry().getDate());
remind.setEndDate(item.getInquiry().getEndDate());
remind.setVendUU(enuu);
if (productUsersMap.containsKey(enuu)) {
remind.setRemindStatus(1);
} else {
remind.setRemindStatus(0);
}
remind.setDate(new Date(System.currentTimeMillis()));
remind.setStatus(Status.INPUTTING.value());
inquiryEnReminds.add(remind);
}
if (!CollectionUtils.isEmpty(inquiryEnReminds)) {
inquiryEnRemindDao.save(inquiryEnReminds);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* 通过id查询询价信息
*
* @param id 公共询价主表id
* @return
*/
@Override
public PurcInquiry findInquiryById(Long id) {
PurcInquiry inquiry = purcInquiryDao.findOne(id);
if (!CollectionUtils.isEmpty(inquiry.getInquiryItems())) {
for (PurcInquiryItem item : inquiry.getInquiryItems()) {
if (null == item.getProductId()) {
Product product = new Product();
product.setTitle(item.getProdTitle());
product.setCmpCode(item.getCmpCode());
product.setBrand(item.getInbrand());
product.setSpec(item.getSpec());
item.setProduct(product);
}
}
}
return inquiry;
}
/**
* 发送消息推送
*
* @param models 封装的消息信息
*/
private void sendMessage(final List models) {
ThreadUtils.task(new Runnable() {
@Override
public void run() {
try {
long start = System.currentTimeMillis();
log.info("发送消息");
String res = HttpUtil.doPost(PS_MESSAGE_URL + "/messages", FlexJsonUtils.toJsonDeep(models));
log.info("消息请求发送");
log.info("/messages , 条数:{},耗时:{}", models.size(), (System.currentTimeMillis() - start));
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* 将ERP传入的inquiry信息转成公共询价服务中心需要的信息
*
* @param inquiries 将ERP传入的inquiry信息
* @param enuu 询价企业UU号
* @param address 询价企业地址
* @return
*/
@Override
public List covert(List inquiries, Long enuu, String address) throws NotFoundException {
List purcInquiries = new ArrayList();
if (!CollectionUtils.isEmpty(inquiries)) {
for (BatchInquiry inquiry : inquiries) {
List old = purcInquiryDao.findByCodeAndEnUU(inquiry.getBi_code(), enuu);
//先判断是否已经存在,不存在才进行存储
if (CollectionUtils.isEmpty(old)) {
PurcInquiry purcInquiry = inquiry.covert();
purcInquiry.setEnUU(enuu);
purcInquiry.setShip(address);
Enterprise e = enterpriseDao.findOne(enuu);
if (null != e) {
purcInquiry.setEnName(e.getEnName());
}
Set purcInquiryItems = new HashSet();
if (!CollectionUtils.isEmpty(inquiry.getInProducts())) {
for (BatchInProduct batch : inquiry.getInProducts()) {
PurcInquiryItem item = new PurcInquiryItem();
List products = productDao.findByEnUUAndCode(enuu, batch.getBip_prodcode());
if (!CollectionUtils.isEmpty(products)) {
item.setProductId(products.get(0).getId());
item.setCmpCode(products.get(0).getCmpCode());
item.setInbrand(products.get(0).getBrand());
item.setProdTitle(products.get(0).getTitle());
item.setSpec(products.get(0).getSpec());
} else {
item.setCmpCode(batch.getPr_orispeccode());
item.setInbrand(batch.getPr_brand());
item.setProdTitle(batch.getPr_detail());
item.setSpec(batch.getPr_spec());
}
item.setProdCode(batch.getBip_prodcode());
item.setRemark(batch.getBip_remark());
item.setNumber(batch.getBip_detno());
item.setFromDate(new Date(System.currentTimeMillis()));
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());
item.setUserName(batch.getEm_name());
item.setUserTel(batch.getBip_mobile());
item.setUserCode(batch.getBip_buyercode());
item.setOfferAmount(0);
item.setEndDate(inquiry.getBi_enddate());
item.setNeedquantity(batch.getYcgqty());
if (null == item.getCmpCode() || item.getCmpCode().equals("无")) {
item.setCmpCode(item.getSpec());
}
if (null != inquiry.getBi_date()) {
item.setDate(inquiry.getBi_date());
} else {
item.setDate(new Date(System.currentTimeMillis()));
}
if (item.getCustCurrency() == null) {
item.setCustCurrency("RMB");
}
purcInquiryItems.add(item);
}
}
purcInquiry.setInquiryItems(purcInquiryItems);
purcInquiries.add(purcInquiry);
}
}
}
return purcInquiries;
}
/**
* erp提交审核时,公共询价服务中心单据禁用报价功能
*
* @param inquiries erp询价信息
* @param enuu 询价企业UU号
*/
@Override
public void updateStatus(List inquiries, Long enuu) {
if (!CollectionUtils.isEmpty(inquiries)) {
for (BatchInquiry inquiry : inquiries) {
List purcInquiryList = purcInquiryDao.findByCodeAndEnUU(inquiry.getBi_code(), enuu);
for (PurcInquiry purcInquiry : purcInquiryList) {
purcInquiryItemDao.updateStatus(purcInquiry.getId());
}
}
}
}
/**
* 查询供应商的报价信息
*
* @return
*/
@Override
public List findNotUploadReply(Long enuu) {
List items = publicInquiryItemDao.findByEnUUAndBackStatus(enuu, (short) Status.NOT_UPLOAD.value());
if (!CollectionUtils.isEmpty(items)) {
// 防止下载过程中进行操作,这里设置一个下载中的状态
Set ids = new HashSet<>();
for (PublicInquiryItem item : items) {
ids.add(item.getId());
}
if (ids.size() > 0) {
publicInquiryItemDao.updateBackStatus(ids);
}
return convertPublicInquiryReply(items);
}
return new ArrayList<>();
}
/**
* 查找报价的单据,上传到卖家UAS
*
* @param enUU 企业UU
* @return
*/
@Override
public List findNotUploadToUas(Long enUU) {
return publicInquiryItemDao.findByVendUUAndReplySendStatus(enUU, (short) Status.NOT_UPLOAD.value());
}
/**
* UAS获取商城账套下企业商机
*
* @param vendUU 报价企业UU
* @return 待下载的企业商机
* @author dongbw
*/
@Override
public List findNotUploadEnRemind(Long vendUU) {
return inquiryEnRemindDao.findNotUploadEnRemind(vendUU);
}
/**
* UAS获取商城账套下企业商机之后 回调 修改状态
*
* @param idArray 报价单明细id list
* @param vendUU 报价企业UU
*/
@Override
public void downEnRemindSuccess(String[] idArray, Long vendUU) {
List items = new ArrayList<>();
for (String id : idArray) {
InquiryEnRemind item = inquiryEnRemindDao.findOne(Long.parseLong(id));
if (item != null && vendUU.equals(item.getVendUU())) {
item.setErpDownStatus((short) Status.DOWNLOADED.value());
items.add(item);
}
}
if (!CollectionUtils.isEmpty(items)) {
inquiryEnRemindDao.save(items);
}
}
/**
* 获取当前月和上个月询价单数量
*
* @return 数量map
*/
@Override
public ModelMap getCountOfLastAndThisMonth() {
Calendar now = Calendar.getInstance();
Integer year = now.get(Calendar.YEAR);
Integer month = now.get(Calendar.MONTH) + 1;
ModelMap result = new ModelMap();
try {
Long current = inquiryItemInfoDao.countByMonth(year, month);
result.put("current", current);
if (month == 1) {
year = year - 1;
month = 12;
} else {
month = month - 1;
}
Long last = inquiryItemInfoDao.countByMonth(year, month);
result.put("last", last);
result.put("success", "true");
} catch (Exception e) {
result.put("message", e.getMessage());
result.put("success", false);
e.printStackTrace();
}
return result;
}
/**
* 查询单条bom询价单的报价情况
*
* @param inquiry 询价单
* @return 询价单
*/
@Override
public PurcInquiry getQuotedDetail(PurcInquiry inquiry) {
List itemIds = new ArrayList<>();
for (PurcInquiryItem item : inquiry.getInquiryItems()) {
itemIds.add(item.getId());
}
Long[] itemIdArray = new Long[inquiry.getInquiryItems().size()];
Integer quotedAmount = publicInquiryItemDao.getQuotedAmountBySourceId(itemIds.toArray(itemIdArray));
Integer replaceQuotedAmount =publicInquiryItemDao.getReplaceQuotedAmountBySourceId(itemIds.toArray(itemIdArray));
inquiry.setQuotedAmount(quotedAmount);
inquiry.setReplaceQuotedAmount(replaceQuotedAmount);
return inquiry;
}
/**
* 根据id设置询价单明细有效状态
*
* @param id 询价单明细id purcInquiryItem
* @param valid 1有效 0 无效
* @return
*/
@Override
public ModelMap deleteItems(Long id, Integer valid) {
ModelMap map = new ModelMap();
if (null == id || null == valid) {
map.put("success", false);
map.put("message", "传入参数为空");
return map;
}
PurcInquiryItem item = purcInquiryItemDao.findOne(id);
if (null != item) {
item.setValid(valid);
try {
purcInquiryItemDao.save(item);
if (valid == 0) {
List enReminds = inquiryEnRemindDao.findByItemId(id);
List reminds = remindDao.findByItemId(id);
if (!CollectionUtils.isEmpty(enReminds)) {
inquiryEnRemindDao.delete(enReminds);
}
if (!CollectionUtils.isEmpty(reminds)) {
remindDao.delete(reminds);
}
}
map.put("success", true);
} catch (Exception e) {
map.put("success", false);
map.put("message", e.getMessage());
}
} else {
map.put("success", false);
map.put("message", "未找到对应询价单明细记录");
}
return map;
}
/**
* 将公共询价服务中心的公共询价转成ERP的对应的字段
*
* @param notUploadReply 未下载的供应商报价信息
* @return
* @author hejq
* @date 2018-01-14 11:51
*/
@Override
public List convertPublicInquiryReply(List notUploadReply) {
List details = new ArrayList();
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) {
List items = new ArrayList<>();
for (String id : idArray) {
PublicInquiryItem item = publicInquiryItemDao.findOne(Long.parseLong(id));
if (item != null) {
item.setBackStatus((short) Status.DOWNLOADED.value());
item.setErpstatus(Constant.YES);
items.add(item);
}
}
if (!CollectionUtils.isEmpty(items)) {
publicInquiryItemDao.save(items);
}
}
/**
* 下载完成后更新公共询价服务中心询价单明细的下载状态
*
* @param idArray 询价单明细id
* @author hejq
* @date 2018-01-14 12:12
*/
@Override
public void onReplyDownLoadSuccess(String[] idArray) {
List items = new ArrayList<>();
for (String id : idArray) {
PublicInquiryItem item = publicInquiryItemDao.findOne(Long.parseLong(id));
if (item != null) {
item.setReplySendStatus((short) Status.DOWNLOADED.value());
items.add(item);
}
}
if (!CollectionUtils.isEmpty(items)) {
publicInquiryItemDao.save(items);
}
}
/**
* ERP提交公共询价单之后,更新平台状态,让公共询价服务中心询价单不能进行报价操作
*
* @param details 询价信息
* @author hejq
* @date 2018-01-14 12:20
*/
@Override
public void updateInquiryStatus(List details, Long enuu) {
if (!CollectionUtils.isEmpty(details)) {
for (InquiryDetail detail : details) {
// 更新为过期状态,不能进行报价处理
String sql = "update purc$puInquiryItems set id_overdue = 1 where id_id = " +
"(select id_sourceid from public$inquiryItems where id_id = " + detail.getB2b_id_id() + ")";
jdbcTemplate.update(sql);
// 更新已转报价的询价单明细状态
jdbcTemplate.update("update public$inquiryItems set id_checked = 1 where id_id = " + detail.getB2b_id_id());
}
}
}
/**
* ERP对报价信息的采纳状态上传到公共询价服务中心
*
* @param decides 采纳信息
*/
@Override
public void onReplyDecide(List decides, Long enuu) {
List publicInquiryItems = convertInquiryDecide(decides);
if (!CollectionUtils.isEmpty(publicInquiryItems)) {
for (PublicInquiryItem inquiryItem : publicInquiryItems) {
publicInquiryItemDao.updateDecideStatusByID(inquiryItem.getAgreed(), inquiryItem.getDecideStatus(), inquiryItem.getId());
notifyDecide(inquiryItem, PRODUCERAPP);
}
}
}
/**
* 针对供应商,客户对报价结果发送消息通知
*
* @param item 询价明细
* @param sourceApp 应用来源
*/
@Override
public void notifyDecide(PublicInquiryItem item, String sourceApp) {
final String SMS_TYPE = "IM"; //只推送消息
List models = new ArrayList();
User u = userDao.findOne(null != item.getInquiry().getRecorderUU() ? item.getInquiry().getRecorderUU() : 0L);
Enterprise e = enterpriseDao.findOne(item.getInquiry().getEnUU());
Product product = new Product();
if (null != item.getProductId()) {
product = productDao.findOne(item.getProductId());
}
String cmpCode = product.getCmpCode() != null ? product.getCmpCode() : item.getCmpCode();
String content = item.getAgreed() == 1 ? "【已采纳】" : "【未采纳】";
content = content + "您关于“" + cmpCode + "”的报价";
if (null != e) {
content = e.getEnName() + content;
} else if (null != u) {
content = u.getUserName() + content;
} else if (null == e && null == u) {
content = "您关于“" + cmpCode + "”的报价已被";
String result = item.getAgreed() == 1 ? "【已采纳】" : "【拒绝】";
content = content + result;
}
MessageModel model = new MessageModel();
model.setType(INQUIRY_DECIDE_TYPE);
model.setProducerApp(sourceApp);
model.setConsumerType(CUST_TYPE);
model.setConsumerApp(CONSUMERAPP);
model.setContent(content);
model.setRemark(String.valueOf(item.getInquiry().getId()));
model.setSourceId(item.getId());
model.setReceiverEnuu(item.getVendUU());
model.setReceiverUu(item.getVendUserUU());
model.setSenderEnuu(item.getInquiry().getEnUU());
if (null != item.getUserUU() || null != item.getInquiry().getRecorderUU()) {
model.setSenderUu(item.getUserUU() != null ? item.getUserUU() : item.getInquiry().getRecorderUU());
} else {
Enterprise enterprise = enterpriseDao.findOne(item.getInquiry().getEnUU());
model.setSenderUu(null != enterprise ? enterprise.getAdminUU() : 0L);
}
model.setSmsType(SMS_TYPE);
models.add(model);
if (!CollectionUtils.isEmpty(models)) {
sendMessage(models);
}
}
/**
* 将ERP的报价采纳信息转为公共询价服务中心需要的信息
*
* @param decides erp报价采纳信息
* @author hejq
* @date 2018-01-14 12:25
*/
@Override
public List convertInquiryDecide(List decides) {
List inquiryItems = new ArrayList();
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 inquiries, final Long enuu) {
final List newInquiryItems = new ArrayList<>();
for (final Inquiry inquiry : inquiries) {
ThreadUtils.task(new Runnable() {
@Override
public void run() {
List 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);
}
}
}
}
});
}
}
/**
* 将公共询价列表转成需要报价的询价单,类型是公共询价
*
* @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 attachs = new HashSet();
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 items = new HashSet();
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.setSource(purcInquiryItem.getSource());
item.setCustLap(Constant.NO);
item.setSendStatus((short) Status.NOT_UPLOAD.value());
item.setSourceId(id);
List replies = new ArrayList();
PublicInquiryReply reply = new PublicInquiryReply();
reply.setLapQty((double) 0);
replies.add(reply);
item.setReplies(replies);
item.setNeedquantity(purcInquiryItem.getNeedquantity());
item.setKind(INQUIRYKIND);
item.setProdCode(purcInquiryItem.getProdCode());
items.add(item);
i++;
}
List 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.setSource(purcInquiryItem.getSource());
item.setStatus((short) Status.NOT_REPLY.value());
item.setCustLap(Constant.NO);
item.setSendStatus((short) Status.NOT_UPLOAD.value());
item.setSourceId(id);
item.setProdCode(purcInquiryItem.getProdCode());
item.setKind(INQUIRYKIND);
item.setNeedquantity(purcInquiryItem.getNeedquantity());
List replies = new ArrayList();
List purcReplies = new ArrayList();
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.getSource(), 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 info 分页参数
* @param filter 过滤条件
* @return
* @author hejq
* @date 2018-01-17 10:30
*/
@Override
public IPage findByPageInfo(final PageInfo info, final SearchFilter filter) {
Sort sort = new Sort(Sort.Direction.DESC, "date");
if (info.getOffset() == 0) {
info.setOffset(info.getPageSize() * (info.getPageNumber() - 1));
}
info.setSort(sort);
if (null != filter) {
if (filter.getFromDate() != null) {
info.expression(PredicateUtils.gte("offerTime", new Date(filter.getFromDate()), false));
}
if (filter.getEndDate() != null) {
info.expression(PredicateUtils.lte("offerTime", new Date(filter.getEndDate()), false));
}
// 此处的 fromDelivery 作为发布时间过滤
if (filter.getFromDelivery() != null) {
info.expression(PredicateUtils.gte("date", new Date(filter.getFromDelivery()), false));
}
if (filter.getEndDelivery() != null) {
info.expression(PredicateUtils.lte("date", new Date(filter.getEndDelivery()), false));
}
if (filter.getUserUU() != null) {
info.expression(PredicateUtils.eq("vendUserUU", filter.getUserUU(), false));
}
if (StringUtils.hasText(filter.getKeyword())) {
SimpleExpression cmpCode = new SimpleExpression("cmpCode", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
SimpleExpression brand = new SimpleExpression("inbrand", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
SimpleExpression code = new SimpleExpression("inquiry.code", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
SimpleExpression title = new SimpleExpression("prodTitle", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
SimpleExpression spec = new SimpleExpression("spec", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
SimpleExpression inquiryEnName = new SimpleExpression("inquiry.enName", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
SimpleExpression[] simpleExpressions = new SimpleExpression[]{cmpCode, brand, code, title, inquiryEnName, spec};
LogicalExpression logical = new LogicalExpression(simpleExpressions, CriterionExpression.Operator.OR);
info.expression(logical);
}
}
Page itemInfoPage = itemInfoDao.findAll(new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder builder) {
query.where(info.getPredicates(root, query, builder));
return null;
}
}, info);
if (!CollectionUtils.isEmpty(itemInfoPage.getContent())) {
for (PublicInquiryItemInfo itemInfo : itemInfoPage) {
String sql = "select at_path,at_name from attachs a left join public$inquiryitems$attach p on a.at_id = p.at_id " +
"left join public$inquiryitems i on p.id_id = i.id_id where i.id_id = " + itemInfo.getId();
List