Subversion Repositories SmartDukaan

Rev

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