SerialNumberService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. package com.jsh.erp.service;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.jsh.erp.constants.BusinessConstants;
  4. import com.jsh.erp.constants.ExceptionConstants;
  5. import com.jsh.erp.datasource.entities.*;
  6. import com.jsh.erp.datasource.mappers.*;
  7. import com.jsh.erp.exception.BusinessRunTimeException;
  8. import com.jsh.erp.exception.JshException;
  9. import com.jsh.erp.utils.StringUtil;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12. import org.springframework.stereotype.Service;
  13. import org.springframework.transaction.annotation.Transactional;
  14. import org.springframework.web.context.request.RequestContextHolder;
  15. import org.springframework.web.context.request.ServletRequestAttributes;
  16. import javax.annotation.Resource;
  17. import javax.servlet.http.HttpServletRequest;
  18. import java.math.BigDecimal;
  19. import java.util.ArrayList;
  20. import java.util.Date;
  21. import java.util.List;
  22. @Service
  23. public class SerialNumberService {
  24. private Logger logger = LoggerFactory.getLogger(SerialNumberService.class);
  25. @Resource
  26. private SerialNumberMapper serialNumberMapper;
  27. @Resource
  28. private SerialNumberMapperEx serialNumberMapperEx;
  29. @Resource
  30. private MaterialMapperEx materialMapperEx;
  31. @Resource
  32. private MaterialService materialService;
  33. @Resource
  34. private UserService userService;
  35. @Resource
  36. private LogService logService;
  37. public SerialNumber getSerialNumber(long id)throws Exception {
  38. SerialNumber result=null;
  39. try{
  40. result=serialNumberMapper.selectByPrimaryKey(id);
  41. }catch(Exception e){
  42. JshException.readFail(logger, e);
  43. }
  44. return result;
  45. }
  46. public List<SerialNumber> getSerialNumberListByIds(String ids)throws Exception {
  47. List<Long> idList = StringUtil.strToLongList(ids);
  48. List<SerialNumber> list = new ArrayList<>();
  49. try{
  50. SerialNumberExample example = new SerialNumberExample();
  51. example.createCriteria().andIdIn(idList);
  52. list = serialNumberMapper.selectByExample(example);
  53. }catch(Exception e){
  54. JshException.readFail(logger, e);
  55. }
  56. return list;
  57. }
  58. public List<SerialNumber> getSerialNumber()throws Exception {
  59. SerialNumberExample example = new SerialNumberExample();
  60. List<SerialNumber> list=null;
  61. try{
  62. list=serialNumberMapper.selectByExample(example);
  63. }catch(Exception e){
  64. JshException.readFail(logger, e);
  65. }
  66. return list;
  67. }
  68. public List<SerialNumberEx> select(String serialNumber, String materialName, Integer offset, Integer rows)throws Exception {
  69. return null;
  70. }
  71. @Transactional(value = "transactionManager", rollbackFor = Exception.class)
  72. public int insertSerialNumber(JSONObject obj, HttpServletRequest request)throws Exception {
  73. return 0;
  74. }
  75. @Transactional(value = "transactionManager", rollbackFor = Exception.class)
  76. public int updateSerialNumber(JSONObject obj, HttpServletRequest request) throws Exception{
  77. return 0;
  78. }
  79. @Transactional(value = "transactionManager", rollbackFor = Exception.class)
  80. public int deleteSerialNumber(Long id, HttpServletRequest request)throws Exception {
  81. return 0;
  82. }
  83. @Transactional(value = "transactionManager", rollbackFor = Exception.class)
  84. public int batchDeleteSerialNumber(String ids, HttpServletRequest request)throws Exception {
  85. return 0;
  86. }
  87. public int checkIsNameExist(Long id, String serialNumber)throws Exception {
  88. return 0;
  89. }
  90. /**
  91. * 根据商品名称判断给商品添加序列号是否可行
  92. * 1、根据商品名称必须查询到唯一的商品
  93. * 2、该商品必须已经启用序列号
  94. * 3、该商品已绑定序列号数量小于商品现有库存
  95. * 用商品的库存去限制序列号的添加有点不合乎道理,去掉此限制
  96. * @return Long 满足使用条件的商品的id
  97. */
  98. public Long getSerialNumberMaterialIdByBarCode(String materialCode)throws Exception{
  99. if(StringUtil.isNotEmpty(materialCode)){
  100. //计算商品库存和目前占用的可用序列号数量关系
  101. //库存=入库-出库
  102. //入库数量
  103. Long materialId = 0L;
  104. List<MaterialVo4Unit> list = materialService.getMaterialByBarCode(materialCode);
  105. if(list!=null && list.size()>0) {
  106. materialId = list.get(0).getId();
  107. }
  108. return materialId;
  109. }
  110. return null;
  111. }
  112. /**
  113. * 出库时判断序列号库存是否足够,
  114. * 同时将对应的序列号绑定单据
  115. */
  116. public void checkAndUpdateSerialNumber(DepotItem depotItem, String outBillNo,User userInfo, String snList) throws Exception{
  117. if(depotItem!=null){
  118. sellSerialNumber(depotItem.getMaterialId(), outBillNo, snList,userInfo);
  119. }
  120. }
  121. /**
  122. * 出售序列号
  123. */
  124. @Transactional(value = "transactionManager", rollbackFor = Exception.class)
  125. public void sellSerialNumber(Long materialId, String outBillNo, String snList, User user) throws Exception{
  126. //将中文的逗号批量替换为英文逗号
  127. snList = snList.replaceAll(",",",");
  128. String [] snArray=snList.split(",");
  129. for (String sn : snArray) {
  130. int isNotSellCount = serialNumberMapperEx.getIsNotSellCountByParam(materialId, sn);
  131. if (isNotSellCount == 0) {
  132. //如果序列号不存在或者已售出则进行提示,不再进行后续的出售操作
  133. throw new BusinessRunTimeException(ExceptionConstants.SERIAL_NUMBERE_NOT_EXISTS_CODE,
  134. String.format(ExceptionConstants.SERIAL_NUMBERE_NOT_EXISTS_MSG, sn));
  135. }
  136. }
  137. serialNumberMapperEx.sellSerialNumber(materialId, outBillNo, snArray, new Date(), user == null ? null : user.getId());
  138. }
  139. /**
  140. * 赎回序列号
  141. * @Param: materialId
  142. * @Param: depotheadId
  143. * @Param: isSell 赎回'0'
  144. * @Param: Count 卖出或者赎回的数量
  145. */
  146. @Transactional(value = "transactionManager", rollbackFor = Exception.class)
  147. public int cancelSerialNumber(Long materialId, String outBillNo,int count,User user) {
  148. int result=0;
  149. try{
  150. result = serialNumberMapperEx.cancelSerialNumber(materialId,outBillNo,count,new Date(),user==null?null:user.getId());
  151. }catch(Exception e){
  152. JshException.writeFail(logger, e);
  153. }
  154. return result;
  155. }
  156. /**
  157. * 批量添加序列号,最多500个
  158. */
  159. @Transactional(value = "transactionManager", rollbackFor = Exception.class)
  160. public int batAddSerialNumber(String materialCode, String serialNumberPrefix, Integer batAddTotal, String remark)throws Exception {
  161. int result=0;
  162. try {
  163. if (StringUtil.isNotEmpty(materialCode)) {
  164. //查询商品id
  165. Long materialId = getSerialNumberMaterialIdByBarCode(materialCode);
  166. List<SerialNumberEx> list = null;
  167. //当前用户
  168. User userInfo = userService.getCurrentUser();
  169. Long userId = userInfo == null ? null : userInfo.getId();
  170. Date date = null;
  171. Long million = null;
  172. synchronized (this) {
  173. date = new Date();
  174. million = date.getTime();
  175. }
  176. int insertNum = 0;
  177. StringBuffer prefixBuf = new StringBuffer(serialNumberPrefix).append(million);
  178. list = new ArrayList<SerialNumberEx>();
  179. int forNum = BusinessConstants.BATCH_INSERT_MAX_NUMBER >= batAddTotal ? batAddTotal : BusinessConstants.BATCH_INSERT_MAX_NUMBER;
  180. for (int i = 0; i < forNum; i++) {
  181. insertNum++;
  182. SerialNumberEx each = new SerialNumberEx();
  183. each.setMaterialId(materialId);
  184. each.setCreator(userId);
  185. each.setCreateTime(date);
  186. each.setUpdater(userId);
  187. each.setUpdateTime(date);
  188. each.setRemark(remark);
  189. each.setSerialNumber(new StringBuffer(prefixBuf.toString()).append(insertNum).toString());
  190. list.add(each);
  191. }
  192. result = serialNumberMapperEx.batAddSerialNumber(list);
  193. logService.insertLog("序列号",
  194. new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_BATCH_ADD).append(batAddTotal).append(BusinessConstants.LOG_DATA_UNIT).toString(),
  195. ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
  196. }
  197. } catch (Exception e) {
  198. JshException.writeFail(logger, e);
  199. }
  200. return result;
  201. }
  202. public List<SerialNumberEx> getEnableSerialNumberList(String number, String name, Long depotId, String barCode, Integer offset, Integer rows)throws Exception {
  203. List<SerialNumberEx> list =null;
  204. try{
  205. list = serialNumberMapperEx.getEnableSerialNumberList(StringUtil.toNull(number), StringUtil.toNull(name), depotId, barCode, offset, rows);
  206. }catch(Exception e){
  207. JshException.readFail(logger, e);
  208. }
  209. return list;
  210. }
  211. public Long getEnableSerialNumberCount(String number, String name, Long depotId, String barCode)throws Exception {
  212. Long count = 0L;
  213. try{
  214. count = serialNumberMapperEx.getEnableSerialNumberCount(StringUtil.toNull(number), StringUtil.toNull(name), depotId, barCode);
  215. }catch(Exception e){
  216. JshException.readFail(logger, e);
  217. }
  218. return count;
  219. }
  220. /**
  221. * 新增序列号
  222. */
  223. public void addSerialNumberByBill(String type, String subType, String inBillNo, Long materialId, Long depotId, BigDecimal inPrice, String snList) {
  224. //录入序列号的时候不能和库里面的重复-入库
  225. if ((BusinessConstants.SUB_TYPE_PURCHASE.equals(subType) ||
  226. BusinessConstants.SUB_TYPE_OTHER.equals(subType) ||
  227. BusinessConstants.SUB_TYPE_SALES_RETURN.equals(subType)||
  228. BusinessConstants.SUB_TYPE_RETAIL_RETURN.equals(subType)) &&
  229. BusinessConstants.DEPOTHEAD_TYPE_IN.equals(type)) {
  230. //将中文的逗号批量替换为英文逗号
  231. snList = snList.replaceAll(",", ",");
  232. List<String> snArr = StringUtil.strToStringList(snList);
  233. for (String sn : snArr) {
  234. List<SerialNumber> list = new ArrayList<>();
  235. SerialNumberExample example = new SerialNumberExample();
  236. example.createCriteria().andMaterialIdEqualTo(materialId).andSerialNumberEqualTo(sn.trim()).andIsSellEqualTo("0")
  237. .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
  238. list = serialNumberMapper.selectByExample(example);
  239. //判断如果不存在重复序列号就新增
  240. if (list == null || list.size() == 0) {
  241. SerialNumber serialNumber = new SerialNumber();
  242. serialNumber.setMaterialId(materialId);
  243. serialNumber.setDepotId(depotId);
  244. serialNumber.setSerialNumber(sn);
  245. serialNumber.setInPrice(inPrice);
  246. Date date = new Date();
  247. serialNumber.setCreateTime(date);
  248. serialNumber.setUpdateTime(date);
  249. User userInfo = userService.getCurrentUser();
  250. serialNumber.setCreator(userInfo == null ? null : userInfo.getId());
  251. serialNumber.setUpdater(userInfo == null ? null : userInfo.getId());
  252. serialNumber.setInBillNo(inBillNo);
  253. serialNumberMapper.insertSelective(serialNumber);
  254. } else {
  255. if(!inBillNo.equals(list.get(0).getInBillNo())) {
  256. throw new BusinessRunTimeException(ExceptionConstants.SERIAL_NUMBERE_ALREADY_EXISTS_CODE,
  257. String.format(ExceptionConstants.SERIAL_NUMBERE_ALREADY_EXISTS_MSG, sn));
  258. }
  259. }
  260. }
  261. }
  262. }
  263. /**
  264. * 直接删除序列号
  265. * @param example
  266. */
  267. public void deleteByExample(SerialNumberExample example) {
  268. serialNumberMapper.deleteByExample(example);
  269. }
  270. }