DeliveryServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. package com.tld.service.impl;
  2. import com.tld.mapper.AskGoodsMapper;
  3. import com.tld.mapper.DeliveryMapper;
  4. import com.tld.mapper.DictionaryMapper;
  5. import com.tld.mapper.WarehousingMapper;
  6. import com.tld.model.*;
  7. import com.tld.service.DeliveryService;
  8. import org.redisson.api.RLock;
  9. import org.redisson.api.RedissonClient;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.stereotype.Service;
  12. import javax.servlet.http.HttpServletRequest;
  13. import java.text.SimpleDateFormat;
  14. import java.util.*;
  15. @Service
  16. public class DeliveryServiceImpl implements DeliveryService {
  17. @Autowired
  18. private DeliveryMapper deliveryMapper;
  19. @Autowired
  20. private AskGoodsMapper askGoodsMapper;
  21. //redis锁
  22. @Autowired
  23. private RedissonClient redissonClient;
  24. //删除日志表
  25. @Autowired
  26. private DictionaryMapper dictionaryMapper;
  27. //入库
  28. @Autowired
  29. private WarehousingMapper warehousingMapper;
  30. @Override
  31. public Map<String, Object> getDelivery(Delivery delivery) {
  32. Map<String, Object> map = new HashMap<>();
  33. try{
  34. List<Delivery> list = deliveryMapper.getDelivery(delivery);
  35. Map<String, Object> mapVal = new HashMap<>();
  36. for(Delivery delivery1 : list){
  37. int sumScan = deliveryMapper.getScanSum(delivery1);
  38. mapVal.put(delivery1.getDeliveryId() + delivery1.getMaterialId(), sumScan);
  39. }
  40. map.put("data", list);
  41. map.put("scan", mapVal);
  42. map.put("msg", "200");
  43. }catch (Exception e) {
  44. map.put("msg", "500");
  45. map.put("errMsg", "服务器请求异常,请稍后再试");
  46. e.printStackTrace();
  47. }
  48. return map;
  49. }
  50. @Override
  51. public Map<String, Object> getRecommend(Delivery delivery) {
  52. Map<String, Object> map = new HashMap<>();
  53. try{
  54. MaterialClass materialClass = deliveryMapper.getMaterialClass(delivery.getMaterialId());
  55. if(materialClass == null){
  56. map.put("msg", "500");
  57. map.put("errMsg", "物料信息未录入,请联系管理员");
  58. return map;
  59. }
  60. if(materialClass.getPartType().equals("产成品")){
  61. //查询所有产成品库位
  62. String storageLocationCode = deliveryMapper.getStorageLocationCodeList();
  63. List<Inventory> list = new LinkedList<>();
  64. for(Inventory inventory : deliveryMapper.getInventory(storageLocationCode, delivery)){
  65. int occupy = deliveryMapper.getVitrual(inventory);
  66. if(occupy == 0){
  67. if(Double.doubleToLongBits(Double.parseDouble(inventory.getAmount())) == Double.doubleToLongBits(Double.parseDouble(delivery.getOutNum()))){
  68. for(Inventory inventorys : deliveryMapper.getInventory(storageLocationCode, delivery)){
  69. if (inventorys.getStorageLocationCode().equals(inventory.getStorageLocationCode())){
  70. list.add(inventorys);
  71. map.put("data", list);
  72. map.put("msg", "200");
  73. }
  74. }
  75. return map;
  76. }
  77. }
  78. }
  79. map.put("data", list);
  80. } else if(materialClass.getPartType().equals("半成品")){
  81. List<Inventory> list = new LinkedList<>();
  82. for(Inventory inventory : deliveryMapper.getInventory(delivery.getStorageLocationCode(), delivery)){
  83. int productNum = deliveryMapper.getProductNumVitrual(inventory);
  84. if(Integer.parseInt(inventory.getAmount()) < 0){
  85. map.put("msg", "500");
  86. map.put("errMsg", "库存不足");
  87. return map;
  88. } else {
  89. list.add(inventory);
  90. map.put("data", list);
  91. map.put("msg", "200");
  92. return map;
  93. }
  94. }
  95. } else {
  96. List<Inventory> list = new LinkedList<>();
  97. AskGoods askGoods = new AskGoods()
  98. .setCompanyNumber(delivery.getCompanyNumber())
  99. .setMaterialId(delivery.getMaterialId())
  100. .setWbs(delivery.getWbs());
  101. for(Inventory inventory : deliveryMapper.getMaterialCk(askGoods)){
  102. AskGoods askGoods1 = askGoodsMapper.getAsk(inventory);
  103. if(askGoods1 != null){
  104. if( Double.doubleToLongBits(Double.parseDouble(askGoods1.getNum())) != Double.doubleToLongBits(Double.parseDouble(inventory.getAmount())) ){
  105. list.add(inventory);
  106. map.put("data", list);
  107. map.put("msg", "200");
  108. return map;
  109. }
  110. } else {
  111. list.add(inventory);
  112. map.put("data", list);
  113. map.put("msg", "200");
  114. return map;
  115. }
  116. }
  117. }
  118. map.put("msg", "200");
  119. }catch (Exception e){
  120. map.put("msg", "500");
  121. map.put("errMsg", "服务器请求异常,请稍后再试");
  122. e.printStackTrace();
  123. }
  124. return map;
  125. }
  126. @Override
  127. public Map<String, Object> OutOfLibrary(String uniqueCode, String type, String deliveryId) {
  128. Map<String, Object> map = new HashMap<>();
  129. //redis并发锁
  130. RLock lock = redissonClient.getLock(uniqueCode);
  131. lock.lock();
  132. try{
  133. String removalCode = codeGenerateCk();
  134. for(AskGoods askGoods : askGoodsMapper.getAskGoodsVitrual(uniqueCode, type)){
  135. askGoods.setStorageCode(removalCode);
  136. askGoods.setCompanyNumber(askGoods.getAccountSleeve());
  137. Inventory inventory = deliveryMapper.getInventoryHalf(askGoods);
  138. //如果出库库存等于虚拟表库存则删除此库存
  139. if(Double.doubleToLongBits(Double.parseDouble(askGoods.getNum())) == Double.doubleToLongBits(Double.parseDouble(inventory.getAmount()))){
  140. askGoodsMapper.deleteInventory(inventory);
  141. } else {
  142. inventory.setAmount(askGoods.getNum());
  143. askGoodsMapper.updateInventory(inventory);
  144. }
  145. //判断物料是否录入
  146. MaterialClass materialClass = warehousingMapper.getMateriaIsExist(askGoods.getWllbCode());
  147. //查询销售单部分信息
  148. Delivery delivery = new Delivery().setDeliveryId(deliveryId).setMaterialId(materialClass.getTldId());
  149. List<Delivery> list = deliveryMapper.getDelivery(delivery);
  150. deliveryMapper.updateDelivery(materialClass.getTldId(), askGoods.getNum(), deliveryId); //修改销售单出库数量
  151. if(materialClass.getPartType().equals("产成品")){
  152. //产成品销售流水
  153. Delivery delivery1 = new Delivery()
  154. .setMaterialCode(askGoods.getWllbCode()) //物料code
  155. .setOutNum(askGoods.getNum()) //出库数量
  156. .setUserId(askGoods.getUserId()) //用户id
  157. .setDeliveryId(deliveryId) //销售单id
  158. .setCompanyNumber(list.get(0).getCompanyNumber()) //公司编号
  159. .setCustomerCode(list.get(0).getCustomerCode())//客户编号
  160. .setStorageCode(removalCode) //出库流水
  161. .setWbs(list.get(0).getWbs());// wbs
  162. deliveryMapper.addRemovalHalf(delivery1); //流水录入
  163. } else if(materialClass.getPartType().equals("原材料")){
  164. askGoods.setType("销售出库");
  165. askGoodsMapper.addRemoval(askGoods);//插入出库流水
  166. } else if(materialClass.getPartType().equals("半成品")){
  167. //半成品销售流水
  168. Delivery delivery1 = new Delivery()
  169. .setMaterialCode(askGoods.getWllbCode()) //物料code
  170. .setOutNum(askGoods.getNum()) //出库数量
  171. .setUserId(askGoods.getUserId()) //用户id
  172. .setDeliveryId(deliveryId) //销售单id
  173. .setCompanyNumber(list.get(0).getCompanyNumber()) //公司编号
  174. .setCustomerCode(list.get(0).getCustomerCode())//客户编号
  175. .setStorageCode(removalCode) //出库流水
  176. .setWbs(list.get(0).getWbs());// wbs
  177. deliveryMapper.addRemovalHalfProduct(delivery1); //流水录入
  178. }
  179. askGoodsMapper.deleteVirtual(askGoods.getId());//删除已出虚拟表库存
  180. ReturRemoval returRemoval = new ReturRemoval()
  181. .setMaterialId(materialClass.getTldId())
  182. .setDocumentId(deliveryId)
  183. .setWbs(list.get(0).getWbs())
  184. .setNum(askGoods.getNum())
  185. .setEntryNumber(list.get(0).getEntryNumber())
  186. .setDocumentPointsId(list.get(0).getId())
  187. .setStorageLocationCode(askGoods.getStorageLocationCode());
  188. askGoodsMapper.addReturnGsRemoval(returRemoval);//新增返回gs数据子表信息
  189. }
  190. //新增销售单出库父表信息
  191. Delivery delivery = deliveryMapper.getDeliveryF(deliveryId);
  192. ReturRemoval returRemoval1 = new ReturRemoval()
  193. .setDocumentId(delivery.getDeliveryId())
  194. .setRemovalCode(removalCode)
  195. .setSourceType(delivery.getSourceType())
  196. .setMoveType(delivery.getMoveType())
  197. .setDeliveryType(delivery.getDeliveryType());
  198. askGoodsMapper.addReturnGsRemovalF(returRemoval1);//新增返回gs数据父表信息
  199. map.put("data", removalCode);
  200. map.put("msg", "200");
  201. }catch (Exception e){
  202. map.put("msg", "500");
  203. map.put("errMsg", "服务器请求异常,请稍后再试");
  204. e.printStackTrace();
  205. } finally {
  206. //判断要解锁的key是否已被锁定;判断要解锁的key是否被当前线程持有
  207. if (lock.isLocked() && lock.isHeldByCurrentThread()) {
  208. //释放锁
  209. lock.unlock();
  210. }
  211. }
  212. return map;
  213. }
  214. @Override
  215. public Map<String, Object> getAttribute(Delivery delivery) {
  216. Map<String, Object> map = new HashMap<>();
  217. try{
  218. //查询所有产成品库位
  219. String storageLocationCode = deliveryMapper.getStorageLocationCodeList();
  220. List<Inventory> list = deliveryMapper.getAttribute(storageLocationCode, delivery);
  221. map.put("data", list);
  222. map.put("msg", "200");
  223. }catch (Exception e){
  224. map.put("msg", "500");
  225. map.put("errMsg", "服务器请求异常,请稍后再试");
  226. e.printStackTrace();
  227. }
  228. return map;
  229. }
  230. @Override
  231. public Map<String, Object> addVitrual(AskGoods askGoods) {
  232. Map<String, Object> map = new HashMap<>();
  233. try{
  234. int mapValScan = deliveryMapper.getDeliveryScan(askGoods);
  235. if(mapValScan != 0){
  236. map.put("msg", "500");
  237. map.put("errMsg", "已扫描!");
  238. return map;
  239. }
  240. Map<String, Object> mapVal = deliveryMapper.getScanIsNot(askGoods);
  241. if(Double.parseDouble(mapVal.get("amount").toString()) - Double.parseDouble(mapVal.get("vitrualNum").toString()) == 0){
  242. map.put("msg", "500");
  243. map.put("errMsg", "已全部出库");
  244. return map;
  245. }
  246. askGoodsMapper.addAskGoodsVitrual(askGoods);
  247. map.put("msg", "200");
  248. }catch (Exception e){
  249. map.put("msg", "500");
  250. map.put("errMsg", "服务器请求异常,请稍后再试");
  251. e.printStackTrace();
  252. }
  253. return map;
  254. }
  255. @Override
  256. public Map<String, Object> delDelivery(String id, HttpServletRequest request) {
  257. Map<String, Object> map = new HashMap<>();
  258. try {
  259. String userId = request.getHeader("userId");
  260. Map<String, Object> mapVal = deliveryMapper.getDeliverys(id);
  261. if(Double.parseDouble(mapVal.get("out_num").toString()) > 0){
  262. map.put("msg", "500");
  263. map.put("errMsg", "此单据已出库!");
  264. return map;
  265. }
  266. LogData logData = new LogData()
  267. .setUserId(userId)
  268. .setData(mapVal.toString())
  269. .setType("0")
  270. .setDocumentType("交货单");
  271. dictionaryMapper.addLogdata(logData);
  272. deliveryMapper.delDelivery(id);
  273. map.put("msg", "200");
  274. } catch (Exception e) {
  275. e.printStackTrace();
  276. map.put("msg", "500");
  277. map.put("errMsg", "服务器请求异常,请稍后再试");
  278. }
  279. return map;
  280. }
  281. /**
  282. * 出库单生成
  283. * @return
  284. */
  285. public String codeGenerateCk(){
  286. StringBuilder stringBuilder = new StringBuilder("XSCK");
  287. Date date = new Date();
  288. SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
  289. stringBuilder.append(sdf.format(date));
  290. int count = askGoodsMapper.getReturnRemovalCount();
  291. for(int i = 0; i < 4 - (count + "").length(); i++){
  292. stringBuilder.append("0");
  293. }
  294. return (stringBuilder.append(count + 1)).toString();
  295. }
  296. }