InquiryServiceImpl.java 43 KB

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