PublicInquiryServiceImpl.java 79 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763
  1. package com.uas.ps.inquiry.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.uas.ps.core.util.ContextUtils;
  4. import com.uas.ps.entity.Product;
  5. import com.uas.ps.entity.ProductUsers;
  6. import com.uas.ps.entity.Status;
  7. import com.uas.ps.inquiry.AccessConfiguration;
  8. import com.uas.ps.inquiry.dao.*;
  9. import com.uas.ps.inquiry.domain.IPage;
  10. import com.uas.ps.inquiry.entity.*;
  11. import com.uas.ps.inquiry.exception.NotFoundException;
  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.*;
  16. import com.uas.ps.inquiry.page.exception.IllegalOperatorException;
  17. import com.uas.ps.inquiry.service.PublicInquiryService;
  18. import com.uas.ps.inquiry.util.*;
  19. import org.slf4j.Logger;
  20. import org.slf4j.LoggerFactory;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.dao.DataAccessException;
  23. import org.springframework.data.domain.Page;
  24. import org.springframework.data.domain.Sort;
  25. import org.springframework.data.jpa.domain.Specification;
  26. import org.springframework.http.HttpStatus;
  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.CriteriaBuilder;
  34. import javax.persistence.criteria.CriteriaQuery;
  35. import javax.persistence.criteria.Predicate;
  36. import javax.persistence.criteria.Root;
  37. import java.text.SimpleDateFormat;
  38. import java.util.*;
  39. /**
  40. * 公共询价接口实现
  41. * <p>
  42. * Created by hejq on 2018-01-13.
  43. */
  44. @Service
  45. public class PublicInquiryServiceImpl implements PublicInquiryService {
  46. @Autowired
  47. private PublicInquiryDao publicInquiryDao;
  48. @Autowired
  49. private PurcInquiryDao purcInquiryDao;
  50. @Autowired
  51. private ProductDao productDao;
  52. @Autowired
  53. private PurcInquiryItemDao purcInquiryItemDao;
  54. @Autowired
  55. private JdbcTemplate jdbcTemplate;
  56. @Autowired
  57. private PublicInquiryReplyDao publicInquiryReplyDao;
  58. @Autowired
  59. private PurcInquiryItemInfoDao inquiryItemInfoDao;
  60. @Autowired
  61. private PublicInquiryItemInfoDao itemInfoDao;
  62. @Autowired
  63. private PublicInquiryItemDao publicInquiryItemDao;
  64. @Autowired
  65. private UserDao userDao;
  66. @Autowired
  67. private EnterpriseDao enterpriseDao;
  68. @Autowired
  69. private InquiryRemindDao remindDao;
  70. @Autowired
  71. private ProductReplaceDao productReplaceDao;
  72. @Autowired
  73. private InquiryEnRemindDao inquiryEnRemindDao;
  74. @Autowired
  75. private KindConcernDao kindConcernDao;
  76. @Autowired
  77. private InquiryDataDao inquiryDataDao;
  78. /**
  79. * 应用来源
  80. */
  81. private final String SOURCERAPP = "B2B";
  82. /**
  83. * 接收应用(以","拼接应用名称)
  84. */
  85. private final String CONSUMERAPP = "MALL,B2B";
  86. /**
  87. * 消息类型 (在B2B消息中拼接跳转单据详情url请求时需要)
  88. */
  89. private final String INQUIRY_TYPE = "公共询价";
  90. /**
  91. * 消息类型 (在B2B消息中拼接跳转单据详情url请求时需要)
  92. */
  93. private final String INQUIRY_TYPE_MALL = "MALL跳转买家已报价页面";
  94. /**
  95. * 消息类型 (在MALL消息中拼接求购询价待报价)
  96. */
  97. private final String INQUIRY_TYPE_SELLER_MALL = "MALL公共询价";
  98. /**
  99. * 消息类型,公共询价的采纳结果
  100. */
  101. private final String INQUIRY_DECIDE_TYPE = "公共询价采纳结果";
  102. /**
  103. * 消息类型,公共询价的采纳结果
  104. */
  105. private final String INQUIRY_DECIDE_TYPE_MALL = "商城公共询价采纳结果";
  106. /**
  107. * 询价种类
  108. */
  109. private final String INQUIRYKIND = "publicInquiry";
  110. /**
  111. * 消息推送邮件模板id
  112. */
  113. private final String MAIL_TEMP_ID = "d94e931b-b699-46d7-8bb2-94604a3352c0";
  114. /**
  115. * 消息推送短信模板id
  116. */
  117. private final String SMS_TEMP_ID = "6e094dcf-f2c7-462a-9686-b2d32d684a78";
  118. /**
  119. * 消息推送方式:邮件、短信、im
  120. */
  121. private final String SMS_TYPE = "MAIL_AND_SM_AND_IM";
  122. /**
  123. * 来源应用,ERP
  124. */
  125. private final String PRODUCERAPP = "ERP";
  126. /**
  127. * 消费类型: 多个,MULTI
  128. */
  129. private final String CUST_TYPE = "MULTI";
  130. /**
  131. * 公共物料访问地址
  132. */
  133. private final String PS_PRODUCT_URL = ContextUtils.getBean(AccessConfiguration.class).getPsProductUrl();
  134. /**
  135. * 公共消息访问地址
  136. */
  137. private final String PS_MESSAGE_URL = ContextUtils.getBean(AccessConfiguration.class).getPsMessageUrl();
  138. /**
  139. * 商城链接
  140. */
  141. private final String USOFTMALL_URL = ContextUtils.getBean(AccessConfiguration.class).getMallUrl();
  142. /**
  143. * 日志
  144. */
  145. private static final Logger log = LoggerFactory.getLogger(PublicInquiryServiceImpl.class);
  146. /**
  147. * 保存公共询价信息
  148. *
  149. * @param inquiries erp传入公共询价的信息
  150. * @param enuu 询价企业UU号
  151. * @param address 询价企业地址
  152. */
  153. @Override
  154. public void save(List<BatchInquiry> inquiries, Long enuu, String address) throws NotFoundException {
  155. List<PurcInquiry> purcInquiries = covert(inquiries, enuu, address);
  156. if (!CollectionUtils.isEmpty(purcInquiries)) {
  157. for (PurcInquiry inquiry : purcInquiries) {
  158. // 判断单号是否已存在
  159. List<PurcInquiry> old = purcInquiryDao.findByCodeAndEnUU(inquiry.getCode(), enuu);
  160. List<PurcInquiryItem> items = new ArrayList<PurcInquiryItem>();
  161. if (CollectionUtils.isEmpty(old) && !CollectionUtils.isEmpty(inquiry.getInquiryItems())) {
  162. for (PurcInquiryItem item : inquiry.getInquiryItems()) {
  163. item.setInquiry(inquiry);
  164. items.add(item);
  165. }
  166. }
  167. try {
  168. items = purcInquiryItemDao.save(items);
  169. if (!CollectionUtils.isEmpty(items)) {
  170. final List<PurcInquiryItem> purcInquiryItems = items;
  171. ThreadUtils.task(new Runnable() {
  172. @Override
  173. public void run() {
  174. try {
  175. notifyMessage(purcInquiryItems, PRODUCERAPP);
  176. } catch (Exception e) {
  177. e.printStackTrace();
  178. }
  179. }
  180. });
  181. }
  182. } catch (Exception e) {
  183. e.printStackTrace();
  184. }
  185. }
  186. }
  187. }
  188. /**
  189. * 消息推送
  190. *
  191. * @param inquiryItems 询价明细
  192. * @param sourceApp 消息来源应用
  193. */
  194. @Override
  195. public void notifyMessage(List<PurcInquiryItem> inquiryItems, String sourceApp) throws Exception {
  196. for (PurcInquiryItem item : inquiryItems) {
  197. String cmpCode = null;
  198. if (item.getCmpCode() != null) {
  199. cmpCode = item.getCmpCode();
  200. } else if (null != item.getProductId()) {
  201. Product product = productDao.findOne(item.getProductId());
  202. cmpCode = product.getCmpCode();
  203. }
  204. if (null != cmpCode) {
  205. String url = PS_PRODUCT_URL + "/productuser/getProductUsersByEnUUAndCmpCode";
  206. JSONObject formData = new JSONObject();
  207. formData.put("enUU", item.getInquiry().getEnUU());
  208. formData.put("cmpCode", cmpCode);
  209. try {
  210. long start = System.currentTimeMillis();
  211. HttpUtil.Response res = HttpUtil.sendGetRequest(url, formData);
  212. log.info("/productuser/getProductUsersByEnUUAndCmpCode,耗时:{}", (System.currentTimeMillis() - start));
  213. if (res.getStatusCode() == 200) {
  214. List<ProductUsers> users = FlexJsonUtils.fromJsonArray(res.getResponseText(), ProductUsers.class);
  215. users = getProductReplaceByEnUUAndCmpCode(item.getInquiry().getRecorderUU(), cmpCode, users);
  216. if (!CollectionUtils.isEmpty(users)) {
  217. List<MessageModel> models = new ArrayList<MessageModel>();
  218. User buyerUser = userDao.findOne(null != item.getInquiry().getRecorderUU() ? item.getInquiry().getRecorderUU() : 0L);
  219. Enterprise buyerEnterprise = enterpriseDao.findOne(item.getInquiry().getEnUU());
  220. for (ProductUsers user : users) {
  221. String cmp = cmpCode.length() > 10 ? cmpCode.substring(0, 10).concat("...") : cmpCode;
  222. String content = "发布关于“型号:" + cmp + "”的公共询价信息,邀请您参与报价。";
  223. MessageModel model = new MessageModel();
  224. if (null != buyerEnterprise) {
  225. content = buyerEnterprise.getEnName() + content;
  226. model.setBuyerName(buyerEnterprise.getEnName());
  227. } else if (null != buyerUser) {
  228. content = buyerUser.getUserName() + content;
  229. model.setBuyerName(buyerUser.getUserName());
  230. }
  231. // 询价方信息
  232. if (null != item.getUserUU() || null != item.getInquiry().getRecorderUU()) {
  233. model.setSenderUu(item.getUserUU() != null ? item.getUserUU() : item.getInquiry().getRecorderUU());
  234. } else {
  235. model.setSenderUu(null != buyerEnterprise ? buyerEnterprise.getAdminUU() : 0L);
  236. }
  237. model.setSenderEnuu(item.getInquiry().getEnUU());
  238. model.setCmpCode(cmpCode);
  239. model.setType(INQUIRY_TYPE);
  240. model.setType(INQUIRY_TYPE_SELLER_MALL);
  241. model.setProducerApp(sourceApp);
  242. model.setConsumerType(CUST_TYPE);
  243. model.setConsumerApp(CONSUMERAPP);
  244. model.setContent(content);
  245. model.setRemark(String.valueOf(item.getInquiry().getId()));
  246. model.setSourceId(item.getId());
  247. // 供应商信息
  248. Enterprise vendEnterprise = enterpriseDao.findOne(user.getEnuu());
  249. if (vendEnterprise != null) {
  250. model.setVendName(vendEnterprise.getEnName());
  251. }
  252. model.setReceiverEnuu(user.getEnuu());
  253. model.setReceiverUu(user.getUseruu());
  254. model.setSmsType("DONT_SEND");
  255. model.setMailTemplate(MAIL_TEMP_ID);
  256. model.setSmTemplate(SMS_TEMP_ID);
  257. models.add(model);
  258. // log.info("公共询价产生消息", "根据物料型号【{}】查询接收人,关联询价单明细【{}】,UserUU:{},Enuu:{},报价的应用来源:{}", cmpCode, item.getId(), user.getUseruu(), user.getEnuu(), InquirySource.ERP.name());
  259. }
  260. if (!CollectionUtils.isEmpty(models)) {
  261. sendMessage(models);
  262. sendWechatMessage(models);
  263. }
  264. }
  265. // 生成推荐信息
  266. remindInquiry(item, users);
  267. }
  268. } catch (Exception e) {
  269. String reason = e.getMessage().length() > 10 ? e.getMessage().substring(0, 1000).concat("") : e.getMessage();
  270. log.info("公共询价产生消息,根据物料型号【{}】查询接收人失败,id:{},原因:{}, Constant:{}, 报价的应用来源:{}", cmpCode, item.getId(), reason, Constant.UU, InquirySource.ERP.name());
  271. e.printStackTrace();
  272. }
  273. }
  274. }
  275. }
  276. /**
  277. * 微信消息发送
  278. * @param models
  279. */
  280. private void sendWechatMessage(final List<MessageModel> models) {
  281. ThreadUtils.task(new Runnable() {
  282. @Override
  283. public void run() {
  284. try {
  285. long start = System.currentTimeMillis();
  286. log.info("发送微信消息");
  287. String res = HttpUtil.doPost(USOFTMALL_URL + "/wx/sendTemplateMessage", FlexJsonUtils.toJsonDeep(models));
  288. log.info("微信消息请求发送日志, {}", res);
  289. log.info("微信消息请求发送,数量:{}, 耗时:{}", models.size(), (System.currentTimeMillis() - start));
  290. } catch (Exception e) {
  291. e.printStackTrace();
  292. }
  293. }
  294. });
  295. }
  296. /**
  297. * 根据企业UU和物料原厂型号cmpCode获取替代物料信息
  298. *
  299. * @param cmpCode 物料原厂型号
  300. * @return
  301. */
  302. public List<ProductUsers> getProductReplaceByEnUUAndCmpCode(final Long userUU, final String cmpCode, List<ProductUsers> productUsers) {
  303. List<ProductReplace> productReplacesList = productReplaceDao.findAll(new Specification<ProductReplace>() {
  304. @Override
  305. public Predicate toPredicate(Root<ProductReplace> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
  306. final PredicateFactory<ProductReplace> factory = new PredicateFactory<>();
  307. factory.add(PredicateUtils.ne("userUU", userUU, false));
  308. factory.add(PredicateUtils.and(PredicateUtils.isNotNull("ptrCmpcode"), PredicateUtils.eq("ptrCmpcode", cmpCode, false)));
  309. query.where(factory.toPredicate(root, query, cb));
  310. return null;
  311. }
  312. });
  313. if (!CollectionUtils.isEmpty(productReplacesList)) {
  314. for (ProductReplace productReplace : productReplacesList) {
  315. ProductUsers user = new ProductUsers();
  316. user.setEnuu(productReplace.getEnuu());
  317. user.setUseruu(productReplace.getUserUU());
  318. productUsers.add(user);
  319. }
  320. }
  321. // 去掉同一企业下同一个人相同原厂型号的不同物料的记录,保证一个原厂型号只发一条
  322. List<ProductUsers> returnList = new ArrayList<>();
  323. Set<String> enUUAndUserUUs = new HashSet<>();
  324. for (ProductUsers user : productUsers) {
  325. String receiverInfo = user.getEnuu().toString() + user.getUseruu().toString();
  326. if (!enUUAndUserUUs.contains(receiverInfo)) {
  327. returnList.add(user);
  328. enUUAndUserUUs.add(receiverInfo);
  329. }
  330. }
  331. return returnList;
  332. }
  333. /**
  334. * 通过查询的个人物料相关联的信息,自动生成推荐的报价的数据
  335. *
  336. * @param item 报价明细
  337. * @param users 用户信息
  338. */
  339. private void remindInquiry(final PurcInquiryItem item, final List<ProductUsers> users) {
  340. ThreadUtils.task(new Runnable() {
  341. @Override
  342. public void run() {
  343. try {
  344. Map<Long, ProductUsers> productUsersMap = new HashMap<>();
  345. Enterprise enterprise = enterpriseDao.findOne(item.getInquiry().getEnUU());
  346. if (!CollectionUtils.isEmpty(users)) {
  347. List<InquiryRemind> inquiryReminds = new ArrayList<>();
  348. for (ProductUsers u : users) {
  349. List<InquiryRemind> remindList = remindDao.findByVendUserUUAndVendUUAndItemId(u.getUseruu(), u.getEnuu(), item.getId());
  350. if (remindList.size() == 0 && item.getInquiry().getEnUU() != null) {
  351. productUsersMap.put(u.getEnuu(), u);
  352. InquiryRemind remind = new InquiryRemind();
  353. remind.setEnName(enterprise.getEnName());
  354. remind.setEnUU(item.getInquiry().getEnUU());
  355. remind.setUserName(item.getUserName());
  356. remind.setUserTel(item.getUserTel());
  357. remind.setCode(item.getInquiry().getCode());
  358. remind.setBrand(item.getInbrand());
  359. remind.setInbrand(item.getInbrand());
  360. remind.setCmpCode(item.getCmpCode());
  361. remind.setSpec(item.getSpec());
  362. remind.setProdTitle(item.getProdTitle());
  363. remind.setInid(item.getInquiry().getId());
  364. if (item.getProduct() != null) {
  365. remind.setBrand(item.getProduct().getBrand());
  366. remind.setCmpCode(item.getProduct().getCmpCode());
  367. remind.setSpec(item.getProduct().getSpec());
  368. remind.setProdTitle(item.getProduct().getTitle());
  369. }
  370. remind.setItemId(item.getId());
  371. remind.setNeedQty(item.getNeedquantity());
  372. remind.setReDate(item.getInquiry().getDate());
  373. remind.setEndDate(item.getInquiry().getEndDate());
  374. remind.setVendUU(u.getEnuu());
  375. remind.setVendUserUU(u.getUseruu());
  376. remind.setDate(new Date(System.currentTimeMillis()));
  377. remind.setStatus(Status.INPUTTING.value());
  378. inquiryReminds.add(remind);
  379. }
  380. }
  381. if (!CollectionUtils.isEmpty(inquiryReminds)) {
  382. remindDao.save(inquiryReminds);
  383. }
  384. }
  385. // 查询已关注类目中是否有当前类目
  386. String kind = item.getProdTitle();
  387. Set<Long> enuuSet = new HashSet<>();
  388. if (!StringUtils.isEmpty(kind)) {
  389. enuuSet = kindConcernDao.findByNameCnAndNeEnuu(kind, item.getInquiry().getEnUU());
  390. }
  391. String url = PS_PRODUCT_URL + "/product/businessOpportunity";
  392. JSONObject formData = new JSONObject();
  393. formData.put("enUU", item.getInquiry().getEnUU());
  394. formData.put("pCmpCode", item.getCmpCode());
  395. long start = System.currentTimeMillis();
  396. HttpUtil.Response res = HttpUtil.sendGetRequest(url, formData);
  397. log.info("/product/businessOpportunity , 型号:{}, 耗时:{}", item.getCmpCode(), (System.currentTimeMillis() - start));
  398. if (res.getStatusCode() == HttpStatus.OK.value()) {
  399. Map<String, Object> result = FlexJsonUtils.fromJson(res.getResponseText());
  400. if (!StringUtils.isEmpty(result.get("enUUs"))) {
  401. List<Long> enuus = (List<Long>) result.get("enUUs");
  402. enuuSet.addAll(enuus);
  403. }
  404. if (!CollectionUtils.isEmpty(enuuSet)) {
  405. List<InquiryEnRemind> inquiryEnReminds = new ArrayList<>();
  406. for (Long enuu : enuuSet) {
  407. InquiryEnRemind remind = new InquiryEnRemind();
  408. remind.setEnName(enterprise.getEnName());
  409. remind.setEnUU(item.getInquiry().getEnUU());
  410. remind.setUserName(item.getUserName());
  411. remind.setUserTel(item.getUserTel());
  412. remind.setCode(item.getInquiry().getCode());
  413. remind.setBrand(item.getInbrand());
  414. remind.setInbrand(item.getInbrand());
  415. remind.setCmpCode(item.getCmpCode());
  416. remind.setSpec(item.getSpec());
  417. remind.setProdTitle(item.getProdTitle());
  418. remind.setInid(item.getInquiry().getId());
  419. if (item.getProduct() != null) {
  420. remind.setBrand(item.getProduct().getBrand());
  421. remind.setCmpCode(item.getProduct().getCmpCode());
  422. remind.setSpec(item.getProduct().getSpec());
  423. remind.setProdTitle(item.getProduct().getTitle());
  424. }
  425. remind.setItemId(item.getId());
  426. remind.setNeedQty(item.getNeedquantity());
  427. remind.setReDate(item.getInquiry().getDate());
  428. remind.setEndDate(item.getInquiry().getEndDate());
  429. remind.setVendUU(enuu);
  430. if (productUsersMap.containsKey(enuu)) {
  431. remind.setRemindStatus(1);
  432. } else {
  433. remind.setRemindStatus(0);
  434. }
  435. remind.setDate(new Date(System.currentTimeMillis()));
  436. remind.setStatus(Status.INPUTTING.value());
  437. inquiryEnReminds.add(remind);
  438. }
  439. if (!CollectionUtils.isEmpty(inquiryEnReminds)) {
  440. inquiryEnRemindDao.save(inquiryEnReminds);
  441. }
  442. }
  443. }
  444. } catch (Exception e) {
  445. e.printStackTrace();
  446. }
  447. }
  448. });
  449. }
  450. /**
  451. * 通过id查询询价信息
  452. *
  453. * @param id 公共询价主表id
  454. * @return
  455. */
  456. @Override
  457. public PurcInquiry findInquiryById(Long id) {
  458. PurcInquiry inquiry = purcInquiryDao.findOne(id);
  459. if (!CollectionUtils.isEmpty(inquiry.getInquiryItems())) {
  460. for (PurcInquiryItem item : inquiry.getInquiryItems()) {
  461. if (null == item.getProductId()) {
  462. Product product = new Product();
  463. product.setTitle(item.getProdTitle());
  464. product.setCmpCode(item.getCmpCode());
  465. product.setBrand(item.getInbrand());
  466. product.setSpec(item.getSpec());
  467. item.setProduct(product);
  468. }
  469. }
  470. }
  471. return inquiry;
  472. }
  473. /**
  474. * 发送消息推送
  475. *
  476. * @param models 封装的消息信息
  477. */
  478. private void sendMessage(final List<MessageModel> models) {
  479. ThreadUtils.task(new Runnable() {
  480. @Override
  481. public void run() {
  482. try {
  483. long start = System.currentTimeMillis();
  484. log.info("发送消息");
  485. String res = HttpUtil.doPost(PS_MESSAGE_URL + "/messages", FlexJsonUtils.toJsonDeep(models));
  486. log.info("消息请求发送");
  487. log.info("/messages , 条数:{},耗时:{}", models.size(), (System.currentTimeMillis() - start));
  488. } catch (Exception e) {
  489. e.printStackTrace();
  490. }
  491. }
  492. });
  493. }
  494. /**
  495. * 将ERP传入的inquiry信息转成公共询价服务中心需要的信息
  496. *
  497. * @param inquiries 将ERP传入的inquiry信息
  498. * @param enuu 询价企业UU号
  499. * @param address 询价企业地址
  500. * @return
  501. */
  502. @Override
  503. public List<PurcInquiry> covert(List<BatchInquiry> inquiries, Long enuu, String address) throws NotFoundException {
  504. List<PurcInquiry> purcInquiries = new ArrayList<PurcInquiry>();
  505. if (!CollectionUtils.isEmpty(inquiries)) {
  506. for (BatchInquiry inquiry : inquiries) {
  507. List<PurcInquiry> old = purcInquiryDao.findByCodeAndEnUU(inquiry.getBi_code(), enuu);
  508. //先判断是否已经存在,不存在才进行存储
  509. if (CollectionUtils.isEmpty(old)) {
  510. PurcInquiry purcInquiry = inquiry.covert();
  511. purcInquiry.setEnUU(enuu);
  512. purcInquiry.setShip(address);
  513. Enterprise e = enterpriseDao.findOne(enuu);
  514. if (null != e) {
  515. purcInquiry.setEnName(e.getEnName());
  516. }
  517. Set<PurcInquiryItem> purcInquiryItems = new HashSet<PurcInquiryItem>();
  518. if (!CollectionUtils.isEmpty(inquiry.getInProducts())) {
  519. for (BatchInProduct batch : inquiry.getInProducts()) {
  520. PurcInquiryItem item = new PurcInquiryItem();
  521. List<Product> products = productDao.findByEnUUAndCode(enuu, batch.getBip_prodcode());
  522. if (!CollectionUtils.isEmpty(products)) {
  523. item.setProductId(products.get(0).getId());
  524. item.setCmpCode(products.get(0).getCmpCode());
  525. item.setInbrand(products.get(0).getBrand());
  526. item.setProdTitle(products.get(0).getTitle());
  527. item.setSpec(products.get(0).getSpec());
  528. } else {
  529. item.setCmpCode(batch.getPr_orispeccode());
  530. item.setInbrand(batch.getPr_brand());
  531. item.setProdTitle(batch.getPr_detail());
  532. item.setSpec(batch.getPr_spec());
  533. }
  534. item.setProdCode(batch.getBip_prodcode());
  535. item.setRemark(batch.getBip_remark());
  536. item.setNumber(batch.getBip_detno());
  537. item.setFromDate(new Date(System.currentTimeMillis()));
  538. item.setToDate(purcInquiry.getEndDate());
  539. item.setStatus((short) Status.NOT_REPLY.value());
  540. item.setIsOpen(Constant.YES);
  541. item.setSource("ERP");
  542. item.setSourceid(batch.getBip_id());
  543. item.setCurrency(batch.getBip_currency());
  544. item.setUserName(batch.getEm_name());
  545. item.setUserTel(batch.getBip_mobile());
  546. item.setUserCode(batch.getBip_buyercode());
  547. item.setOfferAmount(0);
  548. item.setEndDate(inquiry.getBi_enddate());
  549. item.setNeedquantity(batch.getYcgqty());
  550. if (null == item.getCmpCode() || item.getCmpCode().equals("无")) {
  551. item.setCmpCode(item.getSpec());
  552. }
  553. if (null != inquiry.getBi_date()) {
  554. item.setDate(inquiry.getBi_date());
  555. } else {
  556. item.setDate(new Date(System.currentTimeMillis()));
  557. }
  558. if (item.getCustCurrency() == null) {
  559. item.setCustCurrency("RMB");
  560. }
  561. purcInquiryItems.add(item);
  562. }
  563. }
  564. purcInquiry.setInquiryItems(purcInquiryItems);
  565. purcInquiries.add(purcInquiry);
  566. }
  567. }
  568. }
  569. return purcInquiries;
  570. }
  571. /**
  572. * erp提交审核时,公共询价服务中心单据禁用报价功能
  573. *
  574. * @param inquiries erp询价信息
  575. * @param enuu 询价企业UU号
  576. */
  577. @Override
  578. public void updateStatus(List<BatchInquiry> inquiries, Long enuu) {
  579. if (!CollectionUtils.isEmpty(inquiries)) {
  580. for (BatchInquiry inquiry : inquiries) {
  581. List<PurcInquiry> purcInquiryList = purcInquiryDao.findByCodeAndEnUU(inquiry.getBi_code(), enuu);
  582. for (PurcInquiry purcInquiry : purcInquiryList) {
  583. purcInquiryItemDao.updateStatus(purcInquiry.getId());
  584. }
  585. }
  586. }
  587. }
  588. /**
  589. * 查询供应商的报价信息
  590. *
  591. * @return
  592. */
  593. @Override
  594. public List<InquiryDetail> findNotUploadReply(Long enuu) {
  595. List<PublicInquiryItem> items = publicInquiryItemDao.findByEnUUAndBackStatus(enuu, (short) Status.NOT_UPLOAD.value());
  596. if (!CollectionUtils.isEmpty(items)) {
  597. // 防止下载过程中进行操作,这里设置一个下载中的状态
  598. Set<Long> ids = new HashSet<>();
  599. for (PublicInquiryItem item : items) {
  600. ids.add(item.getId());
  601. }
  602. if (ids.size() > 0) {
  603. publicInquiryItemDao.updateBackStatus(ids);
  604. }
  605. return convertPublicInquiryReply(items);
  606. }
  607. return new ArrayList<>();
  608. }
  609. /**
  610. * 查找报价的单据,上传到卖家UAS
  611. *
  612. * @param enUU 企业UU
  613. * @return
  614. */
  615. @Override
  616. public List<PublicInquiryItem> findNotUploadToUas(Long enUU) {
  617. return publicInquiryItemDao.findByVendUUAndReplySendStatus(enUU, (short) Status.NOT_UPLOAD.value());
  618. }
  619. /**
  620. * UAS获取商城账套下企业商机
  621. *
  622. * @param vendUU 报价企业UU
  623. * @return 待下载的企业商机
  624. * @author dongbw
  625. */
  626. @Override
  627. public List<InquiryEnRemind> findNotUploadEnRemind(Long vendUU) {
  628. return inquiryEnRemindDao.findNotUploadEnRemind(vendUU);
  629. }
  630. /**
  631. * UAS获取商城账套下企业商机之后 回调 修改状态
  632. *
  633. * @param idArray 报价单明细id list
  634. * @param vendUU 报价企业UU
  635. */
  636. @Override
  637. public void downEnRemindSuccess(String[] idArray, Long vendUU) {
  638. List<InquiryEnRemind> items = new ArrayList<>();
  639. for (String id : idArray) {
  640. InquiryEnRemind item = inquiryEnRemindDao.findOne(Long.parseLong(id));
  641. if (item != null && vendUU.equals(item.getVendUU())) {
  642. item.setErpDownStatus((short) Status.DOWNLOADED.value());
  643. items.add(item);
  644. }
  645. }
  646. if (!CollectionUtils.isEmpty(items)) {
  647. inquiryEnRemindDao.save(items);
  648. }
  649. }
  650. /**
  651. * 获取当前月和上个月询价单数量
  652. *
  653. * @return 数量map
  654. */
  655. @Override
  656. public ModelMap getCountOfLastAndThisMonth() {
  657. Calendar now = Calendar.getInstance();
  658. Integer year = now.get(Calendar.YEAR);
  659. Integer month = now.get(Calendar.MONTH) + 1;
  660. ModelMap result = new ModelMap();
  661. try {
  662. Long current = inquiryItemInfoDao.countByMonth(year, month);
  663. result.put("current", current);
  664. if (month == 1) {
  665. year = year - 1;
  666. month = 12;
  667. } else {
  668. month = month - 1;
  669. }
  670. Long last = inquiryItemInfoDao.countByMonth(year, month);
  671. result.put("last", last);
  672. result.put("success", "true");
  673. } catch (Exception e) {
  674. result.put("message", e.getMessage());
  675. result.put("success", false);
  676. e.printStackTrace();
  677. }
  678. return result;
  679. }
  680. /**
  681. * 查询单条bom询价单的报价情况
  682. *
  683. * @param inquiry 询价单
  684. * @return 询价单
  685. */
  686. @Override
  687. public PurcInquiry getQuotedDetail(PurcInquiry inquiry) {
  688. List<Long> itemIds = new ArrayList<>();
  689. for (PurcInquiryItem item : inquiry.getInquiryItems()) {
  690. itemIds.add(item.getId());
  691. }
  692. Long[] itemIdArray = new Long[inquiry.getInquiryItems().size()];
  693. Integer quotedAmount = publicInquiryItemDao.getQuotedAmountBySourceId(itemIds.toArray(itemIdArray));
  694. Integer replaceQuotedAmount =publicInquiryItemDao.getReplaceQuotedAmountBySourceId(itemIds.toArray(itemIdArray));
  695. inquiry.setQuotedAmount(quotedAmount);
  696. inquiry.setReplaceQuotedAmount(replaceQuotedAmount);
  697. return inquiry;
  698. }
  699. /**
  700. * 将公共询价服务中心的公共询价转成ERP的对应的字段
  701. *
  702. * @param notUploadReply 未下载的供应商报价信息
  703. * @return
  704. * @author hejq
  705. * @date 2018-01-14 11:51
  706. */
  707. @Override
  708. public List<InquiryDetail> convertPublicInquiryReply(List<PublicInquiryItem> notUploadReply) {
  709. List<InquiryDetail> details = new ArrayList<InquiryDetail>();
  710. if (!CollectionUtils.isEmpty(notUploadReply)) {
  711. for (PublicInquiryItem item : notUploadReply) {
  712. details.add(new InquiryDetail(item));
  713. }
  714. }
  715. return details;
  716. }
  717. /**
  718. * 下载完成后更新公共询价服务中心询价单明细的下载状态
  719. *
  720. * @param idArray 询价单明细id
  721. * @author hejq
  722. * @date 2018-01-14 12:12
  723. */
  724. @Override
  725. public void onReplyUploadSuccess(String[] idArray) {
  726. List<PublicInquiryItem> items = new ArrayList<>();
  727. for (String id : idArray) {
  728. PublicInquiryItem item = publicInquiryItemDao.findOne(Long.parseLong(id));
  729. if (item != null) {
  730. item.setBackStatus((short) Status.DOWNLOADED.value());
  731. item.setErpstatus(Constant.YES);
  732. items.add(item);
  733. }
  734. }
  735. if (!CollectionUtils.isEmpty(items)) {
  736. publicInquiryItemDao.save(items);
  737. }
  738. }
  739. /**
  740. * 下载完成后更新公共询价服务中心询价单明细的下载状态
  741. *
  742. * @param idArray 询价单明细id
  743. * @author hejq
  744. * @date 2018-01-14 12:12
  745. */
  746. @Override
  747. public void onReplyDownLoadSuccess(String[] idArray) {
  748. List<PublicInquiryItem> items = new ArrayList<>();
  749. for (String id : idArray) {
  750. PublicInquiryItem item = publicInquiryItemDao.findOne(Long.parseLong(id));
  751. if (item != null) {
  752. item.setReplySendStatus((short) Status.DOWNLOADED.value());
  753. items.add(item);
  754. }
  755. }
  756. if (!CollectionUtils.isEmpty(items)) {
  757. publicInquiryItemDao.save(items);
  758. }
  759. }
  760. /**
  761. * ERP提交公共询价单之后,更新平台状态,让公共询价服务中心询价单不能进行报价操作
  762. *
  763. * @param details 询价信息
  764. * @author hejq
  765. * @date 2018-01-14 12:20
  766. */
  767. @Override
  768. public void updateInquiryStatus(List<InquiryDetail> details, Long enuu) {
  769. if (!CollectionUtils.isEmpty(details)) {
  770. for (InquiryDetail detail : details) {
  771. // 更新为过期状态,不能进行报价处理
  772. String sql = "update purc$puInquiryItems set id_overdue = 1 where id_id = " +
  773. "(select id_sourceid from public$inquiryItems where id_id = " + detail.getB2b_id_id() + ")";
  774. jdbcTemplate.update(sql);
  775. // 更新已转报价的询价单明细状态
  776. jdbcTemplate.update("update public$inquiryItems set id_checked = 1 where id_id = " + detail.getB2b_id_id());
  777. }
  778. }
  779. }
  780. /**
  781. * ERP对报价信息的采纳状态上传到公共询价服务中心
  782. *
  783. * @param decides 采纳信息
  784. */
  785. @Override
  786. public void onReplyDecide(List<InquiryDecide> decides, Long enuu) {
  787. List<PublicInquiryItem> publicInquiryItems = convertInquiryDecide(decides);
  788. if (!CollectionUtils.isEmpty(publicInquiryItems)) {
  789. for (PublicInquiryItem inquiryItem : publicInquiryItems) {
  790. publicInquiryItemDao.updateDecideStatusByID(inquiryItem.getAgreed(), inquiryItem.getDecideStatus(), inquiryItem.getId());
  791. notifyDecide(inquiryItem, PRODUCERAPP);
  792. }
  793. }
  794. }
  795. /**
  796. * 针对供应商,客户对报价结果发送消息通知
  797. *
  798. * @param item 询价明细
  799. * @param sourceApp 应用来源
  800. */
  801. @Override
  802. public void notifyDecide(PublicInquiryItem item, String sourceApp) {
  803. final String SMS_TYPE = "IM"; //只推送消息
  804. List<MessageModel> models = new ArrayList<MessageModel>();
  805. User u = userDao.findOne(null != item.getInquiry().getRecorderUU() ? item.getInquiry().getRecorderUU() : 0L);
  806. Enterprise e = enterpriseDao.findOne(item.getInquiry().getEnUU());
  807. Product product = new Product();
  808. if (null != item.getProductId()) {
  809. product = productDao.findOne(item.getProductId());
  810. }
  811. String cmpCode = product.getCmpCode() != null ? product.getCmpCode() : item.getCmpCode();
  812. String content = item.getAgreed() == 1 ? "【已采纳】" : "【未采纳】";
  813. content = content + "您关于“" + cmpCode + "”的报价";
  814. if (null != e) {
  815. content = e.getEnName() + content;
  816. } else if (null != u) {
  817. content = u.getUserName() + content;
  818. } else if (null == e && null == u) {
  819. content = "您关于“" + cmpCode + "”的报价已被";
  820. String result = item.getAgreed() == 1 ? "【已采纳】" : "【拒绝】";
  821. content = content + result;
  822. }
  823. MessageModel model = new MessageModel();
  824. model.setType(INQUIRY_DECIDE_TYPE);
  825. model.setProducerApp(sourceApp);
  826. model.setConsumerType(CUST_TYPE);
  827. model.setConsumerApp(CONSUMERAPP);
  828. model.setContent(content);
  829. model.setRemark(String.valueOf(item.getInquiry().getId()));
  830. model.setSourceId(item.getId());
  831. model.setReceiverEnuu(item.getVendUU());
  832. model.setReceiverUu(item.getVendUserUU());
  833. model.setSenderEnuu(item.getInquiry().getEnUU());
  834. if (null != item.getUserUU() || null != item.getInquiry().getRecorderUU()) {
  835. model.setSenderUu(item.getUserUU() != null ? item.getUserUU() : item.getInquiry().getRecorderUU());
  836. } else {
  837. Enterprise enterprise = enterpriseDao.findOne(item.getInquiry().getEnUU());
  838. model.setSenderUu(null != enterprise ? enterprise.getAdminUU() : 0L);
  839. }
  840. model.setSmsType(SMS_TYPE);
  841. models.add(model);
  842. if (!CollectionUtils.isEmpty(models)) {
  843. sendMessage(models);
  844. }
  845. }
  846. /**
  847. * 将ERP的报价采纳信息转为公共询价服务中心需要的信息
  848. *
  849. * @param decides erp报价采纳信息
  850. * @author hejq
  851. * @date 2018-01-14 12:25
  852. */
  853. @Override
  854. public List<PublicInquiryItem> convertInquiryDecide(List<InquiryDecide> decides) {
  855. List<PublicInquiryItem> inquiryItems = new ArrayList<PublicInquiryItem>();
  856. if (!CollectionUtils.isEmpty(decides)) {
  857. for (InquiryDecide decide : decides) {
  858. PublicInquiryItem item = publicInquiryItemDao.findOne(decide.getB2b_id());
  859. if (null != item) {
  860. item.setAgreed(decide.getId_agreed());
  861. item.setDecideStatus((short) Status.NOT_UPLOAD.value());
  862. inquiryItems.add(item);
  863. }
  864. }
  865. }
  866. return inquiryItems;
  867. }
  868. /**
  869. * 买家ERP作废询价单后,修改公共询价服务中心里面的状态
  870. *
  871. * @param inquiries 询价信息
  872. * @param enuu 企业UU
  873. * @author hejq
  874. * @date 2018-01-14 12:28
  875. */
  876. @Override
  877. public void onReplyInvalid(List<Inquiry> inquiries, final Long enuu) {
  878. final List<PublicInquiryItem> newInquiryItems = new ArrayList<>();
  879. ThreadUtils.tasks(new IRunnable<Inquiry>() {
  880. @Override
  881. public void run(Inquiry inquiry) {
  882. List<PublicInquiry> purchaseInquiries = publicInquiryDao.findByEnUUAndCode(enuu, inquiry.getIn_code());
  883. if (!CollectionUtils.isEmpty(purchaseInquiries)) {
  884. PublicInquiry publicInquiry = purchaseInquiries.get(0);
  885. for (PublicInquiryItem item : publicInquiry.getInquiryItems()) {
  886. item.setStatus((short) Status.DISABLED.value());
  887. // 获取作废信息时,更新作废上传状态为 待上传
  888. item.setInvalidStatus((short) Status.NOT_UPLOAD.value());
  889. synchronized (newInquiryItems) {
  890. newInquiryItems.add(item);
  891. }
  892. }
  893. }
  894. }
  895. }, inquiries);
  896. }
  897. /**
  898. * 将公共询价列表转成需要报价的询价单,类型是公共询价
  899. *
  900. * @param id 询价明细id
  901. * @param enuu 报价企业UU
  902. * @param useruu 报价人uu
  903. * @return
  904. * @author hejq
  905. * @date 2018-01-14 14:46
  906. */
  907. @Override
  908. public ModelMap transtoInquiry(Long id, Long enuu, Long useruu) {
  909. ModelMap map = new ModelMap();
  910. PurcInquiryItem purcInquiryItem = purcInquiryItemDao.findOne(id);
  911. PurcInquiry purcInquiry = purcInquiryItem.getInquiry();
  912. // 先判断客户询价单是否存在这张单据
  913. PublicInquiry inquiry = publicInquiryDao.findBySourceIdAndSourceApp(purcInquiry.getId(), SOURCERAPP);
  914. if (null == inquiry) {// 新增
  915. PublicInquiry saleInquiry = new PublicInquiry();
  916. saleInquiry.setDate(new Date());
  917. saleInquiry.setCode(purcInquiry.getCode());
  918. saleInquiry.setEnUU(purcInquiry.getEnUU());
  919. saleInquiry.setRecorder(purcInquiry.getRecorder());
  920. saleInquiry.setRecorderUU(purcInquiry.getRecorderUU());
  921. saleInquiry.setAuditor(purcInquiry.getAuditor());
  922. saleInquiry.setSourceApp(SOURCERAPP);
  923. saleInquiry.setKind(INQUIRYKIND);
  924. saleInquiry.setSourceId(purcInquiry.getId());
  925. saleInquiry.setPriceType(purcInquiry.getPriceType());
  926. saleInquiry.setInvoice(purcInquiry.getInvoice());
  927. saleInquiry.setShip(purcInquiry.getShip());
  928. saleInquiry.setEndDate(purcInquiry.getEndDate());
  929. if (!CollectionUtils.isEmpty(purcInquiry.getAttachs())) {
  930. Set<com.uas.ps.inquiry.model.Attach> attachs = new HashSet<com.uas.ps.inquiry.model.Attach>();
  931. for (com.uas.ps.inquiry.model.Attach attach : purcInquiry.getAttachs()) {
  932. com.uas.ps.inquiry.model.Attach newAttach = new com.uas.ps.inquiry.model.Attach();
  933. newAttach.setDate(new Date());
  934. newAttach.setDescription(attach.getDescription());
  935. newAttach.setName(attach.getName());
  936. newAttach.setPath(attach.getPath());
  937. newAttach.setRelatedKey(attach.getRelatedKey());
  938. newAttach.setSize(attach.getSize());
  939. newAttach.setRelatedKey(attach.getRelatedKey());
  940. attachs.add(newAttach);
  941. }
  942. saleInquiry.setAttachs(attachs);
  943. }
  944. saleInquiry.setEnvironment(purcInquiry.getEnvironment());
  945. saleInquiry.setRemark(purcInquiry.getRemark());
  946. saleInquiry.setInquirytype(purcInquiry.getInquirytype());
  947. Set<PublicInquiryItem> items = new HashSet<PublicInquiryItem>();
  948. Short i = 0;
  949. if (null != purcInquiryItem) {
  950. PublicInquiryItem item = new PublicInquiryItem();
  951. Product product = productDao.findOne(purcInquiryItem.getProductId());
  952. item.setProductId(product.getId());
  953. item.setInquiry(saleInquiry);
  954. item.setNumber(i);
  955. item.setCurrency(purcInquiryItem.getCurrency());
  956. item.setFromDate(new Date());
  957. item.setToDate(purcInquiryItem.getToDate());
  958. item.setTaxrate(purcInquiryItem.getTaxrate());
  959. item.setRemark(purcInquiryItem.getRemark());
  960. item.setProductId(purcInquiryItem.getProductId());
  961. item.setStatus((short) Status.NOT_REPLY.value());
  962. item.setVendUU(enuu);
  963. item.setVendUserUU(useruu);
  964. item.setSource(purcInquiryItem.getSource());
  965. item.setCustLap(Constant.NO);
  966. item.setSendStatus((short) Status.NOT_UPLOAD.value());
  967. item.setSourceId(id);
  968. List<PublicInquiryReply> replies = new ArrayList<PublicInquiryReply>();
  969. PublicInquiryReply reply = new PublicInquiryReply();
  970. reply.setLapQty((double) 0);
  971. replies.add(reply);
  972. item.setReplies(replies);
  973. item.setNeedquantity(purcInquiryItem.getNeedquantity());
  974. item.setKind(INQUIRYKIND);
  975. item.setProdCode(purcInquiryItem.getProdCode());
  976. items.add(item);
  977. i++;
  978. }
  979. List<PublicInquiryItem> purcitems = publicInquiryItemDao.save(items);
  980. if (purcitems.get(0).getId() != null) {
  981. map.put("success", "转客户询价单成功");
  982. map.put("id", purcitems.get(0).getInquiry().getId());
  983. } else {
  984. map.put("success", "转客户询价单失败");
  985. }
  986. } else {// 插入
  987. PublicInquiryItem purcItem = publicInquiryItemDao.findByVendUUAndSourceId(enuu, id);
  988. if (purcItem != null) {
  989. map.put("info", "询价单已存在");
  990. map.put("inid", purcItem.getId());
  991. } else {
  992. if (!CollectionUtils.isEmpty(purcInquiry.getInquiryItems())) {
  993. if (null != purcInquiryItem) {
  994. // 涉及到级联存储及ERP转入单据的操作,用主表id存储存在问题,这里先用sql语句直接插入
  995. PublicInquiryItem item = new PublicInquiryItem();
  996. Product product = productDao.findOne(purcInquiryItem.getProductId());
  997. item.setProductId(product.getId());
  998. item.setNumber((short) (purcInquiry.getInquiryItems().size() + 1));
  999. item.setCurrency(purcInquiryItem.getCurrency());
  1000. item.setFromDate(new Date());
  1001. item.setToDate(purcInquiryItem.getToDate());
  1002. item.setTaxrate(purcInquiryItem.getTaxrate());
  1003. item.setRemark(purcInquiryItem.getRemark());
  1004. item.setProductId(purcInquiryItem.getProductId());
  1005. item.setVendUU(enuu);
  1006. item.setVendUserUU(useruu);
  1007. item.setSource(purcInquiryItem.getSource());
  1008. item.setStatus((short) Status.NOT_REPLY.value());
  1009. item.setCustLap(Constant.NO);
  1010. item.setSendStatus((short) Status.NOT_UPLOAD.value());
  1011. item.setSourceId(id);
  1012. item.setProdCode(purcInquiryItem.getProdCode());
  1013. item.setKind(INQUIRYKIND);
  1014. item.setNeedquantity(purcInquiryItem.getNeedquantity());
  1015. List<PublicInquiryReply> replies = new ArrayList<PublicInquiryReply>();
  1016. List<PublicInquiryReply> purcReplies = new ArrayList<PublicInquiryReply>();
  1017. PublicInquiryReply reply = new PublicInquiryReply();
  1018. reply.setLapQty((double) 0);
  1019. purcReplies.add(reply);
  1020. purcReplies = publicInquiryReplyDao.save(purcReplies);
  1021. replies.addAll(purcReplies);
  1022. item.setReplies(replies);
  1023. Long idid = jdbcTemplate.queryForObject("select public$inquiryitems_seq.nextval from dual", Long.class);
  1024. try {
  1025. jdbcTemplate.update(
  1026. "insert into public$inquiryitems(id_id,id_number,id_currency,id_fromdate,id_todate,id_taxrate,id_prid,id_venduu,"
  1027. + "id_venduseruu,id_sourceapp,id_status,id_custlap,id_sendstatus,id_sourceid,id_inid,id_kind) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
  1028. idid, item.getNumber(), item.getCurrency(), item.getFromDate(), item.getToDate(),
  1029. item.getTaxrate(), item.getProductId(), item.getVendUU(), item.getVendUserUU(),
  1030. item.getSource(), item.getStatus(), item.getCustLap(), item.getSendStatus(),
  1031. item.getSourceId(), inquiry.getId(), inquiry.getKind());
  1032. } catch (DataAccessException e) {
  1033. map.put("info", "转客户询价单失败");
  1034. }
  1035. item = publicInquiryItemDao.findOne(idid);
  1036. //回复清单更新
  1037. if (replies.size() > 0) {
  1038. for (PublicInquiryReply reply1 : replies) {
  1039. jdbcTemplate.update("update public$inquiryreply set ir_idid = " + idid + "where ir_id = " + reply1.getId());
  1040. }
  1041. }
  1042. if (item != null) {
  1043. map.put("success", "转客户询价单成功");
  1044. map.put("id", item.getInquiry().getId());
  1045. } else {
  1046. map.put("info", "转客户询价单失败");
  1047. }
  1048. }
  1049. }
  1050. }
  1051. }
  1052. return map;
  1053. }
  1054. /**
  1055. * 通过分页参数和过滤条件查询报价信息
  1056. *
  1057. * @param info 分页参数
  1058. * @param filter 过滤条件
  1059. * @return
  1060. * @author hejq
  1061. * @date 2018-01-17 10:30
  1062. */
  1063. @Override
  1064. public IPage<PublicInquiryItemInfo> findByPageInfo(final PageInfo info, final SearchFilter filter) {
  1065. Sort sort = new Sort(Sort.Direction.DESC, "date");
  1066. if (info.getOffset() == 0) {
  1067. info.setOffset(info.getPageSize() * (info.getPageNumber() - 1));
  1068. }
  1069. info.setSort(sort);
  1070. if (null != filter) {
  1071. if (filter.getFromDate() != null) {
  1072. info.expression(PredicateUtils.gte("offerTime", new Date(filter.getFromDate()), false));
  1073. }
  1074. if (filter.getEndDate() != null) {
  1075. info.expression(PredicateUtils.lte("offerTime", new Date(filter.getEndDate()), false));
  1076. }
  1077. // 此处的 fromDelivery 作为发布时间过滤
  1078. if (filter.getFromDelivery() != null) {
  1079. info.expression(PredicateUtils.gte("date", new Date(filter.getFromDelivery()), false));
  1080. }
  1081. if (filter.getEndDelivery() != null) {
  1082. info.expression(PredicateUtils.lte("date", new Date(filter.getEndDelivery()), false));
  1083. }
  1084. if (filter.getUserUU() != null) {
  1085. info.expression(PredicateUtils.gte("vendUserUU", filter.getUserUU(), false));
  1086. }
  1087. if (StringUtils.hasText(filter.getKeyword())) {
  1088. SimpleExpression cmpCode = new SimpleExpression("cmpCode", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  1089. SimpleExpression brand = new SimpleExpression("inbrand", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  1090. SimpleExpression code = new SimpleExpression("inquiry.code", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  1091. SimpleExpression title = new SimpleExpression("prodTitle", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  1092. SimpleExpression spec = new SimpleExpression("spec", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  1093. SimpleExpression inquiryEnName = new SimpleExpression("inquiry.enName", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  1094. SimpleExpression[] simpleExpressions = new SimpleExpression[]{cmpCode, brand, code, title, inquiryEnName, spec};
  1095. LogicalExpression logical = new LogicalExpression(simpleExpressions, CriterionExpression.Operator.OR);
  1096. info.expression(logical);
  1097. }
  1098. }
  1099. Page<PublicInquiryItemInfo> itemInfoPage = itemInfoDao.findAll(new Specification<PublicInquiryItemInfo>() {
  1100. @Override
  1101. public Predicate toPredicate(Root<PublicInquiryItemInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
  1102. query.where(info.getPredicates(root, query, builder));
  1103. return null;
  1104. }
  1105. }, info);
  1106. if (!CollectionUtils.isEmpty(itemInfoPage.getContent())) {
  1107. for (PublicInquiryItemInfo itemInfo : itemInfoPage) {
  1108. String sql = "select at_path,at_name from attachs a left join public$inquiryitems$attach p on a.at_id = p.at_id " +
  1109. "left join public$inquiryitems i on p.id_id = i.id_id where i.id_id = " + itemInfo.getId();
  1110. List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
  1111. if (!CollectionUtils.isEmpty(maps)) {
  1112. Map<String, Object> map = maps.get(0);
  1113. itemInfo.setAttachUrl(map.get("at_path").toString());
  1114. itemInfo.setAttachName(map.get("at_name").toString());
  1115. }
  1116. if (null == itemInfo.getProductId()) {
  1117. Product product = new Product();
  1118. product.setTitle(itemInfo.getProdTitle());
  1119. product.setCmpCode(itemInfo.getCmpCode());
  1120. product.setBrand(itemInfo.getInbrand());
  1121. product.setSpec(itemInfo.getSpec());
  1122. product.setCode(itemInfo.getProdCode());
  1123. if (null == product.getCode()) {
  1124. product.setCode(itemInfo.getCmpCode());
  1125. }
  1126. itemInfo.setProduct(product);
  1127. }
  1128. }
  1129. }
  1130. return IPageUtils.covert(itemInfoPage);
  1131. }
  1132. @Override
  1133. public Page<PublicInquiryItemInfo> findListByPageInfo(final PageInfo info, SearchFilter filter) {
  1134. Sort sort = new Sort(Sort.Direction.DESC, "date");
  1135. if (info.getOffset() == 0) {
  1136. info.setOffset(info.getPageSize() * (info.getPageNumber() - 1));
  1137. }
  1138. info.setSort(sort);
  1139. return itemInfoDao.findAll(new Specification<PublicInquiryItemInfo>() {
  1140. @Override
  1141. public Predicate toPredicate(Root<PublicInquiryItemInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
  1142. query.where(info.getPredicates(root, query, builder));
  1143. return null;
  1144. }
  1145. }, info);
  1146. }
  1147. /**
  1148. * 查询公共询价列表信息
  1149. *
  1150. * @param info 分页参数
  1151. * @param filter 过滤条件
  1152. * @return
  1153. */
  1154. @Override
  1155. public IPage<PurcInquiryItemInfo> findTodoByPageInfo(final PageInfo info, final SearchFilter filter) {
  1156. Sort sort = new Sort(Sort.Direction.DESC, "id", "date");
  1157. if (info.getOffset() == 0) {
  1158. info.setOffset(info.getPageSize() * (info.getPageNumber() - 1));
  1159. }
  1160. info.setSort(sort);
  1161. Long enUU = null;
  1162. if (null != filter) {
  1163. if (filter.getFromDate() != null) {
  1164. info.expression(PredicateUtils.gte("date", new Date(filter.getFromDate()), false));
  1165. }
  1166. if (filter.getEndDate() != null) {
  1167. info.expression(PredicateUtils.lte("date", new Date(filter.getEndDate()), false));
  1168. }
  1169. if (!CollectionUtils.isEmpty(filter.getDistribute())) {
  1170. info.expression(PredicateUtils.in("inquiry.enUU", filter.getDistribute(), false));
  1171. }
  1172. // 将当前uu设置
  1173. enUU = filter.getEnUU();
  1174. if (!StringUtils.isEmpty(filter.getIsAll()) && filter.getIsAll() == 0 && !StringUtils.isEmpty(filter.getEnUU())) {
  1175. info.expression(PredicateUtils.ne("inquiry.enUU", filter.getEnUU(), false));
  1176. }
  1177. if (!StringUtils.isEmpty(filter.getKeyword())) {
  1178. SimpleExpression cmpCode = new SimpleExpression("cmpCode", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  1179. SimpleExpression brand = new SimpleExpression("inbrand", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  1180. SimpleExpression title = new SimpleExpression("prodTitle", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  1181. SimpleExpression spec = new SimpleExpression("spec", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  1182. SimpleExpression code = new SimpleExpression("inquiry.code", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  1183. SimpleExpression enName = new SimpleExpression("inquiry.enName", filter.getKeyword(), CriterionExpression.Operator.LIKE, true);
  1184. SimpleExpression[] simpleExpressions = null;
  1185. if (!StringUtils.isEmpty(filter.getIsLogin()) && filter.getIsLogin() == 0) {
  1186. simpleExpressions = new SimpleExpression[]{cmpCode, brand, code, title, spec};
  1187. } else {
  1188. simpleExpressions = new SimpleExpression[]{cmpCode, brand, code, title, enName, spec};
  1189. }
  1190. LogicalExpression logical = new LogicalExpression(simpleExpressions, CriterionExpression.Operator.OR);
  1191. info.expression(logical);
  1192. }
  1193. }
  1194. Page<PurcInquiryItemInfo> orders = inquiryItemInfoDao.findAll(new Specification<PurcInquiryItemInfo>() {
  1195. @Override
  1196. public Predicate toPredicate(Root<PurcInquiryItemInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
  1197. query.where(info.getPredicates(root, query, builder));
  1198. return null;
  1199. }
  1200. }, info);
  1201. // 将当前企业报价信息设置进去
  1202. if (null != filter && !StringUtils.isEmpty(enUU)) {
  1203. for (PurcInquiryItemInfo itemInfo : orders) {
  1204. PublicInquiryItem item = publicInquiryItemDao.findByVendUUAndSourceId(filter.getEnUU(), itemInfo.getId());
  1205. List<InquiryEnRemind> inquiryEnRemind = inquiryEnRemindDao.findByItemIdAndVendUU(itemInfo.getId(), filter.getEnUU());
  1206. if (!CollectionUtils.isEmpty(inquiryEnRemind) && inquiryEnRemind.size() > 0) {
  1207. itemInfo.setAllotStatus((short) 1);
  1208. } else {
  1209. itemInfo.setAllotStatus((short) 0);
  1210. }
  1211. itemInfo.setQuotation(item);
  1212. }
  1213. }
  1214. return covert(orders, enUU);
  1215. }
  1216. /**
  1217. * 将数据库查询的数据进行封装处理
  1218. *
  1219. * @param orders 查询的数据信息
  1220. * @return
  1221. */
  1222. private IPage<PurcInquiryItemInfo> covert(Page<PurcInquiryItemInfo> orders, Long enuu) {
  1223. if (!CollectionUtils.isEmpty(orders.getContent()) && null != enuu) {
  1224. for (PurcInquiryItemInfo itemInfo : orders.getContent()) {
  1225. PublicInquiryItem item = publicInquiryItemDao.findByVendUUAndSourceId(enuu, itemInfo.getId());
  1226. itemInfo.setQuoted(Constant.NO);
  1227. if (null != item) {
  1228. itemInfo.setAgreed(item.getAgreed());
  1229. itemInfo.setQuteId(item.getId());
  1230. itemInfo.setQuoted(Constant.YES);
  1231. }
  1232. if (null == itemInfo.getProductId()) {
  1233. Product product = new Product();
  1234. product.setTitle(itemInfo.getProdTitle());
  1235. product.setCmpCode(itemInfo.getCmpCode());
  1236. product.setBrand(itemInfo.getInbrand());
  1237. product.setSpec(itemInfo.getSpec());
  1238. product.setCode(itemInfo.getProdCode());
  1239. if (null == product.getCode()) {
  1240. product.setCode(itemInfo.getCmpCode());
  1241. }
  1242. itemInfo.setProduct(product);
  1243. } else {
  1244. Product product = productDao.findOne(itemInfo.getProductId());
  1245. itemInfo.setProduct(product);
  1246. }
  1247. }
  1248. }
  1249. return IPageUtils.covert(orders);
  1250. }
  1251. /**
  1252. * 根据传入条件封装查询条件
  1253. *
  1254. * @param pageInfo 分页参数
  1255. * @param state 过滤条件
  1256. * @return
  1257. */
  1258. @Override
  1259. public PageInfo covert(PageInfo pageInfo, String state, Short overdue) {
  1260. Sort sort = new Sort(Sort.Direction.DESC, "date");
  1261. if (pageInfo.getOffset() == 0) {
  1262. pageInfo.setOffset(pageInfo.getPageSize() * (pageInfo.getPageNumber() - 1));
  1263. }
  1264. pageInfo.setSort(sort);
  1265. if (state.equals(OrderStatus.todo.name())) {
  1266. pageInfo.filter("status", Status.NOT_REPLY.value());
  1267. pageInfo.filter("overdue", Constant.NO);
  1268. pageInfo.filter("invalid", Constant.NO);
  1269. } else if (state.equals(OrderStatus.done.name())) {
  1270. if (StringUtils.isEmpty(overdue) || !overdue.equals(Constant.YES)) {
  1271. pageInfo.filter("overdue", Constant.NO);
  1272. }
  1273. pageInfo.filter("status", Status.REPLIED.value());
  1274. pageInfo.filter("invalid", Constant.NO);
  1275. pageInfo.filter("decideStatus", Status.UNAUDIT.value());
  1276. } else if (state.equals(OrderStatus.end.name())) {
  1277. pageInfo.filter("overdue", Constant.YES);
  1278. pageInfo.filter("invalid", Constant.NO);
  1279. } else if (state.equals(OrderStatus.invalid.name())) {
  1280. SimpleExpression overdue1 = new SimpleExpression("overdue", Constant.NO, CriterionExpression.Operator.NE, true);
  1281. SimpleExpression invalid = new SimpleExpression("invalid", Constant.NO, CriterionExpression.Operator.NE, true);
  1282. SimpleExpression[] simpleExpressions = new SimpleExpression[]{invalid, overdue1};
  1283. LogicalExpression logical = new LogicalExpression(simpleExpressions, CriterionExpression.Operator.OR);
  1284. pageInfo.expression(logical);
  1285. } else if (state.equals(OrderStatus.agreed.name())) {
  1286. pageInfo.filter("agreed", Constant.YES);
  1287. pageInfo.filter("status", Status.REPLIED.value());
  1288. pageInfo.filter("invalid", Constant.NO);
  1289. } else if (state.equals(OrderStatus.refused.name())) {
  1290. pageInfo.filter("agreed", Constant.NO);
  1291. pageInfo.filter("status", Status.REPLIED.value());
  1292. pageInfo.filter("invalid", Constant.NO);
  1293. }
  1294. return pageInfo;
  1295. }
  1296. /**
  1297. * 获取公共询价列表信息
  1298. *
  1299. * @param enuu 当前企业UU
  1300. * @param size 大小
  1301. * @return
  1302. */
  1303. @Override
  1304. public List<InquiryMessage> getMessageList(Long enuu, Integer size) {
  1305. if (size == 0 || size == null) {
  1306. size = 10;
  1307. }
  1308. String sql = "select * from (select p.id_id id, p.id_prodtitle prodTitle, 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 1=1";
  1309. if (enuu != null) {
  1310. sql = sql + " and i.in_enuu <> " + enuu;
  1311. }
  1312. sql = sql + " and COALESCE(p.id_overdue, 0) <> 1 order by p.id_id desc) i limit " + size;
  1313. List<PurcInquiryItem> items = jdbcTemplate.query(sql, new BeanPropertyRowMapper<PurcInquiryItem>(PurcInquiryItem.class));
  1314. List<InquiryMessage> messages = new ArrayList<InquiryMessage>();
  1315. if (!CollectionUtils.isEmpty(items)) {
  1316. for (PurcInquiryItem item : items) {
  1317. InquiryMessage message = new InquiryMessage();
  1318. if (null != item.getEnuu()) {
  1319. Enterprise enterprise = enterpriseDao.findOne(item.getEnuu());
  1320. message.setEnName(enterprise.getEnName());
  1321. }
  1322. item = purcInquiryItemDao.findOne(item.getId());
  1323. message.setPordName(item.getProdTitle());
  1324. message.setInid(item.getId());
  1325. PublicInquiryItem publicInquiryItem = publicInquiryItemDao.findByVendUUAndSourceId(enuu, item.getId());
  1326. if (null != publicInquiryItem) {
  1327. message.setQuteId(publicInquiryItem.getId());
  1328. }
  1329. message.setLastest(isToday(item.getDate()));
  1330. messages.add(message);
  1331. }
  1332. }
  1333. return messages;
  1334. }
  1335. /**
  1336. * 判断该条单据是否当天单据
  1337. *
  1338. * @param date 询价时间
  1339. * @return
  1340. */
  1341. private boolean isToday(Date date) {
  1342. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  1343. String inDate = sdf.format(date);
  1344. String nowDate = sdf.format(new Date());
  1345. return inDate.equals(nowDate);
  1346. }
  1347. /**
  1348. * 商城-采购排行榜
  1349. *
  1350. * @return
  1351. */
  1352. @Override
  1353. public List<Map<String, Object>> findCodeRankingList() {
  1354. String name = "采购排行榜";
  1355. InquiryData inquiryData = inquiryDataDao.findByName(name);
  1356. List<Map<String, Object>> result = FlexJsonUtils.fromJsonArray(inquiryData.getData(), HashMap.class);
  1357. return result;
  1358. }
  1359. /**
  1360. * 通过明细id查询询价详情
  1361. *
  1362. * @param itemId 明细id
  1363. * @return
  1364. */
  1365. @Override
  1366. public PurcInquiryItemInfo findItemByItemId(Long itemId, Long enuu) {
  1367. PurcInquiryItemInfo itemInfo = inquiryItemInfoDao.findOne(itemId);
  1368. PublicInquiryItem item = publicInquiryItemDao.findByVendUUAndSourceId(enuu, itemInfo.getId());
  1369. itemInfo.setQuoted(Constant.NO);
  1370. if (null != item) {
  1371. itemInfo.setAgreed(item.getAgreed());
  1372. itemInfo.setQuteId(item.getId());
  1373. itemInfo.setQuoted(Constant.YES);
  1374. }
  1375. if (null == itemInfo.getProductId()) {
  1376. Product product = new Product();
  1377. product.setTitle(itemInfo.getProdTitle());
  1378. product.setCmpCode(itemInfo.getCmpCode());
  1379. product.setBrand(itemInfo.getInbrand());
  1380. product.setSpec(itemInfo.getSpec());
  1381. itemInfo.setProduct(product);
  1382. }
  1383. return itemInfo;
  1384. }
  1385. /**
  1386. * 通过id查询单个已转报价的信息
  1387. *
  1388. * @param id
  1389. * @return
  1390. */
  1391. @Override
  1392. public PublicInquiryItemInfo findOneInfo(Long id, Long enuu, Long useruu) {
  1393. PublicInquiryItemInfo itemInfo = itemInfoDao.findOne(id);
  1394. if (!itemInfo.getVendUU().equals(enuu)) {
  1395. throw new IllegalOperatorException("访问受限");
  1396. }
  1397. return itemInfo;
  1398. }
  1399. /**
  1400. * 将推荐信息转成UU互联需要的数据
  1401. *
  1402. * @param content 推荐信息
  1403. * @return
  1404. */
  1405. @Override
  1406. public List<PurcInquiryItemInfo> covertRemindToInquiry(List<InquiryRemind> content) {
  1407. List<PurcInquiryItemInfo> infoList = new ArrayList<>();
  1408. if (!CollectionUtils.isEmpty(content)) {
  1409. for (InquiryRemind remind : content) {
  1410. PurcInquiryItemInfo itemInfo = inquiryItemInfoDao.findOne(remind.getItemId());
  1411. if (null != itemInfo) {
  1412. Product product = new Product();
  1413. product.setTitle(itemInfo.getProdTitle());
  1414. product.setCmpCode(itemInfo.getCmpCode());
  1415. product.setCode(itemInfo.getCmpCode());
  1416. product.setBrand(itemInfo.getInbrand());
  1417. product.setSpec(itemInfo.getSpec());
  1418. itemInfo.setProduct(product);
  1419. if (remind.getStatus().equals(Status.NOTALLOW.value())) {
  1420. itemInfo.setAgreed(Constant.NO);
  1421. } else if (remind.getStatus().equals(Status.ALLOW.value())) {
  1422. itemInfo.setAgreed(Constant.YES);
  1423. }
  1424. itemInfo.setQuoted(Constant.NO);
  1425. if (remind.getStatus().equals(Status.SUBMITTED.value())) {
  1426. itemInfo.setQuoted(Constant.YES);
  1427. itemInfo.setQuteId(remind.getNewId());
  1428. }
  1429. if (null != itemInfo.getRemainingTime() && itemInfo.getRemainingTime() <= 0) {
  1430. itemInfo.setOverdue(Constant.YES);
  1431. }
  1432. infoList.add(itemInfo);
  1433. }
  1434. }
  1435. }
  1436. return infoList;
  1437. }
  1438. /**
  1439. * 针对供应商,客户将拒绝理由发送信息给供应商
  1440. *
  1441. * @param item 询价明细
  1442. * @param sourceApp 应用来源
  1443. * @throws Exception
  1444. */
  1445. @Override
  1446. public Page<MessageModel> refuseMessage(PublicInquiryItem item, String sourceApp) {
  1447. if (null != item.getVendUU() && null != item.getVendUserUU()) {
  1448. final String SMS_TYPE = "SM"; //发送信息
  1449. List<MessageModel> models = new ArrayList<MessageModel>();
  1450. String Buyer = item.getInquiry().getEnName() == null ? item.getInquiry().getRecorder() : item.getInquiry().getEnName();
  1451. String cmpCode = item.getCmpCode();
  1452. String cmp = cmpCode.length() > 10 ? cmpCode.substring(0, 10).concat("...") : cmpCode;
  1453. String content = "因" + item.getRefusereason() + "," + Buyer + "【未采纳】您关于“型号:" + cmp + "”的报价。期待与您的下次合作!";
  1454. MessageModel model = new MessageModel();
  1455. model.setType(INQUIRY_DECIDE_TYPE_MALL);
  1456. model.setProducerApp(sourceApp);
  1457. model.setConsumerType(CUST_TYPE);
  1458. model.setConsumerApp(CONSUMERAPP);
  1459. model.setContent(content);
  1460. model.setRemark(String.valueOf(item.getInquiry().getId()));
  1461. model.setSourceId(item.getId());
  1462. model.setReceiverEnuu(item.getVendUU());
  1463. model.setReceiverUu(item.getVendUserUU());
  1464. model.setSenderEnuu(item.getInquiry().getEnUU());
  1465. if (null != item.getUserUU() || null != item.getInquiry().getRecorderUU()) {
  1466. model.setSenderUu(item.getUserUU() != null ? item.getUserUU() : item.getInquiry().getRecorderUU());
  1467. } else {
  1468. Enterprise enterprise = enterpriseDao.findOne(item.getInquiry().getEnUU());
  1469. model.setSenderUu(null != enterprise ? enterprise.getAdminUU() : 0L);
  1470. }
  1471. model.setSmsType(SMS_TYPE);
  1472. models.add(model);
  1473. if (!CollectionUtils.isEmpty(models)) {
  1474. sendMessage(models);
  1475. }
  1476. }
  1477. return null;
  1478. }
  1479. /**
  1480. * 针对供应商,把客户采纳报价的消息发送给供应商
  1481. *
  1482. * @param item 询价明细
  1483. * @param sourceApp 应用来源
  1484. * @throws Exception
  1485. */
  1486. @Override
  1487. public Page<MessageModel> adoptMessage(PublicInquiryItem item, String sourceApp) {
  1488. if (null != item.getVendUU() && null != item.getVendUserUU()) {
  1489. final String SMS_TYPE = "SM"; //发送信息
  1490. List<MessageModel> models = new ArrayList<MessageModel>();
  1491. String cmpCode = item.getCmpCode();
  1492. String cmp = cmpCode.length() > 10 ? cmpCode.substring(0, 10).concat("...") : cmpCode;
  1493. String content = item.getInquiry().getEnName() + "【已采纳】您关于'型号:'" + cmp + "的报价,期待与您的合作!";
  1494. MessageModel model = new MessageModel();
  1495. model.setType(INQUIRY_DECIDE_TYPE_MALL);
  1496. model.setProducerApp(sourceApp);
  1497. model.setConsumerType(CUST_TYPE);
  1498. model.setConsumerApp(CONSUMERAPP);
  1499. model.setContent(content);
  1500. model.setRemark(String.valueOf(item.getInquiry().getId()));
  1501. model.setSourceId(item.getId());
  1502. model.setReceiverEnuu(item.getVendUU());
  1503. model.setReceiverUu(item.getVendUserUU());
  1504. model.setSenderEnuu(item.getInquiry().getEnUU());
  1505. if (null != item.getUserUU() || null != item.getInquiry().getRecorderUU()) {
  1506. model.setSenderUu(item.getUserUU() != null ? item.getUserUU() : item.getInquiry().getRecorderUU());
  1507. } else {
  1508. Enterprise enterprise = enterpriseDao.findOne(item.getInquiry().getEnUU());
  1509. model.setSenderUu(null != enterprise ? enterprise.getAdminUU() : 0L);
  1510. }
  1511. model.setSmsType(SMS_TYPE);
  1512. models.add(model);
  1513. if (!CollectionUtils.isEmpty(models)) {
  1514. sendMessage(models);
  1515. }
  1516. }
  1517. return null;
  1518. }
  1519. @Override
  1520. public Page<MessageModel> ReceiveMessage(PublicInquiryItem item, String sourceApp) {
  1521. if (null != item.getVendUU() && null != item.getVendUserUU() && !StringUtils.isEmpty(item.getCmpCode())) {
  1522. final String SMS_TYPE = "SM"; //发送信息
  1523. List<MessageModel> models = new ArrayList<MessageModel>();
  1524. String cmpCode = item.getCmpCode();
  1525. String cmp = cmpCode.length() > 10 ? cmpCode.substring(0, 10).concat("...") : cmpCode;
  1526. String content = "您收到了" + item.getVendName() + "关于“型号:" + cmp + "“的报价,马上去看一看吧!";
  1527. MessageModel model = new MessageModel();
  1528. model.setType(INQUIRY_TYPE_MALL);
  1529. model.setProducerApp(sourceApp);
  1530. model.setConsumerType(CUST_TYPE);
  1531. model.setConsumerApp(CONSUMERAPP);
  1532. model.setContent(content);
  1533. model.setRemark(String.valueOf(item.getInquiry().getId()));
  1534. model.setSourceId(item.getId());
  1535. model.setReceiverEnuu(item.getInquiry().getEnUU());
  1536. model.setReceiverUu(item.getInquiry().getRecorderUU());
  1537. model.setSenderEnuu(item.getVendUU());
  1538. if (null != item.getUserUU() || null != item.getInquiry().getRecorderUU()) {
  1539. model.setSenderUu(item.getUserUU() != null ? item.getUserUU() : item.getInquiry().getRecorderUU());
  1540. } else {
  1541. Enterprise enterprise = enterpriseDao.findOne(item.getInquiry().getEnUU());
  1542. model.setSenderUu(null != enterprise ? enterprise.getAdminUU() : 0L);
  1543. }
  1544. model.setSmsType(SMS_TYPE);
  1545. models.add(model);
  1546. if (!CollectionUtils.isEmpty(models)) {
  1547. sendMessage(models);
  1548. }
  1549. }
  1550. return null;
  1551. }
  1552. @Override
  1553. public ModelMap getPurcInquiryItemCount() {
  1554. ModelMap result = null;
  1555. try {
  1556. result = new ModelMap();
  1557. Long count = inquiryItemInfoDao.count();
  1558. result.put("count", count);
  1559. } catch (Exception e) {
  1560. e.printStackTrace();
  1561. }
  1562. return result;
  1563. }
  1564. /**
  1565. * 查询某年某月的询价明细总数
  1566. *
  1567. * @param month
  1568. * @return
  1569. */
  1570. @Override
  1571. public ModelMap countByMonth(Integer year, Integer month) {
  1572. ModelMap result = null;
  1573. try {
  1574. result = new ModelMap();
  1575. Long count = inquiryItemInfoDao.countByMonth(year, month);
  1576. result.put("count", count);
  1577. result.put("success", "true");
  1578. } catch (Exception e) {
  1579. result.put("message", e.getMessage());
  1580. result.put("success", false);
  1581. e.printStackTrace();
  1582. }
  1583. return result;
  1584. }
  1585. /**
  1586. * 根据年份和月份字符串获取条数
  1587. *
  1588. * @param year 年份
  1589. * @param months 月份字符串 6,7,8
  1590. * @return map
  1591. */
  1592. @Override
  1593. public List<ModelMap> countByMonths(Integer year, String months) {
  1594. List<ModelMap> results = new ArrayList<>();
  1595. try {
  1596. String[] monthArray = months.split(",");
  1597. for (String month : monthArray) {
  1598. ModelMap result = new ModelMap();
  1599. Long count = inquiryItemInfoDao.countByMonth(year, Integer.valueOf(month));
  1600. result.put("count", count);
  1601. result.put("success", "true");
  1602. result.put("month", Integer.valueOf(month));
  1603. results.add(result);
  1604. }
  1605. } catch (Exception e) {
  1606. ModelMap result = new ModelMap();
  1607. result.put("message", e.getMessage());
  1608. result.put("success", false);
  1609. results.add(result);
  1610. e.printStackTrace();
  1611. }
  1612. return results;
  1613. }
  1614. /**
  1615. * 根据enUU获取
  1616. *
  1617. * @param enUU 报价企业UU
  1618. * @return
  1619. */
  1620. @Override
  1621. public List<PublicInquiryItem> findDecideNotUploadReply(Long enUU) {
  1622. String sql = "select id_id id, id_sourceid sourceId, id_agreed agreed, id_refusereason refusereason, id_status status from public$inquiryitems " +
  1623. "where id_venduu = " + enUU + " and id_decidedownstatus = " + Status.NOT_UPLOAD.value() + " limit 200";
  1624. return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(PublicInquiryItem.class));
  1625. }
  1626. /**
  1627. * 已被采纳或拒绝的报价单明细 上传买方UAS之后,回调
  1628. *
  1629. * @param ids 报价单明细ids
  1630. * @param enUU 报价企业UU
  1631. * @return
  1632. */
  1633. @Override
  1634. public ModelMap downloadDecideBack(List<Long> ids, Long enUU) {
  1635. List<PublicInquiryItem> items = publicInquiryItemDao.findAll(ids);
  1636. List<PublicInquiryItem> saveList = new ArrayList<>();
  1637. ModelMap map = new ModelMap();
  1638. for (PublicInquiryItem item : items) {
  1639. if (enUU.equals(item.getVendUU())) {
  1640. item.setDecideDownStatus((short) Status.DOWNLOADED.value());
  1641. saveList.add(item);
  1642. }
  1643. }
  1644. publicInquiryItemDao.save(saveList);
  1645. map.put("success", true);
  1646. return map;
  1647. }
  1648. @Override
  1649. public ModelMap getInquiryCountData(String startDate, String endDate) {
  1650. ModelMap result = new ModelMap();
  1651. if (StringUtils.isEmpty(startDate) && StringUtils.isEmpty(endDate)) {
  1652. throw new IllegalOperatorException("缺失参数");
  1653. }
  1654. // 查询询价数
  1655. Integer inquiryAmount = purcInquiryItemDao.countInquiryAmount(startDate, endDate);
  1656. result.put("inquiryAmount", inquiryAmount);
  1657. // 查询询价用户数
  1658. Integer inquiryUserAmount = purcInquiryItemDao.countInquiryUserAmount(startDate, endDate);
  1659. result.put("inquiryUserAmount", inquiryUserAmount);
  1660. // 查询报价用户
  1661. Integer offerAmount = publicInquiryItemDao.countOfferAmount(startDate, endDate);
  1662. result.put("offerAmount", offerAmount);
  1663. // 查询报价数
  1664. Integer offerEnAmount = publicInquiryItemDao.countOfferEnAmount(startDate, endDate);
  1665. result.put("offerEnAmount", offerEnAmount);
  1666. result.put("success", true);
  1667. return result;
  1668. }
  1669. }