package com.nanometer.smartlab.service; import com.nanometer.smartlab.dao.SysSequenceDao; import com.nanometer.smartlab.entity.SysSequence; import com.nanometer.smartlab.util.Constants; import com.nanometer.smartlab.util.Utils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.RandomUtils; import org.apache.log4j.Logger; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Date; /** * Created by johnny on 17/12/13. */ @Service("sysSequenceService") @Scope("singleton") public class SysSequenceServiceImpl implements SysSequenceService { private static Logger logger = Logger.getLogger(SysSequenceService.class); @Resource(name = "sysSequenceDao") SysSequenceDao sysSequenceDao; @Transactional(propagation = Propagation.REQUIRED) private synchronized int getNextVal(String seqId) { int result = -1; try { if (StringUtils.isNotBlank(seqId)) { SysSequence sequence = this.sysSequenceDao.getSysSequence(seqId); if (sequence == null) { sequence = new SysSequence(); sequence.setId(seqId); sequence.setName(seqId); sequence.setMinVal(0); sequence.setMaxVal(99999); sequence.setStep(1); sequence.setCurrentVal(0); this.sysSequenceDao.insertSysSequence(sequence); } int currentVal = sequence.getCurrentVal() + sequence.getStep(); if (currentVal > sequence.getMaxVal()) { currentVal = sequence.getMinVal(); } sequence.setCurrentVal(currentVal); result = currentVal; this.sysSequenceDao.updateSysSequence(sequence); } } catch (Exception e) { logger.error(e.getMessage(), e); result = -1; } return result; } @Transactional(propagation = Propagation.REQUIRED) public String getApplyCode() { StringBuffer result = new StringBuffer(""); result.append("SG"); result.append(Utils.formatDateToString(new Date(), "yyyyMMdd")); int seq = this.getNextVal(Constants.SEQ_APPLY_CODE); String seqStr = ""; if (seq == -1) { seqStr = String.valueOf(RandomUtils.nextInt(5)); } else { seqStr = String.valueOf(seq); if (seqStr.length() < 5) { seqStr = String.format("%05d", seq); } } result.append(seqStr); return result.toString(); } @Transactional(propagation = Propagation.REQUIRED) public String getOrderCode() { StringBuffer result = new StringBuffer(""); result.append("OD"); result.append(Utils.formatDateToString(new Date(), "yyyyMMdd")); int seq = this.getNextVal(Constants.SEQ_ORDER_CODE); String seqStr = ""; if (seq == -1) { seqStr = String.valueOf(RandomUtils.nextInt(5)); } else { seqStr = String.valueOf(seq); if (seqStr.length() < 5) { seqStr = String.format("%05d", seq); } } result.append(seqStr); return result.toString(); } }