PublicInquiryServiceImpl.java 40 KB

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