Rev 5220 | Rev 5223 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
package in.shop2020.support.controllers;import in.shop2020.model.v1.catalog.InventoryService.Client;import in.shop2020.model.v1.catalog.InventoryServiceException;import in.shop2020.model.v1.catalog.Item;import in.shop2020.model.v1.catalog.ItemType;import in.shop2020.model.v1.catalog.VendorItemMapping;import in.shop2020.model.v1.catalog.Warehouse;import in.shop2020.support.models.BillingUpdate;import in.shop2020.support.models.InventoryUpdate;import in.shop2020.support.models.PLBDetails;import in.shop2020.support.models.Update;import in.shop2020.thrift.clients.CatalogClient;import in.shop2020.thrift.clients.TransactionClient;import in.shop2020.utils.ConfigClientKeys;import in.shop2020.utils.GmailUtils;import java.io.File;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.mail.MessagingException;import org.apache.struts2.rest.DefaultHttpHeaders;import org.apache.struts2.rest.HttpHeaders;import org.apache.thrift.TException;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.opensymphony.xwork2.ModelDriven;public class UpdatesController implements ModelDriven<InventoryUpdate>{/****/private static final String FIELD_DELIMITER = "~#~#~#";private static Logger logger = LoggerFactory.getLogger(UpdatesController.class);private InventoryUpdate inventoryUpdate = new InventoryUpdate();private String timestampAndItemIds;private int errorCode = 0;private String errorMessage;private boolean fullPlbSync = false;private String id;public UpdatesController(){}@Overridepublic InventoryUpdate getModel() {return this.inventoryUpdate;}public HttpHeaders show(){logger.info("Status requested for warehouse id: " + getId());CatalogClient catalogServiceClient;Client client;try {catalogServiceClient = new CatalogClient();client = catalogServiceClient.getClient();long warehouseId = Long.parseLong(getId());Warehouse warehouse = client.getWarehouse(warehouseId);timestampAndItemIds = warehouse.getVendorString();client = catalogServiceClient.getClient();List<String> itemKeys = client.getItemKeysToBeProcessed(warehouseId);if (fullPlbSync) {itemKeys = new ArrayList<String>();client = catalogServiceClient.getClient();List<Item> items = client.getAllItems(true);for (Item item : items) {if (ItemType.NON_SERIALIZED.equals(item.getType())) {continue;}client = catalogServiceClient.getClient();List<VendorItemMapping> mappings = client.getVendorItemMappings(item.getId());if (mappings != null) {for (VendorItemMapping mapping : mappings) {if (mapping.getVendorId() == 1) {itemKeys.add(mapping.getItemKey());break;}}}}}if (!itemKeys.isEmpty()) {for (String itemKey : itemKeys) {timestampAndItemIds += FIELD_DELIMITER + itemKey;}}} catch (Exception e) {logger.error("Error getting the warehouse or setting the timestamp", e);}return new DefaultHttpHeaders("lsuccess");}/*** Stores the inventory updates on the history and the production server.* @return*/public HttpHeaders create(){logger.info(inventoryUpdate.toString());try {//The snapshot client is used to update the inventory snapshot for production systems.CatalogClient snapshotCatalogServiceClient = new CatalogClient();Client snapshotClient = snapshotCatalogServiceClient.getClient();//The history client is used to update the inventory history on the processing system.CatalogClient historyCatalogServiceClient = new CatalogClient(ConfigClientKeys.inventory_history_service_server_host.toString(),ConfigClientKeys.inventory_history_service_server_port.toString());Client historyClient = historyCatalogServiceClient.getClient();//The snapshot client is used to update the inventory snapshot for production systems.TransactionClient transactionClient = new TransactionClient();in.shop2020.model.v1.order.TransactionService.Client tClient = transactionClient.getClient();Long warehouseId = Long.parseLong(inventoryUpdate.getwarehouseId());String timestamp = inventoryUpdate.getCurrentTimestamp();Map<String, Long> availability = new HashMap<String, Long>();List<Update> updates = inventoryUpdate.getUpdates();for(Update update: updates){String key = update.getKey();long quantity = (long) Double.parseDouble(update.getQuantity());if(availability.containsKey(key)){quantity = quantity + availability.get(key);}availability.put(key, quantity);}//Update the snapshot before the history since that is more important.snapshotClient.updateInventory(warehouseId, timestamp, availability);historyClient.updateInventoryHistory(warehouseId, timestamp, availability);List<BillingUpdate> billingUpdates = inventoryUpdate.getBillingUpdates();if(billingUpdates!=null){for(BillingUpdate billingUpdate: billingUpdates){tClient.addInvoiceNumber(Long.parseLong(billingUpdate.getOrderId()), billingUpdate.getInvoiceNumber(), billingUpdate.getColor());}}List<PLBDetails> plbDetails = inventoryUpdate.getPlbDetails();if (plbDetails != null) {Map<String, PLBDetails> currentInventory = new HashMap<String, PLBDetails>();for (PLBDetails plbDetail : plbDetails) {try {if (fullPlbSync) {currentInventory.put(plbDetail.getItemKey(), plbDetail);}else {snapshotClient.resetAvailability(plbDetail.getItemKey(), 1,plbDetail.getQuantity().longValue(), warehouseId);snapshotClient.markMissedInventoryUpdatesAsProcessed(plbDetail.getItemKey(), warehouseId);}} catch (Exception e) {logger.error("Could not reset availability of: " + plbDetail.getItemKey(), e);GmailUtils g = new GmailUtils();g.sendSSLMessage(new String[]{ "mandeep.dhir@shop2020.in" }, "Error resetting availability for " + plbDetail.getItemKey() + " in warehouseId: " + warehouseId + " to " + plbDetail.getQuantity(), "", "cnc.center@shop2020.in", "5hop2o2o", new ArrayList<File>());}}sendMailForPLBMismatches(warehouseId, currentInventory);}} catch (Exception e) {logger.error("Unable to update inventory", e);}return new DefaultHttpHeaders("psuccess");}private void sendMailForPLBMismatches(Long warehouseId, Map<String, PLBDetails> currentInventory)throws InventoryServiceException, TException, MessagingException {if (fullPlbSync) {Map<Item, PLBDetails> mismatches = new HashMap<Item, PLBDetails>();Client snapshotClient = new CatalogClient().getClient();List<Item> items = snapshotClient.getAllItems(true);for (Item item : items) {if (ItemType.NON_SERIALIZED.equals(item.getType())) {continue;}List<VendorItemMapping> mappings = snapshotClient.getVendorItemMappings(item.getId());if (mappings != null) {for (VendorItemMapping mapping : mappings) {if (mapping.getVendorId() == 1) {try {if (!item.getItemInventory().getAvailability().get(warehouseId).equals(currentInventory.get(mapping.getItemKey()).getQuantity().longValue())) {mismatches.put(item, currentInventory.get(mapping.getItemKey()));}} catch (Exception e) {mismatches.put(item, currentInventory.get(mapping.getItemKey()));}}}}}String subject = mismatches.size() + " mismatches with PLB sync for warehouse id: " + warehouseId;StringBuilder body = new StringBuilder("");for (Item item : mismatches.keySet()) {PLBDetails plbDetails = mismatches.get(item);if (plbDetails != null) {body.append(item.getId() + " " + plbDetails.getItemKey() + " " + item.getItemInventory().getAvailability().get(warehouseId) + " " + plbDetails.getQuantity().longValue() + "\n");}else {body.append(item.getId() + " " + item.getBrand() + "|" + item.getModelName() + "|" + item.getModelNumber() + "|" + item.getColor() + " " + item.getItemInventory().getAvailability().get(warehouseId) + " 0\n");}}logger.info(body.toString());GmailUtils g = new GmailUtils();g.sendSSLMessage(new String[]{ "mandeep.dhir@shop2020.in" }, subject, body.toString(), "cnc.center@shop2020.in", "5hop2o2o", new ArrayList<File>());}}public int getErrorCode() {return errorCode;}public String getErrorMessage() {return errorMessage;}public String getId(){return id;}public void setId(String id){this.id = id;}public InventoryUpdate getInventoryUpdate() {return inventoryUpdate;}public void setInventoryUpdate(InventoryUpdate inventoryUpdate) {this.inventoryUpdate = inventoryUpdate;}public void setTimestampAndItemIds(String timestampAndItemIds) {this.timestampAndItemIds = timestampAndItemIds;}public String getTimestampAndItemIds() {return timestampAndItemIds;}public boolean isFullPlbSync() {return fullPlbSync;}public void setFullPlbSync(boolean fullPlbSync) {this.fullPlbSync = fullPlbSync;}}