package com.jsh.erp.service.serialNumber; import com.alibaba.fastjson.JSONObject; import com.jsh.erp.constants.BusinessConstants; import com.jsh.erp.constants.ExceptionConstants; import com.jsh.erp.datasource.entities.*; import com.jsh.erp.datasource.mappers.*; import com.jsh.erp.exception.BusinessRunTimeException; import com.jsh.erp.exception.JshException; import com.jsh.erp.service.log.LogService; import com.jsh.erp.service.material.MaterialService; import com.jsh.erp.service.user.UserService; import com.jsh.erp.utils.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; @Service public class SerialNumberService { private Logger logger = LoggerFactory.getLogger(SerialNumberService.class); @Resource private SerialNumberMapper serialNumberMapper; @Resource private SerialNumberMapperEx serialNumberMapperEx; @Resource private MaterialMapperEx materialMapperEx; @Resource private MaterialService materialService; @Resource private UserService userService; @Resource private LogService logService; public SerialNumber getSerialNumber(long id)throws Exception { SerialNumber result=null; try{ result=serialNumberMapper.selectByPrimaryKey(id); }catch(Exception e){ JshException.readFail(logger, e); } return result; } public List getSerialNumberListByIds(String ids)throws Exception { List idList = StringUtil.strToLongList(ids); List list = new ArrayList<>(); try{ SerialNumberExample example = new SerialNumberExample(); example.createCriteria().andIdIn(idList); list = serialNumberMapper.selectByExample(example); }catch(Exception e){ JshException.readFail(logger, e); } return list; } public List getSerialNumber()throws Exception { SerialNumberExample example = new SerialNumberExample(); List list=null; try{ list=serialNumberMapper.selectByExample(example); }catch(Exception e){ JshException.readFail(logger, e); } return list; } public List select(String serialNumber, String materialName, Integer offset, Integer rows)throws Exception { return null; } public Long countSerialNumber(String serialNumber,String materialName)throws Exception { return null; } @Transactional(value = "transactionManager", rollbackFor = Exception.class) public int insertSerialNumber(JSONObject obj, HttpServletRequest request)throws Exception { int result=0; try{ SerialNumberEx serialNumberEx = JSONObject.parseObject(obj.toJSONString(), SerialNumberEx.class); /**处理商品id*/ serialNumberEx.setMaterialId(getSerialNumberMaterialIdByBarCode(serialNumberEx.getMaterialCode())); //删除标记,默认未删除 serialNumberEx.setDeleteFlag(BusinessConstants.DELETE_FLAG_EXISTS); //已卖出,默认未否 serialNumberEx.setIsSell(BusinessConstants.IS_SELL_HOLD); Date date=new Date(); serialNumberEx.setCreateTime(date); serialNumberEx.setUpdateTime(date); User userInfo=userService.getCurrentUser(); serialNumberEx.setCreator(userInfo==null?null:userInfo.getId()); serialNumberEx.setUpdater(userInfo==null?null:userInfo.getId()); result = serialNumberMapperEx.addSerialNumber(serialNumberEx); logService.insertLog("序列号",BusinessConstants.LOG_OPERATION_TYPE_ADD, ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); }catch(Exception e){ JshException.writeFail(logger, e); } return result; } @Transactional(value = "transactionManager", rollbackFor = Exception.class) public int updateSerialNumber(JSONObject obj, HttpServletRequest request) throws Exception{ SerialNumberEx serialNumberEx = JSONObject.parseObject(obj.toJSONString(), SerialNumberEx.class); int result=0; try{ serialNumberEx.setMaterialId(getSerialNumberMaterialIdByBarCode(serialNumberEx.getMaterialCode())); Date date=new Date(); serialNumberEx.setUpdateTime(date); User userInfo=userService.getCurrentUser(); serialNumberEx.setUpdater(userInfo==null?null:userInfo.getId()); result = serialNumberMapperEx.updateSerialNumber(serialNumberEx); logService.insertLog("序列号", new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(serialNumberEx.getId()).toString(), ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); }catch(Exception e){ JshException.writeFail(logger, e); } return result; } @Transactional(value = "transactionManager", rollbackFor = Exception.class) public int deleteSerialNumber(Long id, HttpServletRequest request)throws Exception { return batchDeleteSerialNumberByIds(id.toString()); } @Transactional(value = "transactionManager", rollbackFor = Exception.class) public int batchDeleteSerialNumber(String ids, HttpServletRequest request)throws Exception { return batchDeleteSerialNumberByIds(ids); } /** * 逻辑删除序列号信息 * create time: 2019/3/27 17:43 * @Param: ids * @return */ @Transactional(value = "transactionManager", rollbackFor = Exception.class) public int batchDeleteSerialNumberByIds(String ids) throws Exception{ StringBuffer sb = new StringBuffer(); sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE); List list = getSerialNumberListByIds(ids); for(SerialNumber serialNumber: list){ sb.append("[").append(serialNumber.getSerialNumber()).append("]"); } logService.insertLog("序列号", sb.toString(), ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); User userInfo=userService.getCurrentUser(); String [] idArray=ids.split(","); int result=0; try{ result = serialNumberMapperEx.batchDeleteSerialNumberByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray); }catch(Exception e){ JshException.writeFail(logger, e); } return result; } public int checkIsNameExist(Long id, String serialNumber)throws Exception { SerialNumberExample example = new SerialNumberExample(); example.createCriteria().andIdNotEqualTo(id).andSerialNumberEqualTo(serialNumber).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED); List list=null; try{ list=serialNumberMapper.selectByExample(example); }catch(Exception e){ JshException.readFail(logger, e); } return list==null?0:list.size(); } /** * 根据商品名称判断商品名称是否有效 * @Param: materialName * @return Long 满足使用条件的商品的id */ public Long checkMaterialName(String materialName)throws Exception{ if(StringUtil.isNotEmpty(materialName)) { List mlist=null; try{ mlist = materialMapperEx.findByMaterialName(materialName); }catch(Exception e){ JshException.readFail(logger, e); } if (mlist == null || mlist.size() < 1) { //商品名称不存在 throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NOT_EXISTS_CODE, ExceptionConstants.MATERIAL_NOT_EXISTS_MSG); } if (mlist.size() > 1) { //商品信息不唯一 throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NOT_ONLY_CODE, ExceptionConstants.MATERIAL_NOT_ONLY_MSG); } //获得唯一商品 if (BusinessConstants.ENABLE_SERIAL_NUMBER_NOT_ENABLED.equals(mlist.get(0).getEnableSerialNumber())) { //商品未开启序列号 throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NOT_ENABLE_SERIAL_NUMBER_CODE, ExceptionConstants.MATERIAL_NOT_ENABLE_SERIAL_NUMBER_MSG); } return mlist.get(0).getId(); } return null; } /** * 根据商品名称判断给商品添加序列号是否可行 * 1、根据商品名称必须查询到唯一的商品 * 2、该商品必须已经启用序列号 * 3、该商品已绑定序列号数量小于商品现有库存 * 用商品的库存去限制序列号的添加有点不合乎道理,去掉此限制 * @return Long 满足使用条件的商品的id */ public Long getSerialNumberMaterialIdByBarCode(String materialCode)throws Exception{ if(StringUtil.isNotEmpty(materialCode)){ //计算商品库存和目前占用的可用序列号数量关系 //库存=入库-出库 //入库数量 Long materialId = 0L; List list = materialService.getMaterialByBarCode(materialCode); if(list!=null && list.size()>0) { materialId = list.get(0).getId(); } return materialId; } return null; } /** * 出库时判断序列号库存是否足够, * 同时将对应的序列号绑定单据 */ public void checkAndUpdateSerialNumber(DepotItem depotItem, String outBillNo,User userInfo, String snList) throws Exception{ if(depotItem!=null){ sellSerialNumber(depotItem.getMaterialId(), outBillNo, snList,userInfo); } } /** * 出售序列号 */ @Transactional(value = "transactionManager", rollbackFor = Exception.class) public void sellSerialNumber(Long materialId, String outBillNo, String snList, User user) throws Exception{ //将中文的逗号批量替换为英文逗号 snList = snList.replaceAll(",",","); String [] snArray=snList.split(","); for (String sn : snArray) { int isNotSellCount = serialNumberMapperEx.getIsNotSellCountByParam(materialId, sn); if (isNotSellCount == 0) { //如果序列号不存在或者已售出则进行提示,不再进行后续的出售操作 throw new BusinessRunTimeException(ExceptionConstants.SERIAL_NUMBERE_NOT_EXISTS_CODE, String.format(ExceptionConstants.SERIAL_NUMBERE_NOT_EXISTS_MSG, sn)); } } serialNumberMapperEx.sellSerialNumber(materialId, outBillNo, snArray, new Date(), user == null ? null : user.getId()); } /** * 赎回序列号 * @Param: materialId * @Param: depotheadId * @Param: isSell 赎回'0' * @Param: Count 卖出或者赎回的数量 */ @Transactional(value = "transactionManager", rollbackFor = Exception.class) public int cancelSerialNumber(Long materialId, String outBillNo,int count,User user) throws Exception{ int result=0; try{ result = serialNumberMapperEx.cancelSerialNumber(materialId,outBillNo,count,new Date(),user==null?null:user.getId()); }catch(Exception e){ JshException.writeFail(logger, e); } return result; } /** * 批量添加序列号,最多500个 */ @Transactional(value = "transactionManager", rollbackFor = Exception.class) public int batAddSerialNumber(String materialCode, String serialNumberPrefix, Integer batAddTotal, String remark)throws Exception { int result=0; try { if (StringUtil.isNotEmpty(materialCode)) { //查询商品id Long materialId = getSerialNumberMaterialIdByBarCode(materialCode); List list = null; //当前用户 User userInfo = userService.getCurrentUser(); Long userId = userInfo == null ? null : userInfo.getId(); Date date = null; Long million = null; synchronized (this) { date = new Date(); million = date.getTime(); } int insertNum = 0; StringBuffer prefixBuf = new StringBuffer(serialNumberPrefix).append(million); list = new ArrayList(); int forNum = BusinessConstants.BATCH_INSERT_MAX_NUMBER >= batAddTotal ? batAddTotal : BusinessConstants.BATCH_INSERT_MAX_NUMBER; for (int i = 0; i < forNum; i++) { insertNum++; SerialNumberEx each = new SerialNumberEx(); each.setMaterialId(materialId); each.setCreator(userId); each.setCreateTime(date); each.setUpdater(userId); each.setUpdateTime(date); each.setRemark(remark); each.setSerialNumber(new StringBuffer(prefixBuf.toString()).append(insertNum).toString()); list.add(each); } result = serialNumberMapperEx.batAddSerialNumber(list); logService.insertLog("序列号", new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_BATCH_ADD).append(batAddTotal).append(BusinessConstants.LOG_DATA_UNIT).toString(), ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); } } catch (Exception e) { JshException.writeFail(logger, e); } return result; } public List getEnableSerialNumberList(String number, String name, Long depotId, String barCode, Integer offset, Integer rows)throws Exception { List list =null; try{ list = serialNumberMapperEx.getEnableSerialNumberList(StringUtil.toNull(number), StringUtil.toNull(name), depotId, barCode, offset, rows); }catch(Exception e){ JshException.readFail(logger, e); } return list; } public Long getEnableSerialNumberCount(String number, String name, Long depotId, String barCode)throws Exception { Long count = 0L; try{ count = serialNumberMapperEx.getEnableSerialNumberCount(StringUtil.toNull(number), StringUtil.toNull(name), depotId, barCode); }catch(Exception e){ JshException.readFail(logger, e); } return count; } public void addSerialNumberByBill(String type, String subType, String inBillNo, Long materialId, Long depotId, BigDecimal inPrice, String snList) throws Exception { //录入序列号的时候不能和库里面的重复-入库 if ((BusinessConstants.SUB_TYPE_PURCHASE.equals(subType) || BusinessConstants.SUB_TYPE_OTHER.equals(subType) || BusinessConstants.SUB_TYPE_SALES_RETURN.equals(subType)|| BusinessConstants.SUB_TYPE_RETAIL_RETURN.equals(subType)) && BusinessConstants.DEPOTHEAD_TYPE_IN.equals(type)) { //将中文的逗号批量替换为英文逗号 snList = snList.replaceAll(",", ","); List snArr = StringUtil.strToStringList(snList); for (String sn : snArr) { List list = new ArrayList<>(); SerialNumberExample example = new SerialNumberExample(); example.createCriteria().andMaterialIdEqualTo(materialId).andSerialNumberEqualTo(sn.trim()).andIsSellEqualTo("0") .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED); list = serialNumberMapper.selectByExample(example); //判断如果不存在重复序列号就新增 if (list == null || list.size() == 0) { SerialNumber serialNumber = new SerialNumber(); serialNumber.setMaterialId(materialId); serialNumber.setDepotId(depotId); serialNumber.setSerialNumber(sn); serialNumber.setInPrice(inPrice); Date date = new Date(); serialNumber.setCreateTime(date); serialNumber.setUpdateTime(date); User userInfo = userService.getCurrentUser(); serialNumber.setCreator(userInfo == null ? null : userInfo.getId()); serialNumber.setUpdater(userInfo == null ? null : userInfo.getId()); serialNumber.setInBillNo(inBillNo); serialNumberMapper.insertSelective(serialNumber); } else { if(!inBillNo.equals(list.get(0).getInBillNo())) { throw new BusinessRunTimeException(ExceptionConstants.SERIAL_NUMBERE_ALREADY_EXISTS_CODE, String.format(ExceptionConstants.SERIAL_NUMBERE_ALREADY_EXISTS_MSG, sn)); } } } } } /** * 直接删除序列号 * @param example */ public void deleteByExample(SerialNumberExample example) { serialNumberMapper.deleteByExample(example); } }