DeliveryServiceImpl.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. package com.tld.service.impl;
  2. import com.github.pagehelper.PageHelper;
  3. import com.github.pagehelper.PageInfo;
  4. import com.tld.mapper.AskGoodsMapper;
  5. import com.tld.mapper.DeliveryMapper;
  6. import com.tld.mapper.DictionaryMapper;
  7. import com.tld.mapper.WarehousingMapper;
  8. import com.tld.model.*;
  9. import com.tld.service.DeliveryService;
  10. import org.redisson.api.RLock;
  11. import org.redisson.api.RedissonClient;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.stereotype.Service;
  14. import javax.servlet.http.HttpServletRequest;
  15. import java.text.SimpleDateFormat;
  16. import java.util.*;
  17. @Service
  18. public class DeliveryServiceImpl implements DeliveryService {
  19. @Autowired
  20. private DeliveryMapper deliveryMapper;
  21. @Autowired
  22. private AskGoodsMapper askGoodsMapper;
  23. //redis锁
  24. @Autowired
  25. private RedissonClient redissonClient;
  26. //删除日志表
  27. @Autowired
  28. private DictionaryMapper dictionaryMapper;
  29. //入库
  30. @Autowired
  31. private WarehousingMapper warehousingMapper;
  32. @Override
  33. public Map<String, Object> getDelivery(Delivery delivery) {
  34. Map<String, Object> map = new HashMap<>();
  35. try{
  36. List<Delivery> list = deliveryMapper.getDelivery(delivery);
  37. Map<String, Object> mapVal = new HashMap<>();
  38. for(Delivery delivery1 : list){
  39. int sumScan = deliveryMapper.getScanSum(delivery1);
  40. mapVal.put(delivery1.getDeliveryId() + delivery1.getMaterialId() + delivery1.getEntryNumber(), sumScan);
  41. }
  42. map.put("data", list);
  43. map.put("scan", mapVal);
  44. map.put("msg", "200");
  45. }catch (Exception e) {
  46. map.put("msg", "500");
  47. map.put("errMsg", "服务器请求异常,请稍后再试");
  48. e.printStackTrace();
  49. }
  50. return map;
  51. }
  52. @Override
  53. public Map<String, Object> getRecommend(Delivery delivery) {
  54. Map<String, Object> map = new HashMap<>();
  55. try{
  56. MaterialClass materialClass = deliveryMapper.getMaterialClass(delivery.getMaterialId());
  57. if(materialClass == null){
  58. map.put("msg", "500");
  59. map.put("errMsg", "物料信息未录入,请联系管理员");
  60. return map;
  61. }
  62. if(materialClass.getPartType().equals("产成品")){
  63. //查询所有产成品库位
  64. String storageLocationCode = deliveryMapper.getStorageLocationCodeList();
  65. List<Inventory> list = new LinkedList<>();
  66. for(Inventory inventory : deliveryMapper.getInventory(storageLocationCode, delivery)){
  67. int occupy = deliveryMapper.getVitrual(inventory);
  68. if(occupy == 0){
  69. //--------------暂时使用 后期改回逻辑
  70. // if(Double.doubleToLongBits(Double.parseDouble(inventory.getAmount())) == Double.doubleToLongBits(Double.parseDouble(delivery.getOutNum()))){
  71. if(Double.doubleToLongBits(Double.parseDouble(inventory.getAmount())) >= Double.doubleToLongBits(Double.parseDouble(delivery.getOutNum()))){
  72. for(Inventory inventorys : deliveryMapper.getInventory(storageLocationCode, delivery)){
  73. if (inventorys.getStorageLocationCode().equals(inventory.getStorageLocationCode())){
  74. list.add(inventorys);
  75. map.put("data", list);
  76. map.put("msg", "200");
  77. }
  78. }
  79. return map;
  80. }
  81. }
  82. }
  83. map.put("data", list);
  84. } else if(materialClass.getPartType().equals("半成品")){
  85. List<Inventory> list = new LinkedList<>();
  86. for(Inventory inventory : deliveryMapper.getInventory(delivery.getStorageLocationCode(), delivery)){
  87. int productNum = deliveryMapper.getProductNumVitrual(inventory);
  88. if(Integer.parseInt(inventory.getAmount()) < 0){
  89. map.put("msg", "500");
  90. map.put("errMsg", "库存不足");
  91. return map;
  92. } else {
  93. list.add(inventory);
  94. map.put("data", list);
  95. map.put("msg", "200");
  96. return map;
  97. }
  98. }
  99. } else {
  100. List<Inventory> list = new LinkedList<>();
  101. AskGoods askGoods = new AskGoods()
  102. .setCompanyNumber(delivery.getCompanyNumber())
  103. .setMaterialId(delivery.getMaterialId())
  104. .setWbs(delivery.getWbs());
  105. for(Inventory inventory : deliveryMapper.getMaterialCk(askGoods)){
  106. AskGoods askGoods1 = askGoodsMapper.getAsk(inventory);
  107. if(askGoods1 != null){
  108. if( Double.doubleToLongBits(Double.parseDouble(askGoods1.getNum())) != Double.doubleToLongBits(Double.parseDouble(inventory.getAmount())) ){
  109. list.add(inventory);
  110. map.put("data", list);
  111. map.put("msg", "200");
  112. return map;
  113. }
  114. } else {
  115. list.add(inventory);
  116. map.put("data", list);
  117. map.put("msg", "200");
  118. return map;
  119. }
  120. }
  121. }
  122. map.put("msg", "200");
  123. }catch (Exception e){
  124. map.put("msg", "500");
  125. map.put("errMsg", "服务器请求异常,请稍后再试");
  126. e.printStackTrace();
  127. }
  128. return map;
  129. }
  130. @Override
  131. public Map<String, Object> OutOfLibrary(String uniqueCode, String type, String deliveryId) {
  132. Map<String, Object> map = new HashMap<>();
  133. //redis并发锁
  134. RLock lock = redissonClient.getLock(uniqueCode);
  135. lock.lock();
  136. try{
  137. String removalCode = codeGenerateCk();
  138. List<AskGoods> listData = askGoodsMapper.getAskGoodsVitrual(uniqueCode, type);
  139. for(AskGoods askGoods : listData){
  140. if(!askGoods.getAskGoodsId().equals(deliveryId)){
  141. continue;
  142. }
  143. askGoods.setStorageCode(removalCode);
  144. askGoods.setCompanyNumber(askGoods.getAccountSleeve());
  145. //判断物料是否录入
  146. MaterialClass materialClass = warehousingMapper.getMateriaIsExist(askGoods.getWllbCode());
  147. //临时使用后期删除
  148. //-------------------------------
  149. Inventory inventory = null;
  150. if(materialClass.getPartType().equals("产成品")){
  151. inventory = deliveryMapper.getTemporarily(askGoods);
  152. } else {
  153. inventory = deliveryMapper.getInventoryHalf(askGoods);
  154. }
  155. //------------------------------
  156. // Inventory inventory = deliveryMapper.getInventoryHalf(askGoods);
  157. //如果出库库存等于虚拟表库存则删除此库存
  158. if(Double.doubleToLongBits(Double.parseDouble(askGoods.getNum())) == Double.doubleToLongBits(Double.parseDouble(inventory.getAmount()))){
  159. askGoodsMapper.deleteInventory(inventory);
  160. } else {
  161. inventory.setAmount(askGoods.getNum());
  162. askGoodsMapper.updateInventory(inventory);
  163. }
  164. //查询销售单部分信息
  165. Delivery delivery = new Delivery().setDeliveryId(deliveryId).setMaterialId(materialClass.getTldId())
  166. .setEntryNumber(askGoods.getEntryNumber())
  167. .setUserId(askGoods.getUserId());
  168. List<Delivery> list = deliveryMapper.getDelivery(delivery);
  169. deliveryMapper.updateDelivery(materialClass.getTldId(), askGoods.getNum(), deliveryId, askGoods.getEntryNumber()); //修改销售单出库数量
  170. if(materialClass.getPartType().equals("产成品")){
  171. //产成品销售流水
  172. Delivery delivery1 = new Delivery()
  173. .setMaterialCode(askGoods.getWllbCode()) //物料code
  174. .setOutNum(askGoods.getNum()) //出库数量
  175. .setUserId(askGoods.getUserId()) //用户id
  176. .setDeliveryId(deliveryId) //销售单id
  177. .setCompanyNumber(list.get(0).getCompanyNumber()) //公司编号
  178. .setCustomerCode(list.get(0).getCustomerCode())//客户编号
  179. .setStorageCode(removalCode) //出库流水
  180. .setWbs(list.get(0).getWbs());// wbs
  181. deliveryMapper.addRemovalHalf(delivery1); //流水录入
  182. } else if(materialClass.getPartType().equals("原材料")){
  183. askGoods.setType("销售出库");
  184. askGoodsMapper.addRemoval(askGoods);//插入出库流水
  185. } else if(materialClass.getPartType().equals("半成品")){
  186. //半成品销售流水
  187. Delivery delivery1 = new Delivery()
  188. .setMaterialCode(askGoods.getWllbCode()) //物料code
  189. .setOutNum(askGoods.getNum()) //出库数量
  190. .setUserId(askGoods.getUserId()) //用户id
  191. .setDeliveryId(deliveryId) //销售单id
  192. .setCompanyNumber(list.get(0).getCompanyNumber()) //公司编号
  193. .setCustomerCode(list.get(0).getCustomerCode())//客户编号
  194. .setStorageCode(removalCode) //出库流水
  195. .setWbs(list.get(0).getWbs());// wbs
  196. deliveryMapper.addRemovalHalfProduct(delivery1); //流水录入
  197. }
  198. askGoodsMapper.deleteVirtual(askGoods.getId());//删除已出虚拟表库存
  199. if(materialClass.getPartType().equals("产成品")){
  200. //查询设备绑定的
  201. List<Map<String, Object>> list1 = deliveryMapper.getEquipmentSoftware(materialClass.getCode());
  202. //如果设备绑定软件基础信息有数据则继续往下执行
  203. if(list1.size() != 0){
  204. Map<String, Object> map1 = list1.get(0);
  205. Delivery delivery1 = new Delivery()
  206. .setDeliveryId(deliveryId)
  207. .setMaterialId(map1.get("materialId").toString())
  208. .setWbs(list.get(0).getWbs())
  209. .setUserId(askGoods.getUserId());
  210. //查询软件类销售出库单据
  211. List<Delivery> list2 = deliveryMapper.getDelivery(delivery1);
  212. //如果单据存在 则继续往下执行
  213. if(list2.size() != 0){
  214. //修改软件类单据出库数量
  215. deliveryMapper.updateDelivery(list2.get(0).getMaterialId(), askGoods.getNum(), deliveryId, list2.get(0).getEntryNumber());
  216. //存入返回GS信息表内
  217. ReturRemoval returRemoval = new ReturRemoval()
  218. .setMaterialId(map1.get("materialId").toString())
  219. .setDocumentId(deliveryId)
  220. .setWbs(list2.get(0).getWbs())
  221. .setNum(askGoods.getNum())
  222. .setEntryNumber(list2.get(0).getEntryNumber())
  223. .setDocumentPointsId(list2.get(0).getId())
  224. .setStorageLocationCode(askGoods.getStorageLocationCode());
  225. askGoodsMapper.addReturnGsRemoval(returRemoval);//新增返回gs数据子表信息
  226. }
  227. }
  228. }
  229. //存入返回GS信息表内
  230. ReturRemoval returRemoval = new ReturRemoval()
  231. .setMaterialId(materialClass.getTldId())
  232. .setDocumentId(deliveryId)
  233. .setWbs(list.get(0).getWbs())
  234. .setNum(askGoods.getNum())
  235. .setEntryNumber(list.get(0).getEntryNumber())
  236. .setDocumentPointsId(list.get(0).getId())
  237. .setStorageLocationCode(askGoods.getStorageLocationCode());
  238. askGoodsMapper.addReturnGsRemoval(returRemoval);//新增返回gs数据子表信息
  239. }
  240. if(listData.size() != 0){
  241. //新增销售单出库父表信息
  242. Delivery delivery = deliveryMapper.getDeliveryF(deliveryId);
  243. ReturRemoval returRemoval1 = new ReturRemoval()
  244. .setDocumentId(delivery.getDeliveryId())
  245. .setRemovalCode(removalCode)
  246. .setSourceType(delivery.getSourceType())
  247. .setMoveType(delivery.getMoveType())
  248. .setDeliveryType(delivery.getDeliveryType());
  249. askGoodsMapper.addReturnGsRemovalF(returRemoval1);//新增返回gs数据父表信息
  250. }
  251. map.put("data", removalCode);
  252. map.put("msg", "200");
  253. }catch (Exception e){
  254. map.put("msg", "500");
  255. map.put("errMsg", "服务器请求异常,请稍后再试");
  256. e.printStackTrace();
  257. } finally {
  258. //判断要解锁的key是否已被锁定;判断要解锁的key是否被当前线程持有
  259. if (lock.isLocked() && lock.isHeldByCurrentThread()) {
  260. //释放锁
  261. lock.unlock();
  262. }
  263. }
  264. return map;
  265. }
  266. @Override
  267. public Map<String, Object> getAttribute(Delivery delivery) {
  268. Map<String, Object> map = new HashMap<>();
  269. try{
  270. //查询所有产成品库位
  271. String storageLocationCode = deliveryMapper.getStorageLocationCodeList();
  272. List<Inventory> list = deliveryMapper.getAttribute(storageLocationCode, delivery);
  273. map.put("data", list);
  274. map.put("msg", "200");
  275. }catch (Exception e){
  276. map.put("msg", "500");
  277. map.put("errMsg", "服务器请求异常,请稍后再试");
  278. e.printStackTrace();
  279. }
  280. return map;
  281. }
  282. @Override
  283. public Map<String, Object> addVitrual(AskGoods askGoods) {
  284. Map<String, Object> map = new HashMap<>();
  285. try{
  286. int mapValScan = deliveryMapper.getDeliveryScan(askGoods);
  287. if(mapValScan != 0){
  288. map.put("msg", "500");
  289. map.put("errMsg", "已扫描!");
  290. return map;
  291. }
  292. Map<String, Object> mapVal = deliveryMapper.getScanIsNot(askGoods);
  293. if(Double.parseDouble(mapVal.get("amount").toString()) - Double.parseDouble(mapVal.get("vitrualNum").toString()) == 0){
  294. map.put("msg", "500");
  295. map.put("errMsg", "已全部出库");
  296. return map;
  297. }
  298. //判断物料是否录入
  299. MaterialClass materialClass = warehousingMapper.getMateriaIsExist(askGoods.getWllbCode());
  300. if(!materialClass.getPartType().equals("产成品")){
  301. Delivery delivery = deliveryMapper.getDeliveryInfo(askGoods); //需求数量、已出数量
  302. String scanNum = deliveryMapper.getScanNumDelivery(askGoods); //单据扫描数量
  303. Inventory inventory = deliveryMapper.getInventoryVal(askGoods.getId());//库存数量
  304. String allScanNum = deliveryMapper.getAllScanNumDelivery(askGoods); //虚拟表此物料占用数量
  305. //剩余出库数量
  306. Double num = Double.parseDouble(delivery.getGsDeliveryNum()) - Double.parseDouble(delivery.getOutNum()) - Double.parseDouble(scanNum);
  307. if(Double.doubleToLongBits(Double.parseDouble(inventory.getAmount()) - Double.parseDouble(allScanNum) - num) >= 0){
  308. askGoods.setNum(num.toString());
  309. } else {
  310. askGoods.setNum((Double.parseDouble(inventory.getAmount()) - Double.parseDouble(allScanNum)) + "");
  311. }
  312. }
  313. askGoodsMapper.addAskGoodsVitrual(askGoods);
  314. map.put("msg", "200");
  315. }catch (Exception e){
  316. map.put("msg", "500");
  317. map.put("errMsg", "服务器请求异常,请稍后再试");
  318. e.printStackTrace();
  319. }
  320. return map;
  321. }
  322. @Override
  323. public Map<String, Object> delDelivery(String id, HttpServletRequest request) {
  324. Map<String, Object> map = new HashMap<>();
  325. try {
  326. String userId = request.getHeader("userId");
  327. Map<String, Object> mapVal = deliveryMapper.getDeliverys(id);
  328. if(Double.parseDouble(mapVal.get("out_num").toString()) > 0){
  329. map.put("msg", "500");
  330. map.put("errMsg", "此单据已出库!");
  331. return map;
  332. }
  333. LogData logData = new LogData()
  334. .setUserId(userId)
  335. .setData(mapVal.toString())
  336. .setType("0")
  337. .setDocumentType("交货单");
  338. dictionaryMapper.addLogdata(logData);
  339. deliveryMapper.delDelivery(id);
  340. map.put("msg", "200");
  341. } catch (Exception e) {
  342. e.printStackTrace();
  343. map.put("msg", "500");
  344. map.put("errMsg", "服务器请求异常,请稍后再试");
  345. }
  346. return map;
  347. }
  348. @Override
  349. public Map<String, Object> getDeliveryCode(Delivery delivery) {
  350. Map<String, Object> map = new HashMap<>();
  351. try {
  352. List<Delivery> list = deliveryMapper.getDeliveryCode(delivery);
  353. map.put("data", list);
  354. map.put("msg", "200");
  355. } catch (Exception e) {
  356. e.printStackTrace();
  357. map.put("msg", "500");
  358. map.put("errMsg", "服务器请求异常,请稍后再试");
  359. }
  360. return map;
  361. }
  362. @Override
  363. public Map<String, Object> getDeliveryName(Delivery delivery) {
  364. Map<String, Object> map = new HashMap<>();
  365. try {
  366. List<String> list = deliveryMapper.getDeliveryProjectName(delivery);
  367. map.put("data", list);
  368. map.put("msg", "200");
  369. } catch (Exception e) {
  370. e.printStackTrace();
  371. map.put("msg", "500");
  372. map.put("errMsg", "服务器请求异常,请稍后再试");
  373. }
  374. return map;
  375. }
  376. @Override
  377. public Map<String, Object> getEquipmentBindingSoftware(EquipmentBindingSoftware equipmentBindingSoftware) {
  378. Map<String, Object> map = new HashMap<>();
  379. try {
  380. PageHelper.startPage(equipmentBindingSoftware.getPage(), equipmentBindingSoftware.getLimit());
  381. PageInfo<EquipmentBindingSoftware> pageInfo = new PageInfo<>(deliveryMapper.getEquipmentBindingSoftware(equipmentBindingSoftware));
  382. map.put("data", pageInfo);
  383. map.put("msg", "200");
  384. } catch (Exception e) {
  385. e.printStackTrace();
  386. map.put("msg", "500");
  387. map.put("errMsg", "服务器请求异常,请稍后再试");
  388. }
  389. return map;
  390. }
  391. @Override
  392. public Map<String, Object> addEquipmentBindingSoftware(EquipmentBindingSoftware equipmentBindingSoftware, HttpServletRequest request) {
  393. Map<String, Object> map = new HashMap<>();
  394. try {
  395. equipmentBindingSoftware.setModifyUser(request.getHeader("userId"));
  396. int count = deliveryMapper.getIsNotBinding(equipmentBindingSoftware);
  397. if(count > 0){
  398. map.put("msg", "500");
  399. map.put("errMsg", "此设备已经绑定过次软件,请勿重复绑定!");
  400. return map;
  401. }
  402. deliveryMapper.addEquipmentBindingSoftware(equipmentBindingSoftware);
  403. map.put("msg", "200");
  404. } catch (Exception e) {
  405. e.printStackTrace();
  406. map.put("msg", "500");
  407. map.put("errMsg", "服务器请求异常,请稍后再试");
  408. }
  409. return map;
  410. }
  411. @Override
  412. public Map<String, Object> updateEquipmentBindingSoftware(EquipmentBindingSoftware equipmentBindingSoftware, HttpServletRequest request) {
  413. Map<String, Object> map = new HashMap<>();
  414. try {
  415. equipmentBindingSoftware.setModifyUser(request.getHeader("userId"));
  416. deliveryMapper.updateEquipmentBindingSoftware(equipmentBindingSoftware);
  417. map.put("msg", "200");
  418. } catch (Exception e) {
  419. e.printStackTrace();
  420. map.put("msg", "500");
  421. map.put("errMsg", "服务器请求异常,请稍后再试");
  422. }
  423. return map;
  424. }
  425. @Override
  426. public Map<String, Object> delEquipmentBindingSoftware(String id) {
  427. Map<String, Object> map = new HashMap<>();
  428. try {
  429. deliveryMapper.delEquipmentBindingSoftware(id);
  430. map.put("msg", "200");
  431. } catch (Exception e) {
  432. e.printStackTrace();
  433. map.put("msg", "500");
  434. map.put("errMsg", "服务器请求异常,请稍后再试");
  435. }
  436. return map;
  437. }
  438. /**
  439. * 出库单生成
  440. * @return
  441. */
  442. public String codeGenerateCk(){
  443. StringBuilder stringBuilder = new StringBuilder("XSCK");
  444. Date date = new Date();
  445. SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
  446. stringBuilder.append(sdf.format(date));
  447. int count = askGoodsMapper.getReturnRemovalCount();
  448. for(int i = 0; i < 4 - (count + "").length(); i++){
  449. stringBuilder.append("0");
  450. }
  451. return (stringBuilder.append(count + 1)).toString();
  452. }
  453. }