1. package cn.hybn.erp.modular.system.service.impl;
  2.  
  3. import cn.hybn.erp.core.common.page.LayuiPageFactory;
  4. import cn.hybn.erp.core.common.page.LayuiPageInfo;
  5. import cn.hybn.erp.modular.system.base.BaseStatus;
  6. import cn.hybn.erp.modular.system.base.Order;
  7. import cn.hybn.erp.modular.system.base.Status;
  8. import cn.hybn.erp.modular.system.entity.*;
  9. import cn.hybn.erp.modular.system.mapper.GrnOrderMapper;
  10. import cn.hybn.erp.modular.system.model.params.GrnOrderParam;
  11. import cn.hybn.erp.modular.system.model.params.PurchaseOrderParam;
  12. import cn.hybn.erp.modular.system.model.result.GrnOrderResult;
  13. import cn.hybn.erp.modular.system.service.*;
  14. import cn.hybn.erp.modular.system.utility.Katrina_CJ_Utils;
  15. import cn.stylefeng.roses.core.util.ToolUtil;
  16. import com.alibaba.fastjson.JSONObject;
  17. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  18. import com.baomidou.mybatisplus.core.metadata.IPage;
  19. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  20. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  21. import com.sun.xml.internal.bind.v2.TODO;
  22. import org.slf4j.LoggerFactory;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.stereotype.Service;
  25. import org.springframework.transaction.annotation.Transactional;
  26.  
  27. import java.io.Serializable;
  28. import java.math.BigDecimal;
  29. import java.util.*;
  30.  
  31. /**
  32. * <p>
  33. * 服务实现类
  34. * </p>
  35. *
  36. * @author Katrina_CJ
  37. * @since 2019-03-16
  38. */
  39. @Service
  40. public class GrnOrderServiceImpl extends ServiceImpl<GrnOrderMapper, GrnOrder> implements GrnOrderService {
  41.  
  42. @Autowired
  43. private PurchaseDetailService purchaseDetailService;
  44.  
  45. @Autowired
  46. private GrnOrderDetailService grnOrderDetailService;
  47.  
  48. @Autowired
  49. private InventoryService inventoryService;
  50.  
  51. @Autowired
  52. private InventoryTransactionService inventoryTransactionService;
  53.  
  54. @Autowired
  55. private PurchaseOrderService purchaseOrderService;
  56.  
  57. @Autowired
  58. private PaymentOrderService paymentOrderService;
  59.  
  60. @Override
  61. public void add(GrnOrderParam param) {
  62. GrnOrder entity = getEntity(param);
  63. this.save(entity);
  64. }
  65.  
  66. @Override
  67. public void delete(GrnOrderParam param) {
  68. this.removeById(getKey(param));
  69. }
  70.  
  71. @Override
  72. public void update(GrnOrderParam param) {
  73. GrnOrder oldEntity = getOldEntity(param);
  74. GrnOrder newEntity = getEntity(param);
  75. ToolUtil.copyProperties(newEntity, oldEntity);
  76. this.updateById(newEntity);
  77. }
  78.  
  79. @Override
  80. public GrnOrderResult findBySpec(GrnOrderParam param) {
  81. return null;
  82. }
  83.  
  84. @Override
  85. public List<GrnOrderResult> findListBySpec(GrnOrderParam param) {
  86. return null;
  87. }
  88.  
  89. @Override
  90. public LayuiPageInfo findPageBySpec(GrnOrderParam param) {
  91. Page pageContext = getPageContext();
  92. QueryWrapper<GrnOrder> objectQueryWrapper = new QueryWrapper<>();
  93. IPage page = this.page(pageContext, objectQueryWrapper);
  94. return LayuiPageFactory.createPageInfo(page);
  95. }
  96.  
  97. @Override
  98. @Transactional(rollbackFor = {Exception.class})
  99. public void createGrnOrder(PurchaseOrderParam param) {
  100. GrnOrder grnOrder = new GrnOrder();
  101. grnOrder.setGrnOrderStatus(Status.CREATE.getStatus());
  102. grnOrder.setOrderId(param.getPoId());
  103. grnOrder.setGrnOrderCreateTime(new Date());
  104. QueryWrapper<GrnOrder> wrapper = new QueryWrapper<>();
  105. wrapper.orderByDesc("grn_order_id").last("limit 1");
  106. GrnOrder grnId = this.getOne(wrapper);
  107. //如果当前数据库没有订单,手动赋值
  108. if (Objects.isNull(grnId)) {
  109. grnId = new GrnOrder();
  110. grnId.setOrderId((long) 0);
  111. }
  112. //创建订单编号
  113. LoggerFactory.getLogger(GrnOrderServiceImpl.class).info("DEBUG:->" + String.valueOf(grnId.getOrderId()));
  114. String serial = Katrina_CJ_Utils.createOrderSerial(Order.RKD_, grnId.getOrderId());
  115. grnOrder.setGrnOrderSerial(serial);
  116. //填充入库单明细
  117. // QueryWrapper<PurchaseDetail> queryWrapper = new QueryWrapper<>();
  118. // queryWrapper.eq("order_po_id", param.getPoId());
  119. //当前采购单明细
  120. // List<PurchaseDetail> details = purchaseDetailService.list(queryWrapper);
  121.  
  122. this.getBaseMapper().insert(grnOrder);
  123. // details.forEach(pd -> {
  124. // GrnOrderDetail grnOrderDetail = new GrnOrderDetail();
  125. // grnOrderDetail.setGrnOrderId(grnOrder.getGrnOrderId());
  126. // grnOrderDetail.setGrnDetailIsGift(pd.getOrderIsGifts());
  127. // grnOrderDetail.setGrnDetailProductId(pd.getOrderProductId());
  128. // grnOrderDetail.setGrnDetailUnit(pd.getOrderUnit());
  129. // grnOrderDetail.setGrnDetailGoods(new BigDecimal(0));
  130. // grnOrderDetailService.getBaseMapper().insert(grnOrderDetail);
  131. // });
  132. }
  133.  
  134. @Override
  135. @Transactional(rollbackFor = {Exception.class})
  136. public void getGoods(GrnOrderParam grnOrderParam) {
  137. GrnOrder grnOrder = new GrnOrder();
  138. grnOrder.setGrnOrderId(grnOrderParam.getGrnOrderId());
  139. grnOrder.setGrnOrderAgent(grnOrderParam.getGrnOrderAgent());
  140. grnOrder.setGrnOrderAgentDept(grnOrderParam.getGrnOrderAgentDept());
  141. grnOrder.setGrnOrderGetGoodsTime(new Date());
  142. grnOrder.setGrnOrderRemark(grnOrderParam.getGrnOrderRemark());
  143. grnOrder.setGrnOrderStatus(Status.FINISH.getStatus());
  144.  
  145. List<GrnOrderDetail> grnOrderDetails = JSONObject.parseArray(grnOrderParam.getGrnOrderDetail(), GrnOrderDetail.class);
  146.  
  147. //更新入库单
  148.  
  149. this.getBaseMapper().updateById(grnOrder);
  150.  
  151. //更新入库单详情
  152. grnOrderDetails.forEach(g -> {
  153. // grnOrderDetail.setGrnDetailIsGift(pd.getOrderIsGifts());
  154. // grnOrderDetail.setGrnDetailProductId(pd.getOrderProductId());
  155. // grnOrderDetail.setGrnDetailUnit(pd.getOrderUnit());
  156. // grnOrderDetail.setGrnDetailGoods(new BigDecimal(0));
  157. g.setGrnDetailProductId(g.getGrnDetailProductId());
  158. g.setGrnDetailIsGift(g.getGrnDetailIsGift());
  159. g.setGrnOrderId(grnOrder.getGrnOrderId());
  160.  
  161. grnOrderDetailService.getBaseMapper().insert(g);
  162. });
  163.  
  164. //查询入库单详情
  165. QueryWrapper<GrnOrderDetail> queryWrapper = new QueryWrapper<>();
  166. queryWrapper.eq("grn_order_id", grnOrder.getGrnOrderId());
  167.  
  168. //更新库存和库存事务
  169. List<GrnOrderDetail> details = grnOrderDetailService.list(queryWrapper);
  170.  
  171. //获取采购单数据
  172. GrnOrder grn = this.getById(grnOrder.getGrnOrderId());
  173. PurchaseOrder purchaseOrder = purchaseOrderService.getById(grn.getOrderId());
  174. //更新采购单数据
  175. QueryWrapper<PurchaseDetail> purchaseDetailQueryWrapper = new QueryWrapper<>();
  176. purchaseDetailQueryWrapper.eq("order_po_id", purchaseOrder.getPoId());
  177. List<PurchaseDetail> purchaseDetails = purchaseDetailService.list(purchaseDetailQueryWrapper);
  178.  
  179. //移除无入库的明细
  180. details.removeIf(d -> Objects.isNull(d.getGrnDetailWarehouse()));
  181.  
  182. details.forEach(d -> {
  183. QueryWrapper<Inventory> inventoryQueryWrapper = new QueryWrapper<>();
  184. inventoryQueryWrapper.eq("inventory_product_id", d.getGrnDetailProductId());
  185. List<Inventory> inventories = inventoryService.list(inventoryQueryWrapper);
  186.  
  187. //如果无当前产品,新增库存
  188. if (inventories.size() == 0) {
  189. //新库存
  190. Inventory inventory = new Inventory();
  191. inventory.setInventoryAmount(d.getGrnDetailGoods());
  192. inventory.setInventoryAvailableLocation(d.getGrnDetailGoods());
  193. inventory.setInventoryIn(d.getGrnDetailGoods());
  194. inventory.setInventoryLow(new BigDecimal(0));
  195. inventory.setInventoryProductId(d.getGrnDetailProductId());
  196. inventory.setInventoryMax(new BigDecimal(0));
  197. inventory.setInventoryWarehouseId(d.getGrnDetailWarehouse());
  198. inventory.setInventoryUnit(d.getGrnDetailUnit());
  199. inventory.setInventoryCreateTime(new Date());
  200. inventory.setInventoryOnWay(new BigDecimal(0));
  201. inventory.setInventoryBatch(d.getGrnDetailBatch());
  202. inventory.setInventoryProductTime(d.getGrnDetailProductTime());
  203. inventoryService.getBaseMapper().insert(inventory);
  204.  
  205. //新库存事务
  206. InventoryTransaction transaction = new InventoryTransaction();
  207. transaction.setGrnTransactionInventoryId(inventory.getInventoryId());
  208. transaction.setGrnTransactionIsGift(d.getGrnDetailIsGift());
  209. transaction.setGrnTransactionOrderSerial(grnOrderParam.getGrnOrderSerial());
  210. transaction.setGrnTransactionBatch(d.getGrnDetailBatch());
  211. transaction.setGrnTransactionType(BaseStatus.RK.getDesc());
  212. transaction.setGrnTransactionProductId(d.getGrnDetailProductId());
  213. transaction.setGrnTransactionGrnOrderId(grnOrder.getGrnOrderId());
  214. transaction.setGrnTransactionHappenNumber(d.getGrnDetailGoods());
  215. transaction.setGrnTransactionProductionOfDate(d.getGrnDetailProductTime());
  216. transaction.setGrnTransactionProductBarcode(d.getGrnDetailBarcode());
  217.  
  218. inventoryTransactionService.getBaseMapper().insert(transaction);
  219.  
  220. } else {
  221. inventories.forEach(inventory -> {
  222. //库位一致
  223. if (inventory.getInventoryWarehouseId().equals(d.getGrnDetailWarehouse())) {
  224. //单位一致
  225. if (inventory.getInventoryUnit().equals(d.getGrnDetailUnit())) {
  226. //更新库存数量
  227. inventory.setInventoryAmount(inventory.getInventoryAmount().add(d.getGrnDetailGoods()));
  228.  
  229. inventoryService.getBaseMapper().updateById(inventory);
  230. } else {
  231. //新库存
  232. Inventory newInventory = new Inventory();
  233. newInventory.setInventoryAmount(d.getGrnDetailGoods());
  234. newInventory.setInventoryAvailableLocation(d.getGrnDetailGoods());
  235. newInventory.setInventoryIn(d.getGrnDetailGoods());
  236. newInventory.setInventoryLow(new BigDecimal(0));
  237. newInventory.setInventoryProductId(d.getGrnDetailProductId());
  238. newInventory.setInventoryMax(new BigDecimal(0));
  239. newInventory.setInventoryWarehouseId(d.getGrnDetailWarehouse());
  240. newInventory.setInventoryUnit(d.getGrnDetailUnit());
  241. newInventory.setInventoryCreateTime(new Date());
  242. newInventory.setInventoryOnWay(new BigDecimal(0));
  243. newInventory.setInventoryBatch(d.getGrnDetailBatch());
  244. newInventory.setInventoryProductTime(d.getGrnDetailProductTime());
  245. inventoryService.getBaseMapper().insert(newInventory);
  246.  
  247. //新库存事务
  248. InventoryTransaction transaction = new InventoryTransaction();
  249. transaction.setGrnTransactionInventoryId(newInventory.getInventoryId());
  250. transaction.setGrnTransactionIsGift(d.getGrnDetailIsGift());
  251. transaction.setGrnTransactionOrderSerial(grnOrderParam.getGrnOrderSerial());
  252. transaction.setGrnTransactionBatch(d.getGrnDetailBatch());
  253. transaction.setGrnTransactionType(BaseStatus.RK.getDesc());
  254. transaction.setGrnTransactionProductId(d.getGrnDetailProductId());
  255. transaction.setGrnTransactionGrnOrderId(grnOrder.getGrnOrderId());
  256. transaction.setGrnTransactionHappenNumber(d.getGrnDetailGoods());
  257. transaction.setGrnTransactionProductionOfDate(d.getGrnDetailProductTime());
  258. transaction.setGrnTransactionProductBarcode(d.getGrnDetailBarcode());
  259. inventoryTransactionService.getBaseMapper().insert(transaction);
  260. }
  261. } else {
  262. //新库存
  263. Inventory newInventory = new Inventory();
  264. newInventory.setInventoryAmount(d.getGrnDetailGoods());
  265. newInventory.setInventoryAvailableLocation(d.getGrnDetailGoods());
  266. newInventory.setInventoryIn(d.getGrnDetailGoods());
  267. newInventory.setInventoryLow(new BigDecimal(0));
  268. newInventory.setInventoryProductId(d.getGrnDetailProductId());
  269. newInventory.setInventoryMax(new BigDecimal(0));
  270. newInventory.setInventoryWarehouseId(d.getGrnDetailWarehouse());
  271. newInventory.setInventoryUnit(d.getGrnDetailUnit());
  272. newInventory.setInventoryCreateTime(new Date());
  273. newInventory.setInventoryOnWay(new BigDecimal(0));
  274. newInventory.setInventoryBatch(d.getGrnDetailBatch());
  275. newInventory.setInventoryProductTime(d.getGrnDetailProductTime());
  276. inventoryService.getBaseMapper().insert(newInventory);
  277.  
  278. //新库存事务
  279. InventoryTransaction transaction = new InventoryTransaction();
  280. transaction.setGrnTransactionInventoryId(newInventory.getInventoryId());
  281. transaction.setGrnTransactionIsGift(d.getGrnDetailIsGift());
  282. transaction.setGrnTransactionOrderSerial(grnOrderParam.getGrnOrderSerial());
  283. transaction.setGrnTransactionBatch(d.getGrnDetailBatch().longValue());
  284. transaction.setGrnTransactionType(BaseStatus.RK.getDesc());
  285. transaction.setGrnTransactionProductId(d.getGrnDetailProductId());
  286. transaction.setGrnTransactionGrnOrderId(grnOrder.getGrnOrderId());
  287. transaction.setGrnTransactionHappenNumber(d.getGrnDetailGoods());
  288. transaction.setGrnTransactionProductionOfDate(d.getGrnDetailProductTime());
  289. transaction.setGrnTransactionProductBarcode(d.getGrnDetailBarcode());
  290. inventoryTransactionService.getBaseMapper().insert(transaction);
  291. }
  292. });
  293. }
  294. });
  295.  
  296. //TODO
  297. //生成付款单
  298. QueryWrapper<PaymentOrder> wrapper = new QueryWrapper<>();
  299. wrapper.orderByDesc("payment_order_id").last("limit 1");
  300. PaymentOrder serial = paymentOrderService.getOne(wrapper);
  301. if (Objects.isNull(serial)) {
  302. serial = new PaymentOrder();
  303. serial.setPaymentOrderId((long) 0);
  304. }
  305. String paySerial = Katrina_CJ_Utils.createOrderSerial(Order.FKD_, serial.getPaymentOrderId());
  306. PaymentOrder paymentOrder = new PaymentOrder();
  307. paymentOrder.setPaymentOrderSerial(paySerial);
  308. paymentOrder.setPaymentOrderCreateTime(new Date());
  309. paymentOrder.setPaymentOrderStatus(Status.EXECUTION.getStatus());
  310.  
  311. //更新采购单
  312. //当前采购单总数
  313. purchaseOrder.setPoSumNumbers(new BigDecimal(0));
  314.  
  315. details.forEach(d -> {
  316. if (purchaseOrder.getPoStatus().equals(Status.EXECUTION.getStatus()) || purchaseOrder.getPoStatus().equals(Status.TERMINATION.getStatus())) {
  317. purchaseDetails.forEach(pd -> {
  318. if (pd.getOrderProductId().equals(d.getGrnDetailProductId())) {
  319. //更新已完成数量
  320. pd.setOrderFinishNumber(pd.getOrderFinishNumber().add(d.getGrnDetailGoods()));
  321. int flag = pd.getOrderNumbers().compareTo(pd.getOrderFinishNumber());
  322. if (flag == 0) {
  323. //已完成
  324. pd.setOrderPendingNumber(new BigDecimal(0));
  325. } else if (flag < 0) {
  326. //超收
  327. pd.setOrderPendingNumber(new BigDecimal(0));
  328. } else {
  329. //更新未完成数量
  330. pd.setOrderPendingNumber(pd.getOrderNumbers().subtract(pd.getOrderFinishNumber()));
  331. }
  332. paymentOrder.setPaymentAmountsPayable(pd.getOrderPrice().multiply(d.getGrnDetailGoods()));
  333. purchaseOrder.setPoSumNumbers(purchaseOrder.getPoSumNumbers().add(pd.getOrderFinishNumber()));
  334. purchaseDetailService.getBaseMapper().updateById(pd);
  335. }
  336. });
  337. } else {
  338. throw new RuntimeException("订单状态异常!");
  339. }
  340. });
  341.  
  342. PurchaseOrder purchaseOrder_old = purchaseOrderService.getById(purchaseOrder.getPoId());
  343.  
  344. int flag = purchaseOrder.getPoSumNumbers().compareTo(purchaseOrder_old.getPoSumNumbers());
  345.  
  346. //订单完成
  347. if (flag == 0 || flag > 0) {
  348. //订单完成
  349. purchaseOrder_old.setPoStatus(Status.FINISH.getStatus());
  350. purchaseOrderService.getBaseMapper().updateById(purchaseOrder_old);
  351. }
  352. paymentOrder.setPaymentGrnOrder(grnOrder.getGrnOrderId());
  353. //新增付款单
  354. paymentOrderService.getBaseMapper().insert(paymentOrder);
  355. }
  356.  
  357. private Serializable getKey(GrnOrderParam param) {
  358. return param.getGrnOrderId();
  359. }
  360.  
  361. private Page getPageContext() {
  362. return LayuiPageFactory.defaultPage();
  363. }
  364.  
  365. private GrnOrder getOldEntity(GrnOrderParam param) {
  366. return this.getById(getKey(param));
  367. }
  368.  
  369. private GrnOrder getEntity(GrnOrderParam param) {
  370. GrnOrder entity = new GrnOrder();
  371. ToolUtil.copyProperties(param, entity);
  372. return entity;
  373. }
  374.  
  375. @Override
  376. public Page<Map<String, Object>> list(String condition, String date_1, String date_2, String status) {
  377. Page productPage = LayuiPageFactory.defaultPage();
  378. return baseMapper.order_list(productPage, condition, date_1, date_2, status);
  379. }
  380.  
  381. }

  

商贸型企业 Java 收货 + 入库 + 生成付款单的更多相关文章

  1. SAP交货单过账自动生产采购订单、采购订单自动收货入库

    公司间需要买卖操作,由于发货和收货都是同一批人在操作,为了减少业务人员的工作量,提高工作效率,特实现以上功能 1.增强实现:增强点为交货单过账成功时触发,在提交前触发,如果遇到不可预知问题,可能造成数 ...

  2. ERP采购收货在标准成本和移动平均价下的差别

    欢迎关注微信公众号:iERPer (ERP咨询顾问之家) ERP系统在处理主要的采购流程有: 下采购合同->下采购订单->收货->发票校验->付款(财务) 其中 收货和发票校验 ...

  3. PP生产订单创建、下达、报工、收货、投料

    转自http://blog.sina.com.cn/s/blog_69fb8eb60102vpjd.html SAP 物料订单创建.下达.报工.收货与投料(ABAP代码) (2015-06-03 22 ...

  4. PDA移动POS终端系统,实现专柜或店铺的收货、零售、盘点通过无线网络直接连接总部中央数据库,实现高效安全的移动供应链管理

    利用PDA移动终端,实现专柜或店铺的收货.零售.盘点等一体化操作,通过无线网络直接连接总部中央数据库,实现高效安全的移动供应链管理. · PDA订货会应用解决方案利用PDA或电脑系统,在订货会现场直接 ...

  5. 微信支付开发(7) 收货地址共享接口V2

    关键字:微信公众平台 JSSDK 发送给朋友 收货地址共享接口 openAddress 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-open ...

  6. JDE报表开发笔记(R5537011 收货校验统计表)

    业务场景:根据批次收货,收货后对该批次产品进行检验,记录检验结果生成统计表. 涉及表:主表F37011,业务从表F43121/F4101/F4108 ------------------------- ...

  7. PO_PO系列 - 收货管理分析(案例)

    2014-07-01 Created By BaoXinjian

  8. 收货MIGO

    FUNCTION zrfc_mm003. *"---------------------------------------------------------------------- * ...

  9. java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串

    java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 package com.zdz.test; im ...

随机推荐

  1. mysql 正确清理binlog日志的两种方法

    前言: MySQL中的binlog日志记录了数据库中数据的变动,便于对数据的基于时间点和基于位置的恢复,但是binlog也会日渐增大,占用很大的磁盘空间,因此,要对binlog使用正确安全的方法清理掉 ...

  2. V语言横空出世,C/C++/Java/Python/Go地位不保

    V语言已在github正式开源,目前已收获近9000星,引发开发者的强烈关注. V语言到底是怎样一门语言?已经有了C/C++/Java/Python/Go..., 我们还需要另外一门语言吗? 先看看V ...

  3. Python 爬虫从入门到进阶之路(十三)

    之前的文章我们介绍了一下 BeautifulSoup4 模块,接下来我们就利用 BeautifulSoup4 模块爬取<糗事百科>的糗事. 之前我们已经分别利用 re 模块和 Xpath ...

  4. 小白开学Asp.Net Core 《五》

    小白开学Asp.Net Core<五>                               —— 使用.Net Core MVC Filter 一.简介 今天在项目(https:/ ...

  5. CDH CM元数据梳理,包括HIVE

      一.Schema SCM 表结构梳理(对应生产BAOFOO_SCM) AUDITS 登录信息.服务,角色重启.配置更改 PROCESSES 进程信息.这里面有很多信息.开放的web端口. HOST ...

  6. SpringCloud系列——限流、熔断、降级

    前言 分布式环境下,服务直接相互调用,一个复杂的业务可能要调用多个服务,例如A -> B -> C -> D,当某个服务出现异常(调用超时.调用失败等)将导致整个流程阻塞崩溃,严重的 ...

  7. scrapy实战1分布式爬取有缘网(6.22接口已挂):

    直接上代码: items.py # -*- coding: utf-8 -*- # Define here the models for your scraped items # # See docu ...

  8. 解决thinkphp在开发环境下文件模块找不到的问题

    win10系统下,phpstudy开发环境下小问题描述: 找不到public公共模块. Not Found The requested URL /public/admin/login.html was ...

  9. Spring 核心技术(2)

    接上篇:Spring 核心技术(1) version 5.1.8.RELEASE 1.3 Bean概述 Spring IoC 容器管理一个或多个bean,他们都是根据提供的配置元数据(例如 XML 中 ...

  10. git rebase VS git merge? 更优雅的 git 合并方式值得拥有

    写在前面 如果你不能很好的应用 Git,那么这里为你提供一个非常棒的 Git 在线练习工具 Git Online ,你可以更直观的看到你所使用的命令会产生什么效果 另外,你在使用 Git 合并分支时只 ...