AskGoodsServiceImpl.java 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  1. package com.tld.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.github.pagehelper.PageHelper;
  5. import com.github.pagehelper.PageInfo;
  6. import com.tld.excel.ExcelUtils;
  7. import com.tld.mapper.*;
  8. import com.tld.model.*;
  9. import com.tld.model.Error;
  10. import com.tld.service.AskGoodsService;
  11. import com.tld.util.DateUtil;
  12. import com.tld.util.HttpClientUtil;
  13. import org.redisson.api.RLock;
  14. import org.redisson.api.RedissonClient;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Service;
  17. import org.springframework.transaction.annotation.Transactional;
  18. import javax.servlet.http.HttpServletRequest;
  19. import javax.servlet.http.HttpServletResponse;
  20. import java.text.SimpleDateFormat;
  21. import java.util.*;
  22. @Service
  23. public class AskGoodsServiceImpl implements AskGoodsService {
  24. @Autowired
  25. private AskGoodsMapper askGoodsMapper;
  26. //redis锁
  27. @Autowired
  28. private RedissonClient redissonClient;
  29. //入库
  30. @Autowired
  31. private WarehousingMapper warehousingMapper;
  32. @Autowired
  33. private ErrorMapper errorMapper;
  34. @Autowired
  35. private DeliveryMapper deliveryMapper;
  36. @Autowired
  37. private DictionaryMapper dictionaryMapper;
  38. @Override
  39. @Transactional(rollbackFor = Exception.class)
  40. public Map<String, Object> addAskGoods(List<Map<String,Object>> mapList) {
  41. Map<String, Object> map = new HashMap<>();
  42. try{
  43. List<AskGoods> askGoodsList = new LinkedList<AskGoods>();
  44. for(Map<String,Object> jsonMap:mapList) {
  45. List<Map<String, Object>> list = (List) jsonMap.get("datalist");
  46. for (Map<String, Object> element : list) {
  47. AskGoods ag = new AskGoods();
  48. //父表
  49. ag.setAskGoodsId(jsonMap.get("requestOrderId").toString());
  50. ag.setAskGoodsCode(jsonMap.get("requestOrderNo").toString());
  51. ag.setCompanyNumber(jsonMap.get("companyNo").toString());
  52. ag.setSqrq(jsonMap.get("requestDate").toString());//申请日期
  53. ag.setDepartmentId(jsonMap.get("useDepartment").toString());
  54. ag.setSourceType(jsonMap.get("sourceType").toString());
  55. ag.setMoveType(jsonMap.get("moveType").toString());
  56. //子表
  57. ag.setType("0");
  58. ag.setEntryNumber(element.get("entryNumber").toString());
  59. ag.setProductionCode(element.get("prodOrderNo").toString());
  60. ag.setMaterialId(element.get("materialId").toString());
  61. ag.setWbs(element.get("WBS").toString());
  62. ag.setMeasurementId(element.get("measUnitId").toString());
  63. ag.setNum(element.get("orderCount").toString());
  64. askGoodsList.add(ag);
  65. }
  66. }
  67. for(AskGoods askGoods : askGoodsList) {
  68. int count = askGoodsMapper.getAskGoods(askGoods);
  69. if (count != 0) {
  70. askGoodsMapper.updateAskGoodsNum(askGoods);
  71. } else {
  72. if (askGoodsMapper.getAskGoodsf(askGoods) == 0) {
  73. askGoodsMapper.addAskGoodsf(askGoods);
  74. }
  75. askGoodsMapper.addAskGoods(askGoods);
  76. }
  77. askGoodsMapper.addAskGoodsLog(askGoods);
  78. }
  79. //新增日志
  80. Access access = new Access().setType("生产领料信息").setData(JSON.toJSONString(mapList)).setAccessType("0");
  81. dictionaryMapper.addAccess(access);
  82. map.put("status", "0000");
  83. map.put("msg","成功");
  84. }catch (Exception e){
  85. e.printStackTrace();
  86. map.put("status", "0009");
  87. map.put("msg", "服务器请求异常,请稍后再试");
  88. }
  89. return map;
  90. }
  91. @Override
  92. public Map<String, Object> getAskGoodsfList(AskGoods askGoods) {
  93. Map<String, Object> map = new HashMap<>();
  94. try{
  95. List<AskGoods> list = askGoodsMapper.getAskGoodsfList(askGoods);
  96. map.put("data", list);
  97. map.put("msg", "200");
  98. }catch (Exception e){
  99. e.printStackTrace();
  100. map.put("msg", "500");
  101. map.put("errMsg", "失败");
  102. }
  103. return map;
  104. }
  105. @Override
  106. public Map<String, Object> getAskGoodsMaterial(AskGoods askGoods) {
  107. Map<String, Object> map = new HashMap<>();
  108. try{
  109. List<AskGoods> list = askGoodsMapper.getAskGoodsMaterial(askGoods);
  110. List<String> scanNum = new LinkedList<>();
  111. for(AskGoods askGoods1 : list){
  112. askGoods1.setUniqueCode(askGoods.getUniqueCode());
  113. askGoods1.setWllbCode(askGoods1.getMaterialCode());
  114. scanNum.add(askGoodsMapper.getScanNum(askGoods1));//扫描总数
  115. }
  116. map.put("scanNum", scanNum);
  117. map.put("data", list);
  118. map.put("msg", "200");
  119. }catch (Exception e){
  120. e.printStackTrace();
  121. map.put("msg", "500");
  122. map.put("errMsg", "失败");
  123. }
  124. return map;
  125. }
  126. @Override
  127. public Map<String, Object> getMaterialCk(AskGoods askGoods) {
  128. Map<String, Object> map = new HashMap<>();
  129. try{
  130. List<Inventory> list = new LinkedList<>();
  131. for(Inventory inventory : askGoodsMapper.getMaterialCk(askGoods)){
  132. AskGoods askGoods1 = askGoodsMapper.getAsk(inventory);
  133. if(askGoods1 != null){
  134. if(Double.parseDouble(askGoods1.getNum()) != Double.parseDouble(inventory.getAmount())){
  135. list.add(inventory);
  136. }
  137. } else {
  138. list.add(inventory);
  139. }
  140. }
  141. map.put("data", list);
  142. map.put("msg", "200");
  143. }catch (Exception e){
  144. e.printStackTrace();
  145. map.put("msg", "500");
  146. map.put("errMsg", "失败");
  147. }
  148. return map;
  149. }
  150. @Override
  151. @Transactional(rollbackFor = Exception.class)
  152. public Map<String, Object> addAskGoodsVitrual(AskGoods askGoods) {
  153. Map<String, Object> map = new HashMap<>();
  154. //redis并发锁
  155. RLock lock = redissonClient.getLock(askGoods.getUniqueCode());
  156. lock.lock();
  157. try{
  158. Map<String, Object> mapVal = askGoodsMapper.getScanIsNot(askGoods);
  159. if((Double.parseDouble(mapVal.get("inventoryNum").toString()) - Double.parseDouble(mapVal.get("virtualNum").toString())) == 0){
  160. map.put("msg", "500");
  161. map.put("errMsg", "已全部出库");
  162. return map;
  163. }
  164. Inventory inventory = askGoodsMapper.getInventory(askGoods); //库存数量
  165. AskGoods askGoods1 = askGoodsMapper.getAsknInfo(askGoods); //要货单数量
  166. int alreadyNum = askGoodsMapper.getAskInfoNumVitrual(askGoods);//已扫描总数
  167. int inventoryAlready = askGoodsMapper.getInventoryAlready(askGoods);//库存已扫描数量
  168. int inventorySurplus = (Integer.parseInt(inventory.getAmount()) - Integer.parseInt(inventory.getAmountLock())) - inventoryAlready; //库存剩余数量
  169. Double surplusNum = Double.parseDouble(askGoods1.getNum()) - Double.parseDouble(askGoods1.getOutNum()) - alreadyNum; //剩余要扫描数量
  170. if(surplusNum >= inventorySurplus){
  171. askGoods.setNum(String.valueOf(inventorySurplus));
  172. } else {
  173. askGoods.setNum(String.valueOf(surplusNum));
  174. }
  175. askGoods.setStorageLocationCode(inventory.getStorageLocationCode());//库存编号
  176. askGoodsMapper.addAskGoodsVitrual(askGoods);
  177. map.put("msg", "200");
  178. }catch (Exception e){
  179. e.printStackTrace();
  180. map.put("msg", "500");
  181. map.put("errMsg", "失败");
  182. } finally {
  183. //判断要解锁的key是否已被锁定;判断要解锁的key是否被当前线程持有
  184. if (lock.isLocked() && lock.isHeldByCurrentThread()) {
  185. //释放锁
  186. lock.unlock();
  187. }
  188. }
  189. return map;
  190. }
  191. @Override
  192. @Transactional(rollbackFor = Exception.class)
  193. public Map<String, Object> OutOfLibrary(String uniqueCode, String type, String askGoodsId) {
  194. Map<String, Object> map = new HashMap<>();
  195. //redis并发锁
  196. RLock lock = redissonClient.getLock(uniqueCode);
  197. lock.lock();
  198. try{
  199. //出库流水
  200. String removalCode = codeGenerateCk();
  201. List<AskGoods> list = askGoodsMapper.getVirtualUniqueCode(uniqueCode, type, askGoodsId);
  202. for(AskGoods askGoods : list){
  203. askGoods.setStorageCode(removalCode);
  204. askGoods.setCompanyNumber(askGoods.getAccountSleeve());
  205. Inventory inventory = askGoodsMapper.getInventory(askGoods);
  206. if(inventory == null){
  207. throw new Exception("库存不存在");
  208. }
  209. //如果出库库存等于虚拟表库存则删除此库存
  210. if(Double.parseDouble(askGoods.getNum()) == Double.parseDouble(inventory.getAmount())){
  211. askGoodsMapper.deleteInventory(inventory);
  212. } else {
  213. inventory.setAmount(askGoods.getNum());
  214. askGoodsMapper.updateInventory(inventory);
  215. }
  216. String materialId = askGoodsMapper.getMaterialId(askGoods.getWllbCode());//查询物料id
  217. AskGoods askGoods1 = askGoodsMapper.getAskDetailed(askGoodsId, materialId);//查询要料申请单内容
  218. ReturRemoval returRemoval = new ReturRemoval()
  219. .setMaterialId(materialId)
  220. .setDocumentId(askGoodsId)
  221. .setWbs(askGoods1.getWbs())
  222. .setNum(askGoods.getNum())
  223. .setEntryNumber(askGoods1.getEntryNumber())
  224. .setDocumentPointsId(askGoods1.getId())
  225. .setStorageLocationCode(askGoods.getStorageLocationCode());
  226. askGoodsMapper.addRemoval(askGoods);//插入出库流水
  227. askGoodsMapper.deleteVirtual(askGoods.getId());//删除已出虚拟表库存
  228. askGoodsMapper.addReturnGsRemoval(returRemoval);//新增返回gs数据子表信息
  229. askGoodsMapper.updateOutNum(askGoods.getNum(), askGoodsId, materialId);//修改出库数量
  230. }
  231. //查询要货单父级信息
  232. AskGoods askGoods3 = askGoodsMapper.getAskDetailedF(askGoodsId);
  233. ReturRemoval returRemoval1 = new ReturRemoval()
  234. .setDocumentId(askGoods3.getAskGoodsId())
  235. .setRemovalCode(removalCode)
  236. .setSourceType(askGoods3.getSourceType())
  237. .setMoveType(askGoods3.getMoveType());
  238. askGoodsMapper.addReturnGsRemovalF(returRemoval1);//新增返回gs数据父表信息
  239. map.put("data", askGoods3.getAskGoodsId());
  240. map.put("msg", "200");
  241. }catch (Exception e){
  242. e.printStackTrace();
  243. map.put("msg", "500");
  244. map.put("errMsg", "失败");
  245. } finally {
  246. //判断要解锁的key是否已被锁定;判断要解锁的key是否被当前线程持有
  247. if (lock.isLocked() && lock.isHeldByCurrentThread()) {
  248. //释放锁
  249. lock.unlock();
  250. }
  251. }
  252. return map;
  253. }
  254. /**
  255. * 出库回传
  256. * @param removalCode 单据id
  257. */
  258. @Override
  259. @Transactional(rollbackFor = Exception.class)
  260. public void plugOutRemoval(String removalCode) {
  261. try{
  262. JSONObject returnData = new JSONObject();
  263. List<JSONObject> retunList = new LinkedList<>();
  264. for(String warehouseWhere : askGoodsMapper.getWarehouseWhere(removalCode)){
  265. List<Map<String, Object>> mapList = askGoodsMapper.plugOutRemoval(removalCode);
  266. if(mapList.size() >0 ) {
  267. JSONObject strJson = new JSONObject();
  268. //父表
  269. strJson.put("GIReqBillID", mapList.get(0).get("askGoodsId").toString());//要货单id
  270. strJson.put("WMSID", mapList.get(0).get("id").toString());//出库单id
  271. strJson.put("WMSCode", mapList.get(0).get("removalCode").toString());//出库单编号
  272. strJson.put("WareHouse", warehouseWhere);//仓库ID
  273. strJson.put("SourceBillDate",DateUtil.dateConversion(mapList.get(0).get("scrq").toString()));//业务日期
  274. strJson.put("SourceType", mapList.get(0).get("sourceType").toString());//来源类型
  275. strJson.put("MoveType", mapList.get(0).get("moveType").toString());//移动类型
  276. strJson.put("IsRed", 0);//是否红单1
  277. strJson.put("Creator", "测试");//制单人姓名1
  278. //子表
  279. List<JSONObject> list = new LinkedList<>();
  280. for (Map<String, Object> map : askGoodsMapper.getRemovalz(mapList.get(0).get("askGoodsId").toString(), warehouseWhere)) {
  281. JSONObject BillItems = new JSONObject();
  282. BillItems.put("WMSItemID", map.get("id"));//分录ID
  283. BillItems.put("GIReqBillID", map.get("askGoodsId"));//要货申请单ID
  284. BillItems.put("GIReqBillItemID", map.get("entryNumber"));//要货申请明细ID
  285. BillItems.put("Material", map.get("materialId"));//物料id
  286. BillItems.put("Quantity", map.get("num"));//数量
  287. BillItems.put("FlexField1", map.get("wbsId"));//wbs
  288. BillItems.put("FlexField1Code", map.get("wbsCode"));//WBS编号
  289. BillItems.put("FlexField1Name", map.get("wbsName"));//WBS名称
  290. list.add(BillItems);
  291. }
  292. strJson.put("BillItems", list);
  293. retunList.add(strJson);
  294. }
  295. }
  296. JSONObject ReqOutStocks = new JSONObject();
  297. ReqOutStocks.put("ReqOutStocks",retunList);
  298. returnData.put("strJson", JSON.toJSONString(ReqOutStocks));
  299. System.out.println(returnData);
  300. HttpClientUtil httpClientUtil1 = new HttpClientUtil();
  301. Map<String, Object> result = httpClientUtil1.doPost("http://42.159.85.29:52480/cwbase/sg/V1/ERP/TELD/DEVTEST/API_WMS_PurInStock/CreateProductiveOutStock", returnData);
  302. System.out.println("result:"+result);
  303. Error error = new Error();
  304. if(Integer.parseInt(result.get("msg").toString()) != 200){
  305. //如果失败存入报错信息跟数据
  306. error.setErrorInfo(result.get("data").toString());
  307. error.setUrl("http://42.159.85.29:52480/cwbase/sg/V1/ERP/TELD/DEVTEST/API_WMS_PurInStock/CreateProductiveOutStock");
  308. error.setDataVal(returnData.toJSONString());
  309. errorMapper.addError(error);
  310. }else {
  311. JSONObject jsonObject = (JSONObject) JSONObject.parse(result.get("data").toString());
  312. JSONObject jsonObject1 = (JSONObject) JSONObject.parse(jsonObject.get("result").toString());
  313. if ( jsonObject1.get("State").toString().equals("0") ){
  314. //如果失败存入报错信息跟数据
  315. error.setErrorInfo(jsonObject1.get("Msg").toString());
  316. error.setUrl("http://42.159.85.29:52480/cwbase/sg/V1/ERP/TELD/DEVTEST/API_WMS_PurInStock/CreateProductiveOutStock");
  317. error.setDataVal(returnData.toJSONString());
  318. errorMapper.addError(error);
  319. }else {
  320. List<JSONObject> data1 = (List<JSONObject>) JSONObject.parse(jsonObject1.get("data").toString());
  321. for (JSONObject map : data1) {
  322. if (map.get("State").toString().equals("0")){
  323. for(JSONObject jsonObject2 : retunList){
  324. if(jsonObject2.get("WMSCode").toString().equals(map.get("WMSCode")) && jsonObject2.get("WareHouse").toString().equals(map.get("WareHouse"))){
  325. //如果失败存入报错信息跟数据
  326. error.setErrorInfo(map.get("FailReason").toString());
  327. error.setUrl("http://42.159.85.29:52480/cwbase/sg/V1/ERP/TELD/DEVTEST/API_WMS_PurInStock/CreateProductiveOutStock");
  328. error.setDataVal(jsonObject2.toString());
  329. errorMapper.addError(error);
  330. }
  331. }
  332. }
  333. }
  334. }
  335. }
  336. //删除父子表信息
  337. askGoodsMapper.delPlugOutRemoval(removalCode);
  338. askGoodsMapper.delRemovalz(removalCode);
  339. //添加记录到tld_access
  340. String names = "出库回传" ;
  341. String accessType = "1" ;
  342. String returnGsRemoval = returnData.toString() ;
  343. askGoodsMapper.addAccess(names,returnGsRemoval,accessType);
  344. }catch (Exception e){
  345. e.printStackTrace();
  346. }
  347. }
  348. @Override
  349. public Map<String, Object> getRemoval(AskGoods askGoods) {
  350. Map<String, Object> map = new HashMap<>();
  351. try{
  352. //查询数据
  353. PageHelper.startPage(askGoods.getPage(), askGoods.getLimit());
  354. PageInfo<AskGoods> list = new PageInfo<>(askGoodsMapper.getRemoval(askGoods));
  355. map.put("data", list);
  356. map.put("msg", "200");
  357. }catch (Exception e){
  358. e.printStackTrace();
  359. map.put("msg", "500");
  360. map.put("errMsg", "失败");
  361. }
  362. return map;
  363. }
  364. @Override
  365. public void export(AskGoods askGoods, HttpServletResponse response) {
  366. try{
  367. //导出数据汇总
  368. List<List<Object>> sheetDataList = new ArrayList<>();
  369. //表头数据
  370. List<Object> head = Arrays.asList("物料名称", "供应商名称", "连番号", "类型", "出库用户", "领用部门", "库位名称", "出库日期", "出库数量");
  371. //查询数据
  372. List<Map<String, Object>> list = askGoodsMapper.export(askGoods);
  373. sheetDataList.add(head);
  374. for(Map<String, Object> userMap : list){
  375. List<Object> listSheet = new ArrayList<>();
  376. for(String key: userMap.keySet()){
  377. listSheet.add(userMap.get(key));
  378. }
  379. sheetDataList.add(listSheet);
  380. }
  381. //当前时间
  382. Date time = new Date();
  383. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMddHHmmss");
  384. ExcelUtils.export(response, "出库流水数据导出" + sdf.format(time), sheetDataList);
  385. }catch (Exception e){
  386. e.printStackTrace();
  387. }
  388. }
  389. @Override
  390. public Map<String, Object> getAskGoodsVitrual(String uniqueCode, String type) {
  391. Map<String, Object> map = new HashMap<>();
  392. try{
  393. List<AskGoods> list = askGoodsMapper.getAskGoodsVitrual(uniqueCode, type);
  394. map.put("data", list);
  395. map.put("msg", "200");
  396. }catch (Exception e){
  397. e.printStackTrace();
  398. map.put("msg", "500");
  399. map.put("errMsg", "失败");
  400. }
  401. return map;
  402. }
  403. @Override
  404. @Transactional(rollbackFor = Exception.class)
  405. public Map<String, Object> delAskGoodsVitrual(String id, String type) {
  406. Map<String, Object> map = new HashMap<>();
  407. try{
  408. askGoodsMapper.delAskGoodsVitrual(id, type);
  409. map.put("msg", "200");
  410. }catch (Exception e){
  411. e.printStackTrace();
  412. map.put("msg", "500");
  413. map.put("errMsg", "失败");
  414. }
  415. return map;
  416. }
  417. @Override
  418. public Map<String, Object> getGoodsHalf(AskGoods askGoods) {
  419. Map<String, Object> map = new HashMap<>();
  420. try{
  421. //查询数据
  422. PageHelper.startPage(askGoods.getPage(), askGoods.getLimit());
  423. PageInfo<AskGoods> list = new PageInfo<>(askGoodsMapper.getGoodsHalf(askGoods));
  424. map.put("data", list);
  425. map.put("msg", "200");
  426. }catch (Exception e){
  427. e.printStackTrace();
  428. map.put("msg", "500");
  429. map.put("errMsg", "失败");
  430. }
  431. return map;
  432. }
  433. @Override
  434. public Map<String, Object> getRemovalHalfProduct(AskGoods askGoods) {
  435. Map<String, Object> map = new HashMap<>();
  436. try{
  437. //查询数据
  438. PageHelper.startPage(askGoods.getPage(), askGoods.getLimit());
  439. PageInfo<AskGoods> list = new PageInfo<>(askGoodsMapper.getRemovalHalfProduct(askGoods));
  440. map.put("data", list);
  441. map.put("msg", "200");
  442. }catch (Exception e){
  443. e.printStackTrace();
  444. map.put("msg", "500");
  445. map.put("errMsg", "失败");
  446. }
  447. return map;
  448. }
  449. @Override
  450. public void getRemovalHalfProductExcel(AskGoods askGoods, HttpServletResponse response) {
  451. try{
  452. //导出数据汇总
  453. List<List<Object>> sheetDataList = new ArrayList<>();
  454. //表头数据
  455. List<Object> head = Arrays.asList("物料名称", "出库数量", "用户名称", "出库时间", "要货单ID", "领用部门", "出库单编号", "WBS");
  456. //查询数据
  457. List<Map<String, Object>> list = askGoodsMapper.getRemovalHalfProductExcel(askGoods);
  458. sheetDataList.add(head);
  459. for(Map<String, Object> userMap : list){
  460. List<Object> listSheet = new ArrayList<>();
  461. for(String key: userMap.keySet()){
  462. listSheet.add(userMap.get(key));
  463. }
  464. sheetDataList.add(listSheet);
  465. }
  466. //当前时间
  467. Date time = new Date();
  468. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMddHHmmss");
  469. ExcelUtils.export(response, "半成品出库流水数据导出" + sdf.format(time), sheetDataList);
  470. }catch (Exception e){
  471. e.printStackTrace();
  472. }
  473. }
  474. @Override
  475. public Map<String, Object> getRemovalHalf(AskGoods askGoods) {
  476. Map<String, Object> map = new HashMap<>();
  477. try{
  478. //查询数据
  479. PageHelper.startPage(askGoods.getPage(), askGoods.getLimit());
  480. PageInfo<AskGoods> list = new PageInfo<>(askGoodsMapper.getRemovalHalf(askGoods));
  481. map.put("data", list);
  482. map.put("msg", "200");
  483. }catch (Exception e){
  484. e.printStackTrace();
  485. map.put("msg", "500");
  486. map.put("errMsg", "失败");
  487. }
  488. return map;
  489. }
  490. @Override
  491. public void getRemovalHalfExcel(AskGoods askGoods, HttpServletResponse response) {
  492. try{
  493. //导出数据汇总
  494. List<List<Object>> sheetDataList = new ArrayList<>();
  495. //表头数据
  496. List<Object> head = Arrays.asList("物料名称", "出库数量", "用户名称", "出库时间", "公司名称", "客户名称", "出库单编号", "WBS");
  497. //查询数据
  498. List<Map<String, Object>> list = askGoodsMapper.getRemovalHalfExcel(askGoods);
  499. sheetDataList.add(head);
  500. for(Map<String, Object> userMap : list){
  501. List<Object> listSheet = new ArrayList<>();
  502. for(String key: userMap.keySet()){
  503. listSheet.add(userMap.get(key));
  504. }
  505. sheetDataList.add(listSheet);
  506. }
  507. //当前时间
  508. Date time = new Date();
  509. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMddHHmmss");
  510. ExcelUtils.export(response, "产成品出库流水数据导出" + sdf.format(time), sheetDataList);
  511. }catch (Exception e){
  512. e.printStackTrace();
  513. }
  514. }
  515. @Override
  516. public Map<String, Object> otherAskGoods(AskGoods askGoods) {
  517. Map<String, Object> map = new HashMap<>();
  518. //redis并发锁
  519. RLock lock = redissonClient.getLock(askGoods.getWllbCode() + askGoods.getStorageLocationCode());
  520. lock.lock();
  521. try{
  522. //查询物料信息
  523. MaterialClass material = warehousingMapper.getMaterial(new Notice().setMaterialCode(askGoods.getWllbCode()));
  524. if(material.getPartType().equals("原材料")){
  525. if(askGoods.getSerial() == null) {
  526. map.put("msg", "500");
  527. map.put("errMsg", "此物料是" + material.getPartType() + "连番号参数不能为空!");
  528. return map;
  529. }
  530. } else if(material.getPartType().equals("产成品")) {
  531. if(askGoods.getAttribute() == null) {
  532. map.put("msg", "500");
  533. map.put("errMsg", "此物料是" + material.getPartType() + "属性参数不能为空!");
  534. return map;
  535. }
  536. } else if(material.getPartType().equals("半成品")) {
  537. askGoods.setProducDate(null);
  538. if(askGoods.getStorageLocationCode() == null) {
  539. map.put("msg", "500");
  540. map.put("errMsg", "此物料是" + material.getPartType() + "库位参数不能为空!");
  541. return map;
  542. }
  543. }
  544. askGoods.setMaterialId(material.getTldId());
  545. //查询库存
  546. List<Inventory> inventory = askGoodsMapper.getInventoryInfo(askGoods);
  547. if(inventory.size() == 0){
  548. map.put("msg", "500");
  549. map.put("errMsg", "未查询到该库位的库存");
  550. return map;
  551. }
  552. if(Integer.parseInt(inventory.get(0).getAmount()) < Integer.parseInt(askGoods.getNum())){
  553. map.put("msg", "500");
  554. map.put("errMsg", "库存数量不足");
  555. return map;
  556. }
  557. //如果出库库存等于虚拟表库存则删除此库存
  558. if(Integer.parseInt(askGoods.getNum()) == Integer.parseInt(inventory.get(0).getAmount())){
  559. askGoodsMapper.deleteInventory(inventory.get(0));
  560. } else {
  561. inventory.get(0).setAmount(askGoods.getNum());
  562. askGoodsMapper.updateInventory(inventory.get(0));
  563. }
  564. String removalCode = codeGenerateCk();
  565. if(material.getPartType().equals("半成品")){
  566. //新增半成品出库流水
  567. AskGoods askGoods1 = new AskGoods()
  568. .setWllbCode(material.getWllbCode())
  569. .setNum(askGoods.getNum())
  570. .setUserId(askGoods.getUserId())
  571. .setAskGoodsId("")
  572. .setDepartment(askGoods.getDepartment())
  573. .setWbs(askGoods.getWbs())
  574. .setStorageCode(removalCode)
  575. .setStorageLocationCode(askGoods.getStorageLocationCode());//新增出库流水
  576. warehousingMapper.addRemovalHalfProduct(askGoods1);
  577. } else if(material.getPartType().equals("产成品")){
  578. //产成品销售流水
  579. Delivery delivery1 = new Delivery()
  580. .setMaterialCode(material.getWllbCode()) //物料code
  581. .setOutNum(askGoods.getNum()) //出库数量
  582. .setUserId(askGoods.getUserId()) //用户id
  583. .setDeliveryId("") //销售单id
  584. .setCompanyNumber("") //公司编号
  585. .setCustomerCode("")//客户编号
  586. .setWbs(askGoods.getWbs())
  587. .setStorageCode(removalCode);
  588. deliveryMapper.addRemovalHalf(delivery1); //流水录入
  589. } else {
  590. askGoods.setSupplierId(inventory.get(0).getSupplierId());
  591. askGoods.setType("其他出库");
  592. askGoods.setProducDate(inventory.get(0).getProducDate());
  593. askGoods.setSerial(inventory.get(0).getSerial());
  594. askGoods.setStorageCode(removalCode);
  595. askGoods.setWbs(askGoods.getWbs());
  596. askGoodsMapper.addRemoval(askGoods);//插入出库流水
  597. }
  598. //新增返回gs信息
  599. ReturRemoval returRemoval = new ReturRemoval()
  600. .setMaterialId(material.getTldId())
  601. .setWbs(askGoods.getWbs())
  602. .setNum(askGoods.getNum())
  603. .setStorageLocationCode(inventory.get(0).getStorageLocationCode())
  604. .setRemovalCode(removalCode)
  605. .setSourceType("0")
  606. .setMoveType("209")
  607. .setDocumentId(removalCode)
  608. .setDocumentPointsId(removalCode);
  609. askGoodsMapper.addReturnGsRemovalF(returRemoval);//新增返回gs数据父表信息
  610. askGoodsMapper.addReturnGsRemoval(returRemoval);//新增返回gs数据子表信息
  611. map.put("data", removalCode);
  612. map.put("msg", "200");
  613. }catch (Exception e){
  614. map.put("msg", "500");
  615. map.put("errMsg", "失败");
  616. e.printStackTrace();
  617. } finally {
  618. //判断要解锁的key是否已被锁定;判断要解锁的key是否被当前线程持有
  619. if (lock.isLocked() && lock.isHeldByCurrentThread()) {
  620. //释放锁
  621. lock.unlock();
  622. }
  623. }
  624. return map;
  625. }
  626. @Override
  627. @Transactional(rollbackFor = Exception.class)
  628. public Map<String, Object> delAskGoods(String id, HttpServletRequest request) {
  629. Map<String, Object> map = new HashMap<>();
  630. try{
  631. String userId = request.getHeader("userId");
  632. Map<String, Object> mapVal = askGoodsMapper.getDelAskGoods(id);
  633. if(Double.parseDouble(mapVal.get("out_num").toString()) > 0){
  634. map.put("msg", "500");
  635. map.put("errMsg", "此单据已出库!");
  636. return map;
  637. }
  638. LogData logData = new LogData()
  639. .setUserId(userId)
  640. .setData(mapVal.toString())
  641. .setType("0")
  642. .setDocumentType("生产领料");
  643. dictionaryMapper.addLogdata(logData);
  644. askGoodsMapper.delAskGoods(id);
  645. map.put("msg","200");
  646. } catch (Exception e) {
  647. e.printStackTrace();
  648. map.put("msg", "500");
  649. map.put("errMsg", "服务器请求异常,请稍后再试");
  650. }
  651. return map;
  652. }
  653. /**
  654. * 销售发货单接口
  655. * @return
  656. */
  657. @Override
  658. public void CreateBOLOutStock(String removalCode) {
  659. try{
  660. JSONObject returnData = new JSONObject();
  661. List<JSONObject> retunList = new LinkedList<>();
  662. for(String warehouseWhere : askGoodsMapper.getWarehouseWhere(removalCode)){
  663. List<Map<String, Object>> mapList = askGoodsMapper.getGsRemoval(removalCode);
  664. if(mapList.size() >0 ) {
  665. JSONObject strJson = new JSONObject();
  666. //父表
  667. strJson.put("BOLID", mapList.get(0).get("askGoodsId").toString());//要货单id
  668. strJson.put("WMSID", mapList.get(0).get("id").toString());//出库单id
  669. strJson.put("WMSCode", mapList.get(0).get("removalCode").toString());//出库单编号
  670. strJson.put("WareHouse", warehouseWhere);//仓库ID
  671. strJson.put("SourceBillDate",DateUtil.dateConversion(mapList.get(0).get("scrq").toString()));//业务日期
  672. strJson.put("SourceType", mapList.get(0).get("sourceType").toString());//来源类型
  673. strJson.put("MoveType", mapList.get(0).get("moveType").toString());//移动类型
  674. strJson.put("IsRed", 0);//是否红单1
  675. strJson.put("Creator", "测试");//制单人姓名1
  676. //子表
  677. List<JSONObject> list = new LinkedList<>();
  678. for (Map<String, Object> map : askGoodsMapper.getRemovalz(mapList.get(0).get("askGoodsId").toString(), warehouseWhere)) {
  679. JSONObject BillItems = new JSONObject();
  680. BillItems.put("WMSItemID", map.get("id"));//分录ID
  681. BillItems.put("BOLID", map.get("askGoodsId"));//要货申请单ID
  682. BillItems.put("BOLItemID", map.get("entryNumber"));//要货申请明细ID
  683. BillItems.put("Material", map.get("materialId"));//物料id
  684. BillItems.put("Quantity", map.get("num"));//数量
  685. BillItems.put("FlexField1", map.get("wbsId"));//wbs
  686. BillItems.put("FlexField1Code", map.get("wbsCode"));//WBS编号
  687. BillItems.put("FlexField1Name", map.get("wbsName"));//WBS名称
  688. list.add(BillItems);
  689. }
  690. strJson.put("BillItems", list);
  691. retunList.add(strJson);
  692. }
  693. }
  694. JSONObject ReqOutStocks = new JSONObject();
  695. ReqOutStocks.put("BILLs",retunList);
  696. returnData.put("strJson", JSON.toJSONString(ReqOutStocks));
  697. System.out.println(returnData);
  698. HttpClientUtil httpClientUtil1 = new HttpClientUtil();
  699. Map<String, Object> result = httpClientUtil1.doPost("http://42.159.85.29:52480/cwbase/sg/V1/ERP/TELD/DEVTEST/API_WMS_PurInStock/CreateBOLOutStock", returnData);
  700. System.out.println("result:"+result);
  701. Error error = new Error();
  702. if(Integer.parseInt(result.get("msg").toString()) != 200){
  703. //如果失败存入报错信息跟数据
  704. error.setErrorInfo(result.get("data").toString());
  705. error.setUrl("http://42.159.85.29:52480/cwbase/sg/V1/ERP/TELD/DEVTEST/API_WMS_PurInStock/CreateBOLOutStock");
  706. error.setDataVal(returnData.toJSONString());
  707. errorMapper.addError(error);
  708. }else {
  709. JSONObject jsonObject = (JSONObject) JSONObject.parse(result.get("data").toString());
  710. JSONObject jsonObject1 = (JSONObject) JSONObject.parse(jsonObject.get("result").toString());
  711. if ( jsonObject1.get("State").toString().equals("0") ){
  712. //如果失败存入报错信息跟数据
  713. error.setErrorInfo(jsonObject1.get("Msg").toString());
  714. error.setUrl("http://42.159.85.29:52480/cwbase/sg/V1/ERP/TELD/DEVTEST/API_WMS_PurInStock/CreateBOLOutStock");
  715. error.setDataVal(returnData.toJSONString());
  716. errorMapper.addError(error);
  717. }else {
  718. List<JSONObject> data1 = (List<JSONObject>) JSONObject.parse(jsonObject1.get("data").toString());
  719. for (JSONObject map : data1) {
  720. if (map.get("State").toString().equals("0")){
  721. for(JSONObject jsonObject2 : retunList){
  722. if(jsonObject2.get("WMSCode").toString().equals(map.get("WMSCode")) && jsonObject2.get("WareHouse").toString().equals(map.get("WareHouse"))){
  723. //如果失败存入报错信息跟数据
  724. error.setErrorInfo(map.get("FailReason").toString());
  725. error.setUrl("http://42.159.85.29:52480/cwbase/sg/V1/ERP/TELD/DEVTEST/API_WMS_PurInStock/CreateProductiveOutStock");
  726. error.setDataVal(jsonObject2.toString());
  727. errorMapper.addError(error);
  728. }
  729. }
  730. }
  731. }
  732. }
  733. }
  734. //删除父子表信息
  735. askGoodsMapper.delPlugOutRemoval(removalCode);
  736. askGoodsMapper.delRemovalz(removalCode);
  737. //添加记录到tld_access
  738. String names = "出库回传" ;
  739. String accessType = "1" ;
  740. String returnGsRemoval = returnData.toString() ;
  741. askGoodsMapper.addAccess(names,returnGsRemoval,accessType);
  742. }catch (Exception e){
  743. e.printStackTrace();
  744. }
  745. }
  746. @Override
  747. public Map<String, Object> addWarehouseTransferVitrual(AskGoods askGoods) {
  748. Map<String, Object> map = new HashMap<>();
  749. //redis并发锁
  750. RLock lock = redissonClient.getLock(askGoods.getUniqueCode());
  751. lock.lock();
  752. try{
  753. Map<String, Object> mapVal = askGoodsMapper.getScanIsNot(askGoods);
  754. if((Double.parseDouble(mapVal.get("inventoryNum").toString()) - Double.parseDouble(mapVal.get("virtualNum").toString())) == 0){
  755. map.put("msg", "500");
  756. map.put("errMsg", "已全部出库");
  757. return map;
  758. }
  759. Inventory inventory = askGoodsMapper.getInventory(askGoods); //库存数量
  760. AskGoods askGoods1 = askGoodsMapper.getWareInfo(askGoods); //要货单数量
  761. int alreadyNum = askGoodsMapper.getAskInfoNumVitrual(askGoods);//已扫描总数
  762. int inventoryAlready = askGoodsMapper.getInventoryAlready(askGoods);//库存已扫描数量
  763. int inventorySurplus = (Integer.parseInt(inventory.getAmount()) - Integer.parseInt(inventory.getAmountLock())) - inventoryAlready; //库存剩余数量
  764. Double surplusNum = Double.parseDouble(askGoods1.getNum()) - Double.parseDouble(askGoods1.getOutNum()) - alreadyNum; //剩余要扫描数量
  765. if(surplusNum >= inventorySurplus){
  766. askGoods.setNum(String.valueOf(inventorySurplus));
  767. } else {
  768. askGoods.setNum(String.valueOf(surplusNum));
  769. }
  770. askGoods.setStorageLocationCode(inventory.getStorageLocationCode());//库存编号
  771. askGoodsMapper.addAskGoodsVitrual(askGoods);
  772. map.put("msg", "200");
  773. }catch (Exception e){
  774. e.printStackTrace();
  775. map.put("msg", "500");
  776. map.put("errMsg", "失败");
  777. }finally {
  778. //判断要解锁的key是否已被锁定;判断要解锁的key是否被当前线程持有
  779. if (lock.isLocked() && lock.isHeldByCurrentThread()) {
  780. //释放锁
  781. lock.unlock();
  782. }
  783. }
  784. return map;
  785. }
  786. /**
  787. *移库单接口文档
  788. */
  789. @Override
  790. public void CreateGMReqOutStock(String removalCode) {
  791. try {
  792. JSONObject returnData = new JSONObject();
  793. List<JSONObject> retunList = new LinkedList<>();
  794. //通过code查询id
  795. String warehouseTransferTd = askGoodsMapper.getSupplyWarehouseWheres(removalCode);
  796. //根据id查询子表的供货仓库
  797. for (String warehouseWhere : askGoodsMapper.getSupplyWarehouseWhere(warehouseTransferTd)) {
  798. //查询父表信息
  799. List<Map<String, Object>> mapList = askGoodsMapper.getReturnWarehouseTransfer(removalCode);
  800. if (mapList.size() > 0) {
  801. JSONObject strJson = new JSONObject();
  802. //父表
  803. strJson.put("GMReqBillID", mapList.get(0).get("warehouseTransferId").toString());//移库通知ID
  804. strJson.put("WMSID", mapList.get(0).get("id").toString());//利道WMS出库单id
  805. strJson.put("WMSCode", mapList.get(0).get("warehouseTransferCode").toString());//利道WMS出库单编号
  806. strJson.put("TOWareHouse", mapList.get(0).get("askGoodsWarehouseId").toString());//要货仓库ID
  807. strJson.put("FromWareHouse", warehouseWhere);//供货仓库ID
  808. strJson.put("SourceBillDate", DateUtil.dateConversion(mapList.get(0).get("scrq").toString()));//业务日期
  809. strJson.put("MoveType", mapList.get(0).get("warehouseTransferType").toString());//移动类型
  810. strJson.put("IsRed", 0);//是否红单1
  811. strJson.put("Creator", "测试");//制单人姓名1
  812. //子表
  813. List<JSONObject> list = new LinkedList<>();
  814. for (Map<String, Object> map : askGoodsMapper.getReturnWarehouseTransferZ(mapList.get(0).get("warehouseTransferId").toString(), warehouseWhere)) {
  815. JSONObject BillItems = new JSONObject();
  816. BillItems.put("WMSItemID", map.get("id"));//分录ID
  817. BillItems.put("GMReqBillID", map.get("warehouseTransferId"));//移库通知单ID
  818. BillItems.put("GMReqBillItemID", map.get("entryNumber"));//移库通知明细ID
  819. BillItems.put("Material", map.get("materialId"));//物料id
  820. BillItems.put("Quantity", map.get("outNum"));//数量
  821. BillItems.put("FlexField1", map.get("wbsId"));//wbs
  822. BillItems.put("FlexField1Code", map.get("wbsCode"));//WBS编号
  823. BillItems.put("FlexField1Name", map.get("wbsName"));//WBS名称
  824. list.add(BillItems);
  825. }
  826. strJson.put("BillItems", list);
  827. retunList.add(strJson);
  828. }
  829. }
  830. JSONObject ReqOutStocks = new JSONObject();
  831. ReqOutStocks.put("BILLs", retunList);
  832. List<JSONObject> retunList1 = new LinkedList<>();
  833. returnData.put("strJson", JSON.toJSONString(ReqOutStocks));
  834. System.out.println(returnData);
  835. HttpClientUtil httpClientUtil1 = new HttpClientUtil();
  836. Map<String, Object> result = httpClientUtil1.doPost("http://42.159.85.29:52480/cwbase/sg/V1/ERP/TELD/DEVTEST/API_WMS_PurInStock/CreateGMReqOutStock", returnData);
  837. System.out.println("result:" + result);
  838. Error error = new Error();
  839. if (Integer.parseInt(result.get("msg").toString()) != 200) {
  840. //如果失败存入报错信息跟数据
  841. error.setErrorInfo(result.get("data").toString());
  842. error.setUrl("http://42.159.85.29:52480/cwbase/sg/V1/ERP/TELD/DEVTEST/API_WMS_PurInStock/CreateGMReqOutStock");
  843. error.setDataVal(returnData.toJSONString());
  844. errorMapper.addError(error);
  845. } else {
  846. JSONObject jsonObject = (JSONObject) JSONObject.parse(result.get("data").toString());
  847. JSONObject jsonObject1 = (JSONObject) JSONObject.parse(jsonObject.get("result").toString());
  848. if (jsonObject1.get("State").toString().equals("0")) {
  849. //如果失败存入报错信息跟数据
  850. error.setErrorInfo(jsonObject1.get("Msg").toString());
  851. error.setUrl("http://42.159.85.29:52480/cwbase/sg/V1/ERP/TELD/DEVTEST/API_WMS_PurInStock/CreateGMReqOutStock");
  852. error.setDataVal(returnData.toJSONString());
  853. errorMapper.addError(error);
  854. } else {
  855. List<JSONObject> data1 = (List<JSONObject>) JSONObject.parse(jsonObject1.get("data").toString());
  856. for (JSONObject map : data1) {
  857. if (map.get("State").toString().equals("0")) {
  858. for (JSONObject jsonObject2 : retunList) {
  859. if (jsonObject2.get("WMSCode").toString().equals(map.get("WMSCode")) && jsonObject2.get("FromWareHouse").toString().equals(map.get("FromWareHouse"))) {
  860. //如果失败存入报错信息跟数据
  861. error.setErrorInfo(map.get("FailReason").toString());
  862. error.setUrl("http://42.159.85.29:52480/cwbase/sg/V1/ERP/TELD/DEVTEST/API_WMS_PurInStock/CreateGMReqOutStock");
  863. error.setDataVal(jsonObject2.toString());
  864. errorMapper.addError(error);
  865. }
  866. }
  867. }
  868. }
  869. }
  870. }
  871. //删除父子表信息
  872. //根据code
  873. // askGoodsMapper.delReturnWarehouseTransfer(removalCode);
  874. // //根据id
  875. // askGoodsMapper.delReturnWarehouseTransferZ(warehouseTransferTd);
  876. //添加记录到tld_access
  877. String names = "出库回传";
  878. String accessType = "1";
  879. String returnGsRemoval = returnData.toString();
  880. askGoodsMapper.addAccess(names, returnGsRemoval, accessType);
  881. } catch (Exception e) {
  882. e.printStackTrace();
  883. }
  884. }
  885. /**
  886. * 出库单生成
  887. * @return
  888. */
  889. public String codeGenerateCk(){
  890. StringBuilder stringBuilder = new StringBuilder("CK");
  891. Date date = new Date();
  892. SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
  893. stringBuilder.append(sdf.format(date));
  894. int count = askGoodsMapper.getReturnRemovalCount();
  895. for(int i = 0; i < 4 - (count + "").length(); i++){
  896. stringBuilder.append("0");
  897. }
  898. return (stringBuilder.append(count + 1)).toString();
  899. }
  900. }