TWarehouseServiceImpl.java 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973
  1. package com.ruoyi.basicData.service.impl;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  5. import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
  6. import com.ruoyi.basicData.domain.TCorps;
  7. import com.ruoyi.basicData.domain.TCustomerContact;
  8. import com.ruoyi.basicData.domain.TWarehouseArea;
  9. import com.ruoyi.basicData.mapper.TCorpsMapper;
  10. import com.ruoyi.basicData.mapper.TCustomerContactMapper;
  11. import com.ruoyi.basicData.mapper.TWarehouseAreaMapper;
  12. import com.ruoyi.basicData.mapper.TWarehouseMapper;
  13. import com.ruoyi.basicData.service.ITWarehouseService;
  14. import com.ruoyi.common.constant.UserConstants;
  15. import com.ruoyi.common.core.domain.AjaxResult;
  16. import com.ruoyi.common.core.domain.TreeSelect;
  17. import com.ruoyi.common.core.domain.entity.SysUser;
  18. import com.ruoyi.common.core.domain.entity.TWarehouse;
  19. import com.ruoyi.common.core.domain.model.LoginUser;
  20. import com.ruoyi.common.exception.CustomException;
  21. import com.ruoyi.common.utils.DateUtils;
  22. import com.ruoyi.common.utils.SecurityUtils;
  23. import com.ruoyi.common.utils.StringUtils;
  24. import com.ruoyi.system.mapper.TWarehouseUserMapper;
  25. import com.ruoyi.system.service.ISysDictDataService;
  26. import com.ruoyi.warehouseBusiness.domain.TAnnex;
  27. import com.ruoyi.warehouseBusiness.domain.TWarehouseBills;
  28. import com.ruoyi.warehouseBusiness.domain.dto.WarehouseSubmitDTO;
  29. import com.ruoyi.warehouseBusiness.domain.enums.AnnexActEnum;
  30. import com.ruoyi.warehouseBusiness.domain.vo.WarehouseInfoVO;
  31. import com.ruoyi.warehouseBusiness.mapper.TAnnexMapper;
  32. import com.ruoyi.warehouseBusiness.mapper.TWarehouseBillsMapper;
  33. import com.ruoyi.warehouseBusiness.request.InventoryQueryRequest;
  34. import com.ruoyi.warehouseBusiness.response.InventoryQueryResponse;
  35. import com.ruoyi.warehouseBusiness.response.InventoryQueryTwoResponse;
  36. import com.ruoyi.warehouseBusiness.service.impl.BillnoSerialServiceImpl;
  37. import org.springframework.beans.BeanUtils;
  38. import org.springframework.beans.factory.annotation.Autowired;
  39. import org.springframework.stereotype.Service;
  40. import org.springframework.transaction.annotation.Transactional;
  41. import org.springframework.transaction.interceptor.TransactionAspectSupport;
  42. import java.math.BigDecimal;
  43. import java.text.SimpleDateFormat;
  44. import java.util.*;
  45. import java.util.stream.Collectors;
  46. /**
  47. * 仓库Service业务层处理
  48. *
  49. * @author ruoyi
  50. * @date 2020-12-11
  51. */
  52. @Service
  53. public class TWarehouseServiceImpl implements ITWarehouseService {
  54. @Autowired
  55. private TAnnexMapper annexMapper;
  56. @Autowired
  57. private TWarehouseMapper tWarehouseMapper;
  58. @Autowired
  59. private TWarehouseAreaMapper tWarehouseAreaMapper;
  60. @Autowired
  61. private TWarehouseBillsMapper tWarehouseBillsMapper;
  62. @Autowired
  63. private TCustomerContactMapper customerContactMapper;
  64. @Autowired
  65. private TCorpsMapper tCorpsMapper;
  66. @Autowired
  67. private BillnoSerialServiceImpl billnoSerialServiceImpl;
  68. @Autowired
  69. private ISysDictDataService sysDictDataService;
  70. @Autowired
  71. private TWarehouseUserMapper tWarehouseUserMapper;
  72. /**
  73. * 查询仓库
  74. *
  75. * @param fId 仓库ID
  76. * @return 仓库
  77. */
  78. @Override
  79. public WarehouseInfoVO selectTWarehouseById(Long fId) {
  80. WarehouseInfoVO warehouseInfoVO = new WarehouseInfoVO();
  81. TWarehouse tWarehouse = tWarehouseMapper.selectTWarehouseById(fId);
  82. if (Objects.nonNull(tWarehouse)) {
  83. BeanUtils.copyProperties(tWarehouse, warehouseInfoVO);
  84. TAnnex annex = new TAnnex();
  85. annex.setfPid(fId);
  86. annex.setfActid(AnnexActEnum.WAREHOUSE.getType());
  87. List<TAnnex> annexList = annexMapper.selectTAnnexList(annex);
  88. warehouseInfoVO.setAnnexList(annexList);
  89. }
  90. return warehouseInfoVO;
  91. }
  92. @Override
  93. public Map<String, Object> selectTWarehouseById1(Long fId) {
  94. Map<String, Object> map = new HashMap<>();
  95. TWarehouse tWarehouse = tWarehouseMapper.selectTWarehouseById(fId);
  96. if (StringUtils.isNotNull(tWarehouse)) {
  97. map.put("tWarehouse", tWarehouse);
  98. }
  99. TWarehouseArea tWarehouseArea = new TWarehouseArea();
  100. tWarehouseArea.setfWarehouseid(fId);
  101. List<TWarehouseArea> tWarehouseAreaList = tWarehouseAreaMapper.selectTWarehouseAreaList(tWarehouseArea);
  102. if (StringUtils.isNotEmpty(tWarehouseAreaList)) {
  103. map.put("tWarehouseArea", tWarehouseAreaList);
  104. }
  105. return map;
  106. }
  107. /**
  108. * 查询仓库列表
  109. *
  110. * @param tWarehouse 仓库
  111. * @return 仓库
  112. */
  113. @Override
  114. public List<TWarehouse> selectTWarehouseList(TWarehouse tWarehouse) {
  115. List<TWarehouse> list = tWarehouseMapper.selectTWarehouseList(tWarehouse);
  116. return list;
  117. }
  118. /**
  119. * 查询仓库列表
  120. *
  121. * @param tWarehouse 仓库
  122. * @return 仓库
  123. */
  124. @Override
  125. public List<WarehouseInfoVO> selectTWarehouseListAll(TWarehouse tWarehouse) {
  126. List<TWarehouse> list = tWarehouseMapper.selectTWarehouseList(tWarehouse);
  127. List<Long> ids = list.stream().map(TWarehouse::getfId).collect(Collectors.toList());
  128. TAnnex annex = new TAnnex();
  129. StringBuilder pids = new StringBuilder();
  130. for (Long id : ids) {
  131. pids.append(id).append(",");
  132. }
  133. if (ObjectUtils.isNotNull(pids) && pids.length() > 0) {
  134. annex.setIds(pids.substring(0, pids.length() - 1));
  135. }
  136. annex.setfActid(AnnexActEnum.WAREHOUSE.getType());
  137. List<TAnnex> annexList = annexMapper.selectListByPId(annex);
  138. List<WarehouseInfoVO> tWarehouseList = new ArrayList<>();
  139. for (TWarehouse tWarehouse1 : list) {
  140. WarehouseInfoVO warehouseInfoVO = new WarehouseInfoVO();
  141. BeanUtils.copyProperties(tWarehouse1, warehouseInfoVO);
  142. warehouseInfoVO.setfProperties(sysDictDataService.selectDictLabel("warehouse_properties", tWarehouse1.getfProperties()));
  143. warehouseInfoVO.setfType(sysDictDataService.selectDictLabel("warehouse_type", tWarehouse1.getfType()));
  144. warehouseInfoVO.setfGoodsType(sysDictDataService.selectDictLabels("data_goods_category", tWarehouse1.getfGoodsType()));
  145. if (ObjectUtils.isNotNull(annexList) && annexList.size() > 0) {
  146. warehouseInfoVO.setAnnexList(annexList.stream().filter(e -> ObjectUtils.isNotNull(e.getfPid()) && e.getfPid().equals(tWarehouse1.getfId())).collect(Collectors.toList()));
  147. }
  148. tWarehouseList.add(warehouseInfoVO);
  149. }
  150. return tWarehouseList;
  151. }
  152. @Override
  153. public List<TWarehouse> selectTWarehouseLists(TWarehouse tWarehouse) {
  154. return tWarehouseMapper.selectTWarehouseLists(tWarehouse);
  155. }
  156. @Override
  157. public List<Map<String, Object>> appGetWarehouseList() {
  158. TCustomerContact customerContact = new TCustomerContact();
  159. SysUser user = SecurityUtils.getLoginUser().getUser();
  160. Long corpId = null;
  161. if ("外部用户".equals(user.getDept().getDeptName())) {
  162. customerContact.setfTel(user.getUserName());
  163. List<TCustomerContact> tCustomerContacts = customerContactMapper.selectTCustomerContactList(customerContact);
  164. if (CollectionUtils.isNotEmpty(tCustomerContacts)) {
  165. corpId = tCustomerContacts.get(0).getfPid();
  166. }
  167. }
  168. return tWarehouseMapper.appGetWarehouseList(corpId);
  169. }
  170. /**
  171. * 新增仓库
  172. *
  173. * @param tWarehouse 仓库
  174. * @return 结果
  175. */
  176. @Override
  177. @Transactional
  178. public int insertTWarehouse(TWarehouse tWarehouse) {
  179. tWarehouse.setCreateTime(DateUtils.getNowDate());
  180. TWarehouse info = tWarehouseMapper.selectTWarehouseById(tWarehouse.getParentId());
  181. // 如果父节点不为正常状态,则不允许新增子节点
  182. if (!UserConstants.DEPT_NORMAL.equals(info.getfStatus())) {
  183. throw new CustomException("部门停用,不允许新增");
  184. }
  185. tWarehouse.setAncestors(info.getAncestors() + "," + tWarehouse.getParentId());
  186. // 所有节点转换成中文拼接
  187. String fWarehouseInformation = warehouseName(info.getAncestors() + "," + tWarehouse.getParentId(), tWarehouse.getfName());
  188. tWarehouse.setfWarehouseInformation(fWarehouseInformation);
  189. tWarehouseMapper.insertTWarehouse(tWarehouse);
  190. // 更新库容
  191. if (tWarehouse.getfLocation() == 1) {
  192. int i = updateWarehousefTotalgross(tWarehouse.getAncestors());
  193. if (i <= 0) {
  194. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  195. return 0;
  196. }
  197. }
  198. return 1;
  199. }
  200. @Override
  201. @Transactional
  202. public AjaxResult insertTWarehouse1(String tWarehouse, String tWarehouseArea, LoginUser loginUser) {
  203. if (StringUtils.isEmpty(tWarehouse)) {
  204. return AjaxResult.error("提交失败:仓库信息为空");
  205. }
  206. if (StringUtils.isEmpty(tWarehouseArea) && !"[{}]".equals(tWarehouseArea)) {
  207. return AjaxResult.error("提交失败:库区为空");
  208. }
  209. Long fPid = null;
  210. TWarehouse tWarehouses = JSONArray.parseObject(tWarehouse, TWarehouse.class);
  211. JSONArray jsonArray = JSONArray.parseArray(tWarehouseArea);
  212. List<TWarehouseArea> tWarehouseAreaList = JSONObject.parseArray(jsonArray.toJSONString(), TWarehouseArea.class);
  213. if (StringUtils.isNull(tWarehouses.getfId())) {
  214. tWarehouses.setCreateBy(loginUser.getUser().getUserName());
  215. tWarehouses.setCreateTime(new Date());
  216. tWarehouses.setfStatus("0");
  217. tWarehouseMapper.insertTWarehouse(tWarehouses);
  218. fPid = tWarehouses.getfId();
  219. } else {
  220. fPid = tWarehouses.getfId();
  221. tWarehouses.setUpdateBy(loginUser.getUser().getUserName());
  222. tWarehouses.setUpdateTime(new Date());
  223. if (tWarehouses.getfStatus() != null && tWarehouses.getfStatus().equals("1")) {
  224. TWarehouseBills tWarehouseBill = new TWarehouseBills();
  225. tWarehouseBill.setfWarehouseid(tWarehouses.getfId());
  226. List<TWarehouseBills> tWarehouseBillList = tWarehouseBillsMapper.selectTWarehousebillsList(tWarehouseBill);
  227. if (tWarehouseBillList != null && !tWarehouseBillList.isEmpty()) {
  228. return AjaxResult.error("仓库在库存总账有记录不可变更状态");
  229. }
  230. }
  231. tWarehouseMapper.updateTWarehouse(tWarehouses);
  232. // tWarehouseAreaMapper.deleteTWarehouseAreaByTWarehoused(fPid);
  233. }
  234. for (TWarehouseArea cc : tWarehouseAreaList) {
  235. if (StringUtils.isNull(cc.getfNo()) ||
  236. StringUtils.isNull(cc.getfName()) ||
  237. StringUtils.isNull(cc.getfAddr())) {
  238. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  239. return AjaxResult.error("请完善库区明细信息");
  240. }
  241. if (cc.getfId() != null) {
  242. cc.setUpdateBy(loginUser.getUser().getUserName());
  243. cc.setUpdateTime(new Date());
  244. tWarehouseAreaMapper.updateTWarehouseArea(cc);
  245. } else {
  246. cc.setfWarehouseid(fPid);
  247. cc.setfStatus("0");
  248. cc.setCreateBy(loginUser.getUser().getUserName());
  249. cc.setCreateTime(new Date());
  250. tWarehouseAreaMapper.insertTWarehouseArea(cc);
  251. }
  252. }
  253. return AjaxResult.success();
  254. }
  255. /**
  256. * 修改仓库
  257. *
  258. * @param tWarehouse 仓库
  259. * @return 结果
  260. */
  261. @Override
  262. @Transactional
  263. public AjaxResult updateTWarehouse(TWarehouse tWarehouse) {
  264. if (tWarehouse.getfStatus() != null && tWarehouse.getfStatus().equals("1")) {
  265. TWarehouseBills tWarehouseBill = new TWarehouseBills();
  266. tWarehouseBill.setfWarehouseid(tWarehouse.getfId());
  267. List<TWarehouseBills> tWarehouseBillList = tWarehouseBillsMapper.selectTWarehousebillsList(tWarehouseBill);
  268. if (tWarehouseBillList != null && !tWarehouseBillList.isEmpty()) {
  269. return AjaxResult.error("仓库在库存总账有记录不可变更状态");
  270. }
  271. }
  272. tWarehouse.setUpdateTime(DateUtils.getNowDate());
  273. tWarehouseMapper.updateTWarehouse(tWarehouse);
  274. return AjaxResult.success();
  275. }
  276. @Override
  277. public int updateTWarehouses(TWarehouse tWarehouse) {
  278. TWarehouse newParentTWarehouse = tWarehouseMapper.selectTWarehouseById(tWarehouse.getParentId());
  279. TWarehouse oldTWarehouse = tWarehouseMapper.selectTWarehouseById(tWarehouse.getfId());
  280. if (StringUtils.isNotNull(newParentTWarehouse) && StringUtils.isNotNull(oldTWarehouse)) {
  281. String newAncestors = newParentTWarehouse.getAncestors() + "," + newParentTWarehouse.getfId();
  282. String oldAncestors = oldTWarehouse.getAncestors();
  283. tWarehouse.setAncestors(newAncestors);
  284. updateDeptChildren(tWarehouse.getfId(), newAncestors, oldAncestors);
  285. // 修改仓库信息
  286. String fWarehouseInformation = warehouseName(newAncestors, tWarehouse.getfName());
  287. tWarehouse.setfWarehouseInformation(fWarehouseInformation);
  288. }
  289. int result = tWarehouseMapper.updateTWarehouse(tWarehouse);
  290. if (UserConstants.DEPT_NORMAL.equals(tWarehouse.getfStatus())) {
  291. // 如果该部门是启用状态,则启用该部门的所有上级部门
  292. updateParentDeptStatus(tWarehouse);
  293. }
  294. // 更新库容
  295. if (tWarehouse.getfLocation() == 1) {
  296. int i = updateWarehousefTotalgross(tWarehouse.getAncestors());
  297. if (i <= 0) {
  298. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  299. return 0;
  300. }
  301. }
  302. return result;
  303. }
  304. /**
  305. * 修改子元素关系
  306. *
  307. * @param deptId 被修改的部门ID
  308. * @param newAncestors 新的父ID集合
  309. * @param oldAncestors 旧的父ID集合
  310. */
  311. public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) {
  312. List<TWarehouse> children = tWarehouseMapper.selectChildrenDeptById(deptId);
  313. for (TWarehouse child : children) {
  314. child.setAncestors(child.getAncestors().replace(oldAncestors, newAncestors));
  315. }
  316. if (children.size() > 0) {
  317. tWarehouseMapper.updateDeptChildren(children);
  318. }
  319. }
  320. /**
  321. * 修改该部门的父级部门状态
  322. *
  323. * @param tWarehouse 当前部门
  324. */
  325. private void updateParentDeptStatus(TWarehouse tWarehouse) {
  326. String updateBy = tWarehouse.getUpdateBy();
  327. tWarehouse = tWarehouseMapper.selectTWarehouseById(tWarehouse.getfId());
  328. tWarehouse.setUpdateBy(updateBy);
  329. tWarehouseMapper.updateDeptStatus(tWarehouse);
  330. }
  331. /**
  332. * 批量删除仓库
  333. *
  334. * @param fIds 需要删除的仓库ID
  335. * @return 结果
  336. */
  337. @Override
  338. @Transactional
  339. public AjaxResult deleteTWarehouseByIds(Long[] fIds) {
  340. // 查询仓库主表 是否有仓库在使用
  341. int i = 1;
  342. for (Long id : fIds) {
  343. TWarehouseBills tWarehouseBill = new TWarehouseBills();
  344. tWarehouseBill.setfWarehouseid(id);
  345. List<TWarehouseBills> tWarehouseBillList = tWarehouseBillsMapper.selectTWarehousebillsList(tWarehouseBill);
  346. if (tWarehouseBillList != null && !tWarehouseBillList.isEmpty()) {
  347. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  348. return AjaxResult.error("仓库第" + i + "行仓库有货物不可删除");
  349. }
  350. tWarehouseMapper.deleteTWarehouseById(id);
  351. i++;
  352. }
  353. // tWarehouseMapper.deleteTWarehouseByIds(fIds);
  354. return AjaxResult.success();
  355. }
  356. /**
  357. * 删除仓库信息
  358. *
  359. * @param fId 仓库ID
  360. * @return 结果
  361. */
  362. @Override
  363. @Transactional
  364. public int deleteTWarehouseById(Long fId) {
  365. TWarehouse warehouse = tWarehouseMapper.selectTWarehouseById(fId);
  366. tWarehouseMapper.deleteTWarehouseById(fId);
  367. updateParentGross(warehouse.getAncestors());
  368. annexMapper.deleteByPid(fId, AnnexActEnum.WAREHOUSE.getType());
  369. return 1;
  370. }
  371. @Override
  372. public String checkNameUnique(TWarehouse tWarehouse) {
  373. Long fId = StringUtils.isNull(tWarehouse.getfId()) ? -1L : tWarehouse.getfId();
  374. TWarehouse info = tWarehouseMapper.checkDeptNameUnique(tWarehouse.getfName(), tWarehouse.getParentId());
  375. if (StringUtils.isNotNull(info) && info.getfId().longValue() != fId.longValue()) {
  376. return UserConstants.NOT_UNIQUE;
  377. }
  378. return UserConstants.UNIQUE;
  379. }
  380. @Override
  381. public boolean hasChildByfId(Long fId) {
  382. int result = tWarehouseMapper.hasChildByfId(fId);
  383. return result > 0 ? true : false;
  384. }
  385. @Override
  386. public boolean checkDeptExistWarehouse(Long deptId) {
  387. int result = tWarehouseMapper.checkDeptExistarehouse(deptId);
  388. return result > 0 ? true : false;
  389. }
  390. @Override
  391. public boolean checkDeptExistWarehouseItems(Long deptId) {
  392. int result = tWarehouseMapper.checkDeptExistWarehouseItems(deptId);
  393. return result > 0 ? true : false;
  394. }
  395. /**
  396. * 新增仓库
  397. *
  398. * @param tWarehouse
  399. * @return
  400. */
  401. @Override
  402. public AjaxResult warehouseSubmit(WarehouseSubmitDTO tWarehouse) {
  403. // 登录用户
  404. String username = SecurityUtils.getUsername();
  405. tWarehouse.setCreateTime(new Date());
  406. tWarehouse.setCreateBy(username);
  407. TWarehouse info = tWarehouseMapper.selectTWarehouseById(tWarehouse.getParentId());
  408. // 如果父节点不为正常状态,则不允许新增子节点
  409. if (!UserConstants.DEPT_NORMAL.equals(info.getfStatus())) {
  410. throw new CustomException("部门停用,不允许新增");
  411. }
  412. tWarehouse.setAncestors(info.getAncestors() + "," + tWarehouse.getParentId());
  413. // 所有节点转换成中文拼接
  414. String fWarehouseInformation = warehouseName(info.getAncestors() + "," + tWarehouse.getParentId(), tWarehouse.getfName());
  415. tWarehouse.setfWarehouseInformation(fWarehouseInformation);
  416. tWarehouse.setfStatus("0");
  417. tWarehouseMapper.insertTWarehouse(tWarehouse);
  418. updateParentGross(tWarehouse.getAncestors());
  419. if (CollectionUtils.isNotEmpty(tWarehouse.getAnnexList())) {
  420. tWarehouse.getAnnexList().forEach(li -> {
  421. li.setfPid(tWarehouse.getfId());
  422. li.setfActid(AnnexActEnum.WAREHOUSE.getType());
  423. if (Objects.nonNull(li.getfId())) {
  424. li.setCreateTime(new Date());
  425. li.setCreateBy(username);
  426. } else {
  427. li.setUpdateTime(new Date());
  428. li.setUpdateBy(username);
  429. }
  430. annexMapper.insertTAnnex(li);
  431. });
  432. }
  433. return AjaxResult.success();
  434. }
  435. /**
  436. * 修改仓库
  437. *
  438. * @param tWarehouse
  439. * @return
  440. */
  441. @Override
  442. @Transactional
  443. public AjaxResult edit(WarehouseSubmitDTO tWarehouse) {
  444. // 登录用户
  445. String username = SecurityUtils.getUsername();
  446. tWarehouse.setUpdateBy(username);
  447. tWarehouseMapper.updateTWarehouse(tWarehouse);
  448. updateParentGross(tWarehouse.getAncestors());
  449. annexMapper.deleteByPid(tWarehouse.getfId(), AnnexActEnum.WAREHOUSE.getType());
  450. if (CollectionUtils.isNotEmpty(tWarehouse.getAnnexList())) {
  451. tWarehouse.getAnnexList().forEach(li -> {
  452. li.setfPid(tWarehouse.getfId());
  453. li.setfActid(AnnexActEnum.WAREHOUSE.getType());
  454. if (Objects.nonNull(li.getfId())) {
  455. li.setCreateTime(new Date());
  456. li.setCreateBy(username);
  457. } else {
  458. li.setUpdateTime(new Date());
  459. li.setUpdateBy(username);
  460. }
  461. annexMapper.insertTAnnex(li);
  462. });
  463. }
  464. return AjaxResult.success();
  465. }
  466. /**
  467. * 仓库懒加载列表
  468. *
  469. * @param tWarehouse
  470. * @return
  471. */
  472. @Override
  473. public List<TWarehouse> lazyList(TWarehouse tWarehouse) {
  474. if (StringUtils.isNull(tWarehouse.getParentId()) && StringUtils.isEmpty(tWarehouse.getfName()) &&
  475. StringUtils.isNull(tWarehouse.getfStatus()) && StringUtils.isNull(tWarehouse.getfProperties()) &&
  476. StringUtils.isNull(tWarehouse.getfAddr()) && StringUtils.isNull(tWarehouse.getfType()) && StringUtils.isNull(tWarehouse.getfGoodsType())) {
  477. tWarehouse.setParentId(0L);
  478. }
  479. return tWarehouseMapper.lazyList(tWarehouse);
  480. }
  481. @Override
  482. public TWarehouse selectByCode(String position) {
  483. return tWarehouseMapper.getWarehouseByNo(position);
  484. }
  485. @Override
  486. public List<Map<String, Object>> queryGoodsAccountByPageV1(String warehouseCode,
  487. String ownerSocialIdentifier,
  488. String ownerCode,
  489. String ownerName,
  490. String goodsName,
  491. String specifications,
  492. String producing,
  493. String materialQuality,
  494. String level,
  495. Integer pageNo,
  496. Integer pageSize) {
  497. if ("null".equals(warehouseCode)) {
  498. warehouseCode = null;
  499. }
  500. return tWarehouseMapper.queryGoodsAccountByPageV1(warehouseCode, ownerSocialIdentifier, ownerCode, ownerName, goodsName, specifications,
  501. producing, materialQuality, level, pageNo, pageSize);
  502. }
  503. @Override
  504. public List<Map<String, Object>> queryGoodsAccountDetailByPageV1(String warehouseCode, String ownerName, String ownerCode, String ownerSocialIdentifier, String goodsName, String specifications,
  505. String producing, String materialQuality, String level, String receiptDoc, String billOfLading,
  506. String areaName, String areaCode, String slotName, String slotCode,String goodsCode, Integer pageNo, Integer pageSize) {
  507. if ("null".equals(warehouseCode)) {
  508. warehouseCode = null;
  509. }
  510. List<Map<String, Object>> maps = tWarehouseMapper.queryGoodsAccountDetailByPageV1(warehouseCode, ownerName, ownerCode, ownerSocialIdentifier, goodsName, specifications,
  511. producing, materialQuality, level, receiptDoc, billOfLading, areaName, areaCode, slotName, slotCode,goodsCode, pageNo, pageSize);
  512. for (Map<String, Object> map : maps) {
  513. if (map.get("storesTime") != null) {
  514. Date storesTime = (Date) map.get("storesTime");
  515. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  516. String datef = sdf.format(storesTime);
  517. map.put("storesTime", datef);
  518. }
  519. }
  520. return maps;
  521. }
  522. /**
  523. * 获取仓库详细信息
  524. */
  525. @Override
  526. public TWarehouse getWareHouseInfo(String wareHouseId) {
  527. return tWarehouseMapper.getWareHouseInfo(wareHouseId);
  528. }
  529. /**
  530. * 获取最新的库存数据
  531. */
  532. @Override
  533. public Map<String, Object> getStorageInfo(String wareHouseId) {
  534. return tWarehouseMapper.getStorageInfo(wareHouseId);
  535. }
  536. /**
  537. * 库存吞吐趋势信息
  538. */
  539. @Override
  540. public List<Map<String, Object>> getTimeStorageInfo(String wareHouseId, String startTime, String endTime) {
  541. return tWarehouseMapper.getTimeStorageInfo(wareHouseId, startTime, endTime);
  542. }
  543. /**
  544. * 库存吞吐趋势信息
  545. */
  546. @Override
  547. public List<Map<String, Object>> getTimeThroughputInfo(String wareHouseId, String startTime, String endTime) {
  548. return tWarehouseMapper.getTimeThroughputInfo(wareHouseId, startTime, endTime);
  549. }
  550. /**
  551. * 货物保管信息
  552. */
  553. @Override
  554. public Map<String, Object> getCargoInfo(String wareHouseId, String startTime, String endTime, String isPledge) {
  555. return tWarehouseMapper.getCargoInfo(wareHouseId, startTime, endTime, isPledge);
  556. }
  557. /**
  558. * 货物保管信息
  559. */
  560. @Override
  561. public List<Map<String, Object>> getGoodsList(String wareHouseId, String startTime, String endTime) {
  562. return tWarehouseMapper.getGoodsList(wareHouseId, startTime, endTime);
  563. }
  564. /**
  565. * 仓库保管趋势
  566. */
  567. @Override
  568. public List<Map<String, Object>> getCargoInfoTrend(String wareHouseId, String startTime, String endTime, String FTradeModeId) {
  569. return tWarehouseMapper.getCargoInfoTrend(wareHouseId, startTime, endTime, FTradeModeId);
  570. }
  571. /**
  572. * 获取货物品类top值
  573. */
  574. @Override
  575. public List<Map<String, Object>> getStorageTop(String wareHouseId, Integer countType, Integer topCnt) {
  576. return tWarehouseMapper.getStorageTop(wareHouseId, countType, topCnt);
  577. }
  578. /**
  579. * 获取货物品类top值
  580. */
  581. @Override
  582. public List<Map<String, Object>> getStorageTopS(String wareHouseId, Integer countType, Integer topCnt) {
  583. return tWarehouseMapper.getStorageTopS(wareHouseId, countType, topCnt);
  584. }
  585. /**
  586. * 获取货主仓库top值
  587. */
  588. @Override
  589. public List<Map<String, Object>> getGoodsTop(String wareHouseId, Integer countType, Integer topCnt) {
  590. return tWarehouseMapper.getGoodsTop(wareHouseId, countType, topCnt);
  591. }
  592. /**
  593. * 过户交易信息获取
  594. */
  595. @Override
  596. public List<Map<String, Object>> getTransferTransaction(String wareHouseId, String startTime, String endTime) {
  597. return tWarehouseMapper.getTransferTransaction(wareHouseId, startTime, endTime);
  598. }
  599. /**
  600. * 最新的作业统计
  601. */
  602. @Override
  603. public Map<String, Object> getWorkInfo(String wareHouseId, String countType) {
  604. return tWarehouseMapper.getWorkInfo(wareHouseId, countType);
  605. }
  606. /**
  607. * 作业统计趋势数据
  608. */
  609. @Override
  610. public List<Map<String, Object>> getWorkTrend(String wareHouseId, String startTime, String endTime, String countType) {
  611. return tWarehouseMapper.getWorkTrend(wareHouseId, startTime, endTime, countType);
  612. }
  613. /**
  614. * 获取仓库详细信息
  615. */
  616. @Override
  617. public List<InventoryQueryResponse> inventoryQueries(InventoryQueryRequest inventoryQueryRequest) {
  618. return tWarehouseMapper.inventoryQueries(inventoryQueryRequest.getCurrentOwnerName(),
  619. inventoryQueryRequest.getCurrentOwnerSocialIdentifier(),
  620. inventoryQueryRequest.getWarehouseSerialNumbers());
  621. }
  622. /**
  623. * 获取仓库详细信息
  624. */
  625. @Override
  626. public List<InventoryQueryTwoResponse> inventoryQueriesV2(InventoryQueryRequest inventoryQueryRequest, Integer queryAll) {
  627. String currentOwnerName = inventoryQueryRequest.getCurrentOwnerName();
  628. String currentOwnerSocialIdentifier = inventoryQueryRequest.getCurrentOwnerSocialIdentifier();
  629. List<String> warehouseSerialNumbers = inventoryQueryRequest.getWarehouseSerialNumbers();
  630. List<String> blNosList = inventoryQueryRequest.getBlNosList();
  631. return tWarehouseMapper.inventoryQueriesV2(currentOwnerName, currentOwnerSocialIdentifier, warehouseSerialNumbers, blNosList, queryAll);
  632. }
  633. /**
  634. * 仓单注册指令
  635. */
  636. @Override
  637. public int receiptRegister(String ownerName, String identifier, String numbers) {
  638. return tWarehouseMapper.receiptRegister(ownerName, identifier, numbers);
  639. }
  640. /**
  641. * 客户检验指令
  642. */
  643. @Override
  644. public TCorps verification(String name, String identifier) {
  645. return tCorpsMapper.verification(name, identifier);
  646. }
  647. /**
  648. * 仓单过户指令
  649. */
  650. @Override
  651. public int receiptTransfer(TWarehouseBills warehouseBills) {
  652. warehouseBills.setfBilltype("HQZY");
  653. warehouseBills.setfBillstatus(2L);
  654. warehouseBills.setfDeptid(100L);
  655. warehouseBills.setfBsdeptid(100L);
  656. warehouseBills.setCreateTime(new Date());
  657. warehouseBills.setCreateBy("admin");
  658. Date time = new Date();
  659. // 业务编码
  660. String billNo = billnoSerialServiceImpl.getBillNo("HQZY", time);
  661. warehouseBills.setfBillno(billNo);
  662. // 存货编码
  663. String bscorpno = billnoSerialServiceImpl.getCorpNo(warehouseBills.getfCorpid(), time);
  664. warehouseBills.setfBscorpno(bscorpno);
  665. warehouseBills.setfChargedate(time);
  666. warehouseBills.setfBsdate(time);
  667. warehouseBills.setfTrademodeid(1L);
  668. warehouseBills.setfItemsStatus(2L);
  669. return tWarehouseBillsMapper.insertTWarehousebills(warehouseBills);
  670. }
  671. /**
  672. * 仓单解锁指令
  673. */
  674. @Override
  675. public int receiptCancel(String ownerName, String identifier, String numbers) {
  676. return tWarehouseMapper.receiptCancel(ownerName, identifier, numbers);
  677. }
  678. @Override
  679. public List<TWarehouse> nominateTreeselect(TWarehouse tWarehouse) {
  680. // 获取当前登录用户
  681. Long userId = SecurityUtils.getLoginUser().getUser().getUserId();
  682. // 获取当前登录用户的仓库idList
  683. List<Long> warehouseIdList = tWarehouseUserMapper.getWarehouseIdListByUserId(userId);
  684. if (warehouseIdList.size() == 0) {
  685. return null;
  686. }
  687. for (Long warehouseId : warehouseIdList) {
  688. if (warehouseId == 0) {
  689. warehouseIdList = null;
  690. break;
  691. }
  692. }
  693. return tWarehouseMapper.nominateTreeselect(tWarehouse, warehouseIdList);
  694. }
  695. @Override
  696. public String checkUFNoUnique(TWarehouse tWarehouse) {
  697. TWarehouse tWarehouse1 = tWarehouseMapper.checkFNoUnique(tWarehouse.getfNo());
  698. if (StringUtils.isNotNull(tWarehouse1) && !tWarehouse1.getfId().equals(tWarehouse.getfId())) {
  699. return UserConstants.NOT_UNIQUE;
  700. }
  701. return UserConstants.UNIQUE;
  702. }
  703. @Override
  704. public String checkUFNnameUnique(TWarehouse tWarehouse) {
  705. TWarehouse tWarehouse1 = tWarehouseMapper.checkUFNnameUnique(tWarehouse.getfName());
  706. if (StringUtils.isNotNull(tWarehouse1) && !tWarehouse1.getfId().equals(tWarehouse.getfId())) {
  707. return UserConstants.NOT_UNIQUE;
  708. }
  709. return UserConstants.UNIQUE;
  710. }
  711. @Override
  712. public String checkUFAaddrUnique(TWarehouse tWarehouse) {
  713. TWarehouse tWarehouse1 = tWarehouseMapper.checkUFAaddrUnique(tWarehouse.getfAddr());
  714. if (StringUtils.isNotNull(tWarehouse1) && !tWarehouse1.getfId().equals(tWarehouse.getfId())) {
  715. return UserConstants.NOT_UNIQUE;
  716. }
  717. return UserConstants.UNIQUE;
  718. }
  719. @Override
  720. public String checkUFTWarehouseAreaNoUnique(TWarehouseArea tWarehouseAreas) {
  721. TWarehouseArea tWarehouseAreas1 = tWarehouseAreaMapper.checkFNoUnique(tWarehouseAreas.getfNo(), tWarehouseAreas.getfWarehouseid());
  722. if (StringUtils.isNotNull(tWarehouseAreas1) && !tWarehouseAreas1.getfId().equals(tWarehouseAreas.getfId())) {
  723. return UserConstants.NOT_UNIQUE;
  724. }
  725. return UserConstants.UNIQUE;
  726. }
  727. @Override
  728. public String checkUTWarehouseAreaFNnameUnique(TWarehouseArea tWarehouseAreas) {
  729. TWarehouseArea tWarehouseAreas1 = tWarehouseAreaMapper.checkUFNnameUnique(tWarehouseAreas.getfName(), tWarehouseAreas.getfWarehouseid());
  730. if (StringUtils.isNotNull(tWarehouseAreas1) && !tWarehouseAreas1.getfId().equals(tWarehouseAreas.getfId())) {
  731. return UserConstants.NOT_UNIQUE;
  732. }
  733. return UserConstants.UNIQUE;
  734. }
  735. @Override
  736. public int selectNormalChildrenDeptById(Long fId) {
  737. return tWarehouseMapper.selectNormalChildrenDeptById(fId);
  738. }
  739. @Override
  740. public List<TreeSelect> buildDeptTreeSelect(List<TWarehouse> tWarehouses) {
  741. List<TWarehouse> deptTrees = buildDeptTree(tWarehouses);
  742. return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
  743. }
  744. /**
  745. * 构建前端所需要树结构
  746. *
  747. * @param depts 部门列表
  748. * @return 树结构列表
  749. */
  750. @Override
  751. public List<TWarehouse> buildDeptTree(List<TWarehouse> depts) {
  752. List<TWarehouse> returnList = new ArrayList<TWarehouse>();
  753. List<Long> tempList = new ArrayList<Long>();
  754. for (TWarehouse dept : depts) {
  755. tempList.add(dept.getfId());
  756. }
  757. for (Iterator<TWarehouse> iterator = depts.iterator(); iterator.hasNext(); ) {
  758. TWarehouse dept = (TWarehouse) iterator.next();
  759. // 如果是顶级节点, 遍历该父节点的所有子节点
  760. if (!tempList.contains(dept.getParentId())) {
  761. recursionFn(depts, dept);
  762. returnList.add(dept);
  763. }
  764. }
  765. if (returnList.isEmpty()) {
  766. returnList = depts;
  767. }
  768. return returnList;
  769. }
  770. @Override
  771. public String checkUFAreUnique(TWarehouse tWarehouse) {
  772. TWarehouseArea tWarehouseArea = tWarehouseAreaMapper.selectTWarehouseAreaByWarehouseId(tWarehouse.getParentId());
  773. if (StringUtils.isNotNull(tWarehouseArea)) {
  774. return UserConstants.NOT_UNIQUE;
  775. }
  776. return UserConstants.UNIQUE;
  777. }
  778. /**
  779. * 递归列表
  780. */
  781. private void recursionFn(List<TWarehouse> list, TWarehouse t) {
  782. // 得到子节点列表
  783. List<TWarehouse> childList = getChildList(list, t);
  784. t.setChildren(childList);
  785. for (TWarehouse tChild : childList) {
  786. if (hasChild(list, tChild)) {
  787. recursionFn(list, tChild);
  788. }
  789. }
  790. }
  791. /**
  792. * 得到子节点列表
  793. */
  794. private List<TWarehouse> getChildList(List<TWarehouse> list, TWarehouse t) {
  795. List<TWarehouse> tlist = new ArrayList<TWarehouse>();
  796. Iterator<TWarehouse> it = list.iterator();
  797. while (it.hasNext()) {
  798. TWarehouse n = (TWarehouse) it.next();
  799. if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getfId().longValue()) {
  800. tlist.add(n);
  801. }
  802. }
  803. return tlist;
  804. }
  805. /**
  806. * 判断是否有子节点
  807. */
  808. private boolean hasChild(List<TWarehouse> list, TWarehouse t) {
  809. return getChildList(list, t).size() > 0 ? true : false;
  810. }
  811. public String warehouseName(String ancestors, String oldName) {
  812. String str[] = ancestors.split(",");
  813. String fWarehouseInformation = "";
  814. for (String id : str) {
  815. if (!(id.equals("0")) && !(id.equals("100"))) {
  816. // 查询仓库名称
  817. TWarehouse tWarehouse = tWarehouseMapper.selectTWarehouseById(Long.valueOf(id));
  818. fWarehouseInformation += tWarehouse.getfName() + "/";
  819. }
  820. }
  821. if (StringUtils.isNull(fWarehouseInformation) && !fWarehouseInformation.equals("")) {
  822. fWarehouseInformation = oldName;
  823. } else {
  824. fWarehouseInformation += oldName;
  825. }
  826. return fWarehouseInformation;
  827. }
  828. /**
  829. * 修改仓库库容
  830. *
  831. * @param ancestors
  832. * @return
  833. */
  834. public int updateWarehousefTotalgross(String ancestors) {
  835. String str[] = ancestors.split(",");
  836. Long warehouseId = 0L;
  837. for (String id : str) {
  838. if (!(id.equals("0")) && !(id.equals("100"))) {
  839. warehouseId = Long.valueOf(id);
  840. break;
  841. }
  842. }
  843. if (warehouseId != 0) {
  844. // 所有库容
  845. BigDecimal fTotalgross = tWarehouseMapper.selectTWarehouseFTotalgross(warehouseId);
  846. TWarehouse tWarehouseNew = new TWarehouse();
  847. tWarehouseNew.setfId(warehouseId);
  848. tWarehouseNew.setfTotalgross(fTotalgross);
  849. return tWarehouseMapper.updatefTotalgross(tWarehouseNew);
  850. } else {
  851. return 0;
  852. }
  853. }
  854. private void updateParentGross(String ancestors) {
  855. String[] split = ancestors.split(",");
  856. Collections.reverse(Arrays.asList(split));
  857. for (String ancestor : split) {
  858. if ("0".equals(ancestor) || "100".equals(ancestor)) {
  859. break;
  860. }
  861. Long parentId = Long.valueOf(ancestor);
  862. List<TWarehouse> tWarehouses = tWarehouseMapper.selectChildrenDeptById(parentId);
  863. BigDecimal allGross = new BigDecimal("0");
  864. for (TWarehouse warehouse : tWarehouses) {
  865. if (StringUtils.isNotNull(warehouse.getfTotalgross())) {
  866. allGross = allGross.add(warehouse.getfTotalgross());
  867. }
  868. }
  869. if (allGross.compareTo(BigDecimal.ZERO) > 0) {
  870. TWarehouse parent = new TWarehouse();
  871. parent.setfId(parentId);
  872. parent.setfTotalgross(allGross);
  873. tWarehouseMapper.updatefTotalgross(parent);
  874. }
  875. }
  876. }
  877. }