fix: Displaying manufacturer part no along with manufacturer and added Manufacturers validation in Item master (#19066)

Manufacturer Link field options in Items Table of transactions will also display manufacturer part no.
Manufacturers table in Item master will check for duplicate entries.
diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py
index 19ec053..19dea08 100644
--- a/erpnext/controllers/queries.py
+++ b/erpnext/controllers/queries.py
@@ -440,17 +440,17 @@
 
 @frappe.whitelist()
 def item_manufacturer_query(doctype, txt, searchfield, start, page_len, filters):
-	search_txt = "{0}%".format(txt)
+	item_filters = [
+		['manufacturer', 'like', '%' + txt + '%'],
+		['item_code', '=', filters.get("item_code")]
+	]
 
-	item_filters = {
-		'manufacturer': ('like', search_txt),
-		'item_code': filters.get("item_code")
-	}
-
-	return frappe.get_all("Item Manufacturer",
-		fields = "manufacturer",
-		filters = item_filters,
+	item_manufacturers = frappe.get_all(
+		"Item Manufacturer",
+		fields=["manufacturer", "manufacturer_part_no"],
+		filters=item_filters,
 		limit_start=start,
 		limit_page_length=page_len,
 		as_list=1
 	)
+	return item_manufacturers
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 518fe74..164c659 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -125,6 +125,7 @@
 		self.validate_auto_reorder_enabled_in_stock_settings()
 		self.cant_change()
 		self.update_show_in_website()
+		self.validate_manufacturer()
 
 		if not self.get("__islocal"):
 			self.old_item_group = frappe.db.get_value(self.doctype, self.name, "item_group")
@@ -144,6 +145,13 @@
 		if cint(frappe.db.get_single_value('Stock Settings', 'clean_description_html')):
 			self.description = clean_html(self.description)
 
+	def validate_manufacturer(self):
+		list_man = [(x.manufacturer, x.manufacturer_part_no) for x in self.get('manufacturers')]
+		set_man = set(list_man)
+
+		if len(list_man) != len(set_man):
+			frappe.throw(_("Duplicate entry in Manufacturers table"))
+
 	def validate_customer_provided_part(self):
 		if self.is_customer_provided_item:
 			if self.is_purchase_item:
@@ -921,7 +929,6 @@
 		msg = _("Item {0} is cancelled").format(item_code)
 		_msgprint(msg, verbose)
 
-
 def _msgprint(msg, verbose):
 	if verbose:
 		msgprint(msg, raise_exception=True)