InquiryServiceImpl.java 39 KB

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