/**
* 请参看tw物料编码规则.
*
* @return
*/
public String generateItemCode(Item item) {
StringBuffer itemCode = new StringBuffer();
String categoryCode = item.getCategoryCode();
String version = item.getVersionCode();
// 取得大类和中类编码
itemCode.append(categoryCode);
// 根据不同规则构造后面的编码
if (this.matchCodeRuleOne(categoryCode)) {
// 如果规格说明和版本号都相同,则抛出重复记录异常。
List items = itemDao.getItemsBySamePropertiesRule1(item);
if (!items.isEmpty())
throw new ApplicationException(
"errors.DuplicatedItemException",
new String[] { ((Item) (items.get(0))).getItemCode() });
// 取得流水号
itemCode.append(IDENTIFIER_OF_CODE_SPERATER
+ KeyGen.getInstance().getNextKey(categoryCode,
KeyGen.SEQUENCE_LENTH_OF_ITEM_CODE));
itemCode.append(IDENTIFIER_OF_CODE_SPERATER + version);
} else {
// 判断是否存在属性完全相同(除生产商外)的物料,如果存在, 则流水号采用现已
// 存在的物料的流水号; 生产商编码以物料编码生产商前的数字为键,取得下一流水值.
List samePropertiesItems = itemDao.getItemsBySameProperties(item);
String seqNum = null;
String tempManufactoryCode = null;
// update时,samePropertiesItems会找到被update对象
if (samePropertiesItems.isEmpty()) {
// 如果不存在属性完全相同(除生产商外)的物料, 则流水号以大类加中类的数字为键,取得下一流水号
seqNum = KeyGen.getInstance().getNextKey(categoryCode,
KeyGen.SEQUENCE_LENTH_OF_ITEM_CODE);
} else {// 如果存在属性完全相同(除生产商外)的物料
/* 流水号采用现已存在的物料的流水号 */
seqNum = ((Item) samePropertiesItems.get(0)).getItemCode()
.substring(4, 8);
for (Iterator it = samePropertiesItems.iterator(); it.hasNext();) {
Item tempItem = (Item) it.next();
if (tempItem.getManufactory().getId().equals(item.getManufactory().getId()))
throw new ApplicationException(
"errors.DuplicatedRecordException",
new String[] { tempItem.getItemCode() });
}
}
itemCode.append(IDENTIFIER_OF_CODE_SPERATER + seqNum);
tempManufactoryCode = KeyGen.getInstance().getNextKey(
itemCode.toString(),
KeyGen.SEQUENCE_LENTH_OF_MANUFACTORY_CODE);
itemCode.append(IDENTIFIER_OF_CODE_SPERATER + tempManufactoryCode);
}
// 有铅无铅
if (Item.HAS_LEAD_PB.equalsIgnoreCase(item.getHasLead()))
itemCode.append("*");
return itemCode.toString();
}
/**
* 判断是否满足编码规则1适用的对象: 成品,半成品,PCB
*
* @param categoryCodeL1
* @param categoryCodeL2
* @return
*/
private boolean matchCodeRuleOne(String categoryCode) {
String categoryCodeL1 = categoryCode.substring(0, 1);
String categoryCodeL2 = categoryCode.substring(1, 3);
if (CODE_ITEM_CATEGORY_L1_PRODUCT.equals(categoryCodeL1)
|| CODE_ITEM_CATEGORY_L1_SEMI_PRODUCT.equals(categoryCodeL1)
|| (CODE_ITEM_CATEGORY_L1_ELECTRONIC_COMPONENT
.equals(categoryCodeL1) && CODE_ITEM_PCB
.equals(categoryCodeL2)))
return true;
else
return false;
}