InquiryServiceImpl.java 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949
  1. package com.uas.ps.inquiry.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.uas.ps.core.logging.BufferedLoggerManager;
  4. import com.uas.ps.core.util.CollectionUtils;
  5. import com.uas.ps.core.util.ContextUtils;
  6. import com.uas.ps.entity.Product;
  7. import com.uas.ps.entity.Status;
  8. import com.uas.ps.inquiry.AccessConfiguration;
  9. import com.uas.ps.inquiry.dao.EnterpriseDao;
  10. import com.uas.ps.inquiry.dao.InquiryEnRemindDao;
  11. import com.uas.ps.inquiry.dao.InquiryRemindDao;
  12. import com.uas.ps.inquiry.dao.ProductDao;
  13. import com.uas.ps.inquiry.dao.PublicInquiryDao;
  14. import com.uas.ps.inquiry.dao.PublicInquiryItemDao;
  15. import com.uas.ps.inquiry.dao.PurcInquiryDao;
  16. import com.uas.ps.inquiry.dao.PurcInquiryItemDao;
  17. import com.uas.ps.inquiry.dao.PurcInquiryItemInfoDao;
  18. import com.uas.ps.inquiry.entity.Constant;
  19. import com.uas.ps.inquiry.entity.InquiryDetailInfo;
  20. import com.uas.ps.inquiry.entity.InquiryProductInfo;
  21. import com.uas.ps.inquiry.entity.InquirySource;
  22. import com.uas.ps.inquiry.entity.MessageModel;
  23. import com.uas.ps.inquiry.entity.OrderStatus;
  24. import com.uas.ps.inquiry.model.Enterprise;
  25. import com.uas.ps.inquiry.model.InquiryRemind;
  26. import com.uas.ps.inquiry.model.PublicInquiry;
  27. import com.uas.ps.inquiry.model.PublicInquiryItem;
  28. import com.uas.ps.inquiry.model.PurcInquiry;
  29. import com.uas.ps.inquiry.model.PurcInquiryItem;
  30. import com.uas.ps.inquiry.model.PurcInquiryItemInfo;
  31. import com.uas.ps.inquiry.page.PageInfo;
  32. import com.uas.ps.inquiry.page.SearchFilter;
  33. import com.uas.ps.inquiry.page.criteria.CriterionExpression;
  34. import com.uas.ps.inquiry.page.criteria.LogicalExpression;
  35. import com.uas.ps.inquiry.page.criteria.PredicateUtils;
  36. import com.uas.ps.inquiry.page.criteria.SimpleExpression;
  37. import com.uas.ps.inquiry.page.exception.IllegalOperatorException;
  38. import com.uas.ps.inquiry.service.InquiryService;
  39. import com.uas.ps.inquiry.service.PublicInquiryService;
  40. import com.uas.ps.inquiry.support.InquiryBufferedLogger;
  41. import com.uas.ps.inquiry.util.FlexJsonUtils;
  42. import com.uas.ps.inquiry.util.HttpUtil;
  43. import com.uas.ps.inquiry.util.ThreadUtils;
  44. import javassist.NotFoundException;
  45. import org.apache.log4j.Logger;
  46. import org.springframework.beans.factory.annotation.Autowired;
  47. import org.springframework.data.domain.Page;
  48. import org.springframework.data.domain.Sort;
  49. import org.springframework.data.jpa.domain.Specification;
  50. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  51. import org.springframework.jdbc.core.JdbcTemplate;
  52. import org.springframework.stereotype.Service;
  53. import org.springframework.util.StringUtils;
  54. import javax.persistence.criteria.CriteriaBuilder;
  55. import javax.persistence.criteria.CriteriaQuery;
  56. import javax.persistence.criteria.Predicate;
  57. import javax.persistence.criteria.Root;
  58. import java.net.URLEncoder;
  59. import java.util.ArrayList;
  60. import java.util.Date;
  61. import java.util.HashSet;
  62. import java.util.List;
  63. import java.util.Map;
  64. import java.util.Set;
  65. /**
  66. * 针对转询价报价单的数据查询操作
  67. *
  68. * Created by hejq on 2018-01-17.
  69. */
  70. @Service
  71. public class InquiryServiceImpl implements InquiryService {
  72. /**
  73. * 消息类型 (在B2B消息中拼接跳转单据详情url请求时需要)
  74. */
  75. private final String INQUIRY_TYPE = "公共询价";
  76. /**
  77. * 消息推送短信模板id
  78. */
  79. private final String SMS_TEMP_ID = "e6320a3c-89ac-4c77-a75f-62a727bce654";
  80. /**
  81. * 消息推送方式:邮件、短信、im
  82. */
  83. private final String SMS_TYPE = "MAIL_AND_SM_AND_IM";
  84. /**
  85. * 消费类型: 多个,MULTI
  86. */
  87. private final String CUST_TYPE = "MULTI";
  88. /**
  89. * 应用来源,主要是为了平台公共询价做处理
  90. */
  91. private String SOURCEAPP_MALL = "MALL";
  92. /**
  93. * 接收应用
  94. */
  95. private final String CONSUMERAPP_HIDE = "HIDE";
  96. /**
  97. * 消息类型 (在MALL消息中拼接求购询价待报价)
  98. */
  99. private final String INQUIRY_TYPE_SELLER_MALL = "MALL跳转卖家待报价页面";
  100. /**
  101. * 公共消息访问地址
  102. */
  103. private final String PS_MESSAGE_URL = ContextUtils.getBean(AccessConfiguration.class).getPsMessageUrl();
  104. /**
  105. * 询价统计通知发送人UU
  106. */
  107. private final Long MESSAGE_SENDERUU = ContextUtils.getBean(AccessConfiguration.class).getSenderuu();
  108. /**
  109. * 询价统计通知发送企业UU
  110. */
  111. private final Long MESSAGE_SENDERENUU = ContextUtils.getBean(AccessConfiguration.class).getSenderEnuu();
  112. @Autowired
  113. private PublicInquiryItemDao itemDao;
  114. @Autowired
  115. private PurcInquiryItemInfoDao inquiryItemDao;
  116. @Autowired
  117. private PurcInquiryDao purcInquiryDao;
  118. @Autowired
  119. private PublicInquiryDao inquiryDao;
  120. @Autowired
  121. private ProductDao productDao;
  122. @Autowired
  123. private PurcInquiryItemDao purcInquiryItemDao;
  124. @Autowired
  125. private PublicInquiryService inquiryService;
  126. @Autowired
  127. private InquiryRemindDao inquiryRemindDao;
  128. @Autowired
  129. private JdbcTemplate jdbcTemplate;
  130. @Autowired
  131. private EnterpriseDao enterpriseDao;
  132. @Autowired
  133. private PublicInquiryServiceImpl service;
  134. @Autowired
  135. private InquiryEnRemindDao inquiryEnRemindDao;
  136. /**
  137. * 公共物料访问地址
  138. */
  139. private final String PS_PRODUCT_URL = ContextUtils.getBean(AccessConfiguration.class).getPsProductUrl();
  140. /**
  141. * 日志
  142. */
  143. private final static InquiryBufferedLogger logger = BufferedLoggerManager.getLogger(InquiryBufferedLogger.class);
  144. private static final Logger log = Logger.getLogger(Logger.class);
  145. /**
  146. * 查询公共询价列表信息
  147. *
  148. * @param info 分页新
  149. * @param filter 过滤条件
  150. * @param state 过滤状态
  151. * @param overdue 是否过期 1、已过期;0、未过期
  152. * @return
  153. */
  154. @Override
  155. public Page<PurcInquiryItemInfo> findTodoByPageInfo(final PageInfo info, SearchFilter filter, String state, Integer overdue) {
  156. Sort sort = new Sort(Sort.Direction.DESC, "date");
  157. if (info.getOffset() == 0) {
  158. info.setOffset(info.getPageSize() * (info.getPageNumber() - 1));
  159. }
  160. info.setSort(sort);
  161. if (null != filter.getUserUU()) {
  162. info.filter("userUU", filter.getUserUU());
  163. info.expression(PredicateUtils.isNull("inquiry.enUU"));
  164. } else if (null != filter.getEnUU()) {
  165. info.filter("inquiry.enUU", filter.getEnUU());
  166. } else {
  167. throw new IllegalAccessError("非法访问");
  168. }
  169. if (null != filter) {
  170. if (StringUtils.hasText(filter.getKeyword())) {
  171. SimpleExpression cmpCode = new SimpleExpression("cmpCode", filter.getKeyword(), CriterionExpression.Operator.LIKE);
  172. SimpleExpression brand = new SimpleExpression("inbrand", filter.getKeyword(), CriterionExpression.Operator.LIKE);
  173. SimpleExpression[] simpleExpressions = new SimpleExpression[]{cmpCode, brand};
  174. LogicalExpression logicalExpression = PredicateUtils.or(simpleExpressions);
  175. info.expression(logicalExpression);
  176. }
  177. if (filter.getFromDate() != null) {
  178. info.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
  179. }
  180. if (filter.getEndDate() != null) {
  181. info.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
  182. }
  183. }
  184. if (null != state) {
  185. // 待报价
  186. if (state.equals(OrderStatus.todo.name())) {
  187. SimpleExpression amount = new SimpleExpression("offerAmount", Constant.NO, CriterionExpression.Operator.EQ);
  188. SimpleExpression[] simpleExpressions = new SimpleExpression[]{amount};
  189. LogicalExpression logicalExpression = PredicateUtils.and(simpleExpressions);
  190. info.expression(logicalExpression);
  191. }
  192. // 已报价
  193. if (state.equals(OrderStatus.done.name())) {
  194. SimpleExpression amount = new SimpleExpression("offerAmount", Constant.YES, CriterionExpression.Operator.GTE);
  195. SimpleExpression[] simpleExpressions = new SimpleExpression[]{amount};
  196. LogicalExpression logicalExpression = PredicateUtils.and(simpleExpressions);
  197. info.expression(logicalExpression);
  198. }
  199. // 已超过截止日期
  200. if (state.equals(OrderStatus.end.name())) {
  201. SimpleExpression date = new SimpleExpression("endDate", new Date(System.currentTimeMillis()), CriterionExpression.Operator.LT);
  202. SimpleExpression[] simpleExpressions = new SimpleExpression[]{date};
  203. LogicalExpression logicalExpression = PredicateUtils.and(simpleExpressions);
  204. info.expression(logicalExpression);
  205. }
  206. }
  207. if (null != overdue) {
  208. // 已超过截止日期
  209. if (overdue.equals((int)Constant.YES)) {
  210. SimpleExpression date = new SimpleExpression("endDate", new Date(System.currentTimeMillis()), CriterionExpression.Operator.LT);
  211. SimpleExpression[] simpleExpressions = new SimpleExpression[]{date};
  212. LogicalExpression logicalExpression = PredicateUtils.and(simpleExpressions);
  213. info.expression(logicalExpression);
  214. } else if (overdue.equals((int)Constant.NO)) {
  215. info.expression(PredicateUtils.gte("endDate", new Date(System.currentTimeMillis()), false));
  216. }
  217. }
  218. return inquiryItemDao.findAll(new Specification<PurcInquiryItemInfo>() {
  219. @Override
  220. public Predicate toPredicate(Root<PurcInquiryItemInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
  221. query.where(info.getPredicates(root, query, builder));
  222. return null;
  223. }
  224. }, info);
  225. }
  226. /**
  227. * 保存公共询价
  228. *
  229. * @param currentInquiry 询价信息
  230. */
  231. @Override
  232. public PurcInquiry saveInquiry(PurcInquiry currentInquiry) throws NotFoundException {
  233. //通过流水号和企业号找到公共询价单
  234. List<PurcInquiry> existInquiryList = purcInquiryDao.findByCodeAndEnUU(currentInquiry.getCode(), currentInquiry.getEnUU());
  235. if (!CollectionUtils.isEmpty(existInquiryList)) {
  236. throw new IllegalOperatorException("单号重复");
  237. } else {
  238. if (null != currentInquiry.getEnUU()) {
  239. Enterprise e = enterpriseDao.findOne(currentInquiry.getEnUU());
  240. if (null != e) {
  241. currentInquiry.setEnName(e.getEnName());
  242. } else {
  243. throw new NotFoundException("询价企业不存在");
  244. }
  245. }
  246. //保存询价单
  247. PurcInquiry inquiry = purcInquiryDao.save(currentInquiry);
  248. //判断询价明细单是否为空
  249. if (!CollectionUtils.isEmpty(currentInquiry.getInquiryItems())) {
  250. List<PurcInquiryItem> items = new ArrayList<PurcInquiryItem>();
  251. //给询价明细单属性设置初始值
  252. for (PurcInquiryItem item : currentInquiry.getInquiryItems()) {
  253. item.setInquiry(inquiry);
  254. item.setOfferAmount(0);
  255. item.setStatus((short) Status.NOT_REPLY.value());
  256. item.setIsOpen(Constant.YES);
  257. if (null == item.getDate()) {
  258. //设置提交时间
  259. item.setDate(new Date(System.currentTimeMillis()));
  260. }
  261. // 这里设置物料信息的冗余字段
  262. if (null != item.getProduct()) {
  263. item.setProdTitle(item.getProduct().getTitle());
  264. item.setProdCode(item.getProduct().getCode());
  265. item.setSpec(item.getProduct().getSpec());
  266. item.setInbrand(item.getProduct().getBrand());
  267. item.setCmpCode(item.getProduct().getCmpCode());
  268. }
  269. if (null == item.getCmpCode() || item.getCmpCode().equals("无")) {
  270. item.setCmpCode(item.getSpec());
  271. }
  272. if (null == item.getEndDate()) {
  273. item.setEndDate(inquiry.getEndDate());
  274. }
  275. items.add(item);
  276. }
  277. //保存询价单明细表
  278. items = purcInquiryItemDao.save(items);
  279. final List<PurcInquiryItem> purcInquiryItems = items;
  280. final String sourceapp = inquiry.getSourceapp();
  281. final Long enuu = inquiry.getEnUU();
  282. if (null != inquiry.getSourceapp()) {
  283. ThreadUtils.task(new Runnable() {
  284. @Override
  285. public void run() {
  286. try {
  287. //生成推荐询价表
  288. inquiryService.notifyMessage(purcInquiryItems, sourceapp);
  289. if (!StringUtils.isEmpty(enuu)) {
  290. saveProduct(purcInquiryItems, sourceapp);
  291. }
  292. } catch (Exception e) {
  293. e.printStackTrace();
  294. }
  295. }
  296. }).run();
  297. }
  298. }
  299. return inquiry;
  300. }
  301. }
  302. /**
  303. * 可配置的定时任务
  304. */
  305. @Override
  306. public List<InquiryRemind> testMessage(Date startTime, Date endTime, Long useruu, Long enuu){
  307. logger.log("公共询价","9点定时统计询价单总数服务开启");
  308. List<InquiryRemind> list = inquiryRemindDao.findTestInfo(startTime,endTime,useruu,enuu);
  309. logger.log("公共询价","9点定时统计询价单总数服务结束");
  310. return list;
  311. }
  312. /**
  313. * 发布询价成功后加入当前用户的个人物料库
  314. * @param inquiryItems
  315. * @param sourceApp
  316. */
  317. public void saveProduct(List<PurcInquiryItem> inquiryItems, String sourceApp) {
  318. List<Product> products = new ArrayList<>();
  319. for (PurcInquiryItem item : inquiryItems) {
  320. Product product = new Product();
  321. // 需要哪些字段
  322. product.setEnUU(item.getInquiry().getEnUU());
  323. product.setUserUU(item.getInquiry().getRecorderUU());
  324. product.setCmpCode(item.getCmpCode());
  325. product.setBrand(item.getInbrand());
  326. product.setpCmpCode(item.getCmpCode());
  327. product.setpBrandEn(item.getInbrand());
  328. product.setStandard((short) 0);
  329. product.setCreateTime(new Date());
  330. product.setSourceApp(sourceApp);
  331. product.setSpec(StringUtils.isEmpty(item.getSpec()) ? item.getCmpCode() : item.getSpec());
  332. product.setKind(item.getProdTitle());
  333. products.add(product);
  334. }
  335. // 调用公共物料服务的接口
  336. try {
  337. String url = PS_PRODUCT_URL + "/product/save/inquiry/batch";
  338. long start = System.currentTimeMillis();
  339. String res = HttpUtil.doPost(url, FlexJsonUtils.toJsonDeep(products));
  340. log.info("/product/save/inquiry/batch 耗时:" + (System.currentTimeMillis() - start) + "物料数:" + products.size());
  341. JSONObject result = JSONObject.parseObject(res);
  342. Boolean success = (Boolean) result.get("success");
  343. if (success) {
  344. log.info("保存询价单后,批量保存物料成功:" + products.size());
  345. } else {
  346. log.info("保存询价单后,批量保存物料失败,返回:" + result.get("message"));
  347. }
  348. } catch (Exception e) {
  349. e.printStackTrace();
  350. }
  351. }
  352. /**
  353. * 通过报价明细id对供应商报价进行相关审核操作
  354. *
  355. * @param id 报价明细id
  356. * @param status 状态
  357. */
  358. @Override
  359. public void decideQuote(Long id, Short status) {
  360. PublicInquiryItem item = itemDao.findOne(id);
  361. // 验证是否重复操作
  362. validateInquiry(item);
  363. item.setAgreed(status);
  364. itemDao.save(item);
  365. // 更新询价推荐表相关信息
  366. if (status.equals(Constant.YES)) {
  367. inquiryRemindDao.updateStatus(item.getSourceId(), Status.ALLOW.value(), item.getVendUU());
  368. inquiryEnRemindDao.updateStatus(item.getSourceId(), Status.ALLOW.value(), item.getVendUU());
  369. } else if (status.equals(Constant.NO)) {
  370. inquiryRemindDao.updateStatus(item.getSourceId(), Status.NOTALLOW.value(), item.getVendUU());
  371. inquiryEnRemindDao.updateStatus(item.getSourceId(), Status.NOTALLOW.value(), item.getVendUU());
  372. }
  373. // 更新原公共询价单该条明细,设置为不可报价
  374. String sql = "update purc$puinquiryitems set id_overdue = 1 where id_id = " + item.getSourceId();
  375. jdbcTemplate.update(sql);
  376. inquiryService.notifyDecide(item, InquirySource.B2B.name());
  377. }
  378. /**
  379. * 商城通过报价明细id采纳对供应商报价
  380. *
  381. * @param id 报价明细id
  382. * @param status 状态
  383. */
  384. @Override
  385. public void adpotQuote(Long id, Short status) {
  386. PublicInquiryItem item = itemDao.findOne(id);
  387. // 验证是否重复操作
  388. validateInquiry(item);
  389. item.setAgreed(status);
  390. itemDao.save(item);
  391. // 更新询价推荐表相关信息
  392. if (status.equals(Constant.YES)) {
  393. inquiryRemindDao.updateStatus(item.getSourceId(), Status.ALLOW.value(), item.getVendUU());
  394. inquiryEnRemindDao.updateStatus(item.getSourceId(), Status.ALLOW.value(), item.getVendUU());
  395. } else if (status.equals(Constant.NO)) {
  396. inquiryRemindDao.updateStatus(item.getSourceId(), Status.NOTALLOW.value(), item.getVendUU());
  397. inquiryEnRemindDao.updateStatus(item.getSourceId(), Status.NOTALLOW.value(), item.getVendUU());
  398. }
  399. // 更新原公共询价单该条明细,设置为不可报价
  400. String sql = "update purc$puinquiryitems set id_overdue = 1 where id_id = " + item.getSourceId();
  401. jdbcTemplate.update(sql);
  402. // 如果是替代料报价的采纳,添加替代料到询价方对应物料
  403. if (status.equals(Constant.YES)) {
  404. addProductReplace(item);
  405. }
  406. inquiryService.adoptMessage(item, InquirySource.MALL.name());
  407. }
  408. /**
  409. * 替代料报价采纳之后,添加替代料到询价企业对应物料
  410. * @param item 报价明细
  411. */
  412. private void addProductReplace(PublicInquiryItem item) {
  413. if (null != item.getIsReplace() && Constant.YES == item.getIsReplace() && !StringUtils.isEmpty(item.getReplaceCmpCode())
  414. && !StringUtils.isEmpty(item.getReplaceBrand())) {
  415. try {
  416. String url = PS_PRODUCT_URL + "/product/save/inquiry?replaceCmpCode=" + URLEncoder.encode(item.getReplaceCmpCode(), "UTF-8")
  417. + "&replaceBrand=" + URLEncoder.encode(item.getReplaceBrand(), "UTF-8");
  418. Product product;
  419. if (null != item.getProductId()) {
  420. product = productDao.findOne(item.getProductId());
  421. product.setUserUU(item.getInquiry().getRecorderUU());
  422. } else {
  423. product = new Product();
  424. // 需要哪些字段
  425. product.setEnUU(item.getInquiry().getEnUU());
  426. product.setUserUU(item.getInquiry().getRecorderUU());
  427. product.setCmpCode(item.getCmpCode());
  428. product.setBrand(item.getInbrand());
  429. product.setpCmpCode(item.getCmpCode());
  430. product.setpBrandEn(item.getInbrand());
  431. product.setStandard((short) 0);
  432. product.setCreateTime(new Date());
  433. product.setSourceApp(item.getInquiry().getSourceApp());
  434. product.setSpec(StringUtils.isEmpty(item.getSpec()) ? item.getCmpCode() : item.getSpec());
  435. product.setKind(item.getProdTitle());
  436. }
  437. long start = System.currentTimeMillis();
  438. String res = HttpUtil.doPost(url, FlexJsonUtils.toJsonDeep(product));
  439. log.info("/product/save/inquiry 耗时:" + (System.currentTimeMillis() - start));
  440. log.info("采纳替代物料报价,添加替代物料返回" + res);
  441. } catch (Exception e) {
  442. log.info("/product/save/inquiry 替代料报价采纳之后保存到个人物料库中 出错:" + e.getMessage());
  443. e.printStackTrace();
  444. }
  445. }
  446. }
  447. /**
  448. * 验证是否已采纳或拒绝
  449. * @param item 报价单
  450. */
  451. private void validateInquiry(PublicInquiryItem item) {
  452. if (null != item.getAgreed()) {
  453. if (item.getAgreed().equals(Constant.YES)) {
  454. throw new IllegalOperatorException("该报价已被采纳,请勿重复处理");
  455. } else if (item.getAgreed().equals(Constant.NO)) {
  456. throw new IllegalOperatorException("该报价已被拒绝,请勿重复处理");
  457. }
  458. }
  459. }
  460. /**
  461. * 商城通过报价明细id拒绝对供应商报价
  462. *
  463. * @param id 报价明细id
  464. * @param status 状态
  465. */
  466. @Override
  467. public void refuseQuote(Long id, Short status,String refusereason) {
  468. PublicInquiryItem item = itemDao.findOne(id);
  469. // 验证是否重复操作
  470. validateInquiry(item);
  471. item.setAgreed(status);
  472. item.setRefusereason(refusereason);
  473. itemDao.save(item);
  474. if (status.equals(Constant.YES)) {
  475. inquiryRemindDao.updateStatus(item.getSourceId(), Status.ALLOW.value(), item.getVendUU());
  476. inquiryEnRemindDao.updateStatus(item.getSourceId(), Status.ALLOW.value(), item.getVendUU());
  477. } else if (status.equals(Constant.NO)) {
  478. inquiryRemindDao.updateStatus(item.getSourceId(), Status.NOTALLOW.value(), item.getVendUU());
  479. inquiryEnRemindDao.updateStatus(item.getSourceId(), Status.NOTALLOW.value(), item.getVendUU());
  480. }
  481. inquiryService.refuseMessage(item,InquirySource.MALL.name());
  482. }
  483. /**
  484. * 针对客户,查询供应商报价详情
  485. *
  486. * @param id 主表id
  487. * @param enuu 企业UU
  488. * @return
  489. */
  490. @Override
  491. public InquiryDetailInfo findById(Long id, Long enuu) {
  492. PublicInquiry inquiry = inquiryDao.findOne(id);
  493. InquiryDetailInfo inquiryInfo = new InquiryDetailInfo();
  494. if (inquiry != null) {
  495. inquiryInfo.setAttachs(inquiry.getAttachs());
  496. inquiryInfo.setAuditor(inquiry.getAuditor());
  497. inquiryInfo.setCheck(inquiry.getCheck());
  498. inquiryInfo.setCode(inquiry.getCode());
  499. inquiryInfo.setDate(inquiry.getDate());
  500. inquiryInfo.setEndDate(inquiry.getEndDate());
  501. inquiryInfo.setEnterprise(inquiry.getEnterprise());
  502. inquiryInfo.setEnUU(inquiry.getEnUU());
  503. inquiryInfo.setEnvironment(inquiry.getEnvironment());
  504. inquiryInfo.setId(inquiry.getId());
  505. inquiryInfo.setIsOpen(inquiry.getIsOpen());
  506. inquiryInfo.setOverdue(inquiry.getOverdue());
  507. inquiryInfo.setPriceType(inquiry.getPriceType());
  508. inquiryInfo.setRecorder(inquiry.getRecorder());
  509. inquiryInfo.setRecorderUU(inquiry.getRecorderUU());
  510. inquiryInfo.setRemark(inquiry.getRemark());
  511. inquiryInfo.setSourceApp(inquiry.getSourceApp());
  512. inquiryInfo.setSourceId(inquiry.getSourceId());
  513. inquiryInfo.setShip(inquiry.getShip());
  514. inquiryInfo.setInvoice(inquiry.getInvoice());
  515. inquiryInfo.setInquirytype(inquiry.getInquirytype());
  516. Set<Long> ids = new HashSet<Long>();
  517. List<Long> idList = new ArrayList<>();
  518. Set<InquiryProductInfo> products = new HashSet<InquiryProductInfo>();
  519. if (!CollectionUtils.isEmpty(inquiry.getInquiryItems())) {
  520. for (PublicInquiryItem item : inquiry.getInquiryItems()) {
  521. if (item.getProductId() != null) {
  522. idList.add(item.getProductId());
  523. ids.addAll(idList);
  524. } else {
  525. InquiryProductInfo productInfo = new InquiryProductInfo();
  526. Set<PublicInquiryItem> items = new HashSet<PublicInquiryItem>();
  527. productInfo.setBrand(item.getBrand());
  528. productInfo.setSpec(item.getSpec());
  529. productInfo.setCode(item.getProdCode());
  530. productInfo.setTitle(item.getProdTitle());
  531. productInfo.setUnit(item.getUnit());
  532. productInfo.setCmpCode(item.getCmpCode());
  533. products.add(productInfo);
  534. for (PublicInquiryItem item1 : inquiry.getInquiryItems()) {
  535. if (item1.getCmpCode() != null && item1.getCmpCode().equals(productInfo.getCmpCode())) {
  536. String sql = "select at_path,at_name from attachs a left join public$inquiryitems$attach p on a.at_id = p.at_id " +
  537. "left join public$inquiryitems i on p.id_id = i.id_id where i.id_id = " + item1.getId();
  538. List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
  539. if (!org.springframework.util.CollectionUtils.isEmpty(maps)) {
  540. Map<String, Object> map = maps.get(0);
  541. item1.setAttachUrl(map.get("at_path").toString());
  542. item1.setAttachName(map.get("at_name").toString());
  543. }
  544. items.add(item1);
  545. }
  546. }
  547. productInfo.setInquiryItems(items);
  548. inquiryInfo.setProducts(products);
  549. }
  550. }
  551. }
  552. if (!CollectionUtils.isEmpty(ids)) {
  553. for (Long idInfo : ids) {
  554. InquiryProductInfo productInfo = new InquiryProductInfo();
  555. Set<PublicInquiryItem> items = new HashSet<PublicInquiryItem>();
  556. Product product = productDao.findOne(idInfo);
  557. productInfo.setBrand(product.getBrand());
  558. productInfo.setId(product.getId());
  559. productInfo.setSpec(product.getSpec());
  560. productInfo.setCode(product.getCode());
  561. productInfo.setTitle(product.getTitle());
  562. productInfo.setUnit(product.getUnit());
  563. productInfo.setCmpCode(product.getCmpCode());
  564. for (PublicInquiryItem item : inquiry.getInquiryItems()) {
  565. if (item.getProductId().equals(idInfo)) {
  566. String sql = "select at_path,at_name from attachs a left join public$inquiryitems$attach p on a.at_id = p.at_id " +
  567. "left join public$inquiryitems i on p.id_id = i.id_id where i.id_id = " + item.getId();
  568. List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
  569. if (!org.springframework.util.CollectionUtils.isEmpty(maps)) {
  570. Map<String, Object> map = maps.get(0);
  571. item.setAttachUrl(map.get("at_path").toString());
  572. item.setAttachName(map.get("at_name").toString());
  573. }
  574. items.add(item);
  575. }
  576. }
  577. productInfo.setInquiryItems(items);
  578. products.add(productInfo);
  579. inquiryInfo.setProducts(products);
  580. }
  581. }
  582. }
  583. return inquiryInfo;
  584. }
  585. /**
  586. * 通过企业UU和分页信息等查询已发布信息
  587. *
  588. * @param info 分页信息
  589. * @param filter 过滤条件
  590. * @return
  591. */
  592. @Override
  593. public Page<PurcInquiry> findByPageInfo(final PageInfo info, SearchFilter filter) {
  594. if (info.getOffset() == 0) {
  595. info.setOffset(info.getPageSize() * (info.getPageNumber() - 1));
  596. }
  597. Sort sort = new Sort(Sort.Direction.DESC, "date");
  598. if (info.getPageNumber() == 0) {
  599. info.setPageNumber(1);
  600. }
  601. if (info.getPageSize() == 0) {
  602. info.setPageSize(5);
  603. }
  604. info.setSort(sort);
  605. if (null != filter.getUserUU()) {
  606. info.filter("recorderUU", filter.getUserUU());
  607. } else if (null != filter.getEnUU()) {
  608. info.filter("enUU", filter.getEnUU());
  609. } else {
  610. throw new IllegalAccessError("非法访问");
  611. }
  612. if (null != filter) {
  613. if (!StringUtils.isEmpty(filter.getKeyword())) {
  614. SimpleExpression code = new SimpleExpression("remark", filter.getKeyword(), CriterionExpression.Operator.LIKE);
  615. SimpleExpression[] simpleExpressions = new SimpleExpression[]{code};
  616. LogicalExpression logicalExpression = PredicateUtils.or(simpleExpressions);
  617. info.expression(logicalExpression);
  618. }
  619. if (filter.getFromDate() != null) {
  620. info.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
  621. }
  622. if (filter.getEndDate() != null) {
  623. info.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
  624. }
  625. }
  626. SimpleExpression amount = new SimpleExpression("amount", Constant.YES, CriterionExpression.Operator.GT);
  627. SimpleExpression[] simpleExpressions = new SimpleExpression[]{amount};
  628. LogicalExpression logicalExpression = PredicateUtils.and(simpleExpressions);
  629. info.expression(logicalExpression);
  630. return purcInquiryDao.findAll(new Specification<PurcInquiry>() {
  631. @Override
  632. public Predicate toPredicate(Root<PurcInquiry> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
  633. query.where(info.getPredicates(root, query, builder));
  634. return null;
  635. }
  636. }, info);
  637. }
  638. /**
  639. * 针对客户,查询单个物料的报价情况
  640. *
  641. * @param id 明细id
  642. * @param enuu 当前企业UU
  643. * @return
  644. */
  645. @Override
  646. public InquiryProductInfo findInquiryDetailById(Long id, Long enuu) {
  647. List<PublicInquiryItem> items = itemDao.findBySourceId(id);
  648. InquiryProductInfo productInfo = new InquiryProductInfo();
  649. if (!CollectionUtils.isEmpty(items)) {
  650. Long prId = items.get(0).getProductId();
  651. if (null != prId) {
  652. Product product = productDao.findOne(prId);
  653. productInfo.setBrand(product.getBrand());
  654. productInfo.setCode(product.getCode());
  655. productInfo.setTitle(product.getTitle());
  656. productInfo.setSpec(product.getSpec());
  657. productInfo.setUnit(product.getUnit());
  658. productInfo.setCmpCode(product.getCmpCode());
  659. } else {
  660. productInfo.setCmpCode(items.get(0).getCmpCode());
  661. productInfo.setBrand(items.get(0).getInbrand());
  662. }
  663. productInfo.setInquiryItems(new HashSet<PublicInquiryItem>(items));
  664. }
  665. return productInfo;
  666. }
  667. /**
  668. * 针对客户查询供应商报价信息
  669. *
  670. * @param pageInfo 分页信息
  671. * @param filter 过滤条件
  672. * @return
  673. */
  674. @Override
  675. public Page<PurcInquiryItemInfo> findQuotationsByPage(final PageInfo pageInfo, final SearchFilter filter, Long enUU, Long userUU, Short overdue) {
  676. if (enUU == null && userUU == null) {
  677. throw new IllegalAccessError("非法访问");
  678. }
  679. Sort sort = new Sort(Sort.Direction.DESC, "date");
  680. if (pageInfo.getOffset() == 0) {
  681. pageInfo.setOffset(pageInfo.getPageSize() * (pageInfo.getPageNumber() - 1));
  682. }
  683. pageInfo.setSort(sort);
  684. if (enUU != null) {
  685. pageInfo.filter("inquiry.enUU", enUU);
  686. } else {
  687. if (userUU != null) {
  688. pageInfo.filter("inquiry.recorderUU", userUU);
  689. pageInfo.expression(PredicateUtils.isNull("inquiry.enUU"));
  690. }
  691. }
  692. if (StringUtils.hasText(filter.getKeyword())) {
  693. SimpleExpression cmpCode = new SimpleExpression("cmpCode", filter.getKeyword(), CriterionExpression.Operator.LIKE);
  694. SimpleExpression inbrand = new SimpleExpression("inbrand", filter.getKeyword(), CriterionExpression.Operator.LIKE);
  695. SimpleExpression[] simpleExpressions = new SimpleExpression[]{inbrand, cmpCode};
  696. LogicalExpression logicalExpression = PredicateUtils.or(simpleExpressions);
  697. pageInfo.expression(logicalExpression);
  698. }
  699. if (filter.getFromDate() != null) {
  700. pageInfo.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
  701. }
  702. if (filter.getEndDate() != null) {
  703. pageInfo.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
  704. }
  705. if (null != overdue) {
  706. // 已超过截止日期
  707. if (overdue.equals(Constant.YES)) {
  708. pageInfo.expression(PredicateUtils.lt("endDate", new Date(System.currentTimeMillis()), false));
  709. } else if (overdue.equals(Constant.NO)) {
  710. pageInfo.expression(PredicateUtils.gte("endDate", new Date(System.currentTimeMillis()), false));
  711. }
  712. }
  713. pageInfo.expression(PredicateUtils.gt("offerAmount", Constant.NO, false));
  714. Page<PurcInquiryItemInfo> items = inquiryItemDao.findAll(new Specification<PurcInquiryItemInfo>() {
  715. @Override
  716. public Predicate toPredicate(Root<PurcInquiryItemInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
  717. query.where(pageInfo.getPredicates(root, query, builder));
  718. return null;
  719. }
  720. }, pageInfo);
  721. if (!CollectionUtils.isEmpty(items.getContent())) {
  722. for (PurcInquiryItemInfo itemInfo : items.getContent()) {
  723. List<PublicInquiryItem> itemList = itemDao.findBySourceIdOrderByOfferTimeDesc(itemInfo.getId());
  724. itemInfo.setQutations(itemList);
  725. itemInfo.setQuotation(itemList.get(0));
  726. itemInfo.setAgreed(Constant.NO);
  727. if (!CollectionUtils.isEmpty(itemList)) {
  728. for (PublicInquiryItem i : itemList) {
  729. if (i.getAgreed() != null && i.getAgreed().equals(Constant.YES)) {
  730. itemInfo.setAgreed(Constant.YES);
  731. break;
  732. }
  733. }
  734. }
  735. if (null != itemInfo.getInquiry().getEndDate()) {
  736. itemInfo.setRemainingTime(itemInfo.getInquiry().getEndDate().getTime() - System.currentTimeMillis());
  737. }
  738. if (null == itemInfo.getProductId()) {
  739. Product product = new Product();
  740. product.setTitle(itemInfo.getProdTitle());
  741. product.setCmpCode(itemInfo.getCmpCode());
  742. product.setBrand(itemInfo.getInbrand());
  743. product.setSpec(itemInfo.getSpec());
  744. itemInfo.setProduct(product);
  745. }
  746. }
  747. }
  748. return items;
  749. }
  750. /**
  751. * 针对客户单个公共询价,查询供应商报价信息
  752. *
  753. * @param id
  754. * @return
  755. */
  756. @Override
  757. public PurcInquiryItemInfo findQuotationById(Long id) {
  758. PurcInquiryItemInfo itemInfo = inquiryItemDao.findOne(id);
  759. List<PublicInquiryItem> itemList = itemDao.findBySourceId(itemInfo.getId());
  760. itemInfo.setQutations(itemList);
  761. itemInfo.setAgreed(Constant.NO);
  762. if (!CollectionUtils.isEmpty(itemList)) {
  763. for (PublicInquiryItem i : itemList) {
  764. if (i.getAgreed() != null && i.getAgreed().equals(Constant.YES)) {
  765. itemInfo.setAgreed(Constant.YES);
  766. break;
  767. }
  768. }
  769. }
  770. if (null != itemInfo.getInquiry().getEndDate()) {
  771. itemInfo.setRemainingTime(itemInfo.getInquiry().getEndDate().getTime() - System.currentTimeMillis());
  772. }
  773. if (null == itemInfo.getProductId()) {
  774. Product product = new Product();
  775. product.setTitle(itemInfo.getProdTitle());
  776. product.setCmpCode(itemInfo.getCmpCode());
  777. product.setBrand(itemInfo.getInbrand());
  778. product.setSpec(itemInfo.getSpec());
  779. itemInfo.setProduct(product);
  780. }
  781. return itemInfo;
  782. }
  783. /**
  784. * 发送消息推送
  785. *
  786. */
  787. public void sendMessage(final Integer count, final List<InquiryRemind> reminds) {
  788. ThreadUtils.task(new Runnable() {
  789. @Override
  790. public void run() {
  791. try {
  792. List<MessageModel> models = new ArrayList<>();
  793. MessageModel model = new MessageModel();
  794. model.setType(INQUIRY_TYPE);
  795. model.setType(INQUIRY_TYPE_SELLER_MALL);
  796. model.setProducerApp("MALl");
  797. model.setConsumerType(CUST_TYPE);
  798. model.setConsumerApp(CONSUMERAPP_HIDE);
  799. model.setRemark(String.valueOf(count));
  800. for(InquiryRemind remind : reminds){
  801. model.setReceiverEnuu(remind.getVendUU());
  802. model.setReceiverUu(remind.getVendUserUU());
  803. model.setSenderEnuu(MESSAGE_SENDERENUU);
  804. model.setSenderUu(MESSAGE_SENDERUU);
  805. }
  806. String company = "";
  807. Enterprise enterprise = enterpriseDao.findOne(reminds.get(0).getVendUU());
  808. if(null != enterprise){
  809. company = enterprise.getEnName();
  810. }
  811. String content = company + "新增了"+ count +"张公共询价单,快登录优软商城查看详情吧!https://www.usoftmall.com/vendor#/seekPurchase";
  812. model.setContent(content);
  813. model.setSmsType(SMS_TYPE);
  814. model.setSmTemplate(SMS_TEMP_ID);
  815. models.add(model);
  816. long start = System.currentTimeMillis();
  817. String res = HttpUtil.doPost(PS_MESSAGE_URL + "/messages", FlexJsonUtils.toJsonDeep(models));
  818. log.info("/message 耗时:" + (System.currentTimeMillis() - start) + "消息数:" + models.size());
  819. System.out.println(FlexJsonUtils.toJsonDeep(models));
  820. System.out.println(res);
  821. logger.log("公共询价", "此次"+company+"公司新增"+count+"张公共询价");
  822. } catch (Exception e) {
  823. e.printStackTrace();
  824. }
  825. }
  826. }).run();
  827. }
  828. /**
  829. * 发送消息推送 (定时任务使用)
  830. *
  831. */
  832. @Override
  833. public void sendMessage(final List<InquiryRemind> reminds) {
  834. ThreadUtils.task(new Runnable() {
  835. @Override
  836. public void run() {
  837. try {
  838. log.info("发送消息开始");
  839. List<MessageModel> models = new ArrayList<>();
  840. for (InquiryRemind remind : reminds) {
  841. if (null != remind.getVendUU() && null != remind.getVendUserUU()) {
  842. Integer count = remind.getCounts();
  843. MessageModel model = new MessageModel();
  844. model.setType(INQUIRY_TYPE);
  845. model.setType(INQUIRY_TYPE_SELLER_MALL);
  846. model.setProducerApp(SOURCEAPP_MALL);
  847. model.setConsumerType(CUST_TYPE);
  848. model.setConsumerApp(CONSUMERAPP_HIDE);
  849. model.setRemark(String.valueOf(count));
  850. model.setReceiverEnuu(remind.getVendUU());
  851. model.setReceiverUu(remind.getVendUserUU());
  852. model.setSenderEnuu(MESSAGE_SENDERENUU);
  853. model.setSenderUu(MESSAGE_SENDERUU);
  854. String company = "";
  855. Enterprise enterprise = enterpriseDao.findOne(remind.getVendUU());
  856. if(null != enterprise){
  857. company = enterprise.getEnName();
  858. }
  859. String content = company + "新增了"+ count +"张公共询价单,快登录优软商城查看详情吧!https://www.usoftmall.com/vendor#/seekPurchase";
  860. model.setContent(content);
  861. model.setSmsType(SMS_TYPE);
  862. model.setSmTemplate(SMS_TEMP_ID);
  863. models.add(model);
  864. log.info("此次" + company + "公司新增" + remind.getCounts() + "张公共询价(发送信息前),接收人UU:" + model.getReceiverUu());
  865. }
  866. if (models.size() >= 500) {
  867. long start = System.currentTimeMillis();
  868. String res = HttpUtil.doPost(PS_MESSAGE_URL + "/messages", FlexJsonUtils.toJsonDeep(models));
  869. log.info("消息中心生成消息接口返回日志" + res);
  870. log.info("发送消息" + models.size() + ",耗时:" + (System.currentTimeMillis() - start));
  871. models = new ArrayList<>();
  872. }
  873. }
  874. if (!CollectionUtils.isEmpty(models)) {
  875. long start = System.currentTimeMillis();
  876. String res = HttpUtil.doPost(PS_MESSAGE_URL + "/messages", FlexJsonUtils.toJsonDeep(models));
  877. log.info("消息中心生成消息接口返回日志" + res);
  878. log.info("发送消息" + models.size() + ",耗时:" + (System.currentTimeMillis() - start));
  879. }
  880. log.info("发送消息全部完成");
  881. } catch (Exception e) {
  882. e.printStackTrace();
  883. }
  884. }
  885. }).run();
  886. }
  887. /**
  888. * 以供应商企业UU和用户UU分组查询商机
  889. * @param hours 查之前多少小时内的单据
  890. * @return 商机List
  891. */
  892. @Override
  893. public List<InquiryRemind> findInquiryRemindGroupByVendUUAndVendUserUU(int hours) {
  894. String sql = "select ir_venduu vendUU,ir_venduseruu vendUserUU, count(1) counts from purc$inquiry$remind where ir_date between date_sub(now(), interval "
  895. + hours + " hour) and now() group by ir_venduu,ir_venduseruu";
  896. return jdbcTemplate.query(sql, new BeanPropertyRowMapper<InquiryRemind>(InquiryRemind.class));
  897. }
  898. }