WarehouseTransferServiceImpl.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  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 = new Inventory();
  80. askGoods.setCompanyNumber(askGoods.getAccountSleeve());
  81. if(material.getPartType().equals("原材料")){
  82. inventory = askGoodsMapper.getInventory(askGoods);
  83. } else if(material.getPartType().equals("产成品")){
  84. inventory = deliveryMapper.getInventoryHalf(askGoods);
  85. } else if(material.getPartType().equals("半成品")){
  86. inventory = askGoodsMapper.getInventoryInfo(askGoods).get(0);
  87. }
  88. if(inventory == null){
  89. map.put("msg", "500");
  90. map.put("errMsg", "库存不存在");
  91. return map;
  92. }
  93. //如果出库库存等于虚拟表库存则删除此库存
  94. if(Integer.parseInt(askGoods.getNum()) == Integer.parseInt(inventory.getAmount())){
  95. askGoodsMapper.deleteInventory(inventory);
  96. } else {
  97. inventory.setAmount(askGoods.getNum());
  98. askGoodsMapper.updateInventory(inventory);
  99. }
  100. String materialId = askGoodsMapper.getMaterialId(askGoods.getWllbCode());//查询物料id
  101. WarehouseTransfer warehouseTransfer = warehouseTransferMapper.getWarehouseTransferDetailed(askGoodsId, materialId);//查询移库申请内容
  102. //入库流水信息
  103. WarehousingVirtual WarehousingVirtual1 = new WarehousingVirtual()
  104. .setWllbCode(askGoods.getWllbCode()) //物料code
  105. .setSuppId(askGoods.getSupplierId())//供应商id
  106. .setSerial(askGoods.getSerial())//连翻号
  107. .setProducDate(askGoods.getProducDate())//批次
  108. .setNum(askGoods.getNum())//入库数量
  109. .setSeq("0")
  110. .setType(askGoods.getType())//入库类型
  111. .setUserId(askGoods.getUserId())//用户
  112. .setDepartmentId(askGoods.getDepartment())//部门
  113. .setStorageLocationCode(askGoods.getStorageLocationCodeRk())//库位编号
  114. .setStorageCode(warehouseTransferCode)//移库单号
  115. .setWbs(warehouseTransfer.getWbs())//wbs
  116. .setMaterialId(materialId)//物料id
  117. .setAccountSleeve(warehouseTransfer.getAccountSleeve())//公司
  118. .setWllbClass(material.getWllbClass());
  119. warehousing.add(WarehousingVirtual1);
  120. askGoods.setStorageLocationCode(askGoods.getStorageLocationCode());
  121. askGoodsMapper.addRemoval(askGoods);//插入出库流水
  122. askGoodsMapper.deleteVirtual(askGoods.getId());//删除已出虚拟表库存
  123. warehouseTransferMapper.updateOutNum(askGoods.getNum(), askGoodsId, materialId);//修改出库数量
  124. WarehouseTransfer warehouseTransfer1 = new WarehouseTransfer()
  125. .setWarehouseTransferId(warehouseTransfer.getWarehouseTransferId()) //移库单id
  126. .setEntryNumber(warehouseTransfer.getEntryNumber())//分录号
  127. .setSupplyWarehouseId(warehouseTransfer.getSupplyWarehouseId())//供货仓库id
  128. .setMaterialId(materialId)//物料id
  129. .setWbs(warehouseTransfer.getWbs())//wbs
  130. .setOutNum(askGoods.getNum()); //出库数量
  131. warehouseTransferMapper.addReturnGsWarehouseTransfer(warehouseTransfer1);//新增返回gs数据子表信息
  132. }
  133. WarehouseTransfer warehouseTransferF = warehouseTransferMapper.getWarehouseTransferDetailedF(askGoodsId);//查询父表移库单申请
  134. WarehouseTransfer warehouseTransfer1 = new WarehouseTransfer()
  135. .setWarehouseTransferId(warehouseTransferF.getWarehouseTransferId()) //移库单id
  136. .setWarehouseTransferCode(warehouseTransferCode)//移库单编号
  137. .setAskGoodsWarehouseId(warehouseTransferF.getAskGoodsWarehouseId()) //要货仓库id
  138. .setWarehouseTransferType(warehouseTransferF.getWarehouseTransferType()); //移库类型
  139. warehouseTransferMapper.addReturnGsWarehouseTransferF(warehouseTransfer1);//新增返回gs数据父表信息
  140. warehousingMapper.addStorage(warehousing);//入库流水
  141. warehousingMapper.addInventory(warehousing);//库存
  142. map.put("data", warehouseTransferCode);
  143. map.put("msg", "200");
  144. }catch (Exception e){
  145. e.printStackTrace();
  146. map.put("msg", "500");
  147. map.put("errMsg", "失败");
  148. } finally {
  149. //释放锁
  150. lock.unlock();
  151. }
  152. return map;
  153. }
  154. @Override
  155. public Map<String, Object> warehousing(String uniqueCode, String type) {
  156. Map<String, Object> map = new HashMap<>();
  157. try{
  158. //入库信息
  159. List<WarehousingVirtual> list = new LinkedList<>();
  160. List<WarehousingVirtual> warehousingVirtualList = warehousingMapper.getVirtual(uniqueCode, type);
  161. String warehouseTransferCode = codeGenerateYK(); //移库单
  162. //查询入库所需要的信息
  163. for(WarehousingVirtual warehousingVirtual : warehousingVirtualList) {
  164. //查询物料信息
  165. Notice notice = new Notice().setMaterialCode(warehousingVirtual.getWllbCode());
  166. MaterialClass material = warehousingMapper.getMaterial(notice);
  167. //查询采购单信息
  168. String materialId = askGoodsMapper.getMaterialId(warehousingVirtual.getWllbCode());//查询物料id
  169. WarehouseTransfer warehouseTransfer = warehouseTransferMapper.getWarehouseTransferDetailed(warehousingVirtual.getWarehouseTransferId(), materialId);//查询移库申请内容
  170. if(warehouseTransfer != null) {
  171. //WBS
  172. warehousingVirtual.setWbs(warehouseTransfer.getWbs());
  173. //账套
  174. warehousingVirtual.setAccountSleeve(warehouseTransfer.getAccountSleeve());
  175. }
  176. //查询部门编号
  177. List<User> listUser = userMapper.getAllUser(new User().setId(Integer.parseInt(warehousingVirtual.getUserId())));
  178. warehousingVirtual.setDepartmentId(listUser.get(0).getDepartmentId());
  179. //查询物料分类
  180. WarehousingVirtual warehousingVirtual1 = warehousingMapper.getWlClass(warehousingVirtual);
  181. warehousingVirtual.setWllbClass(warehousingVirtual1.getWllbClass());
  182. warehousingVirtual.setMaterialId(warehousingVirtual1.getMaterialId());
  183. warehousingVirtual.setStorageCode(warehouseTransferCode);
  184. list.add(warehousingVirtual);
  185. warehouseTransferMapper.updateOutNum(warehousingVirtual.getNum(), warehousingVirtual.getWarehouseTransferId(), materialId);//修改出库数量
  186. AskGoods askGoods = new AskGoods()
  187. .setStorageLocationCode(warehousingVirtual.getStorageLocationCodeCk())
  188. .setSupplierId(warehousingVirtual.getSuppId())
  189. .setSerial(warehousingVirtual.getSerial())
  190. .setNum(warehousingVirtual.getNum())
  191. .setType(warehousingVirtual.getType())
  192. .setUserId(warehousingVirtual.getUserId())
  193. .setWllbCode(warehousingVirtual.getWllbCode())
  194. .setStorageCode(warehouseTransferCode)
  195. .setWbs(warehousingVirtual.getWbs())
  196. .setProducDate(warehousingVirtual.getProducDate())
  197. .setDepartment(listUser.get(0).getDepartmentId())
  198. .setAskGoodsId(warehousingVirtual.getWarehouseTransferId())
  199. .setCompanyNumber(warehouseTransfer.getAccountSleeve());
  200. Inventory inventory = new Inventory();
  201. if(material.getPartType().equals("原材料")){
  202. inventory = askGoodsMapper.getInventory(askGoods);
  203. } else if(material.getPartType().equals("产成品")){
  204. inventory = deliveryMapper.getInventoryHalf(askGoods);
  205. } else if(material.getPartType().equals("半成品")){
  206. inventory = askGoodsMapper.getInventoryInfo(askGoods).get(0);
  207. }
  208. //如果出库库存等于虚拟表库存则删除此库存
  209. if(Integer.parseInt(askGoods.getNum()) == Integer.parseInt(inventory.getAmount())){
  210. askGoodsMapper.deleteInventory(inventory);
  211. } else {
  212. inventory.setAmount(askGoods.getNum());
  213. askGoodsMapper.updateInventory(inventory);
  214. }
  215. askGoodsMapper.addRemoval(askGoods);//插入出库流水
  216. WarehouseTransfer warehouseTransfer1 = new WarehouseTransfer()
  217. .setWarehouseTransferId(warehouseTransfer.getWarehouseTransferId()) //移库单id
  218. .setEntryNumber(warehouseTransfer.getEntryNumber())//分录号
  219. .setSupplyWarehouseId(warehouseTransfer.getSupplyWarehouseId())//供货仓库id
  220. .setMaterialId(materialId)//物料id
  221. .setWbs(warehouseTransfer.getWbs())//wbs
  222. .setOutNum(warehousingVirtual.getNum()); //出库数量
  223. warehouseTransferMapper.addReturnGsWarehouseTransfer(warehouseTransfer1);//新增返回gs数据子表信息
  224. }
  225. //入库
  226. warehousingMapper.addStorage(list);//入库流水
  227. warehousingMapper.addInventory(list);//库存
  228. warehousingMapper.delVirtual(uniqueCode);//删除临时表数据
  229. WarehouseTransfer warehouseTransferF = warehouseTransferMapper.getWarehouseTransferDetailedF(warehousingVirtualList.get(0).getWarehouseTransferId());//查询父表移库单申请
  230. WarehouseTransfer warehouseTransfer1 = new WarehouseTransfer()
  231. .setWarehouseTransferId(warehouseTransferF.getWarehouseTransferId()) //移库单id
  232. .setWarehouseTransferCode(warehouseTransferCode)//移库单编号
  233. .setAskGoodsWarehouseId(warehouseTransferF.getAskGoodsWarehouseId()) //要货仓库id
  234. .setWarehouseTransferType(warehouseTransferF.getWarehouseTransferType()); //移库类型
  235. warehouseTransferMapper.addReturnGsWarehouseTransferF(warehouseTransfer1);//新增返回gs数据父表信息
  236. map.put("data", warehouseTransferCode);
  237. map.put("msg", "200");
  238. } catch (Exception e){
  239. e.printStackTrace();
  240. map.put("msg", "500");
  241. map.put("errMsg", "服务器请求异常,请稍后再试");
  242. }
  243. return map;
  244. }
  245. /**
  246. * 删除移库单
  247. * @return
  248. */
  249. @Override
  250. public Map<String, Object> delWarehouseTransfer(String id, HttpServletRequest request) {
  251. Map<String, Object> map = new HashMap<>();
  252. try {
  253. String userId = request.getHeader("userId");
  254. Map<String, Object> mapVal = warehouseTransferMapper.getWarehouseTransfers(id);
  255. if(Double.parseDouble(mapVal.get("out_num").toString()) > 0){
  256. map.put("msg", "500");
  257. map.put("errMsg", "此单据已出库!");
  258. return map;
  259. }
  260. LogData logData = new LogData()
  261. .setUserId(userId)
  262. .setData(mapVal.toString())
  263. .setType("0")
  264. .setDocumentType("移库单");
  265. dictionaryMapper.addLogdata(logData);
  266. warehouseTransferMapper.delWarehouseTransfer(id);
  267. map.put("msg", "200");
  268. } catch (Exception e) {
  269. e.printStackTrace();
  270. map.put("msg", "500");
  271. map.put("errMsg", "服务器请求异常,请稍后再试");
  272. }
  273. return map;
  274. }
  275. @Override
  276. public Map<String, Object> addAskGoodsVitrual(AskGoods askGoods) {
  277. Map<String, Object> map = new HashMap<>();
  278. try{
  279. askGoodsMapper.addAskGoodsVitrual(askGoods);
  280. map.put("msg", "200");
  281. }catch (Exception e){
  282. e.printStackTrace();
  283. map.put("msg", "500");
  284. map.put("errMsg", "失败");
  285. }
  286. return map;
  287. }
  288. @Override
  289. public Map<String, Object> getMaterialCk(AskGoods askGoods) {
  290. Map<String, Object> map = new HashMap<>();
  291. try{
  292. List<Inventory> list = new LinkedList<>();
  293. for(Inventory inventory : warehouseTransferMapper.getMaterialWarehouseTransfer(askGoods)){
  294. AskGoods askGoods1 = warehouseTransferMapper.getAsk(inventory);
  295. if(askGoods1 != null){
  296. if(Double.parseDouble(askGoods1.getNum()) != Double.parseDouble(inventory.getAmount())){
  297. list.add(inventory);
  298. }
  299. } else {
  300. list.add(inventory);
  301. }
  302. }
  303. map.put("data", list);
  304. map.put("msg", "200");
  305. }catch (Exception e){
  306. e.printStackTrace();
  307. map.put("msg", "500");
  308. map.put("errMsg", "失败");
  309. }
  310. return map;
  311. }
  312. /**
  313. * 移库单生成
  314. * @return
  315. */
  316. public String codeGenerateYK(){
  317. StringBuilder stringBuilder = new StringBuilder("YK");
  318. Date date = new Date();
  319. SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
  320. stringBuilder.append(sdf.format(date));
  321. int count = warehouseTransferMapper.getReturnWarehouseTransferCount();
  322. for(int i = 0; i < 4 - (count + "").length(); i++){
  323. stringBuilder.append("0");
  324. }
  325. return (stringBuilder.append(count + 1)).toString();
  326. }
  327. }