diff --git a/jshERP-boot/src/main/java/com/jsh/erp/constants/BusinessConstants.java b/jshERP-boot/src/main/java/com/jsh/erp/constants/BusinessConstants.java index dc804fdf..7b350637 100644 --- a/jshERP-boot/src/main/java/com/jsh/erp/constants/BusinessConstants.java +++ b/jshERP-boot/src/main/java/com/jsh/erp/constants/BusinessConstants.java @@ -60,11 +60,12 @@ public class BusinessConstants { public static final String ENABLE_SERIAL_NUMBER_ENABLED = "1"; public static final String ENABLE_SERIAL_NUMBER_NOT_ENABLED = "0"; /** - * 单据状态 billsStatus '0'未审核 '1'审核 '2'已转采购|销售 + * 单据状态 billsStatus '0'未审核 '1'审核 '2'完成采购|销售 '3'部分采购|销售 * */ public static final String BILLS_STATUS_UN_AUDIT = "0"; public static final String BILLS_STATUS_AUDIT = "1"; - public static final String BILLS_STATUS_SKIP = "2"; + public static final String BILLS_STATUS_SKIPED = "2"; + public static final String BILLS_STATUS_SKIPING = "3"; /** * 出入库分类 *采购、采购退货、其它、零售、销售、调拨等 diff --git a/jshERP-boot/src/main/java/com/jsh/erp/constants/ExceptionConstants.java b/jshERP-boot/src/main/java/com/jsh/erp/constants/ExceptionConstants.java index f972df61..a319ca00 100644 --- a/jshERP-boot/src/main/java/com/jsh/erp/constants/ExceptionConstants.java +++ b/jshERP-boot/src/main/java/com/jsh/erp/constants/ExceptionConstants.java @@ -336,6 +336,9 @@ public class ExceptionConstants { //单据反审核-只有已审核的单据才能反审核 public static final int DEPOT_HEAD_AUDIT_TO_UN_AUDIT_FAILED_CODE = 8500013; public static final String DEPOT_HEAD_AUDIT_TO_UN_AUDIT_FAILED_MSG = "抱歉,只有已审核的单据才能反审核"; + //单据录入-商品条码XXX的数量需要修改下 + public static final int DEPOT_HEAD_NUMBER_NEED_EDIT_FAILED_CODE = 85000014; + public static final String DEPOT_HEAD_NUMBER_NEED_EDIT_FAILED_MSG = "商品条码%s的数量需要修改下"; /** * 单据明细信息 * type = 90 diff --git a/jshERP-boot/src/main/java/com/jsh/erp/controller/DepotItemController.java b/jshERP-boot/src/main/java/com/jsh/erp/controller/DepotItemController.java index 4b6587c6..1e9d599d 100644 --- a/jshERP-boot/src/main/java/com/jsh/erp/controller/DepotItemController.java +++ b/jshERP-boot/src/main/java/com/jsh/erp/controller/DepotItemController.java @@ -197,6 +197,8 @@ public class DepotItemController { item.put("sku", diEx.getSku()); item.put("operNumber", diEx.getOperNumber()); item.put("basicNumber", diEx.getBasicNumber()); + item.put("preNumber", diEx.getOperNumber()); //原数量 + item.put("finishNumber", depotItemService.getFinishNumber(diEx.getMaterialId(), diEx.getHeaderId())); //已入库|已出库 item.put("unitPrice", diEx.getUnitPrice()); item.put("taxUnitPrice", diEx.getTaxUnitPrice()); item.put("allPrice", diEx.getAllPrice()); diff --git a/jshERP-boot/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapperEx.java b/jshERP-boot/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapperEx.java index 767f45df..c223fa2e 100644 --- a/jshERP-boot/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapperEx.java +++ b/jshERP-boot/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapperEx.java @@ -22,7 +22,7 @@ public interface DepotHeadMapperEx { @Param("type") String type, @Param("subType") String subType, @Param("creatorArray") String[] creatorArray, - @Param("status") String status, + @Param("statusArray") String[] statusArray, @Param("number") String number, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @@ -38,7 +38,7 @@ public interface DepotHeadMapperEx { @Param("type") String type, @Param("subType") String subType, @Param("creatorArray") String[] creatorArray, - @Param("status") String status, + @Param("statusArray") String[] statusArray, @Param("number") String number, @Param("beginTime") String beginTime, @Param("endTime") String endTime, diff --git a/jshERP-boot/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapperEx.java b/jshERP-boot/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapperEx.java index 5c4fdc8d..b5f3b55b 100644 --- a/jshERP-boot/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapperEx.java +++ b/jshERP-boot/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapperEx.java @@ -123,4 +123,9 @@ public interface DepotItemMapperEx { int findStockWarningCountTotal( @Param("materialParam") String materialParam, @Param("depotId") Long depotId); + + BigDecimal getFinishNumber( + @Param("mId") Long mId, + @Param("linkNumber") String linkNumber, + @Param("goToType") String goToType); } diff --git a/jshERP-boot/src/main/java/com/jsh/erp/service/depotHead/DepotHeadService.java b/jshERP-boot/src/main/java/com/jsh/erp/service/depotHead/DepotHeadService.java index 4ed04cdd..d746c2d5 100644 --- a/jshERP-boot/src/main/java/com/jsh/erp/service/depotHead/DepotHeadService.java +++ b/jshERP-boot/src/main/java/com/jsh/erp/service/depotHead/DepotHeadService.java @@ -107,11 +107,12 @@ public class DepotHeadService { try{ String [] depotArray = getDepotArray(subType); String [] creatorArray = getCreatorArray(roleType); + String [] statusArray = StringUtil.isNotEmpty(status) ? status.split(",") : null; Map personMap = personService.getPersonMap(); Map accountMap = accountService.getAccountMap(); beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME); endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME); - list=depotHeadMapperEx.selectByConditionDepotHead(type, subType, creatorArray, status, number, beginTime, endTime, + list=depotHeadMapperEx.selectByConditionDepotHead(type, subType, creatorArray, statusArray, number, beginTime, endTime, materialParam, organId, creator, depotId, depotArray, offset, rows); if (null != list) { for (DepotHeadVo4List dh : list) { @@ -155,9 +156,10 @@ public class DepotHeadService { try{ String [] depotArray = getDepotArray(subType); String [] creatorArray = getCreatorArray(roleType); + String [] statusArray = StringUtil.isNotEmpty(status) ? status.split(",") : null; beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME); endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME); - result=depotHeadMapperEx.countsByDepotHead(type, subType, creatorArray, status, number, beginTime, endTime, + result=depotHeadMapperEx.countsByDepotHead(type, subType, creatorArray, statusArray, number, beginTime, endTime, materialParam, organId, creator, depotId, depotArray); }catch(Exception e){ JshException.readFail(logger, e); @@ -723,18 +725,6 @@ public class DepotHeadService { /**入库和出库处理单据子表信息*/ depotItemService.saveDetials(rows,headId, request); } - /**如果关联单据号非空则更新订单的状态为2 (只操作采购订单和销售订单) */ - if(depotHead.getLinkNumber()!=null) { - DepotHead depotHeadOrders = new DepotHead(); - depotHeadOrders.setStatus(BusinessConstants.BILLS_STATUS_SKIP); - DepotHeadExample example = new DepotHeadExample(); - example.createCriteria().andNumberEqualTo(depotHead.getLinkNumber()).andTypeEqualTo("其它"); - try{ - depotHeadMapper.updateByExampleSelective(depotHeadOrders, example); - }catch(Exception e){ - JshException.writeFail(logger, e); - } - } logService.insertLog("单据", new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(depotHead.getNumber()).toString(), ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); diff --git a/jshERP-boot/src/main/java/com/jsh/erp/service/depotItem/DepotItemService.java b/jshERP-boot/src/main/java/com/jsh/erp/service/depotItem/DepotItemService.java index 3776835d..bdae8f91 100644 --- a/jshERP-boot/src/main/java/com/jsh/erp/service/depotItem/DepotItemService.java +++ b/jshERP-boot/src/main/java/com/jsh/erp/service/depotItem/DepotItemService.java @@ -320,6 +320,8 @@ public class DepotItemService { } //删除单据的明细 deleteDepotItemHeadId(headerId); + //单据状态:是否全部完成 2-全部完成 3-部分完成(针对订单的分批出入库) + String billStatus = BusinessConstants.BILLS_STATUS_SKIPED; JSONArray rowArr = JSONArray.parseArray(rows); if (null != rowArr && rowArr.size()>0) { for (int i = 0; i < rowArr.size(); i++) { @@ -351,6 +353,17 @@ public class DepotItemService { depotItem.setBasicNumber(oNumber); //其他情况 } } + //如果数量+已完成数量<原订单数量,代表该单据状态为未全部完成出入库 + if (StringUtil.isExist(rowObj.get("preNumber")) && StringUtil.isExist(rowObj.get("finishNumber"))) { + BigDecimal preNumber = rowObj.getBigDecimal("preNumber"); + BigDecimal finishNumber = rowObj.getBigDecimal("finishNumber"); + if(depotItem.getOperNumber().add(finishNumber).compareTo(preNumber)<0) { + billStatus = BusinessConstants.BILLS_STATUS_SKIPING; + } else if(depotItem.getOperNumber().add(finishNumber).compareTo(preNumber)>0) { + throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_NUMBER_NEED_EDIT_FAILED_CODE, + String.format(ExceptionConstants.DEPOT_HEAD_NUMBER_NEED_EDIT_FAILED_MSG, barCode)); + } + } if (StringUtil.isExist(rowObj.get("unitPrice"))) { depotItem.setUnitPrice(rowObj.getBigDecimal("unitPrice")); } @@ -425,12 +438,37 @@ public class DepotItemService { //更新当前库存 updateCurrentStock(depotItem); } + //如果关联单据号非空则更新订单的状态 + if(StringUtil.isNotEmpty(depotHead.getLinkNumber())) { + changeBillStatus(depotHead, billStatus); + } } else { throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_ROW_FAILED_CODE, String.format(ExceptionConstants.DEPOT_HEAD_ROW_FAILED_MSG)); } } + /** + * 更新单据状态 + * @param depotHead + * @param billStatus + */ + public void changeBillStatus(DepotHead depotHead, String billStatus) { + DepotHead depotHeadOrders = new DepotHead(); + depotHeadOrders.setStatus(billStatus); + DepotHeadExample example = new DepotHeadExample(); + List linkNumberList = StringUtil.strToStringList(depotHead.getLinkNumber()); + example.createCriteria().andNumberIn(linkNumberList); + try{ + depotHeadMapper.updateByExampleSelective(depotHeadOrders, example); + }catch(Exception e){ + logger.error("异常码[{}],异常提示[{}],异常[{}]", + ExceptionConstants.DATA_WRITE_FAIL_CODE,ExceptionConstants.DATA_WRITE_FAIL_MSG,e); + throw new BusinessRunTimeException(ExceptionConstants.DATA_WRITE_FAIL_CODE, + ExceptionConstants.DATA_WRITE_FAIL_MSG); + } + } + @Transactional(value = "transactionManager", rollbackFor = Exception.class) public void deleteDepotItemHeadId(Long headerId)throws Exception { DepotItemExample example = new DepotItemExample(); @@ -597,4 +635,19 @@ public class DepotItemService { } } } + + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public BigDecimal getFinishNumber(Long mId, Long headerId) { + String goToType = ""; + DepotHead depotHead =depotHeadMapper.selectByPrimaryKey(headerId); + String linkNumber = depotHead.getNumber(); //订单号 + if(BusinessConstants.SUB_TYPE_PURCHASE_ORDER.equals(depotHead.getSubType())) { + goToType = BusinessConstants.SUB_TYPE_PURCHASE; + } + if(BusinessConstants.SUB_TYPE_SALES_ORDER.equals(depotHead.getSubType())) { + goToType = BusinessConstants.SUB_TYPE_SALES; + } + BigDecimal count = depotItemMapperEx.getFinishNumber(mId, linkNumber, goToType); + return count; + } } diff --git a/jshERP-boot/src/main/resources/mapper_xml/DepotHeadMapperEx.xml b/jshERP-boot/src/main/resources/mapper_xml/DepotHeadMapperEx.xml index b877f6e6..e0b451ca 100644 --- a/jshERP-boot/src/main/resources/mapper_xml/DepotHeadMapperEx.xml +++ b/jshERP-boot/src/main/resources/mapper_xml/DepotHeadMapperEx.xml @@ -61,8 +61,12 @@ and dh.sub_type=#{subType} - - and dh.status =#{status} + + and dh.status in ( + + #{status} + + ) @@ -121,8 +125,12 @@ and dh.sub_type=#{subType} - - and dh.status =#{status} + + and dh.status in ( + + #{status} + + ) diff --git a/jshERP-boot/src/main/resources/mapper_xml/DepotItemMapperEx.xml b/jshERP-boot/src/main/resources/mapper_xml/DepotItemMapperEx.xml index e1e476f3..efb1a37f 100644 --- a/jshERP-boot/src/main/resources/mapper_xml/DepotItemMapperEx.xml +++ b/jshERP-boot/src/main/resources/mapper_xml/DepotItemMapperEx.xml @@ -456,4 +456,21 @@ group by m.id,m.name, m.model, m.unit, m.color, u.name) tb + +