WarehouseTransferServiceImpl.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. package com.tld.service.impl;
  2. import com.tld.mapper.*;
  3. import com.tld.model.*;
  4. import com.tld.model.Dictionary;
  5. import com.tld.service.WarehouseTransferService;
  6. import lombok.RequiredArgsConstructor;
  7. import org.redisson.api.RLock;
  8. import org.redisson.api.RedissonClient;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Service;
  11. import org.springframework.transaction.annotation.Transactional;
  12. import javax.servlet.http.HttpServletRequest;
  13. import java.text.SimpleDateFormat;
  14. import java.util.*;
  15. @Service
  16. @RequiredArgsConstructor
  17. public class WarehouseTransferServiceImpl implements WarehouseTransferService {
  18. //移库
  19. private final WarehouseTransferMapper warehouseTransferMapper;
  20. //redis锁
  21. private final RedissonClient redissonClient;
  22. //出库
  23. private final AskGoodsMapper askGoodsMapper;
  24. //入库
  25. private final WarehousingMapper warehousingMapper;
  26. //字典
  27. private final DictionaryMapper dictionaryMapper;
  28. //产成品
  29. private final DeliveryMapper deliveryMapper;
  30. //用户
  31. private final UserMapper userMapper;
  32. @Override
  33. public Map<String, Object> getWarehouseTransfer(WarehouseTransfer warehouseTransfer) {
  34. Map<String, Object> map = new HashMap<>();
  35. try{
  36. List<WarehouseTransfer> list = warehouseTransferMapper.getWarehouseTransfer(warehouseTransfer);
  37. List<Integer> scanNum = new LinkedList<>();
  38. Map<String, Object> mapVal = new HashMap<>();
  39. for(WarehouseTransfer warehouseTransfer1 : list){
  40. if(warehouseTransfer1.getAskType().equals("0") || warehouseTransfer1.getAskType().equals("1")
  41. || warehouseTransfer1.getAskType().equals("2")){
  42. warehouseTransfer1.setUniqueCode(warehouseTransfer.getUniqueCode());
  43. warehouseTransfer.setMaterialCode(warehouseTransfer.getMaterialCode());
  44. scanNum.add(warehouseTransferMapper.getScanNum(warehouseTransfer1));//扫描总数
  45. mapVal.put(warehouseTransfer1.getWarehouseTransferId(), 0);
  46. } else {
  47. warehouseTransfer1.setUniqueCode(warehouseTransfer.getUniqueCode());
  48. warehouseTransfer.setMaterialCode(warehouseTransfer.getMaterialCode());
  49. scanNum.add(warehouseTransferMapper.getScanNumWare(warehouseTransfer1));//扫描总数
  50. mapVal.put(warehouseTransfer1.getWarehouseTransferId(), 1);
  51. }
  52. }
  53. map.put("scanNum", scanNum);
  54. map.put("type", mapVal);
  55. map.put("data", list);
  56. map.put("msg", "200");
  57. } catch (Exception e){
  58. e.printStackTrace();
  59. map.put("msg", "500");
  60. map.put("errMsg", "服务器请求异常,请稍后再试");
  61. }
  62. return map;
  63. }
  64. @Override
  65. public Map<String, Object> OutOfLibrary(String uniqueCode, String type, String askGoodsId) {
  66. Map<String, Object> map = new HashMap<>();
  67. //redis并发锁
  68. RLock lock = redissonClient.getLock(uniqueCode);
  69. lock.lock();
  70. try{
  71. List<AskGoods> list = askGoodsMapper.getVirtualUniqueCode(uniqueCode, type, askGoodsId);
  72. //入库信息
  73. List<WarehousingVirtual> warehousing = new LinkedList<>();
  74. String warehouseTransferCode = codeGenerateYK(); //移库单
  75. for(AskGoods askGoods : list){
  76. askGoods.setStorageCode(warehouseTransferCode);
  77. //查询物料信息
  78. MaterialClass material = warehousingMapper.getMaterial(new Notice().setMaterialCode(askGoods.getWllbCode()));
  79. Inventory inventory = null;
  80. askGoods.setCompanyNumber(askGoods.getAccountSleeve());
  81. askGoods.setMaterialId(material.getTldId());
  82. //判断是否是三大仓库(半成品、产成品、原材料)之外的仓库 如果是则不需要查询库存
  83. String warehouseType = warehouseTransferMapper.getStorageLocationWarehouse(askGoods.getStorageLocationCode());
  84. if(!warehouseType.equals("10")) {
  85. if(material.getPartType().equals("原材料")) {
  86. inventory = askGoodsMapper.getInventory(askGoods);
  87. } else if(material.getPartType().equals("产成品")) {
  88. inventory = deliveryMapper.getInventoryHalf(askGoods);
  89. } else if(material.getPartType().equals("半成品")) {
  90. if(askGoodsMapper.getInventoryInfo(askGoods).size() != 0){
  91. inventory = askGoodsMapper.getInventoryInfo(askGoods).get(0);
  92. } else {
  93. inventory = null;
  94. }
  95. } else if (material.getPartType().equals("低值易耗品")){
  96. inventory = deliveryMapper.getInventoryHalf(askGoods);
  97. }
  98. if(inventory == null){
  99. map.put("msg", "500");
  100. map.put("errMsg", "库存不存在");
  101. return map;
  102. }
  103. //如果出库库存等于虚拟表库存则删除此库存
  104. if(Double.doubleToLongBits(Double.parseDouble(askGoods.getNum())) == Double.doubleToLongBits(Double.parseDouble(inventory.getAmount()))){
  105. askGoodsMapper.deleteInventory(inventory);
  106. } else {
  107. inventory.setAmount(askGoods.getNum());
  108. askGoodsMapper.updateInventory(inventory);
  109. }
  110. }
  111. String materialId = askGoodsMapper.getMaterialId(askGoods.getWllbCode());//查询物料id
  112. WarehouseTransfer warehouseTransfer = warehouseTransferMapper.getWarehouseTransferDetailed(askGoodsId, materialId, askGoods.getEntryNumber());//查询移库申请内容
  113. //入库流水信息
  114. WarehousingVirtual WarehousingVirtual1 = new WarehousingVirtual()
  115. .setWllbCode(askGoods.getWllbCode()) //物料code
  116. .setSuppId(askGoods.getSupplierId())//供应商id
  117. .setSerial(askGoods.getSerial())//连翻号
  118. .setProducDate(askGoods.getProducDate())//批次
  119. .setNum(askGoods.getNum())//入库数量
  120. .setSeq("0")
  121. .setType(askGoods.getType())//入库类型
  122. .setUserId(askGoods.getUserId())//用户
  123. .setDepartmentId(askGoods.getDepartment())//部门
  124. .setStorageLocationCode(askGoods.getStorageLocationCodeRk())//库位编号
  125. .setStorageCode(warehouseTransferCode)//移库单号
  126. .setWbs(warehouseTransfer.getWbs())//wbs
  127. .setMaterialId(materialId)//物料id
  128. .setAccountSleeve(warehouseTransfer.getAccountSleeve())//公司
  129. .setWllbClass(material.getWllbClass())
  130. .setAttribute(askGoods.getAttribute());
  131. warehousing.add(WarehousingVirtual1);
  132. askGoods.setStorageLocationCode(askGoods.getStorageLocationCode());
  133. askGoodsMapper.addRemoval(askGoods);//插入出库流水
  134. askGoodsMapper.deleteVirtual(askGoods.getId());//删除已出虚拟表库存
  135. Double scanNum = Double.parseDouble(warehouseTransfer.getOutNum()) + Double.parseDouble(askGoods.getNum());
  136. String typeVal = "0";
  137. if(Double.doubleToLongBits(scanNum) == Double.doubleToLongBits(Double.parseDouble(warehouseTransfer.getNum()))){
  138. typeVal = "1";
  139. }
  140. warehouseTransferMapper.updateOutNum(askGoods.getNum(), askGoodsId, materialId, typeVal, askGoods.getEntryNumber());//修改出库数量
  141. if(askGoods.getStorageLocationCodeRk().indexOf("XNKW") != -1){
  142. Inventory inventory2 = warehouseTransferMapper.getInventoryVitrual(askGoods);
  143. String code = warehouseTransferMapper.getWarehouseTransferCodeType(warehouseTransfer.getAskGoodsWarehouseId());
  144. if(material.getPartType().equals("产成品") && code.equals("2")){
  145. //入库信息
  146. List<WarehousingVirtual> warehousingVal = new LinkedList<>();
  147. WarehousingVirtual warehousingVirtual = warehousing.get(warehousing.size() - 1);
  148. warehousingVirtual.setSuppId("");
  149. warehousingVal.add(warehousingVirtual);
  150. warehousingMapper.addInventory(warehousingVal);//库存
  151. } else {
  152. if(inventory2 != null ){
  153. Inventory inventory1 = new Inventory()
  154. .setNum(askGoods.getNum())
  155. .setMaterialId(materialId)
  156. .setStorageLocationCode(askGoods.getStorageLocationCodeRk());
  157. warehousingMapper.updateVitrualNum(inventory1);
  158. } else {
  159. //入库信息
  160. List<WarehousingVirtual> warehousingVal = new LinkedList<>();
  161. WarehousingVirtual warehousingVirtual = warehousing.get(warehousing.size() - 1);
  162. warehousingVirtual.setSuppId("").setSerial("");
  163. warehousingVal.add(warehousingVirtual);
  164. warehousingMapper.addInventory(warehousingVal);//库存
  165. }
  166. }
  167. }
  168. WarehouseTransfer warehouseTransfer1 = new WarehouseTransfer()
  169. .setWarehouseTransferId(warehouseTransfer.getWarehouseTransferId()) //移库单id
  170. .setEntryNumber(warehouseTransfer.getEntryNumber())//分录号
  171. .setSupplyWarehouseId(warehouseTransfer.getSupplyWarehouseId())//供货仓库id
  172. .setMaterialId(materialId)//物料id
  173. .setWbs(warehouseTransfer.getWbs())//wbs
  174. .setOutNum(askGoods.getNum()); //出库数量
  175. warehouseTransferMapper.addReturnGsWarehouseTransfer(warehouseTransfer1);//新增返回gs数据子表信息
  176. }
  177. WarehouseTransfer warehouseTransferF = warehouseTransferMapper.getWarehouseTransferDetailedF(askGoodsId);//查询父表移库单申请
  178. WarehouseTransfer warehouseTransfer1 = new WarehouseTransfer()
  179. .setWarehouseTransferId(warehouseTransferF.getWarehouseTransferId()) //移库单id
  180. .setWarehouseTransferCode(warehouseTransferCode)//移库单编号
  181. .setAskGoodsWarehouseId(warehouseTransferF.getAskGoodsWarehouseId()) //要货仓库id
  182. .setWarehouseTransferType(warehouseTransferF.getWarehouseTransferType()); //移库类型
  183. warehouseTransferMapper.addReturnGsWarehouseTransferF(warehouseTransfer1);//新增返回gs数据父表信息
  184. warehousingMapper.addStorage(warehousing);//入库流水
  185. if(list.get(0).getStorageLocationCodeRk().indexOf("XNKW") > 0){
  186. warehousingMapper.addInventory(warehousing);//库存
  187. }
  188. map.put("data", warehouseTransferCode);
  189. map.put("msg", "200");
  190. }catch (Exception e){
  191. e.printStackTrace();
  192. map.put("msg", "500");
  193. map.put("errMsg", "失败");
  194. } finally {
  195. //判断要解锁的key是否已被锁定;判断要解锁的key是否被当前线程持有
  196. if (lock.isLocked() && lock.isHeldByCurrentThread()) {
  197. //释放锁
  198. lock.unlock();
  199. }
  200. }
  201. return map;
  202. }
  203. @Override
  204. public Map<String, Object> warehousing(String uniqueCode, String type, String askGoodsId) {
  205. Map<String, Object> map = new HashMap<>();
  206. try{
  207. //入库信息
  208. List<WarehousingVirtual> list = new LinkedList<>();
  209. List<WarehousingVirtual> warehousingVirtualList = warehousingMapper.getVirtual(uniqueCode, type, askGoodsId);
  210. String warehouseTransferCode = codeGenerateYK(); //移库单
  211. //查询入库所需要的信息
  212. for(WarehousingVirtual warehousingVirtual : warehousingVirtualList) {
  213. //查询物料信息
  214. Notice notice = new Notice().setMaterialCode(warehousingVirtual.getWllbCode());
  215. MaterialClass material = warehousingMapper.getMaterial(notice);
  216. //查询采购单信息
  217. String materialId = askGoodsMapper.getMaterialId(warehousingVirtual.getWllbCode());//查询物料id
  218. WarehouseTransfer warehouseTransfer = warehouseTransferMapper.getWarehouseTransferDetailed(warehousingVirtual.getWarehouseTransferId(), materialId, warehousingVirtual.getEntryNumber());//查询移库申请内容
  219. if(warehouseTransfer != null) {
  220. //WBS
  221. warehousingVirtual.setWbs(warehouseTransfer.getWbs());
  222. //账套
  223. warehousingVirtual.setAccountSleeve(warehouseTransfer.getAccountSleeve());
  224. }
  225. //查询部门编号
  226. List<User> listUser = userMapper.getAllUser(new User().setId(warehousingVirtual.getUserId()));
  227. warehousingVirtual.setDepartmentId(listUser.get(0).getDepartmentId());
  228. //查询物料分类
  229. WarehousingVirtual warehousingVirtual1 = warehousingMapper.getWlClass(warehousingVirtual);
  230. warehousingVirtual.setWllbClass(warehousingVirtual1.getWllbClass());
  231. warehousingVirtual.setMaterialId(warehousingVirtual1.getMaterialId());
  232. warehousingVirtual.setStorageCode(warehouseTransferCode);
  233. list.add(warehousingVirtual);
  234. Double scanNum = Double.parseDouble(warehouseTransfer.getOutNum()) + Double.parseDouble(warehousingVirtual.getNum());
  235. String typeVal = "0";
  236. if(Double.doubleToLongBits(scanNum) == Double.doubleToLongBits(Double.parseDouble(warehouseTransfer.getNum()))){
  237. typeVal = "1";
  238. }
  239. warehouseTransferMapper.updateOutNum(warehousingVirtual.getNum(), warehousingVirtual.getWarehouseTransferId(), materialId, typeVal, warehousingVirtual.getEntryNumber());//修改出库数量
  240. AskGoods askGoods = new AskGoods()
  241. .setStorageLocationCode(warehousingVirtual.getStorageLocationCodeCk())
  242. .setSupplierId(warehousingVirtual.getSuppId())
  243. .setSerial(warehousingVirtual.getSerial())
  244. .setNum(warehousingVirtual.getNum())
  245. .setType(warehousingVirtual.getType())
  246. .setUserId(warehousingVirtual.getUserId())
  247. .setWllbCode(warehousingVirtual.getWllbCode())
  248. .setStorageCode(warehouseTransferCode)
  249. .setWbs(warehousingVirtual.getWbs())
  250. .setProducDate(warehousingVirtual.getProducDate())
  251. .setDepartment(listUser.get(0).getDepartmentId())
  252. .setAskGoodsId(warehousingVirtual.getWarehouseTransferId())
  253. .setCompanyNumber(warehouseTransfer.getAccountSleeve());
  254. Inventory inventory = new Inventory();
  255. String code = warehouseTransferMapper.getWarehouseTransferCodeType(warehouseTransfer.getAskGoodsWarehouseId());
  256. //判断是否是三大仓库(半成品、产成品、原材料)之外的仓库 如果是则不需要查询库存
  257. String warehouseType = warehouseTransferMapper.getStorageLocationWarehouse(askGoods.getStorageLocationCode());
  258. if(!warehouseType.equals("10")) {
  259. if(material.getPartType().equals("原材料")){
  260. inventory = askGoodsMapper.getInventoryWarehousing(askGoods);
  261. } else if(material.getPartType().equals("产成品")){
  262. if(code.equals("2")){
  263. askGoods.setSerial("");
  264. }
  265. inventory = deliveryMapper.getInventoryHalf(askGoods);
  266. } else if(material.getPartType().equals("半成品")){
  267. inventory = askGoodsMapper.getInventoryWarehousing(askGoods);
  268. }
  269. //如果出库库存等于虚拟表库存则删除此库存
  270. if(Double.doubleToLongBits(Double.parseDouble(askGoods.getNum())) == Double.doubleToLongBits(Double.parseDouble(inventory.getAmount()))){
  271. askGoodsMapper.deleteInventory(inventory);
  272. } else {
  273. inventory.setAmount(askGoods.getNum());
  274. askGoodsMapper.updateInventory(inventory);
  275. }
  276. }
  277. askGoodsMapper.addRemoval(askGoods);//插入出库流水
  278. WarehouseTransfer warehouseTransfer1 = new WarehouseTransfer()
  279. .setWarehouseTransferId(warehouseTransfer.getWarehouseTransferId()) //移库单id
  280. .setEntryNumber(warehouseTransfer.getEntryNumber())//分录号
  281. .setSupplyWarehouseId(warehouseTransfer.getSupplyWarehouseId())//供货仓库id
  282. .setMaterialId(materialId)//物料id
  283. .setWbs(warehouseTransfer.getWbs())//wbs
  284. .setOutNum(warehousingVirtual.getNum()); //出库数量
  285. warehouseTransferMapper.addReturnGsWarehouseTransfer(warehouseTransfer1);//新增返回gs数据子表信息
  286. }
  287. //入库
  288. warehousingMapper.addStorage(list);//入库流水
  289. warehousingMapper.addInventory(list);//库存
  290. warehousingMapper.delVirtual(uniqueCode);//删除临时表数据
  291. WarehouseTransfer warehouseTransferF = warehouseTransferMapper.getWarehouseTransferDetailedF(warehousingVirtualList.get(0).getWarehouseTransferId());//查询父表移库单申请
  292. WarehouseTransfer warehouseTransfer1 = new WarehouseTransfer()
  293. .setWarehouseTransferId(warehouseTransferF.getWarehouseTransferId()) //移库单id
  294. .setWarehouseTransferCode(warehouseTransferCode)//移库单编号
  295. .setAskGoodsWarehouseId(warehouseTransferF.getAskGoodsWarehouseId()) //要货仓库id
  296. .setWarehouseTransferType(warehouseTransferF.getWarehouseTransferType()); //移库类型
  297. warehouseTransferMapper.addReturnGsWarehouseTransferF(warehouseTransfer1);//新增返回gs数据父表信息
  298. map.put("data", warehouseTransferCode);
  299. map.put("msg", "200");
  300. } catch (Exception e){
  301. e.printStackTrace();
  302. map.put("msg", "500");
  303. map.put("errMsg", "服务器请求异常,请稍后再试");
  304. }
  305. return map;
  306. }
  307. /**
  308. * 删除移库单
  309. * @return
  310. */
  311. @Override
  312. public Map<String, Object> delWarehouseTransfer(String id, HttpServletRequest request) {
  313. Map<String, Object> map = new HashMap<>();
  314. try {
  315. String userId = request.getHeader("userId");
  316. Map<String, Object> mapVal = warehouseTransferMapper.getWarehouseTransfers(id);
  317. if(Double.parseDouble(mapVal.get("out_num").toString()) > 0){
  318. map.put("msg", "500");
  319. map.put("errMsg", "此单据已出库!");
  320. return map;
  321. }
  322. LogData logData = new LogData()
  323. .setUserId(userId)
  324. .setData(mapVal.toString())
  325. .setType("0")
  326. .setDocumentType("移库单");
  327. dictionaryMapper.addLogdata(logData);
  328. warehouseTransferMapper.delWarehouseTransfer(id);
  329. map.put("msg", "200");
  330. } catch (Exception e) {
  331. e.printStackTrace();
  332. map.put("msg", "500");
  333. map.put("errMsg", "服务器请求异常,请稍后再试");
  334. }
  335. return map;
  336. }
  337. @Override
  338. public Map<String, Object> addAskGoodsVitrual(AskGoods askGoods) {
  339. Map<String, Object> map = new HashMap<>();
  340. try{
  341. askGoods.setAccountSleeve(askGoods.getCompanyNumber());
  342. List<Inventory> inventory = askGoodsMapper.getInventoryInfo(askGoods);
  343. if(inventory.size() == 0){
  344. map.put("msg", "500");
  345. map.put("errMsg", "库存数量不足");
  346. return map;
  347. }
  348. askGoodsMapper.addAskGoodsVitrual(askGoods);
  349. map.put("msg", "200");
  350. }catch (Exception e){
  351. e.printStackTrace();
  352. map.put("msg", "500");
  353. map.put("errMsg", "失败");
  354. }
  355. return map;
  356. }
  357. @Override
  358. public Map<String, Object> getMaterialCk(AskGoods askGoods) {
  359. Map<String, Object> map = new HashMap<>();
  360. try{
  361. List<Inventory> list = new LinkedList<>();
  362. for(Inventory inventory : warehouseTransferMapper.getMaterialWarehouseTransfer(askGoods)){
  363. AskGoods askGoods1 = warehouseTransferMapper.getAsk(inventory);
  364. if(askGoods1 != null){
  365. if( Double.doubleToLongBits(Double.parseDouble(askGoods1.getNum())) != Double.doubleToLongBits( Double.parseDouble(inventory.getAmount())) ){
  366. list.add(inventory);
  367. }
  368. } else {
  369. list.add(inventory);
  370. }
  371. }
  372. map.put("data", list);
  373. map.put("msg", "200");
  374. }catch (Exception e){
  375. e.printStackTrace();
  376. map.put("msg", "500");
  377. map.put("errMsg", "失败");
  378. }
  379. return map;
  380. }
  381. @Override
  382. public Map<String, Object> getWarehouseTransferCode(WarehouseTransfer warehouseTransfer) {
  383. Map<String, Object> map = new HashMap<>();
  384. try{
  385. List<WarehouseTransfer> list = warehouseTransferMapper.getWarehouseTransferCode(warehouseTransfer);
  386. map.put("data", list);
  387. map.put("msg", "200");
  388. }catch (Exception e){
  389. e.printStackTrace();
  390. map.put("msg", "500");
  391. map.put("errMsg", "失败");
  392. }
  393. return map;
  394. }
  395. /**
  396. * 移库单生成
  397. * @return
  398. */
  399. public String codeGenerateYK(){
  400. StringBuilder stringBuilder = new StringBuilder("YKCZ");
  401. Date date = new Date();
  402. SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
  403. stringBuilder.append(sdf.format(date));
  404. int count = warehouseTransferMapper.getReturnWarehouseTransferCount();
  405. for(int i = 0; i < 4 - (count + "").length(); i++){
  406. stringBuilder.append("0");
  407. }
  408. return (stringBuilder.append(count + 1)).toString();
  409. }
  410. }