JSHERP实现了简单的进销存和应收应付功能,但是在使用中发现不同单据使用的流水号是一样的,现在改造成不同单据类型的流水号都从1开始,不再从同一个流水号池里取号。
改造表jsh_sequence
增加一列,用于承接不同的单据类型
alter table jsh_sequence add column seqtype varchar(20);
修改表的唯一主键
将唯一主键seq_name改成seq_name和seqtype
修改mapper
<update id="updateBuildOnlyNumber">
update jsh_sequence set current_val = current_val + 1 where seq_name = 'depot_number_seq' and seqtype=#{seqtype}
</update>
<select id="getBuildOnlyNumber" resultType="java.lang.Long">
select current_val from jsh_sequence where seq_name = 'depot_number_seq' and seqtype=#{seqtype}
</select>
<select id="checkSeqtype" resultType="java.lang.Integer">
select count(1) from jsh_sequence where seq_name='depot_number_seq' and seqtype=#{seqtype}
</select>
<insert id="createOnlyNumberBySeqtype" parameterType="java.lang.String">
insert into jsh_sequence (seq_name,min_value,max_value,current_val,increment_val,remark,seqtype)
values('depot_number_seq',1,999999999999999999,0,1,'单据编号sequence',#{seqtype})
</insert>
主要是增加了判断单据类型编号是否存在以及如果不存在创建新的单据流水号的功能
修改service
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
public String buildOnlyNumber(String seqtype)throws Exception{
Long buildOnlyNumber=null;
synchronized (this){
try{
//判断是否存在这个编号类型,如果不存在,需要先初始化一个
if(sequenceMapperEx.checkSeqtype(seqtype)==0)
{
//不存在先去创建
sequenceMapperEx.createOnlyNumberBySeqtype(seqtype);
}
//然后再更新
sequenceMapperEx.updateBuildOnlyNumber(seqtype); //编号+1
//再取号
buildOnlyNumber= sequenceMapperEx.getBuildOnlyNumber(BusinessConstants.DEPOT_NUMBER_SEQ,seqtype);
}catch(Exception e){
JshException.writeFail(logger, e);
}
}
if(buildOnlyNumber<BusinessConstants.SEQ_TO_STRING_MIN_LENGTH){
StringBuffer sb=new StringBuffer(buildOnlyNumber.toString());
int len=BusinessConstants.SEQ_TO_STRING_MIN_LENGTH.toString().length()-sb.length();
for(int i=0;i<len;i++){
sb.insert(0,BusinessConstants.SEQ_TO_STRING_LESS_INSERT);
}
return sb.toString();
}else{
return buildOnlyNumber.toString();
}
}
修改前端
在初始化单据的时候,将单据类型传过去
addInit(amountNum) {
this.$nextTick(() => {
this.form.setFieldsValue({'billTime':getNowFormatDateTime()})
});
let param ={
seqtype: amountNum
}
getAction('/sequence/buildNumber',param).then((res) => {
if (res && res.code === 200) {
this.form.setFieldsValue({'billNo':amountNum + res.data.defaultNumber})
}
})
},
这样就可以实现不同单据类型使用不同的流水号
问题
但是这样有个问题,如果点击的新增,但是没有保存单据,这个流水号就浪费了,有时间再考虑实现一个废号利用的功能