PublicInquiryServiceImpl.java 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936
  1. package com.uas.ps.inquiry.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.uas.ps.core.util.ContextUtils;
  5. import com.uas.ps.entity.Product;
  6. import com.uas.ps.entity.ProductUsers;
  7. import com.uas.ps.entity.Status;
  8. import com.uas.ps.inquiry.AccessConfiguration;
  9. import com.uas.ps.inquiry.dao.*;
  10. import com.uas.ps.inquiry.domain.IPage;
  11. import com.uas.ps.inquiry.entity.*;
  12. import com.uas.ps.inquiry.model.*;
  13. import com.uas.ps.inquiry.page.PageInfo;
  14. import com.uas.ps.inquiry.page.SearchFilter;
  15. import com.uas.ps.inquiry.page.criteria.CriterionExpression;
  16. import com.uas.ps.inquiry.page.criteria.LogicalExpression;
  17. import com.uas.ps.inquiry.page.criteria.PredicateUtils;
  18. import com.uas.ps.inquiry.page.criteria.SimpleExpression;
  19. import com.uas.ps.inquiry.service.PublicInquiryService;
  20. import com.uas.ps.inquiry.util.*;
  21. import javassist.NotFoundException;
  22. import org.apache.log4j.Logger;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.dao.DataAccessException;
  25. import org.springframework.data.domain.Page;
  26. import org.springframework.data.jpa.domain.Specification;
  27. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  28. import org.springframework.jdbc.core.JdbcTemplate;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.ui.ModelMap;
  31. import org.springframework.util.CollectionUtils;
  32. import org.springframework.util.StringUtils;
  33. import javax.persistence.criteria.*;
  34. import java.text.SimpleDateFormat;
  35. import java.util.*;
  36. /**
  37. * 公共询价接口实现
  38. *
  39. * Created by hejq on 2018-01-13.
  40. */
  41. @Service
  42. public class PublicInquiryServiceImpl implements PublicInquiryService {
  43. @Autowired
  44. private PublicInquiryDao publicInquiryDao;
  45. @Autowired
  46. private PurcInquiryDao purcInquiryDao;
  47. @Autowired
  48. private ProductDao productDao;
  49. @Autowired
  50. private PurcInquiryItemDao purcInquiryItemDao;
  51. @Autowired
  52. private JdbcTemplate jdbcTemplate;
  53. @Autowired
  54. private PublicInquiryReplyDao publicInquiryReplyDao;
  55. @Autowired
  56. private PurcInquiryItemInfoDao inquiryItemInfoDao;
  57. @Autowired
  58. private PublicInquiryItemInfoDao itemInfoDao;
  59. @Autowired
  60. private PublicInquiryItemDao publicInquiryItemDao;
  61. @Autowired
  62. private UserDao userDao;
  63. @Autowired
  64. private EnterpriseDao enterpriseDao;
  65. @Autowired
  66. private InquiryRemindDao remindDao;
  67. private static final Logger logger = Logger.getLogger(Logger.class);
  68. /**
  69. * 应用来源
  70. */
  71. private final String SOURCERAPP = "B2B";
  72. /**
  73. * 消息类型 (在B2B消息中拼接跳转单据详情url请求时需要)
  74. */
  75. private final String INQUIRY_TYPE = "公共询价";
  76. /**
  77. * 询价种类
  78. */
  79. private final String INQUIRYKIND = "publicInquiry";
  80. /**
  81. * 消息推送邮件模板id
  82. */
  83. private final String MAIL_TEMP_ID = "d94e931b-b699-46d7-8bb2-94604a3352c0";
  84. /**
  85. * 消息推送短信模板id
  86. */
  87. private final String SMS_TEMP_ID = "e14d502a-25b8-40a0-8acf-5c61ae38d763";
  88. /**
  89. * 消息推送方式:邮件、短信、im
  90. */
  91. private final String SMS_TYPE = "MAIL_AND_SM_AND_IM";
  92. /**
  93. * 来源应用,ERP
  94. */
  95. private final String PRODUCERAPP = "ERP";
  96. /**
  97. * 消费类型: 多个,MULTI
  98. */
  99. private final String CUST_TYPE = "MULTI";
  100. /**
  101. * 接收应用
  102. */
  103. private final String CONSUMERAPP = "B2B,MALL";
  104. /**
  105. * 公共物料访问地址
  106. */
  107. private final String PS_PRODUCT_URL = ContextUtils.getBean(AccessConfiguration.class).getPsProductUrl();
  108. /**
  109. * 公共消息访问地址
  110. */
  111. private final String PS_MESSAGE_URL = ContextUtils.getBean(AccessConfiguration.class).getPsMessageUrl();
  112. /**
  113. * 保存公共询价信息
  114. *
  115. * @param inquiries erp传入公共询价的信息
  116. * @param enuu 询价企业UU号
  117. * @param address 询价企业地址
  118. */
  119. @Override
  120. public void save(List<BatchInquiry> inquiries, Long enuu, String address) throws NotFoundException {
  121. List<PurcInquiry> purcInquiries = covert(inquiries, enuu, address);
  122. if(!CollectionUtils.isEmpty(purcInquiries)) {
  123. for(PurcInquiry inquiry : purcInquiries) {
  124. // 判断单号是否已存在
  125. PurcInquiry old = purcInquiryDao.findByCodeAndEnUU(inquiry.getCode(), enuu);
  126. List<PurcInquiryItem> items = new ArrayList<PurcInquiryItem>();
  127. if(old == null && !CollectionUtils.isEmpty(inquiry.getInquiryItems())) {
  128. for(PurcInquiryItem item : inquiry.getInquiryItems()) {
  129. item.setInquiry(inquiry);
  130. items.add(item);
  131. }
  132. }
  133. try {
  134. items = purcInquiryItemDao.save(items);
  135. if (!CollectionUtils.isEmpty(items)) {
  136. notify(items, PRODUCERAPP);
  137. }
  138. } catch (Exception e) {
  139. e.printStackTrace();
  140. }
  141. }
  142. }
  143. }
  144. /**
  145. * 消息推送
  146. *
  147. * @param inquiryItems 询价明细
  148. * @param sourceApp 消息来源应用
  149. */
  150. @Override
  151. public void notify(List<PurcInquiryItem> inquiryItems, String sourceApp) throws Exception {
  152. for (PurcInquiryItem item : inquiryItems) {
  153. Product product = productDao.findOne(item.getProductId());
  154. if (null == product) {
  155. throw new NotFoundException("询价单" + item.getInquiry().getCode() + ",明细第" + item.getNumber() + "行未找到对应物料");
  156. }
  157. String url = PS_PRODUCT_URL + "/productuser/getProductUsersByEnUUAndCmpCode";
  158. JSONObject formData = new JSONObject();
  159. formData.put("enUU", item.getInquiry().getEnUU());
  160. formData.put("cmpCode", item.getCmpCode());
  161. try {
  162. HttpUtil.Response res = HttpUtil.sendGetRequest(url, formData);
  163. if (res.getStatusCode() == 200) {
  164. List<ProductUsers> users = FlexJsonUtils.fromJsonArray(res.getResponseText(), ProductUsers.class);
  165. if (!CollectionUtils.isEmpty(users)) {
  166. List<MessageModel> models = new ArrayList<MessageModel>();
  167. for (ProductUsers user : users) {
  168. User u = userDao.findOne(null != item.getInquiry().getRecorderUU() ? item.getInquiry().getRecorderUU() : 0L);
  169. Enterprise e = enterpriseDao.findOne(item.getInquiry().getEnUU());
  170. String cmp = product.getCmpCode().length() > 10 ? product.getCmpCode().substring(0, 10).concat("...") : product.getCmpCode();
  171. String content = "发布关于“" + cmp + "”的公共询价信息,邀请您参与报价";
  172. if (null != e) {
  173. content = e.getEnName() + content;
  174. } else if (null != u) {
  175. content = u.getUserName() + content;
  176. }
  177. MessageModel model = new MessageModel();
  178. model.setType(INQUIRY_TYPE);
  179. model.setProducerApp(sourceApp);
  180. model.setConsumerType(CUST_TYPE);
  181. model.setConsumerApp(CONSUMERAPP);
  182. model.setContent(content);
  183. model.setRemark(String.valueOf(item.getInquiry().getId()));
  184. model.setSourceId(item.getId());
  185. model.setReceiverEnuu(user.getEnuu());
  186. model.setReceiverUu(user.getUseruu());
  187. model.setSenderEnuu(item.getInquiry().getEnUU());
  188. if (null != item.getUserUU() || null != item.getInquiry().getRecorderUU()) {
  189. model.setSenderUu(item.getUserUU() != null ? item.getUserUU() : item.getInquiry().getRecorderUU());
  190. } else {
  191. Enterprise enterprise = enterpriseDao.findOne(item.getInquiry().getEnUU());
  192. model.setSenderUu(null != enterprise ? enterprise.getAdminUU() : 0L);
  193. }
  194. model.setSmsType(SMS_TYPE);
  195. model.setMailTemplate(MAIL_TEMP_ID);
  196. model.setSmTemplate(SMS_TEMP_ID);
  197. models.add(model);
  198. }
  199. if (!CollectionUtils.isEmpty(models)) {
  200. sendMessage(models);
  201. }
  202. // 生成推荐信息
  203. remindInquiry(inquiryItems, users);
  204. }
  205. }
  206. } catch (Exception e) {
  207. logger.info("根据企业UU和物料原厂型号cmpCode从公共物料库获取个人产品库相关用户失败:" + e.getMessage());
  208. e.printStackTrace();
  209. }
  210. }
  211. }
  212. /**
  213. * 通过查询的个人物料相关联的信息,自动生成推荐的报价的数据
  214. *
  215. * @param inquiryItems 报价明细
  216. * @param users 用户信息
  217. */
  218. private void remindInquiry(final List<PurcInquiryItem> inquiryItems, final List<ProductUsers> users) {
  219. ThreadUtils.task(new Runnable() {
  220. @Override
  221. public void run() {
  222. try {
  223. List<InquiryRemind> reminds = new ArrayList<InquiryRemind>();
  224. for (ProductUsers u : users) {
  225. for (PurcInquiryItem item : inquiryItems) {
  226. if (item.getInquiry().getEnUU() != null) {
  227. Enterprise enterprise = enterpriseDao.findOne(item.getInquiry().getEnUU());
  228. InquiryRemind remind = new InquiryRemind();
  229. remind.setEnName(enterprise.getEnName());
  230. remind.setEnUU(item.getInquiry().getEnUU());
  231. remind.setUserName(item.getUserName());
  232. remind.setUserTel(item.getUserTel());
  233. remind.setCode(item.getInquiry().getCode());
  234. remind.setBrand(item.getBrand());
  235. remind.setCmpCode(item.getCmpCode());
  236. remind.setSpec(item.getSpec());
  237. remind.setTitle(item.getProdTitle());
  238. if (item.getProduct() != null) {
  239. remind.setBrand(item.getProduct().getBrand());
  240. remind.setCmpCode(item.getProduct().getCmpCode());
  241. remind.setSpec(item.getProduct().getSpec());
  242. remind.setTitle(item.getProduct().getTitle());
  243. }
  244. remind.setItemId(item.getId());
  245. remind.setNeedQty(item.getNeedquantity());
  246. remind.setReDate(item.getInquiry().getDate());
  247. remind.setEndDate(item.getInquiry().getEndDate());
  248. remind.setVendUU(u.getEnuu());
  249. remind.setVendUserUU(u.getUseruu());
  250. remind.setDate(new Date(System.currentTimeMillis()));
  251. remind.setStatus(Status.INPUTTING.value());
  252. reminds.add(remind);
  253. }
  254. }
  255. }
  256. if (!CollectionUtils.isEmpty(reminds)) {
  257. remindDao.save(reminds);
  258. }
  259. } catch (Exception e) {
  260. e.printStackTrace();
  261. }
  262. }
  263. }).run();
  264. }
  265. /**
  266. * 通过id查询询价信息
  267. *
  268. * @param id 公共询价主表id
  269. * @return
  270. */
  271. @Override
  272. public PurcInquiry findInquiryById(Long id) {
  273. return purcInquiryDao.findOne(id);
  274. }
  275. /**
  276. * 发送消息推送
  277. *
  278. * @param models 封装的消息信息
  279. */
  280. private void sendMessage(final List<MessageModel> models) {
  281. ThreadUtils.task(new Runnable() {
  282. @Override
  283. public void run() {
  284. try {
  285. logger.info("发送消息实体" + JSON.toJSONString(models));
  286. String res = HttpUtil.doPost(PS_MESSAGE_URL + "/messages", FlexJsonUtils.toJsonDeep(models));
  287. logger.info("消息请求发送日志" + res);
  288. } catch (Exception e) {
  289. e.printStackTrace();
  290. }
  291. }
  292. }).run();
  293. }
  294. /**
  295. * 将ERP传入的inquiry信息转成公共询价服务中心需要的信息
  296. *
  297. * @param inquiries 将ERP传入的inquiry信息
  298. * @param enuu 询价企业UU号
  299. * @param address 询价企业地址
  300. * @return
  301. */
  302. @Override
  303. public List<PurcInquiry> covert(List<BatchInquiry> inquiries, Long enuu, String address) throws NotFoundException {
  304. List<PurcInquiry> purcInquiries = new ArrayList<PurcInquiry>();
  305. if (!CollectionUtils.isEmpty(inquiries)) {
  306. for (BatchInquiry inquiry : inquiries) {
  307. PurcInquiry old = purcInquiryDao.findByCodeAndEnUU(inquiry.getBi_code(), enuu);
  308. //先判断是否已经存在,不存在才进行存储
  309. if (null == old) {
  310. PurcInquiry purcInquiry = inquiry.covert();
  311. purcInquiry.setEnUU(enuu);
  312. purcInquiry.setShip(address);
  313. Set<PurcInquiryItem> purcInquiryItems = new HashSet<PurcInquiryItem>();
  314. if (!CollectionUtils.isEmpty(inquiry.getInProducts())) {
  315. for(BatchInProduct batch : inquiry.getInProducts()) {
  316. PurcInquiryItem item = new PurcInquiryItem();
  317. item.setIsOpen(Constant.YES);
  318. List<Product> products = productDao.findByEnUUAndCode(enuu, batch.getBip_prodcode());
  319. if (CollectionUtils.isEmpty(products)) {
  320. throw new NotFoundException("编号为[" + batch.getBip_prodcode() + "]的物料未找到");
  321. }
  322. item.setProductId(products.get(0).getId());
  323. item.setCmpCode(products.get(0).getCmpCode());
  324. item.setInbrand(products.get(0).getBrand());
  325. item.setProdTitle(products.get(0).getTitle());
  326. item.setSpec(products.get(0).getSpec());
  327. item.setRemark(batch.getBip_remark());
  328. item.setProdCode(products.get(0).getCode());
  329. item.setProdTitle(products.get(0).getTitle());
  330. item.setNumber(batch.getBip_detno());
  331. item.setFromDate(new Date());
  332. item.setToDate(purcInquiry.getEndDate());
  333. item.setStatus((short) Status.NOT_REPLY.value());
  334. item.setIsOpen(Constant.YES);
  335. item.setSource("ERP");
  336. item.setSourceid(batch.getBip_id());
  337. item.setCurrency(batch.getBip_currency());
  338. item.setUserName(batch.getEm_name());
  339. item.setUserTel(batch.getBip_mobile());
  340. item.setUserCode(batch.getBip_buyercode());
  341. item.setOfferAmount(0);
  342. item.setEndDate(inquiry.getBi_enddate());
  343. if (null != inquiry.getBi_date()) {
  344. item.setDate(inquiry.getBi_date());
  345. } else {
  346. item.setDate(new Date(System.currentTimeMillis()));
  347. }
  348. if (item.getCurrency() == null) {
  349. item.setCurrency("RMB");
  350. }
  351. purcInquiryItems.add(item);
  352. }
  353. }
  354. purcInquiry.setInquiryItems(purcInquiryItems);
  355. purcInquiries.add(purcInquiry);
  356. }
  357. }
  358. }
  359. return purcInquiries;
  360. }
  361. /**
  362. * erp提交审核时,公共询价服务中心单据禁用报价功能
  363. *
  364. * @param inquiries erp询价信息
  365. * @param enuu 询价企业UU号
  366. */
  367. @Override
  368. public void updateStatus(List<BatchInquiry> inquiries, Long enuu) {
  369. if (!CollectionUtils.isEmpty(inquiries)) {
  370. for (BatchInquiry inquiry : inquiries) {
  371. PurcInquiry purcInquiry = purcInquiryDao.findByCodeAndEnUU(inquiry.getBi_code(), enuu);
  372. purcInquiryItemDao.updateStatus(purcInquiry.getId());
  373. }
  374. }
  375. }
  376. /**
  377. * 查询供应商的报价信息
  378. *
  379. * @return
  380. */
  381. @Override
  382. public List<InquiryDetail> findNotUploadReply(Long enuu) {
  383. List<PublicInquiryItem> items = publicInquiryItemDao.findByEnUUAndBackStatus(enuu, (short) Status.NOT_UPLOAD.value());
  384. if (!CollectionUtils.isEmpty(items)) {
  385. // 防止下载过程中进行操作,这里设置一个下载中的状态
  386. Set<Long> ids = new HashSet<>();
  387. for (PublicInquiryItem item : items) {
  388. ids.add(item.getId());
  389. }
  390. if (ids.size() > 0) {
  391. publicInquiryItemDao.updateBackStatus(ids);
  392. }
  393. return convertPublicInquiryReply(items);
  394. }
  395. return new ArrayList<>();
  396. }
  397. /**
  398. * 将公共询价服务中心的公共询价转成ERP的对应的字段
  399. *
  400. * @param notUploadReply 未下载的供应商报价信息
  401. * @return
  402. * @author hejq
  403. * @date 2018-01-14 11:51
  404. */
  405. @Override
  406. public List<InquiryDetail> convertPublicInquiryReply(List<PublicInquiryItem> notUploadReply) {
  407. List<InquiryDetail> details = new ArrayList<InquiryDetail>();
  408. if (!CollectionUtils.isEmpty(notUploadReply)) {
  409. for (PublicInquiryItem item : notUploadReply) {
  410. details.add(new InquiryDetail(item));
  411. }
  412. }
  413. return details;
  414. }
  415. /**
  416. * 下载完成后更新公共询价服务中心询价单明细的下载状态
  417. *
  418. * @param idArray 询价单明细id
  419. * @author hejq
  420. * @date 2018-01-14 12:12
  421. */
  422. @Override
  423. public void onReplyUploadSuccess(String[] idArray) {
  424. for (String id : idArray) {
  425. PublicInquiryItem item = publicInquiryItemDao.findOne(Long.parseLong(id));
  426. if (item != null) {
  427. item.setBackStatus((short) Status.DOWNLOADED.value());
  428. item.setErpstatus(Constant.YES);
  429. publicInquiryItemDao.save(item);
  430. }
  431. }
  432. }
  433. /**
  434. * ERP提交公共询价单之后,更新平台状态,让公共询价服务中心询价单不能进行报价操作
  435. *
  436. * @param inquiries 询价信息
  437. * @author hejq
  438. * @date 2018-01-14 12:20
  439. */
  440. @Override
  441. public void updateInquiryStatus(List<Inquiry> inquiries) {
  442. if(!CollectionUtils.isEmpty(inquiries)) {
  443. for(Inquiry inquiry : inquiries) {
  444. // 更新为过期状态,不能进行报价处理
  445. String sql = "update purc$puinquiryitems set id_overdue = 1 where id_inid in ( select in_id from purc$puinquiry where in_enuu = "
  446. + inquiry.getEn_uu() + " and in_code = '" + inquiry.getIn_code() + "')";
  447. jdbcTemplate.update(sql);
  448. // 更新已转报价的询价单明细状态
  449. jdbcTemplate.update("update public$inquiryItems set id_overdue = 1 where id_inid in " +
  450. "(select in_id from public$inquiry where in_enuu = " + inquiry.getEn_uu() + " and in_code = '" + inquiry.getIn_code() + "')");
  451. // 更新已转报价的询价单主表check状态为已提交
  452. jdbcTemplate.update("update public$inquiry set in_checked = 1 where in_enuu = " + inquiry.getEn_uu() + " and in_code = '" + inquiry.getIn_code() + "'");
  453. }
  454. }
  455. }
  456. /**
  457. * ERP对报价信息的采纳状态上传到公共询价服务中心
  458. *
  459. * @param decides 采纳信息
  460. */
  461. @Override
  462. public void onReplyDecide(List<InquiryDecide> decides, Long enuu) {
  463. List<PublicInquiryItem> publicInquiryItems = convertInquiryDecide(decides);
  464. if (!CollectionUtils.isEmpty(publicInquiryItems)) {
  465. for (PublicInquiryItem inquiryItem : publicInquiryItems) {
  466. publicInquiryItemDao.updateDecideStatusByID(inquiryItem.getAgreed(), inquiryItem.getDecideStatus(), inquiryItem.getId());
  467. }
  468. }
  469. }
  470. /**
  471. * 将ERP的报价采纳信息转为公共询价服务中心需要的信息
  472. *
  473. * @param decides erp报价采纳信息
  474. * @author hejq
  475. * @date 2018-01-14 12:25
  476. */
  477. @Override
  478. public List<PublicInquiryItem> convertInquiryDecide(List<InquiryDecide> decides) {
  479. List<PublicInquiryItem> inquiryItems = new ArrayList<PublicInquiryItem>();
  480. if (!CollectionUtils.isEmpty(decides)) {
  481. for (InquiryDecide decide : decides) {
  482. PublicInquiryItem item = publicInquiryItemDao.findOne(decide.getB2b_id());
  483. if (null != item) {
  484. item.setAgreed(decide.getId_agreed());
  485. item.setDecideStatus((short) Status.NOT_UPLOAD.value());
  486. inquiryItems.add(item);
  487. }
  488. }
  489. }
  490. return inquiryItems;
  491. }
  492. /**
  493. * 买家ERP作废询价单后,修改公共询价服务中心里面的状态
  494. *
  495. * @param inquiries 询价信息
  496. * @param enuu 企业UU
  497. * @author hejq
  498. * @date 2018-01-14 12:28
  499. */
  500. @Override
  501. public void onReplyInvalid(List<Inquiry> inquiries, final Long enuu) {
  502. final List<PublicInquiryItem> newInquiryItems = new ArrayList<>();
  503. ThreadUtils.tasks(new IRunnable<Inquiry>() {
  504. @Override
  505. public void run(Inquiry inquiry) {
  506. List<PublicInquiry> purchaseInquiries = publicInquiryDao.findByEnUUAndCode(enuu, inquiry.getIn_code());
  507. if (!CollectionUtils.isEmpty(purchaseInquiries)) {
  508. PublicInquiry publicInquiry = purchaseInquiries.get(0);
  509. for (PublicInquiryItem item : publicInquiry.getInquiryItems()) {
  510. item.setStatus((short) Status.DISABLED.value());
  511. // 获取作废信息时,更新作废上传状态为 待上传
  512. item.setInvalidStatus((short) Status.NOT_UPLOAD.value());
  513. synchronized (newInquiryItems) {
  514. newInquiryItems.add(item);
  515. }
  516. }
  517. }
  518. }
  519. }, inquiries).run();
  520. }
  521. /**
  522. * 将公共询价列表转成需要报价的询价单,类型是公共询价
  523. *
  524. * @param id 询价明细id
  525. * @param enuu 报价企业UU
  526. * @param useruu 报价人uu
  527. * @return
  528. * @author hejq
  529. * @date 2018-01-14 14:46
  530. */
  531. @Override
  532. public ModelMap transtoInquiry(Long id, Long enuu, Long useruu) {
  533. ModelMap map = new ModelMap();
  534. PurcInquiryItem purcInquiryItem = purcInquiryItemDao.findOne(id);
  535. PurcInquiry purcInquiry = purcInquiryItem.getInquiry();
  536. // 先判断客户询价单是否存在这张单据
  537. PublicInquiry inquiry = publicInquiryDao.findBySourceIdAndSourceApp(purcInquiry.getId(), SOURCERAPP);
  538. if (null == inquiry) {// 新增
  539. PublicInquiry saleInquiry = new PublicInquiry();
  540. saleInquiry.setDate(new Date());
  541. saleInquiry.setCode(purcInquiry.getCode());
  542. saleInquiry.setEnUU(purcInquiry.getEnUU());
  543. saleInquiry.setRecorder(purcInquiry.getRecorder());
  544. saleInquiry.setRecorderUU(purcInquiry.getRecorderUU());
  545. saleInquiry.setAuditor(purcInquiry.getAuditor());
  546. saleInquiry.setSourceApp(SOURCERAPP);
  547. saleInquiry.setKind(INQUIRYKIND);
  548. saleInquiry.setSourceId(purcInquiry.getId());
  549. saleInquiry.setPriceType(purcInquiry.getPriceType());
  550. saleInquiry.setInvoice(purcInquiry.getInvoice());
  551. saleInquiry.setShip(purcInquiry.getShip());
  552. saleInquiry.setEndDate(purcInquiry.getEndDate());
  553. if (!CollectionUtils.isEmpty(purcInquiry.getAttachs())) {
  554. Set<com.uas.ps.inquiry.model.Attach> attachs = new HashSet<com.uas.ps.inquiry.model.Attach>();
  555. for (com.uas.ps.inquiry.model.Attach attach : purcInquiry.getAttachs()) {
  556. com.uas.ps.inquiry.model.Attach newAttach = new com.uas.ps.inquiry.model.Attach();
  557. newAttach.setDate(new Date());
  558. newAttach.setDescription(attach.getDescription());
  559. newAttach.setName(attach.getName());
  560. newAttach.setPath(attach.getPath());
  561. newAttach.setRelatedKey(attach.getRelatedKey());
  562. newAttach.setSize(attach.getSize());
  563. newAttach.setRelatedKey(attach.getRelatedKey());
  564. attachs.add(newAttach);
  565. }
  566. saleInquiry.setAttachs(attachs);
  567. }
  568. saleInquiry.setEnvironment(purcInquiry.getEnvironment());
  569. saleInquiry.setRemark(purcInquiry.getRemark());
  570. saleInquiry.setInquirytype(purcInquiry.getInquirytype());
  571. Set<PublicInquiryItem> items = new HashSet<PublicInquiryItem>();
  572. Short i = 0;
  573. if (null != purcInquiryItem) {
  574. PublicInquiryItem item = new PublicInquiryItem();
  575. Product product = productDao.findOne(purcInquiryItem.getProductId());
  576. item.setProductId(product.getId());
  577. item.setInquiry(saleInquiry);
  578. item.setNumber(i);
  579. item.setCurrency(purcInquiryItem.getCurrency());
  580. item.setFromDate(new Date());
  581. item.setToDate(purcInquiryItem.getToDate());
  582. item.setTaxrate(purcInquiryItem.getTaxrate());
  583. item.setRemark(purcInquiryItem.getRemark());
  584. item.setProductId(purcInquiryItem.getProductId());
  585. item.setStatus((short) Status.NOT_REPLY.value());
  586. item.setVendUU(enuu);
  587. item.setVendUserUU(useruu);
  588. item.setSource(purcInquiryItem.getSource());
  589. item.setCustLap(Constant.NO);
  590. item.setSendStatus((short) Status.NOT_UPLOAD.value());
  591. item.setSourceId(id);
  592. List<PublicInquiryReply> replies = new ArrayList<PublicInquiryReply>();
  593. PublicInquiryReply reply = new PublicInquiryReply();
  594. reply.setLapQty((double) 0);
  595. replies.add(reply);
  596. item.setReplies(replies);
  597. item.setNeedquantity(purcInquiryItem.getNeedquantity());
  598. item.setKind(INQUIRYKIND);
  599. item.setProdCode(purcInquiryItem.getProdCode());
  600. items.add(item);
  601. i++;
  602. }
  603. List<PublicInquiryItem> purcitems = publicInquiryItemDao.save(items);
  604. if (purcitems.get(0).getId() != null) {
  605. map.put("success", "转客户询价单成功");
  606. map.put("id", purcitems.get(0).getInquiry().getId());
  607. } else {
  608. map.put("success", "转客户询价单失败");
  609. }
  610. } else {// 插入
  611. PublicInquiryItem purcItem = publicInquiryItemDao.findByVendUUAndSourceId(enuu, id);
  612. if (purcItem != null) {
  613. map.put("info", "询价单已存在");
  614. map.put("inid", purcItem.getId());
  615. } else {
  616. if (!CollectionUtils.isEmpty(purcInquiry.getInquiryItems())) {
  617. if (null != purcInquiryItem) {
  618. // 涉及到级联存储及ERP转入单据的操作,用主表id存储存在问题,这里先用sql语句直接插入
  619. PublicInquiryItem item = new PublicInquiryItem();
  620. Product product = productDao.findOne(purcInquiryItem.getProductId());
  621. item.setProductId(product.getId());
  622. item.setNumber((short) (purcInquiry.getInquiryItems().size() + 1));
  623. item.setCurrency(purcInquiryItem.getCurrency());
  624. item.setFromDate(new Date());
  625. item.setToDate(purcInquiryItem.getToDate());
  626. item.setTaxrate(purcInquiryItem.getTaxrate());
  627. item.setRemark(purcInquiryItem.getRemark());
  628. item.setProductId(purcInquiryItem.getProductId());
  629. item.setVendUU(enuu);
  630. item.setVendUserUU(useruu);
  631. item.setSource(purcInquiryItem.getSource());
  632. item.setStatus((short) Status.NOT_REPLY.value());
  633. item.setCustLap(Constant.NO);
  634. item.setSendStatus((short) Status.NOT_UPLOAD.value());
  635. item.setSourceId(id);
  636. item.setProdCode(purcInquiryItem.getProdCode());
  637. item.setKind(INQUIRYKIND);
  638. item.setNeedquantity(purcInquiryItem.getNeedquantity());
  639. List<PublicInquiryReply> replies = new ArrayList<PublicInquiryReply>();
  640. List<PublicInquiryReply> purcReplies = new ArrayList<PublicInquiryReply>();
  641. PublicInquiryReply reply = new PublicInquiryReply();
  642. reply.setLapQty((double) 0);
  643. purcReplies.add(reply);
  644. purcReplies = publicInquiryReplyDao.save(purcReplies);
  645. replies.addAll(purcReplies);
  646. item.setReplies(replies);
  647. Long idid = jdbcTemplate.queryForObject("select public$inquiryitems_seq.nextval from dual", Long.class);
  648. try {
  649. jdbcTemplate.update(
  650. "insert into public$inquiryitems(id_id,id_number,id_currency,id_fromdate,id_todate,id_taxrate,id_prid,id_venduu,"
  651. + "id_venduseruu,id_sourceapp,id_status,id_custlap,id_sendstatus,id_sourceid,id_inid,id_kind) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
  652. idid, item.getNumber(), item.getCurrency(), item.getFromDate(), item.getToDate(),
  653. item.getTaxrate(), item.getProductId(), item.getVendUU(), item.getVendUserUU(),
  654. item.getSource(), item.getStatus(), item.getCustLap(), item.getSendStatus(),
  655. item.getSourceId(), inquiry.getId(), inquiry.getKind());
  656. } catch (DataAccessException e) {
  657. map.put("info", "转客户询价单失败");
  658. }
  659. item = publicInquiryItemDao.findOne(idid);
  660. //回复清单更新
  661. if(replies.size() > 0) {
  662. for (PublicInquiryReply reply1 : replies) {
  663. jdbcTemplate.update("update public$inquiryreply set ir_idid = " + idid + "where ir_id = " + reply1.getId());
  664. }
  665. }
  666. if (item != null) {
  667. map.put("success", "转客户询价单成功");
  668. map.put("id", item.getInquiry().getId());
  669. } else {
  670. map.put("info", "转客户询价单失败");
  671. }
  672. }
  673. }
  674. }
  675. }
  676. return map;
  677. }
  678. /**
  679. * 通过分页参数和过滤条件查询报价信息
  680. *
  681. * @param info 分页参数
  682. * @param filter 过滤条件
  683. * @return
  684. * @author hejq
  685. * @date 2018-01-17 10:30
  686. */
  687. @Override
  688. public Page<PublicInquiryItemInfo> findByPageInfo(final PageInfo info, final SearchFilter filter) {
  689. if (null != filter) {
  690. if (StringUtils.hasText(filter.getKeyword())) {
  691. SimpleExpression cmpCode = new SimpleExpression("cmpCode", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  692. SimpleExpression brand = new SimpleExpression("inbrand", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  693. SimpleExpression[] simpleExpressions = new SimpleExpression[]{cmpCode, brand};
  694. LogicalExpression logical = new LogicalExpression(simpleExpressions, CriterionExpression.Operator.OR);
  695. info.expression(logical);
  696. }
  697. if (filter.getFromDate() != null) {
  698. info.expression(PredicateUtils.gte("offerTime", new Date(filter.getFromDate()), false));
  699. }
  700. if (filter.getEndDate() != null) {
  701. info.expression(PredicateUtils.lte("offerTime", new Date(filter.getEndDate()), false));
  702. }
  703. }
  704. return itemInfoDao.findAll(new Specification<PublicInquiryItemInfo>() {
  705. public Predicate toPredicate(Root<PublicInquiryItemInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
  706. query.where(info.getPredicates(root, query, builder));
  707. return null;
  708. }
  709. }, info);
  710. }
  711. @Override
  712. public Page<PublicInquiryItemInfo> findListByPageInfo(final PageInfo info, SearchFilter filter) {
  713. return itemInfoDao.findAll(new Specification<PublicInquiryItemInfo>() {
  714. public Predicate toPredicate(Root<PublicInquiryItemInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
  715. query.where(info.getPredicates(root, query, builder));
  716. return null;
  717. }
  718. }, info);
  719. }
  720. /**
  721. * 查询公共询价列表信息
  722. *
  723. * @param info 分页参数
  724. * @param filter 过滤条件
  725. * @return
  726. */
  727. @Override
  728. public IPage<PurcInquiryItemInfo> findTodoByPageInfo(final PageInfo info, final SearchFilter filter) {
  729. Page<PurcInquiryItemInfo> orders = inquiryItemInfoDao.findAll(new Specification<PurcInquiryItemInfo>() {
  730. public Predicate toPredicate(Root<PurcInquiryItemInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
  731. if (null != filter) {
  732. if (filter.getFromDate() != null) {
  733. info.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
  734. }
  735. if (filter.getEndDate() != null) {
  736. info.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
  737. }
  738. if (!StringUtils.isEmpty(filter.getKeyword())) {
  739. SimpleExpression cmpCode = new SimpleExpression("cmpCode", filter.getKeyword(), CriterionExpression.Operator.LIKE);
  740. SimpleExpression brand = new SimpleExpression("inbrand", filter.getKeyword(), CriterionExpression.Operator.LIKE);
  741. SimpleExpression[] simpleExpressions = new SimpleExpression[]{cmpCode, brand};
  742. LogicalExpression logicalExpression = PredicateUtils.or(simpleExpressions);
  743. info.expression(logicalExpression);
  744. }
  745. }
  746. query.where(info.getPredicates(root, query, builder));
  747. return null;
  748. }
  749. }, info);
  750. return covert(orders, filter.getEnUU());
  751. }
  752. /**
  753. * 将数据库查询的数据进行封装处理
  754. *
  755. * @param orders 查询的数据信息
  756. * @return
  757. */
  758. private IPage<PurcInquiryItemInfo> covert(Page<PurcInquiryItemInfo> orders, Long enuu) {
  759. if (!CollectionUtils.isEmpty(orders.getContent()) && null != enuu) {
  760. for (PurcInquiryItemInfo itemInfo : orders.getContent()) {
  761. PublicInquiryItem item = publicInquiryItemDao.findByVendUUAndSourceId(enuu, itemInfo.getId());
  762. itemInfo.setQuoted(Constant.NO);
  763. if (null != item) {
  764. itemInfo.setAgreed(item.getAgreed());
  765. itemInfo.setQuteId(item.getId());
  766. itemInfo.setQuoted(Constant.YES);
  767. }
  768. }
  769. }
  770. return IPageUtils.covert(orders);
  771. }
  772. /**
  773. * 根据传入条件封装查询条件
  774. *
  775. * @param pageInfo 分页参数
  776. * @param state 过滤条件
  777. * @return
  778. */
  779. @Override
  780. public PageInfo covert(PageInfo pageInfo, String state) {
  781. if (state.equals(OrderStatus.todo.name())) {
  782. pageInfo.filter("status", Status.NOT_REPLY.value());
  783. pageInfo.filter("overdue", Constant.NO);
  784. pageInfo.filter("invalid", Constant.NO);
  785. } else if (state.equals(OrderStatus.done.name())) {
  786. pageInfo.filter("overdue", Constant.NO);
  787. pageInfo.filter("status", Status.REPLIED.value());
  788. pageInfo.filter("invalid", Constant.NO);
  789. pageInfo.filter("decideStatus", Status.UNAUDIT.value());
  790. } else if (state.equals(OrderStatus.end.name())) {
  791. pageInfo.filter("overdue", Constant.YES);
  792. pageInfo.filter("invalid", Constant.NO);
  793. } else if (state.equals(OrderStatus.invalid.name())) {
  794. pageInfo.filter("overdue", Constant.YES);
  795. pageInfo.filter("invalid", Constant.YES);
  796. } else if (state.equals(OrderStatus.agreed.name())) {
  797. pageInfo.filter("agreed", Constant.YES);
  798. pageInfo.filter("status", Status.REPLIED.value());
  799. pageInfo.filter("invalid", Constant.NO);
  800. } else if (state.equals(OrderStatus.refused.name())) {
  801. pageInfo.filter("agreed", Constant.NO);
  802. pageInfo.filter("status", Status.REPLIED.value());
  803. pageInfo.filter("invalid", Constant.NO);
  804. }
  805. return pageInfo;
  806. }
  807. /**
  808. * 获取公共询价列表信息
  809. *
  810. * @param enuu 当前企业UU
  811. * @param size 大小
  812. * @return
  813. */
  814. @Override
  815. public List<InquiryMessage> getMessageList(Long enuu, Integer size) {
  816. if (size == 0 || size == null) {
  817. size = 10;
  818. }
  819. String sql = "select * from (select p.id_id id, p.id_prid productId, p.id_date as date, i.in_enuu enuu from purc$puinquiryitems p left join purc$puinquiry i on i.in_id = p.id_inid where i.in_isopen = 1";
  820. if (enuu != null) {
  821. sql = sql + " and i.in_enuu <> " + enuu ;
  822. }
  823. sql = sql + " and COALESCE(p.id_overdue, 0) <> 1 order by p.id_id desc) i limit " + size;
  824. List<PurcInquiryItem> items = jdbcTemplate.query(sql, new BeanPropertyRowMapper<PurcInquiryItem>(PurcInquiryItem.class));
  825. List<InquiryMessage> messages = new ArrayList<InquiryMessage>();
  826. if (!CollectionUtils.isEmpty(items)) {
  827. for (PurcInquiryItem item : items) {
  828. InquiryMessage message = new InquiryMessage();
  829. if (null != item.getEnuu()) {
  830. Enterprise enterprise = enterpriseDao.findOne(item.getEnuu());
  831. message.setEnName(enterprise.getEnName());
  832. }
  833. Product prod = productDao.findOne(item.getProductId());
  834. message.setPordName(prod.getTitle());
  835. item = purcInquiryItemDao.findOne(item.getId());
  836. message.setInid(item.getId());
  837. PublicInquiryItem publicInquiryItem = publicInquiryItemDao.findByVendUUAndSourceId(enuu, item.getId());
  838. if (null != publicInquiryItem) {
  839. message.setQuteId(publicInquiryItem.getId());
  840. }
  841. message.setLastest(isToday(item.getDate()));
  842. messages.add(message);
  843. }
  844. }
  845. return messages;
  846. }
  847. /**
  848. * 判断该条单据是否当天单据
  849. *
  850. * @param date 询价时间
  851. * @return
  852. */
  853. private boolean isToday(Date date) {
  854. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  855. String inDate = sdf.format(date);
  856. String nowDate = sdf.format(new Date());
  857. return inDate.equals(nowDate);
  858. }
  859. /**
  860. * 商城-采购排行榜
  861. * @return
  862. */
  863. @Override
  864. public List<Map<String, Object>> findCodeRankingList() {
  865. String sql = "select * from(SELECT sum(1) AS seekAmount, id_cmpcode FROM `purc$puinquiryitems` where id_cmpcode is not null group by id_cmpcode ) "
  866. + " a order by seekAmount desc limit 0,5";
  867. return jdbcTemplate.queryForList(sql);
  868. }
  869. /**
  870. * 通过明细id查询询价详情
  871. *
  872. * @param itemId 明细id
  873. * @return
  874. */
  875. @Override
  876. public PurcInquiryItemInfo findItemByItemId(Long itemId) {
  877. return inquiryItemInfoDao.findOne(itemId);
  878. }
  879. }