PublicInquiryServiceImpl.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949
  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 = "6e094dcf-f2c7-462a-9686-b2d32d684a78";
  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. List<InquiryRemind> remindList = remindDao.findByVendUserUUAndVendUUAndItemId(u.getUseruu(), u.getEnuu(), item.getId());
  227. if (remindList.size() == 0 && item.getInquiry().getEnUU() != null &&
  228. ((item.getProduct() != null && item.getProduct().getCmpCode().equals(u.getProduct().getCmpCode())) ||
  229. item.getCmpCode().equals(u.getProduct().getCmpCode()))) {
  230. Enterprise enterprise = enterpriseDao.findOne(item.getInquiry().getEnUU());
  231. InquiryRemind remind = new InquiryRemind();
  232. remind.setEnName(enterprise.getEnName());
  233. remind.setEnUU(item.getInquiry().getEnUU());
  234. remind.setUserName(item.getUserName());
  235. remind.setUserTel(item.getUserTel());
  236. remind.setCode(item.getInquiry().getCode());
  237. remind.setBrand(item.getBrand());
  238. remind.setCmpCode(item.getCmpCode());
  239. remind.setSpec(item.getSpec());
  240. remind.setTitle(item.getProdTitle());
  241. if (item.getProduct() != null) {
  242. remind.setBrand(item.getProduct().getBrand());
  243. remind.setCmpCode(item.getProduct().getCmpCode());
  244. remind.setSpec(item.getProduct().getSpec());
  245. remind.setTitle(item.getProduct().getTitle());
  246. }
  247. remind.setItemId(item.getId());
  248. remind.setNeedQty(item.getNeedquantity());
  249. remind.setReDate(item.getInquiry().getDate());
  250. remind.setEndDate(item.getInquiry().getEndDate());
  251. remind.setVendUU(u.getEnuu());
  252. remind.setVendUserUU(u.getUseruu());
  253. remind.setDate(new Date(System.currentTimeMillis()));
  254. remind.setStatus(Status.INPUTTING.value());
  255. reminds.add(remind);
  256. }
  257. }
  258. }
  259. if (!CollectionUtils.isEmpty(reminds)) {
  260. remindDao.save(reminds);
  261. }
  262. } catch (Exception e) {
  263. e.printStackTrace();
  264. }
  265. }
  266. }).run();
  267. }
  268. /**
  269. * 通过id查询询价信息
  270. *
  271. * @param id 公共询价主表id
  272. * @return
  273. */
  274. @Override
  275. public PurcInquiry findInquiryById(Long id) {
  276. return purcInquiryDao.findOne(id);
  277. }
  278. /**
  279. * 发送消息推送
  280. *
  281. * @param models 封装的消息信息
  282. */
  283. private void sendMessage(final List<MessageModel> models) {
  284. ThreadUtils.task(new Runnable() {
  285. @Override
  286. public void run() {
  287. try {
  288. logger.info("发送消息实体" + JSON.toJSONString(models));
  289. String res = HttpUtil.doPost(PS_MESSAGE_URL + "/messages", FlexJsonUtils.toJsonDeep(models));
  290. logger.info("消息请求发送日志" + res);
  291. } catch (Exception e) {
  292. e.printStackTrace();
  293. }
  294. }
  295. }).run();
  296. }
  297. /**
  298. * 将ERP传入的inquiry信息转成公共询价服务中心需要的信息
  299. *
  300. * @param inquiries 将ERP传入的inquiry信息
  301. * @param enuu 询价企业UU号
  302. * @param address 询价企业地址
  303. * @return
  304. */
  305. @Override
  306. public List<PurcInquiry> covert(List<BatchInquiry> inquiries, Long enuu, String address) throws NotFoundException {
  307. List<PurcInquiry> purcInquiries = new ArrayList<PurcInquiry>();
  308. if (!CollectionUtils.isEmpty(inquiries)) {
  309. for (BatchInquiry inquiry : inquiries) {
  310. PurcInquiry old = purcInquiryDao.findByCodeAndEnUU(inquiry.getBi_code(), enuu);
  311. //先判断是否已经存在,不存在才进行存储
  312. if (null == old) {
  313. PurcInquiry purcInquiry = inquiry.covert();
  314. purcInquiry.setEnUU(enuu);
  315. purcInquiry.setShip(address);
  316. Set<PurcInquiryItem> purcInquiryItems = new HashSet<PurcInquiryItem>();
  317. if (!CollectionUtils.isEmpty(inquiry.getInProducts())) {
  318. for (BatchInProduct batch : inquiry.getInProducts()) {
  319. PurcInquiryItem item = new PurcInquiryItem();
  320. item.setIsOpen(Constant.YES);
  321. List<Product> products = productDao.findByEnUUAndCode(enuu, batch.getBip_prodcode());
  322. if (CollectionUtils.isEmpty(products)) {
  323. throw new NotFoundException("编号为[" + batch.getBip_prodcode() + "]的物料未找到");
  324. }
  325. item.setProductId(products.get(0).getId());
  326. item.setCmpCode(products.get(0).getCmpCode());
  327. item.setInbrand(products.get(0).getBrand());
  328. item.setProdTitle(products.get(0).getTitle());
  329. item.setSpec(products.get(0).getSpec());
  330. item.setRemark(batch.getBip_remark());
  331. item.setProdCode(products.get(0).getCode());
  332. item.setProdTitle(products.get(0).getTitle());
  333. item.setNumber(batch.getBip_detno());
  334. item.setFromDate(new Date());
  335. item.setToDate(purcInquiry.getEndDate());
  336. item.setStatus((short) Status.NOT_REPLY.value());
  337. item.setIsOpen(Constant.YES);
  338. item.setSource("ERP");
  339. item.setSourceid(batch.getBip_id());
  340. item.setCurrency(batch.getBip_currency());
  341. item.setUserName(batch.getEm_name());
  342. item.setUserTel(batch.getBip_mobile());
  343. item.setUserCode(batch.getBip_buyercode());
  344. item.setOfferAmount(0);
  345. item.setEndDate(inquiry.getBi_enddate());
  346. if (null != inquiry.getBi_date()) {
  347. item.setDate(inquiry.getBi_date());
  348. } else {
  349. item.setDate(new Date(System.currentTimeMillis()));
  350. }
  351. if (item.getCurrency() == null) {
  352. item.setCurrency("RMB");
  353. }
  354. purcInquiryItems.add(item);
  355. }
  356. }
  357. purcInquiry.setInquiryItems(purcInquiryItems);
  358. purcInquiries.add(purcInquiry);
  359. }
  360. }
  361. }
  362. return purcInquiries;
  363. }
  364. /**
  365. * erp提交审核时,公共询价服务中心单据禁用报价功能
  366. *
  367. * @param inquiries erp询价信息
  368. * @param enuu 询价企业UU号
  369. */
  370. @Override
  371. public void updateStatus(List<BatchInquiry> inquiries, Long enuu) {
  372. if (!CollectionUtils.isEmpty(inquiries)) {
  373. for (BatchInquiry inquiry : inquiries) {
  374. PurcInquiry purcInquiry = purcInquiryDao.findByCodeAndEnUU(inquiry.getBi_code(), enuu);
  375. purcInquiryItemDao.updateStatus(purcInquiry.getId());
  376. }
  377. }
  378. }
  379. /**
  380. * 查询供应商的报价信息
  381. *
  382. * @return
  383. */
  384. @Override
  385. public List<InquiryDetail> findNotUploadReply(Long enuu) {
  386. List<PublicInquiryItem> items = publicInquiryItemDao.findByEnUUAndBackStatus(enuu, (short) Status.NOT_UPLOAD.value());
  387. if (!CollectionUtils.isEmpty(items)) {
  388. // 防止下载过程中进行操作,这里设置一个下载中的状态
  389. Set<Long> ids = new HashSet<>();
  390. for (PublicInquiryItem item : items) {
  391. ids.add(item.getId());
  392. }
  393. if (ids.size() > 0) {
  394. publicInquiryItemDao.updateBackStatus(ids);
  395. }
  396. return convertPublicInquiryReply(items);
  397. }
  398. return new ArrayList<>();
  399. }
  400. /**
  401. * 将公共询价服务中心的公共询价转成ERP的对应的字段
  402. *
  403. * @param notUploadReply 未下载的供应商报价信息
  404. * @return
  405. * @author hejq
  406. * @date 2018-01-14 11:51
  407. */
  408. @Override
  409. public List<InquiryDetail> convertPublicInquiryReply(List<PublicInquiryItem> notUploadReply) {
  410. List<InquiryDetail> details = new ArrayList<InquiryDetail>();
  411. if (!CollectionUtils.isEmpty(notUploadReply)) {
  412. for (PublicInquiryItem item : notUploadReply) {
  413. details.add(new InquiryDetail(item));
  414. }
  415. }
  416. return details;
  417. }
  418. /**
  419. * 下载完成后更新公共询价服务中心询价单明细的下载状态
  420. *
  421. * @param idArray 询价单明细id
  422. * @author hejq
  423. * @date 2018-01-14 12:12
  424. */
  425. @Override
  426. public void onReplyUploadSuccess(String[] idArray) {
  427. for (String id : idArray) {
  428. PublicInquiryItem item = publicInquiryItemDao.findOne(Long.parseLong(id));
  429. if (item != null) {
  430. item.setBackStatus((short) Status.DOWNLOADED.value());
  431. item.setErpstatus(Constant.YES);
  432. publicInquiryItemDao.save(item);
  433. }
  434. }
  435. }
  436. /**
  437. * ERP提交公共询价单之后,更新平台状态,让公共询价服务中心询价单不能进行报价操作
  438. *
  439. * @param inquiries 询价信息
  440. * @author hejq
  441. * @date 2018-01-14 12:20
  442. */
  443. @Override
  444. public void updateInquiryStatus(List<Inquiry> inquiries) {
  445. if (!CollectionUtils.isEmpty(inquiries)) {
  446. for (Inquiry inquiry : inquiries) {
  447. // 更新为过期状态,不能进行报价处理
  448. String sql = "update purc$puinquiryitems set id_overdue = 1 where id_inid in ( select in_id from purc$puinquiry where in_enuu = "
  449. + inquiry.getEn_uu() + " and in_code = '" + inquiry.getIn_code() + "')";
  450. jdbcTemplate.update(sql);
  451. // 更新已转报价的询价单明细状态
  452. jdbcTemplate.update("update public$inquiryItems set id_overdue = 1 where id_inid in " +
  453. "(select in_id from public$inquiry where in_enuu = " + inquiry.getEn_uu() + " and in_code = '" + inquiry.getIn_code() + "')");
  454. // 更新已转报价的询价单主表check状态为已提交
  455. jdbcTemplate.update("update public$inquiry set in_checked = 1 where in_enuu = " + inquiry.getEn_uu() + " and in_code = '" + inquiry.getIn_code() + "'");
  456. }
  457. }
  458. }
  459. /**
  460. * ERP对报价信息的采纳状态上传到公共询价服务中心
  461. *
  462. * @param decides 采纳信息
  463. */
  464. @Override
  465. public void onReplyDecide(List<InquiryDecide> decides, Long enuu) {
  466. List<PublicInquiryItem> publicInquiryItems = convertInquiryDecide(decides);
  467. if (!CollectionUtils.isEmpty(publicInquiryItems)) {
  468. for (PublicInquiryItem inquiryItem : publicInquiryItems) {
  469. publicInquiryItemDao.updateDecideStatusByID(inquiryItem.getAgreed(), inquiryItem.getDecideStatus(), inquiryItem.getId());
  470. }
  471. }
  472. }
  473. /**
  474. * 将ERP的报价采纳信息转为公共询价服务中心需要的信息
  475. *
  476. * @param decides erp报价采纳信息
  477. * @author hejq
  478. * @date 2018-01-14 12:25
  479. */
  480. @Override
  481. public List<PublicInquiryItem> convertInquiryDecide(List<InquiryDecide> decides) {
  482. List<PublicInquiryItem> inquiryItems = new ArrayList<PublicInquiryItem>();
  483. if (!CollectionUtils.isEmpty(decides)) {
  484. for (InquiryDecide decide : decides) {
  485. PublicInquiryItem item = publicInquiryItemDao.findOne(decide.getB2b_id());
  486. if (null != item) {
  487. item.setAgreed(decide.getId_agreed());
  488. item.setDecideStatus((short) Status.NOT_UPLOAD.value());
  489. inquiryItems.add(item);
  490. }
  491. }
  492. }
  493. return inquiryItems;
  494. }
  495. /**
  496. * 买家ERP作废询价单后,修改公共询价服务中心里面的状态
  497. *
  498. * @param inquiries 询价信息
  499. * @param enuu 企业UU
  500. * @author hejq
  501. * @date 2018-01-14 12:28
  502. */
  503. @Override
  504. public void onReplyInvalid(List<Inquiry> inquiries, final Long enuu) {
  505. final List<PublicInquiryItem> newInquiryItems = new ArrayList<>();
  506. ThreadUtils.tasks(new IRunnable<Inquiry>() {
  507. @Override
  508. public void run(Inquiry inquiry) {
  509. List<PublicInquiry> purchaseInquiries = publicInquiryDao.findByEnUUAndCode(enuu, inquiry.getIn_code());
  510. if (!CollectionUtils.isEmpty(purchaseInquiries)) {
  511. PublicInquiry publicInquiry = purchaseInquiries.get(0);
  512. for (PublicInquiryItem item : publicInquiry.getInquiryItems()) {
  513. item.setStatus((short) Status.DISABLED.value());
  514. // 获取作废信息时,更新作废上传状态为 待上传
  515. item.setInvalidStatus((short) Status.NOT_UPLOAD.value());
  516. synchronized (newInquiryItems) {
  517. newInquiryItems.add(item);
  518. }
  519. }
  520. }
  521. }
  522. }, inquiries).run();
  523. }
  524. /**
  525. * 将公共询价列表转成需要报价的询价单,类型是公共询价
  526. *
  527. * @param id 询价明细id
  528. * @param enuu 报价企业UU
  529. * @param useruu 报价人uu
  530. * @return
  531. * @author hejq
  532. * @date 2018-01-14 14:46
  533. */
  534. @Override
  535. public ModelMap transtoInquiry(Long id, Long enuu, Long useruu) {
  536. ModelMap map = new ModelMap();
  537. PurcInquiryItem purcInquiryItem = purcInquiryItemDao.findOne(id);
  538. PurcInquiry purcInquiry = purcInquiryItem.getInquiry();
  539. // 先判断客户询价单是否存在这张单据
  540. PublicInquiry inquiry = publicInquiryDao.findBySourceIdAndSourceApp(purcInquiry.getId(), SOURCERAPP);
  541. if (null == inquiry) {// 新增
  542. PublicInquiry saleInquiry = new PublicInquiry();
  543. saleInquiry.setDate(new Date());
  544. saleInquiry.setCode(purcInquiry.getCode());
  545. saleInquiry.setEnUU(purcInquiry.getEnUU());
  546. saleInquiry.setRecorder(purcInquiry.getRecorder());
  547. saleInquiry.setRecorderUU(purcInquiry.getRecorderUU());
  548. saleInquiry.setAuditor(purcInquiry.getAuditor());
  549. saleInquiry.setSourceApp(SOURCERAPP);
  550. saleInquiry.setKind(INQUIRYKIND);
  551. saleInquiry.setSourceId(purcInquiry.getId());
  552. saleInquiry.setPriceType(purcInquiry.getPriceType());
  553. saleInquiry.setInvoice(purcInquiry.getInvoice());
  554. saleInquiry.setShip(purcInquiry.getShip());
  555. saleInquiry.setEndDate(purcInquiry.getEndDate());
  556. if (!CollectionUtils.isEmpty(purcInquiry.getAttachs())) {
  557. Set<com.uas.ps.inquiry.model.Attach> attachs = new HashSet<com.uas.ps.inquiry.model.Attach>();
  558. for (com.uas.ps.inquiry.model.Attach attach : purcInquiry.getAttachs()) {
  559. com.uas.ps.inquiry.model.Attach newAttach = new com.uas.ps.inquiry.model.Attach();
  560. newAttach.setDate(new Date());
  561. newAttach.setDescription(attach.getDescription());
  562. newAttach.setName(attach.getName());
  563. newAttach.setPath(attach.getPath());
  564. newAttach.setRelatedKey(attach.getRelatedKey());
  565. newAttach.setSize(attach.getSize());
  566. newAttach.setRelatedKey(attach.getRelatedKey());
  567. attachs.add(newAttach);
  568. }
  569. saleInquiry.setAttachs(attachs);
  570. }
  571. saleInquiry.setEnvironment(purcInquiry.getEnvironment());
  572. saleInquiry.setRemark(purcInquiry.getRemark());
  573. saleInquiry.setInquirytype(purcInquiry.getInquirytype());
  574. Set<PublicInquiryItem> items = new HashSet<PublicInquiryItem>();
  575. Short i = 0;
  576. if (null != purcInquiryItem) {
  577. PublicInquiryItem item = new PublicInquiryItem();
  578. Product product = productDao.findOne(purcInquiryItem.getProductId());
  579. item.setProductId(product.getId());
  580. item.setInquiry(saleInquiry);
  581. item.setNumber(i);
  582. item.setCurrency(purcInquiryItem.getCurrency());
  583. item.setFromDate(new Date());
  584. item.setToDate(purcInquiryItem.getToDate());
  585. item.setTaxrate(purcInquiryItem.getTaxrate());
  586. item.setRemark(purcInquiryItem.getRemark());
  587. item.setProductId(purcInquiryItem.getProductId());
  588. item.setStatus((short) Status.NOT_REPLY.value());
  589. item.setVendUU(enuu);
  590. item.setVendUserUU(useruu);
  591. item.setSource(purcInquiryItem.getSource());
  592. item.setCustLap(Constant.NO);
  593. item.setSendStatus((short) Status.NOT_UPLOAD.value());
  594. item.setSourceId(id);
  595. List<PublicInquiryReply> replies = new ArrayList<PublicInquiryReply>();
  596. PublicInquiryReply reply = new PublicInquiryReply();
  597. reply.setLapQty((double) 0);
  598. replies.add(reply);
  599. item.setReplies(replies);
  600. item.setNeedquantity(purcInquiryItem.getNeedquantity());
  601. item.setKind(INQUIRYKIND);
  602. item.setProdCode(purcInquiryItem.getProdCode());
  603. items.add(item);
  604. i++;
  605. }
  606. List<PublicInquiryItem> purcitems = publicInquiryItemDao.save(items);
  607. if (purcitems.get(0).getId() != null) {
  608. map.put("success", "转客户询价单成功");
  609. map.put("id", purcitems.get(0).getInquiry().getId());
  610. } else {
  611. map.put("success", "转客户询价单失败");
  612. }
  613. } else {// 插入
  614. PublicInquiryItem purcItem = publicInquiryItemDao.findByVendUUAndSourceId(enuu, id);
  615. if (purcItem != null) {
  616. map.put("info", "询价单已存在");
  617. map.put("inid", purcItem.getId());
  618. } else {
  619. if (!CollectionUtils.isEmpty(purcInquiry.getInquiryItems())) {
  620. if (null != purcInquiryItem) {
  621. // 涉及到级联存储及ERP转入单据的操作,用主表id存储存在问题,这里先用sql语句直接插入
  622. PublicInquiryItem item = new PublicInquiryItem();
  623. Product product = productDao.findOne(purcInquiryItem.getProductId());
  624. item.setProductId(product.getId());
  625. item.setNumber((short) (purcInquiry.getInquiryItems().size() + 1));
  626. item.setCurrency(purcInquiryItem.getCurrency());
  627. item.setFromDate(new Date());
  628. item.setToDate(purcInquiryItem.getToDate());
  629. item.setTaxrate(purcInquiryItem.getTaxrate());
  630. item.setRemark(purcInquiryItem.getRemark());
  631. item.setProductId(purcInquiryItem.getProductId());
  632. item.setVendUU(enuu);
  633. item.setVendUserUU(useruu);
  634. item.setSource(purcInquiryItem.getSource());
  635. item.setStatus((short) Status.NOT_REPLY.value());
  636. item.setCustLap(Constant.NO);
  637. item.setSendStatus((short) Status.NOT_UPLOAD.value());
  638. item.setSourceId(id);
  639. item.setProdCode(purcInquiryItem.getProdCode());
  640. item.setKind(INQUIRYKIND);
  641. item.setNeedquantity(purcInquiryItem.getNeedquantity());
  642. List<PublicInquiryReply> replies = new ArrayList<PublicInquiryReply>();
  643. List<PublicInquiryReply> purcReplies = new ArrayList<PublicInquiryReply>();
  644. PublicInquiryReply reply = new PublicInquiryReply();
  645. reply.setLapQty((double) 0);
  646. purcReplies.add(reply);
  647. purcReplies = publicInquiryReplyDao.save(purcReplies);
  648. replies.addAll(purcReplies);
  649. item.setReplies(replies);
  650. Long idid = jdbcTemplate.queryForObject("select public$inquiryitems_seq.nextval from dual", Long.class);
  651. try {
  652. jdbcTemplate.update(
  653. "insert into public$inquiryitems(id_id,id_number,id_currency,id_fromdate,id_todate,id_taxrate,id_prid,id_venduu,"
  654. + "id_venduseruu,id_sourceapp,id_status,id_custlap,id_sendstatus,id_sourceid,id_inid,id_kind) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
  655. idid, item.getNumber(), item.getCurrency(), item.getFromDate(), item.getToDate(),
  656. item.getTaxrate(), item.getProductId(), item.getVendUU(), item.getVendUserUU(),
  657. item.getSource(), item.getStatus(), item.getCustLap(), item.getSendStatus(),
  658. item.getSourceId(), inquiry.getId(), inquiry.getKind());
  659. } catch (DataAccessException e) {
  660. map.put("info", "转客户询价单失败");
  661. }
  662. item = publicInquiryItemDao.findOne(idid);
  663. //回复清单更新
  664. if(replies.size() > 0) {
  665. for (PublicInquiryReply reply1 : replies) {
  666. jdbcTemplate.update("update public$inquiryreply set ir_idid = " + idid + "where ir_id = " + reply1.getId());
  667. }
  668. }
  669. if (item != null) {
  670. map.put("success", "转客户询价单成功");
  671. map.put("id", item.getInquiry().getId());
  672. } else {
  673. map.put("info", "转客户询价单失败");
  674. }
  675. }
  676. }
  677. }
  678. }
  679. return map;
  680. }
  681. /**
  682. * 通过分页参数和过滤条件查询报价信息
  683. *
  684. * @param info 分页参数
  685. * @param filter 过滤条件
  686. * @return
  687. * @author hejq
  688. * @date 2018-01-17 10:30
  689. */
  690. @Override
  691. public Page<PublicInquiryItemInfo> findByPageInfo(final PageInfo info, final SearchFilter filter) {
  692. if (null != filter) {
  693. if (StringUtils.hasText(filter.getKeyword())) {
  694. SimpleExpression cmpCode = new SimpleExpression("cmpCode", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  695. SimpleExpression brand = new SimpleExpression("inbrand", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  696. SimpleExpression[] simpleExpressions = new SimpleExpression[]{cmpCode, brand};
  697. LogicalExpression logical = new LogicalExpression(simpleExpressions, CriterionExpression.Operator.OR);
  698. info.expression(logical);
  699. }
  700. if (filter.getFromDate() != null) {
  701. info.expression(PredicateUtils.gte("offerTime", new Date(filter.getFromDate()), false));
  702. }
  703. if (filter.getEndDate() != null) {
  704. info.expression(PredicateUtils.lte("offerTime", new Date(filter.getEndDate()), false));
  705. }
  706. }
  707. return itemInfoDao.findAll(new Specification<PublicInquiryItemInfo>() {
  708. public Predicate toPredicate(Root<PublicInquiryItemInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
  709. query.where(info.getPredicates(root, query, builder));
  710. return null;
  711. }
  712. }, info);
  713. }
  714. @Override
  715. public Page<PublicInquiryItemInfo> findListByPageInfo(final PageInfo info, SearchFilter filter) {
  716. return itemInfoDao.findAll(new Specification<PublicInquiryItemInfo>() {
  717. public Predicate toPredicate(Root<PublicInquiryItemInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
  718. query.where(info.getPredicates(root, query, builder));
  719. return null;
  720. }
  721. }, info);
  722. }
  723. /**
  724. * 查询公共询价列表信息
  725. *
  726. * @param info 分页参数
  727. * @param filter 过滤条件
  728. * @return
  729. */
  730. @Override
  731. public IPage<PurcInquiryItemInfo> findTodoByPageInfo(final PageInfo info, final SearchFilter filter) {
  732. Page<PurcInquiryItemInfo> orders = inquiryItemInfoDao.findAll(new Specification<PurcInquiryItemInfo>() {
  733. public Predicate toPredicate(Root<PurcInquiryItemInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
  734. if (null != filter) {
  735. if (filter.getFromDate() != null) {
  736. info.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
  737. }
  738. if (filter.getEndDate() != null) {
  739. info.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
  740. }
  741. if (!StringUtils.isEmpty(filter.getKeyword())) {
  742. SimpleExpression cmpCode = new SimpleExpression("cmpCode", filter.getKeyword(), CriterionExpression.Operator.LIKE);
  743. SimpleExpression brand = new SimpleExpression("inbrand", filter.getKeyword(), CriterionExpression.Operator.LIKE);
  744. SimpleExpression[] simpleExpressions = new SimpleExpression[]{cmpCode, brand};
  745. LogicalExpression logicalExpression = PredicateUtils.or(simpleExpressions);
  746. info.expression(logicalExpression);
  747. }
  748. }
  749. query.where(info.getPredicates(root, query, builder));
  750. return null;
  751. }
  752. }, info);
  753. return covert(orders, filter.getEnUU());
  754. }
  755. /**
  756. * 将数据库查询的数据进行封装处理
  757. *
  758. * @param orders 查询的数据信息
  759. * @return
  760. */
  761. private IPage<PurcInquiryItemInfo> covert(Page<PurcInquiryItemInfo> orders, Long enuu) {
  762. if (!CollectionUtils.isEmpty(orders.getContent()) && null != enuu) {
  763. for (PurcInquiryItemInfo itemInfo : orders.getContent()) {
  764. PublicInquiryItem item = publicInquiryItemDao.findByVendUUAndSourceId(enuu, itemInfo.getId());
  765. itemInfo.setQuoted(Constant.NO);
  766. if (null != item) {
  767. itemInfo.setAgreed(item.getAgreed());
  768. itemInfo.setQuteId(item.getId());
  769. itemInfo.setQuoted(Constant.YES);
  770. }
  771. }
  772. }
  773. return IPageUtils.covert(orders);
  774. }
  775. /**
  776. * 根据传入条件封装查询条件
  777. *
  778. * @param pageInfo 分页参数
  779. * @param state 过滤条件
  780. * @return
  781. */
  782. @Override
  783. public PageInfo covert(PageInfo pageInfo, String state) {
  784. if (state.equals(OrderStatus.todo.name())) {
  785. pageInfo.filter("status", Status.NOT_REPLY.value());
  786. pageInfo.filter("overdue", Constant.NO);
  787. pageInfo.filter("invalid", Constant.NO);
  788. } else if (state.equals(OrderStatus.done.name())) {
  789. pageInfo.filter("overdue", Constant.NO);
  790. pageInfo.filter("status", Status.REPLIED.value());
  791. pageInfo.filter("invalid", Constant.NO);
  792. pageInfo.filter("decideStatus", Status.UNAUDIT.value());
  793. } else if (state.equals(OrderStatus.end.name())) {
  794. pageInfo.filter("overdue", Constant.YES);
  795. pageInfo.filter("invalid", Constant.NO);
  796. } else if (state.equals(OrderStatus.invalid.name())) {
  797. pageInfo.filter("overdue", Constant.YES);
  798. pageInfo.filter("invalid", Constant.YES);
  799. } else if (state.equals(OrderStatus.agreed.name())) {
  800. pageInfo.filter("agreed", Constant.YES);
  801. pageInfo.filter("status", Status.REPLIED.value());
  802. pageInfo.filter("invalid", Constant.NO);
  803. } else if (state.equals(OrderStatus.refused.name())) {
  804. pageInfo.filter("agreed", Constant.NO);
  805. pageInfo.filter("status", Status.REPLIED.value());
  806. pageInfo.filter("invalid", Constant.NO);
  807. }
  808. return pageInfo;
  809. }
  810. /**
  811. * 获取公共询价列表信息
  812. *
  813. * @param enuu 当前企业UU
  814. * @param size 大小
  815. * @return
  816. */
  817. @Override
  818. public List<InquiryMessage> getMessageList(Long enuu, Integer size) {
  819. if (size == 0 || size == null) {
  820. size = 10;
  821. }
  822. 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";
  823. if (enuu != null) {
  824. sql = sql + " and i.in_enuu <> " + enuu ;
  825. }
  826. sql = sql + " and COALESCE(p.id_overdue, 0) <> 1 order by p.id_id desc) i limit " + size;
  827. List<PurcInquiryItem> items = jdbcTemplate.query(sql, new BeanPropertyRowMapper<PurcInquiryItem>(PurcInquiryItem.class));
  828. List<InquiryMessage> messages = new ArrayList<InquiryMessage>();
  829. if (!CollectionUtils.isEmpty(items)) {
  830. for (PurcInquiryItem item : items) {
  831. InquiryMessage message = new InquiryMessage();
  832. if (null != item.getEnuu()) {
  833. Enterprise enterprise = enterpriseDao.findOne(item.getEnuu());
  834. message.setEnName(enterprise.getEnName());
  835. }
  836. Product prod = productDao.findOne(item.getProductId());
  837. message.setPordName(prod.getTitle());
  838. item = purcInquiryItemDao.findOne(item.getId());
  839. message.setInid(item.getId());
  840. PublicInquiryItem publicInquiryItem = publicInquiryItemDao.findByVendUUAndSourceId(enuu, item.getId());
  841. if (null != publicInquiryItem) {
  842. message.setQuteId(publicInquiryItem.getId());
  843. }
  844. message.setLastest(isToday(item.getDate()));
  845. messages.add(message);
  846. }
  847. }
  848. return messages;
  849. }
  850. /**
  851. * 判断该条单据是否当天单据
  852. *
  853. * @param date 询价时间
  854. * @return
  855. */
  856. private boolean isToday(Date date) {
  857. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  858. String inDate = sdf.format(date);
  859. String nowDate = sdf.format(new Date());
  860. return inDate.equals(nowDate);
  861. }
  862. /**
  863. * 商城-采购排行榜
  864. * @return
  865. */
  866. @Override
  867. public List<Map<String, Object>> findCodeRankingList() {
  868. String sql = "select * from(SELECT sum(1) AS seekAmount, id_cmpcode FROM `purc$puinquiryitems` where id_cmpcode is not null group by id_cmpcode ) "
  869. + " a order by seekAmount desc limit 0,5";
  870. return jdbcTemplate.queryForList(sql);
  871. }
  872. /**
  873. * 通过明细id查询询价详情
  874. *
  875. * @param itemId 明细id
  876. * @return
  877. */
  878. @Override
  879. public PurcInquiryItemInfo findItemByItemId(Long itemId) {
  880. return inquiryItemInfoDao.findOne(itemId);
  881. }
  882. /**
  883. * 通过id查询单个已转报价的信息
  884. * @param id
  885. * @return
  886. */
  887. @Override
  888. public PublicInquiryItemInfo findOneInfo(Long id) {
  889. return itemInfoDao.findOne(id);
  890. }
  891. }