PublicInquiryServiceImpl.java 79 KB

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