package com.vetti.system.service.impl;

import java.util.List;

import cn.hutool.core.collection.CollectionUtil;
import com.vetti.common.core.service.BaseServiceImpl;
import com.vetti.common.enums.FillTypeEnum;
import com.vetti.common.utils.DateUtils;
import com.vetti.common.utils.bean.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.vetti.system.mapper.SysSerialNumberInfoMapper;
import com.vetti.system.domain.SysSerialNumberInfo;
import com.vetti.system.service.ISysSerialNumberInfoService;

/**
 * 系统流水号Service业务层处理
 * 
 * @author wangxiangshun
 * @date 2025-09-10
 */
@SuppressWarnings("all")
@Service
public class SysSerialNumberInfoServiceImpl extends BaseServiceImpl implements ISysSerialNumberInfoService
{
    @Autowired
    private SysSerialNumberInfoMapper sysSerialNumberInfoMapper;

    /**
     * 查询系统流水号
     * 
     * @param id 系统流水号主键
     * @return 系统流水号
     */
    @Transactional(readOnly = true)
    @Override
    public SysSerialNumberInfo selectSysSerialNumberInfoById(Long id)
    {
        return sysSerialNumberInfoMapper.selectSysSerialNumberInfoById(id);
    }

    /**
     * 查询系统流水号列表
     * 
     * @param sysSerialNumberInfo 系统流水号
     * @return 系统流水号
     */
    @Transactional(readOnly = true)
    @Override
    public List<SysSerialNumberInfo> selectSysSerialNumberInfoList(SysSerialNumberInfo sysSerialNumberInfo)
    {
        return sysSerialNumberInfoMapper.selectSysSerialNumberInfoList(sysSerialNumberInfo);
    }

    /**
     * 新增系统流水号
     * 
     * @param sysSerialNumberInfo 系统流水号
     * @return 结果
     */
    @Transactional(rollbackFor=Exception.class)
    @Override
    public int insertSysSerialNumberInfo(SysSerialNumberInfo sysSerialNumberInfo)
    {
        sysSerialNumberInfo.setCreateTime(DateUtils.getNowDate());
        return sysSerialNumberInfoMapper.insertSysSerialNumberInfo(sysSerialNumberInfo);
    }

    /**
     * 修改系统流水号
     * 
     * @param sysSerialNumberInfo 系统流水号
     * @return 结果
     */
    @Transactional(rollbackFor=Exception.class)
    @Override
    public int updateSysSerialNumberInfo(SysSerialNumberInfo sysSerialNumberInfo)
    {
        sysSerialNumberInfo.setUpdateTime(DateUtils.getNowDate());
        return sysSerialNumberInfoMapper.updateSysSerialNumberInfo(sysSerialNumberInfo);
    }

    /**
     * 批量删除系统流水号
     * 
     * @param ids 需要删除的系统流水号主键
     * @return 结果
     */
    @Transactional(rollbackFor=Exception.class)
    @Override
    public int deleteSysSerialNumberInfoByIds(Long[] ids)
    {
        return sysSerialNumberInfoMapper.deleteSysSerialNumberInfoByIds(ids);
    }

    /**
     * 删除系统流水号信息
     * 
     * @param id 系统流水号主键
     * @return 结果
     */
    @Transactional(rollbackFor=Exception.class)
    @Override
    public int deleteSysSerialNumberInfoById(Long id)
    {
        return sysSerialNumberInfoMapper.deleteSysSerialNumberInfoById(id);
    }
    /**
     * 批量新增系统流水号
     *
     * @param sysSerialNumberInfoList 系统流水号列表
     * @return 结果
     */
    @Transactional(rollbackFor=Exception.class)
    @Override
    public int batchInsertSysSerialNumberInfo(List<SysSerialNumberInfo> sysSerialNumberInfoList){
        return sysSerialNumberInfoMapper.batchInsertSysSerialNumberInfo(sysSerialNumberInfoList);
    }

    /**
     * 生成业务编号
     * @param codePrefix 业务编号前缀
     * @param businessType 业务类型
     * @param number 几位流水
     * @return
     */
    @Override
    public String generateSerialNumber(String codePrefix, String businessType, String number) {

        String code = "";
        Integer serialNumber = 1;
        SysSerialNumberInfo sysSerialNumberInfo = new SysSerialNumberInfo();
        sysSerialNumberInfo.setCodePrefix(codePrefix);
        sysSerialNumberInfo.setBusinessType(businessType);
        List<SysSerialNumberInfo> sysSerialNumberInfoList = selectSysSerialNumberInfoList(sysSerialNumberInfo);
        SysSerialNumberInfo xtSerialNumberInfoQueryVo = null;
        if(CollectionUtil.isNotEmpty(sysSerialNumberInfoList)){
            xtSerialNumberInfoQueryVo = sysSerialNumberInfoList.get(0);
        }
        if (xtSerialNumberInfoQueryVo != null) {
            if ("0".equals(xtSerialNumberInfoQueryVo.getLockFlag())) {
                SysSerialNumberInfo serialNumberInfo = new SysSerialNumberInfo();
                BeanUtils.copyProperties(xtSerialNumberInfoQueryVo, serialNumberInfo);
                serialNumberInfo.setLockFlag("1");
                // 进行上锁
                updateSysSerialNumberInfo(serialNumberInfo);
                // 取得流水号进行编号生成
                serialNumber = Integer.parseInt(serialNumberInfo.getSerialNumber()) + 1;
                String serialNumberStr = String.format("%0" + number + "d", serialNumber);
                // 释放锁，更新流水号-获取最新数据
                serialNumberInfo.setLockFlag("0");
                serialNumberInfo.setSerialNumber(serialNumberStr);
                // 进行释放
                updateSysSerialNumberInfo(serialNumberInfo);
                code = codePrefix + serialNumberStr;
            } else {// 上锁
                try {
                    Thread.sleep(500L);
                    generateSerialNumber(codePrefix, businessType, number);
                } catch (Exception e) {
                    throw new IllegalArgumentException("获取编号失败！");
                }
            }
        } else {
            SysSerialNumberInfo serialNumberInfo = new SysSerialNumberInfo();
            String serialNumberStr = String.format("%0" + number + "d", 1);
            serialNumberInfo.setLockFlag("0");
            serialNumberInfo.setSerialNumber(serialNumberStr);
            serialNumberInfo.setCodePrefix(codePrefix);
            serialNumberInfo.setBusinessType(businessType);
            fill(FillTypeEnum.INSERT.getCode(), serialNumberInfo);
            insertSysSerialNumberInfo(serialNumberInfo);
            code = codePrefix + serialNumberStr;
        }
        return code;
    }
}
