Subversion Repositories SmartDukaan

Rev

Rev 34196 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
21285 kshitij.so 1
package com.spice.profitmandi.web.services;
2
 
3
 
4
import java.io.IOException;
21744 ashik.ali 5
 
21285 kshitij.so 6
import java.io.InputStream;
7
import java.net.URISyntaxException;
8
import java.net.URL;
33873 ranu 9
import java.time.LocalDate;
10
import java.util.*;
11
import java.util.stream.Collectors;
21285 kshitij.so 12
 
33873 ranu 13
import com.spice.profitmandi.common.enumuration.SchemeType;
14
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
15
import com.spice.profitmandi.common.model.ProfitMandiConstants;
16
import com.spice.profitmandi.common.web.client.RestClient;
17
import com.spice.profitmandi.dao.entity.catalog.ComboModel;
18
import com.spice.profitmandi.dao.entity.catalog.Item;
19
import com.spice.profitmandi.dao.entity.dtr.WebOffer;
20
import com.spice.profitmandi.dao.entity.inventory.SaholicCISTable;
21
import com.spice.profitmandi.dao.entity.inventory.SaholicPOItem;
22
import com.spice.profitmandi.dao.model.AmountModel;
23
import com.spice.profitmandi.dao.model.CreateOfferRequest;
24
import com.spice.profitmandi.dao.repository.catalog.ComboModelRepository;
25
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
26
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
27
import com.spice.profitmandi.dao.repository.dtr.WebOfferRepository;
28
import com.spice.profitmandi.dao.repository.inventory.SaholicCISTableRepository;
29
import com.spice.profitmandi.service.inventory.FofoAvailabilityInfo;
30
import com.spice.profitmandi.service.inventory.FofoCatalogResponse;
31
import com.spice.profitmandi.service.inventory.SaholicInventoryService;
32
import com.spice.profitmandi.service.pricecircular.PriceCircularItemModelNew;
33
import com.spice.profitmandi.service.pricecircular.PriceCircularModel;
34
import com.spice.profitmandi.service.pricecircular.PriceCircularService;
35
import com.spice.profitmandi.service.scheme.SchemeService;
21285 kshitij.so 36
import org.apache.commons.io.IOUtils;
33873 ranu 37
import org.apache.commons.lang3.StringUtils;
21285 kshitij.so 38
import org.apache.http.client.utils.URIBuilder;
33873 ranu 39
import org.apache.http.conn.HttpHostConnectException;
23568 govind 40
import org.apache.logging.log4j.Logger;
41
import org.apache.logging.log4j.LogManager;
33873 ranu 42
import org.json.JSONArray;
43
import org.json.JSONObject;
44
import org.springframework.beans.factory.annotation.Autowired;
21339 kshitij.so 45
import org.springframework.beans.factory.annotation.Value;
21287 kshitij.so 46
import org.springframework.stereotype.Component;
21285 kshitij.so 47
 
48
 
25387 amit.gupta 49
@Component("solrService")
21285 kshitij.so 50
public class SolrService{
51
 
23568 govind 52
	private static final Logger logger=LogManager.getLogger(SolrService.class);
21285 kshitij.so 53
 
21339 kshitij.so 54
	@Value("${solr.url}")
55
	private String SOLR_URL;
33873 ranu 56
 
57
	@Value("${new.solr.url}")
58
	private String solrUrl;
59
 
60
	@Autowired
61
	private FofoStoreRepository fofoStoreRepository;
62
 
63
	@Autowired
64
	private PriceCircularService priceCircularService;
65
 
66
	@Autowired
67
	private SaholicInventoryService saholicInventoryService;
68
 
69
	@Autowired
70
	private WebOfferRepository webOfferRepository;
71
 
72
	@Autowired
73
	private ComboModelRepository comboModelRepository;
74
 
75
	@Autowired
76
	private SchemeService schemeService;
77
 
78
	@Autowired
79
	private ItemRepository itemRepository;
80
 
81
	@Autowired
82
	private SaholicCISTableRepository saholicCISTableRepository;
83
 
37144 amit 84
	@Autowired
85
	private PartnerSolrClient partnerSolrClient;
86
 
21285 kshitij.so 87
	private static final String limit ="20";
88
	private static final String groupLimit = "10";
89
	private static final String autoSuggestField = "title,subCategoryId,category_id,category,subCategory,score";
90
	private static final String searchResultsField = "title,skuBundleId,id,thumbnail,ids";
91
	private static final String outputFormat = "json";
92
 
93
 
94
 
95
	public String getSuggestions(String search_text) throws URISyntaxException, IOException{
21517 kshitij.so 96
 
21285 kshitij.so 97
		URIBuilder autoSuggestUrl = new URIBuilder(SOLR_URL);
98
		autoSuggestUrl.addParameter("fl", autoSuggestField);                  //Fields to choose
99
		autoSuggestUrl.addParameter("wt", outputFormat); 					  //Output format
100
		autoSuggestUrl.addParameter("group", "true"); 				  //group data
101
		autoSuggestUrl.addParameter("group.query", "category_id:3");  //group by category
102
		autoSuggestUrl.addParameter("group.query", "category_id:5");  //group by category
103
		autoSuggestUrl.addParameter("group.field", "subCategoryId");  //group by subCategory
104
		autoSuggestUrl.addParameter("group.limit", groupLimit);
105
		autoSuggestUrl.addParameter("q", "suggest:("+search_text+")");
106
		URL url = autoSuggestUrl.build().toURL();
24995 amit.gupta 107
		logger.info("Auto Suggest Solr");
21285 kshitij.so 108
		InputStream is = url.openStream();
109
		String jsonString;
110
		try{
111
			jsonString = IOUtils.toString(is, "UTF-8");
112
		}
113
		finally{
114
			is.close();
115
		}
116
		return jsonString; 
117
	}
118
 
21287 kshitij.so 119
	public String getSearchResults(String search_text, int offset) throws URISyntaxException, IOException{
21517 kshitij.so 120
 
21285 kshitij.so 121
		URIBuilder generalSearchUrl = new URIBuilder(SOLR_URL);
122
		generalSearchUrl.addParameter("q", search_text);
123
		generalSearchUrl.addParameter("fl", searchResultsField);                  //Fields to choose
124
		generalSearchUrl.addParameter("wt", outputFormat); 					  //Output format
125
		generalSearchUrl.addParameter("rows", limit);             			  //limit
21288 kshitij.so 126
		generalSearchUrl.setParameter("start", String.valueOf(offset));
21285 kshitij.so 127
		URL url = generalSearchUrl.build().toURL();
128
		InputStream is = url.openStream();
129
		String jsonString;
130
		try{
131
			jsonString = IOUtils.toString(is, "UTF-8");
132
		}
133
		finally{
134
			is.close();
135
		}
136
		return jsonString; 
137
	}
138
 
33873 ranu 139
	public List<FofoCatalogResponse> dealResponse (Set<Integer> catalogIds, int fofoId) throws Exception {
140
		List<FofoCatalogResponse> dealResponse = new ArrayList<>();
141
		Map<String, String> params = new HashMap<>();
142
		List<String> mandatoryQ = new ArrayList<>();
143
		mandatoryQ.add(String.format("+catalogId_i:(%s) +{!parent which=\"id:catalog*\"}", StringUtils.join(catalogIds, " ")));
144
		params.put("start", "0");
145
		params.put("rows", "100");
146
		params.put("q", StringUtils.join(mandatoryQ, " "));
147
		params.put("fl", "*, [child parentFilter=id:catalog*]");
148
 
149
		params.put("wt", "json");
37144 amit 150
		JSONArray docs = partnerSolrClient.selectDocs(params, fofoId);
33873 ranu 151
		dealResponse = getCatalogResponse(docs, false, fofoId);
152
 
153
		return dealResponse;
154
 
155
	}
156
 
157
 
158
	private List<FofoCatalogResponse> getCatalogResponse(JSONArray docs, boolean hotDeal, int fofoId) throws
159
			Exception {
160
		List<FofoCatalogResponse> dealResponse = new ArrayList<>();
161
		List<Integer> tagIds = Arrays.asList(4);
162
		List<Integer> itemIds = new ArrayList<>();
163
		if (docs.length() > 0) {
164
			for (int i = 0; i < docs.length(); i++) {
165
				JSONObject doc = docs.getJSONObject(i);
166
				if (doc.has("_childDocuments_")) {
167
					for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
168
						JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
169
						int itemId = childItem.getInt("itemId_i");
170
						itemIds.add(itemId);
171
					}
172
				}
173
			}
174
			if (itemIds.size() == 0) {
175
				return dealResponse;
176
			}
177
		}
178
		// get warehouse Id
179
		int warehouseId = fofoStoreRepository.selectByRetailerId(fofoId).getWarehouseId();
180
		Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = saholicInventoryService.getSaholicPOItems().get(warehouseId);
181
		List<Integer> catalogIds = new ArrayList<>();
182
		for (int i = 0; i < docs.length(); i++) {
183
			Map<Integer, FofoAvailabilityInfo> fofoAvailabilityInfoMap = new HashMap<>();
184
			JSONObject doc = docs.getJSONObject(i);
185
			catalogIds.add(doc.getInt("catalogId_i"));
186
		}
187
		List<CreateOfferRequest> allSchemOffers = null;
188
		Map<Integer, PriceCircularItemModelNew> priceCircularItemModelMap = new HashMap<>();
189
		if (catalogIds.size() > 0) {
190
			PriceCircularModel priceCircularModel = priceCircularService.getPriceCircularByOffer(fofoId, catalogIds, LocalDate.now());
191
			allSchemOffers = priceCircularModel.getOffers();
192
 
193
			List<PriceCircularItemModelNew> priceCircularItemModelNews = priceCircularModel.getPriceCircularItemModelNews();
194
			if (priceCircularItemModelNews != null) {
195
				priceCircularItemModelMap = priceCircularItemModelNews.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> x));
196
			}
197
		}
198
 
199
        /*List<CatalogFavourite> catalogFavourites = catalogFavouriteRepository.selectBypartnerId(fofoId);
200
        List<Integer> catalogFavouriteIds = new ArrayList<>();
201
        if (!catalogFavourites.isEmpty()) {
202
            catalogFavouriteIds = catalogFavourites.stream().map(x -> x.getCatalogId()).collect(Collectors.toList());
203
        }
204
 
205
        if (!catalogFavourites.isEmpty()) {
206
            catalogFavourites.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> x));
207
        }*/
208
 
209
		for (int i = 0; i < docs.length(); i++) {
210
			Map<Integer, FofoAvailabilityInfo> fofoAvailabilityInfoMap = new HashMap<>();
211
			JSONObject doc = docs.getJSONObject(i);
212
			FofoCatalogResponse fofoCatalogResponse = new FofoCatalogResponse();
213
			fofoCatalogResponse.setCatalogId(doc.getInt("catalogId_i"));
214
			fofoCatalogResponse.setImageUrl(doc.getString("imageUrl_s"));
215
			fofoCatalogResponse.setTitle(doc.getString("title_s"));
216
 
217
            /*if (catalogFavouriteIds.contains(fofoCatalogResponse.getCatalogId())) {
218
                fofoCatalogResponse.setFavourite(true);
219
            }*/
220
 
221
			List<WebOffer> webOffers = webOfferRepository.selectAllActiveOffers().get(fofoCatalogResponse.getCatalogId());
222
 
223
			//logger.info("webOffers {}", webOffers);
224
			if (webOffers != null && webOffers.size() > 0) {
225
				fofoCatalogResponse.setWebOffers(webOffers);
226
				fofoCatalogResponse.setOffers(webOffers.stream().map(x -> x.getTitle()).collect(Collectors.toList()));
227
 
228
			}
229
 
230
			List<ComboModel> comboModels = comboModelRepository.selectByWarehouseId(warehouseId).stream().filter(x -> x.getCatalogId() == fofoCatalogResponse.getCatalogId()).collect(Collectors.toList());
231
 
232
			//logger.info("comboModels {}", comboModels);
233
 
234
			if (comboModels != null && comboModels.size() > 0) {
235
				fofoCatalogResponse.setComboModels(comboModels);
236
			}
237
 
238
			try {
239
				fofoCatalogResponse.setFeature(doc.getString("feature_s"));
240
			} catch (Exception e) {
241
				fofoCatalogResponse.setFeature(null);
242
				logger.info("Could not find Feature_s for {}", fofoCatalogResponse.getCatalogId());
243
			}
244
 
245
			fofoCatalogResponse.setBrand(doc.getJSONArray("brand_ss").getString(0));
246
			logger.info("labelss {}", doc.has("label_ss"));
247
 
248
			if (doc.has("label_ss")) {
249
				logger.info("label {}", doc.getJSONArray("label_ss"));
250
 
251
				JSONArray arr = doc.getJSONArray("label_ss");
252
				Set<String> labels = new HashSet<String>();
253
				for (int j = 0; j < arr.length(); j++) {
254
					labels.add(arr.getString(j));
255
				}
256
 
257
				fofoCatalogResponse.setLabels(new ArrayList<>(labels));
258
 
259
			}
260
			if (doc.has("similarModels_ii")) {
261
				JSONArray similarModelsArray = doc.getJSONArray("similarModels_ii");
262
				List<Integer> similarCatalogIds = new ArrayList<>();
263
				for (int j = 0; j < similarModelsArray.length(); j++) {
264
					similarCatalogIds.add(similarModelsArray.getInt(j));
265
				}
266
				fofoCatalogResponse.setSimilarModelIds(similarCatalogIds);
267
			}
268
 
269
			if (doc.has("_childDocuments_")) {
270
				String modelColorClass = "grey";
271
				FofoAvailabilityInfo fdiAnyColour = null;
272
				// Iterating itemIds
273
				for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
274
					PriceCircularItemModelNew priceCircularItemModel = priceCircularItemModelMap.get(fofoCatalogResponse.getCatalogId());
275
					JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
276
					int itemId = childItem.getInt("itemId_i");
277
					float sellingPrice = (float) childItem.getDouble("sellingPrice_f");
278
					if (!fofoAvailabilityInfoMap.containsKey(itemId)) {
279
						FofoAvailabilityInfo fdi = new FofoAvailabilityInfo();
280
						List<SaholicCISTable> currentAvailability = saholicCISTableRepository.selectByItemWarehouse(itemId, warehouseId);
281
						List<SaholicPOItem> poItemAvailability = null;
282
						if (poItemAvailabilityMap != null) {
283
							poItemAvailability = poItemAvailabilityMap.get(itemId);
284
						}
285
 
286
						if (priceCircularItemModel != null) {
287
							fdi.setNlc((float) priceCircularItemModel.getNetNlc());
288
						}
289
 
290
						for (SaholicCISTable saholicCISTable : currentAvailability) {
291
							saholicCISTable.setWarehouseName(
292
									ProfitMandiConstants.WAREHOUSE_MAP.get(saholicCISTable.getWarehouseFrom()));
293
						}
294
 
295
						Map<Integer, SaholicCISTable> map = currentAvailability.stream().collect(Collectors.toMap(SaholicCISTable::getWarehouseFrom, x -> x));
296
						if (poItemAvailability != null) {
297
							for (SaholicPOItem saholicPOItem : poItemAvailability) {
298
								if (map.containsKey(saholicPOItem.getWarehouseFrom())) {
299
									map.get(saholicPOItem.getWarehouseFrom()).setPopendingQty(saholicPOItem.getUnfulfilledQty());
300
								} else {
301
									SaholicCISTable saholicCISTable = new SaholicCISTable();
302
									saholicCISTable.setAvailability(0);
303
									saholicCISTable.setReserved(0);
304
									saholicCISTable.setItemId(itemId);
305
									saholicCISTable.setWarehouseId(warehouseId);
306
									saholicCISTable.setPopendingQty(saholicPOItem.getUnfulfilledQty());
307
									saholicCISTable.setWarehouseFrom(saholicPOItem.getWarehouseFrom());
308
									saholicCISTable.setWarehouseName(
309
											ProfitMandiConstants.WAREHOUSE_MAP.get(saholicPOItem.getWarehouseFrom()));
310
									map.put(saholicPOItem.getWarehouseFrom(), saholicCISTable);
311
								}
312
							}
313
						}
314
						fdi.setSaholicCISTableList(new ArrayList<>(map.values()));
315
						String poColor = "grey";
316
						boolean active = false;
317
						if (currentAvailability != null && currentAvailability.stream().collect(Collectors.summingInt(SaholicCISTable::getNetAvailability)) > 0) {
318
							poColor = "green";
319
							modelColorClass = "green";
320
						} else if (poItemAvailability != null && poItemAvailability.stream().collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty)) > 0) {
321
							if (currentAvailability != null && poItemAvailability.stream().collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty)) + currentAvailability.stream().collect(Collectors.summingInt(SaholicCISTable::getNetAvailability)) <= 0) {
322
								poColor = "grey";
323
							} else {
324
								poColor = "yellow";
325
								if (modelColorClass != "green") {
326
									modelColorClass = poColor;
327
								}
328
							}
329
						}
330
						fdi.setColorClass(poColor);
331
						fdi.setSellingPrice(sellingPrice);
332
						fdi.setActive(active);
333
						fdi.setMrp(childItem.getDouble("mrp_f"));
334
						fdi.setMop((float) childItem.getDouble("mop_f"));
335
						fdi.setColor(childItem.has("color_s") ? childItem.getString("color_s") : "");
336
						if (fdi.getColor().equalsIgnoreCase("any colour")) {
337
							fdiAnyColour = fdi;
338
						}
339
						fdi.setTagId(childItem.getInt("tagId_i"));
340
						fdi.setItem_id(itemId);
34196 ranu 341
						fdi.setCatalog_id(doc.getInt("catalogId_i"));
33873 ranu 342
						Float cashBack = schemeService.getCatalogSchemeCashBack(fofoId, Arrays.asList(fofoCatalogResponse.getCatalogId())).get(fofoCatalogResponse.getCatalogId());
343
						cashBack = cashBack == null ? 0 : cashBack;
344
						fdi.setCashback(cashBack);
345
						fdi.setMinBuyQuantity(1);
346
						if (hotDeal) {
347
							if (currentAvailability != null) {
348
								fdi.setAvailability(currentAvailability.stream().collect(Collectors.summingInt(SaholicCISTable::getNetAvailability)));
349
							} else {
350
								fdi.setAvailability(0);
351
							}
352
						} else {
353
							// Lets consider that its out of stock
354
							fdi.setAvailability(400);
355
							Item item = null;
356
							try {
357
								item = itemRepository.selectById(itemId);
358
							} catch (Exception e) {
359
								e.printStackTrace();
360
								continue;
361
							}
362
							// In case its tampered glass moq should be
363
							if (item.getCategoryId() == 10020) {
364
								fdi.setMinBuyQuantity(5);
365
							}
366
						}
367
						fdi.setQuantityStep(1);
368
						fdi.setMaxQuantity(Math.min(fdi.getAvailability(), 400));
369
						fofoAvailabilityInfoMap.put(itemId, fdi);
370
					}
371
				}
372
				if (fdiAnyColour != null) {
373
					fdiAnyColour.setColorClass(modelColorClass);
374
				}
375
				fofoCatalogResponse.setInStock(!modelColorClass.equals("grey"));
376
			}
377
			if (fofoAvailabilityInfoMap.values().size() > 0) {
378
				List<FofoAvailabilityInfo> availabilityList = fofoAvailabilityInfoMap.values().stream().sorted(Comparator.comparing(FofoAvailabilityInfo::getAvailability).reversed()).collect(Collectors.toList());
379
				fofoCatalogResponse.setItems(availabilityList);
380
				if (priceCircularItemModelMap.containsKey(fofoCatalogResponse.getCatalogId())) {
381
					PriceCircularItemModelNew priceCircularItemModel = priceCircularItemModelMap.get(fofoCatalogResponse.getCatalogId());
382
					if (priceCircularItemModel.getSlabPayouts() != null) {
383
						List<CreateOfferRequest> schemeOffers = new ArrayList<>();
384
						List<Map<Integer, AmountModel>> slabPayouts = priceCircularItemModel.getSlabPayouts();
385
						Iterator<Map<Integer, AmountModel>> iterator = slabPayouts.iterator();
386
						int iteratorCount = 0;
387
						while (iterator.hasNext()) {
388
							Map<Integer, AmountModel> slabPayoutMap = iterator.next();
389
							if (slabPayoutMap != null) {
390
								schemeOffers.add(allSchemOffers.get(iteratorCount));
391
							} else {
392
								iterator.remove();
393
							}
394
							iteratorCount++;
395
						}
396
						fofoCatalogResponse.setSchemeOffers(schemeOffers);
397
					}
398
					fofoCatalogResponse.setPriceCircularItemModel(priceCircularItemModel);
399
				}
400
				dealResponse.add(fofoCatalogResponse);
401
			}
402
		}
403
		return dealResponse;
404
 
405
	}
406
 
21285 kshitij.so 407
}