PublicInquiryServiceImpl.java 37 KB

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