123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- package com.jsh.erp.service;
- 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.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<SerialNumber> getSerialNumberListByIds(String ids)throws Exception {
- List<Long> idList = StringUtil.strToLongList(ids);
- List<SerialNumber> 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<SerialNumber> getSerialNumber()throws Exception {
- SerialNumberExample example = new SerialNumberExample();
- List<SerialNumber> list=null;
- try{
- list=serialNumberMapper.selectByExample(example);
- }catch(Exception e){
- JshException.readFail(logger, e);
- }
- return list;
- }
- public List<SerialNumberEx> select(String serialNumber, String materialName, Integer offset, Integer rows)throws Exception {
- return null;
- }
- @Transactional(value = "transactionManager", rollbackFor = Exception.class)
- public int insertSerialNumber(JSONObject obj, HttpServletRequest request)throws Exception {
- return 0;
- }
- @Transactional(value = "transactionManager", rollbackFor = Exception.class)
- public int updateSerialNumber(JSONObject obj, HttpServletRequest request) throws Exception{
- return 0;
- }
- @Transactional(value = "transactionManager", rollbackFor = Exception.class)
- public int deleteSerialNumber(Long id, HttpServletRequest request)throws Exception {
- return 0;
- }
- @Transactional(value = "transactionManager", rollbackFor = Exception.class)
- public int batchDeleteSerialNumber(String ids, HttpServletRequest request)throws Exception {
- return 0;
- }
- public int checkIsNameExist(Long id, String serialNumber)throws Exception {
- return 0;
- }
- /**
- * 根据商品名称判断给商品添加序列号是否可行
- * 1、根据商品名称必须查询到唯一的商品
- * 2、该商品必须已经启用序列号
- * 3、该商品已绑定序列号数量小于商品现有库存
- * 用商品的库存去限制序列号的添加有点不合乎道理,去掉此限制
- * @return Long 满足使用条件的商品的id
- */
- public Long getSerialNumberMaterialIdByBarCode(String materialCode)throws Exception{
- if(StringUtil.isNotEmpty(materialCode)){
- //计算商品库存和目前占用的可用序列号数量关系
- //库存=入库-出库
- //入库数量
- Long materialId = 0L;
- List<MaterialVo4Unit> 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) {
- 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<SerialNumberEx> 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<SerialNumberEx>();
- 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<SerialNumberEx> getEnableSerialNumberList(String number, String name, Long depotId, String barCode, Integer offset, Integer rows)throws Exception {
- List<SerialNumberEx> 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) {
- //录入序列号的时候不能和库里面的重复-入库
- 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<String> snArr = StringUtil.strToStringList(snList);
- for (String sn : snArr) {
- List<SerialNumber> 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);
- }
- }
|