PublicInquiryServiceImpl.java 87 KB

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