发货时保存时验证销售订单累计发货数量,并校验销售发票标识,并验证发货款比例
This commit is contained in:
		
							parent
							
								
									96e91e95b3
								
							
						
					
					
						commit
						56756e5aae
					
				|  | @ -0,0 +1,187 @@ | |||
| package nccloud.resources.ic.ic.saleout; | ||||
| 
 | ||||
| import java.time.format.DateTimeFormatter; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| import nc.bs.businessevent.BdUpdateEvent; | ||||
| import nc.bs.businessevent.BusinessEvent; | ||||
| import nc.bs.businessevent.IBusinessEvent; | ||||
| import nc.bs.businessevent.IBusinessListener; | ||||
| import nc.bs.framework.common.NCLocator; | ||||
| import nc.bs.ic.general.businessevent.ICGeneralCommonEvent; | ||||
| import nc.itf.uap.IUAPQueryBS; | ||||
| import nc.jdbc.framework.processor.ColumnProcessor; | ||||
| import nc.jdbc.framework.processor.MapProcessor; | ||||
| import nc.vo.ic.general.define.ICBillBodyVO; | ||||
| import nc.vo.ic.m4c.entity.SaleOutHeadVO; | ||||
| import nc.vo.ic.m4c.entity.SaleOutVO; | ||||
| import nc.vo.pub.BusinessException; | ||||
| import nc.vo.pub.lang.UFDouble; | ||||
| import nc.vo.pubapp.AppContext; | ||||
| import nc.vo.tmpub.util.ModuleEnum; | ||||
| import nc.vo.tmpub.util.ModuleUtil; | ||||
| import java.time.LocalDateTime; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * 发货时保存时验证销售订单累计发货数量,并校验销售发票标识,并验证发货款比例 | ||||
|  * zhangxinah | ||||
|  * 2005适配2312 | ||||
|  */ | ||||
| public class saveBeforeCheck implements IBusinessListener { | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void doAction(IBusinessEvent event) throws BusinessException { | ||||
| 
 | ||||
| 		String pk_group = AppContext.getInstance().getPkGroup(); | ||||
| 		if (ModuleUtil.isEnableByGroup(pk_group, ModuleEnum.SSCRP, false)) { | ||||
| 			if (event != null) { | ||||
| 				Map<String, SaleOutVO[]> map = this.getBills(event); | ||||
| 				SaleOutVO[] obills = map.get("obj"); | ||||
| 				// 判断是否是需要控制的业务单元 | ||||
| 				SaleOutHeadVO parentVO = obills[0].getHead(); | ||||
| 				String pkstockorgStr = getPk_stockorg(parentVO.getPk_org()); | ||||
| 				if (pkstockorgStr == null || pkstockorgStr.equals("")) { | ||||
| 					return; | ||||
| 				} | ||||
| 				ICBillBodyVO[] childrenVO = obills[0].getChildrenVO(); | ||||
| 				for (int i = 0; i < childrenVO.length; ++i) { | ||||
| 					ICBillBodyVO vo = childrenVO[i]; | ||||
| 					Map<String, Object> valMap = getSaleorderPK(vo.getCsourcebillbid()); | ||||
| 					if (valMap == null || valMap.isEmpty()) { | ||||
| 						return; | ||||
| 					} | ||||
| 					// 历史数据不考虑 | ||||
| 					String storedDateStr = (String) valMap.get("creationtime"); | ||||
| 					String targetDateStr = "2024-12-31 00:00:00"; | ||||
| 					DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); | ||||
| 					LocalDateTime storedDate = LocalDateTime.parse(storedDateStr, formatter); | ||||
| 					LocalDateTime targetDate = LocalDateTime.parse(targetDateStr, formatter); | ||||
| 					if (storedDate.isBefore(targetDate)) { | ||||
| 						return; | ||||
| 					} | ||||
| 					// 销售发票表头pk_billtypecode=30-Cxx-12 | ||||
| 					if (valMap.get("pk_billtypecode").equals("30-Cxx-12") | ||||
| 							|| valMap.get("pk_billtypecode").equals("30-Cxx-02") | ||||
| 							|| valMap.get("pk_billtypecode").equals("30-Cxx-08") | ||||
| 							|| valMap.get("pk_billtypecode").equals("30-Cxx-13")) { | ||||
| 						return; | ||||
| 					} | ||||
| 					// 销售发票表头vdef21=是 | ||||
| 					if (valMap.get("vdef20") == null || !valMap.get("vdef20").equals("Y")) { | ||||
| 						throw new BusinessException("销售出库单明细" + (i + 1) + ",销售发票验证不通过,无法保存!"); | ||||
| 					} | ||||
| 					if (valMap.get("sqty") == null) { | ||||
| 						throw new BusinessException("销售出库单明细" + (i + 1) + ",累计发货申请数量为0,无法保存!"); | ||||
| 					} else { | ||||
| 						try { | ||||
| 							double sQty = Double.parseDouble((String) valMap.get("sqty"));// 累计发货申请数量 | ||||
| 							UFDouble bdnumUF = vo.getNshouldassistnum();// 本单应发数量 | ||||
| 							double bdnum = 0; | ||||
| 							if (bdnumUF != null) { | ||||
| 								bdnum = bdnumUF.getDouble(); | ||||
| 							} | ||||
| 							// 应发数量判断 | ||||
| 							Object ntotaloutnumsObj = valMap.get("ntotaloutnums"); | ||||
| 							String ntotaloutnums = (ntotaloutnumsObj != null) ? ntotaloutnumsObj.toString() : ""; | ||||
| 							double ntotaloutnum = (ntotaloutnums.isEmpty()) ? 0 : Double.parseDouble(ntotaloutnums);// 累计出库主数量 | ||||
| 
 | ||||
| 							if (sQty < (ntotaloutnum + bdnum)) { | ||||
| 								throw new BusinessException("销售出库单明细" + (i + 1) + ",累计出库应发数量'" + (ntotaloutnum + bdnum) | ||||
| 										+ "'大于销售订单累计发货申请数量'" + sQty + "',无法保存!"); | ||||
| 							} | ||||
| 							// 实发数量判断 | ||||
| 							UFDouble bdsfnumUF = vo.getNassistnum();// 本单实发数量 | ||||
| 							double bdsfnum = 0; | ||||
| 							if (bdsfnumUF != null) { | ||||
| 								bdsfnum = bdsfnumUF.getDouble(); | ||||
| 							} | ||||
| 							Object nassistnumObj = valMap.get("nassistnum"); | ||||
| 							String nassistnums = (nassistnumObj != null) ? nassistnumObj.toString() : ""; | ||||
| 							double nassistnum = (nassistnums.isEmpty()) ? 0 : Double.parseDouble(nassistnums);// 累计出库主数量 | ||||
| 							if (sQty < (nassistnum + bdsfnum)) { | ||||
| 								throw new BusinessException("销售出库单明细" + (i + 1) + ",累计出库实发数量'" + (nassistnum + bdsfnum) | ||||
| 										+ "'大于销售订单累计发货申请数量'" + sQty + "',无法保存!"); | ||||
| 							} | ||||
| 						} catch (NumberFormatException e) { | ||||
| 							throw new BusinessException("累计发货申请数量、累计出库数量转化数值失败" + e); | ||||
| 						} | ||||
| 					} | ||||
| 
 | ||||
| 				} | ||||
| 
 | ||||
| 			} | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	private Map<String, Object> getSaleorderPK(String csourcebillbidStr) throws BusinessException { | ||||
| 		IUAPQueryBS queryBS = NCLocator.getInstance().lookup(IUAPQueryBS.class); | ||||
| 		String sql = " SELECT s.creationtime,bt.pk_billtypecode,sb.csaleorderbid,sb.vbdef2 AS sQty,\n" + "s.vdef11,\n" | ||||
| 				+ "si.vdef20,\n" + "sbv.nassistnum,\n" + "sbv.ntotaloutnums\n" + "FROM so_saleinvoice_b sib\n" | ||||
| 				+ "INNER JOIN so_saleinvoice si ON si.csaleinvoiceid = sib.csaleinvoiceid\n" | ||||
| 				+ "INNER JOIN so_saleorder_b sb ON sb.csaleorderbid = sib.csrcbid\n" | ||||
| 				+ "left join (SELECT SUM(b.nshouldassistnum) AS ntotaloutnums,sum(nassistnum) as nassistnum,c.csaleorderbid\n" | ||||
| 				+ "FROM so_saleorder_b c\n" + "INNER JOIN so_saleinvoice_b a ON c.csaleorderbid = a.csrcbid\n" | ||||
| 				+ "INNER JOIN ic_saleout_b b ON b.csourcebillbid = a.csaleinvoicebid\n" + "where a.dr=0 and b.dr=0 \n" | ||||
| 				+ "GROUP BY c.csaleorderbid) sbv on sbv.csaleorderbid=sb.csaleorderbid\n" | ||||
| 				+ "INNER JOIN so_saleorder s ON s.csaleorderid = sb.csaleorderid\n" | ||||
| 				+ "INNER JOIN bd_billtype bt on bt.pk_billtypeid=s.ctrantypeid\n" | ||||
| 				+ "INNER JOIN so_saleorder_exe se ON sb.csaleorderbid = se.csaleorderbid\n" | ||||
| 				+ "WHERE sib.csaleinvoicebid = '" + csourcebillbidStr + "' "; | ||||
| 		Map<String, Object> valList = (Map<String, Object>) queryBS.executeQuery(sql, new MapProcessor()); | ||||
| 		return valList; | ||||
| 	} | ||||
| 
 | ||||
| 	public IUAPQueryBS getQueryService() { | ||||
| 		return NCLocator.getInstance().lookup(IUAPQueryBS.class); | ||||
| 	} | ||||
| 
 | ||||
| 	private Map<String, SaleOutVO[]> getBills(IBusinessEvent event) throws BusinessException { | ||||
| 		Object object = null; | ||||
| 		Object old = null; | ||||
| 		Map<String, SaleOutVO[]> retMap = new HashMap<>(); | ||||
| 		// 类型判断和赋值 | ||||
| 		if (event instanceof BusinessEvent) { | ||||
| 			BusinessEvent bills = (BusinessEvent) event; | ||||
| 			object = bills.getObject(); | ||||
| 		} else if (event instanceof BdUpdateEvent) { | ||||
| 			BdUpdateEvent e = (BdUpdateEvent) event; | ||||
| 			object = e.getNewObject(); | ||||
| 			old = e.getOldObject(); | ||||
| 		} else if (event instanceof ICGeneralCommonEvent) { | ||||
| 			ICGeneralCommonEvent e = (ICGeneralCommonEvent) event; | ||||
| 			object = e.getNewObjs(); | ||||
| 			old = e.getOldObjs(); | ||||
| 		} else { | ||||
| 			throw new BusinessException("未找到单据类型"); | ||||
| 		} | ||||
| 		// 将 object 和 old 转换为 SaleOutVO[] 并添加到 retMap | ||||
| 		retMap.put("new", toSaleOutVOArray(object)); | ||||
| 		retMap.put("old", toSaleOutVOArray(old)); | ||||
| 		// 根据 new 或 old 来设置 "obj" | ||||
| 		retMap.put("obj", retMap.get("new") != null ? retMap.get("new") : retMap.get("old")); | ||||
| 		return retMap; | ||||
| 	} | ||||
| 
 | ||||
| 	// 辅助方法:将对象转换为 SaleOutVO 数组 | ||||
| 	private SaleOutVO[] toSaleOutVOArray(Object object) { | ||||
| 		if (object == null) { | ||||
| 			return null; | ||||
| 		} | ||||
| 		if (object.getClass().isArray()) { | ||||
| 			return (SaleOutVO[]) object; | ||||
| 		} else { | ||||
| 			return new SaleOutVO[] { (SaleOutVO) object }; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	private String getPk_stockorg(String pk_stockorg) throws BusinessException { | ||||
| 		String sql = " select pk_stockorg from org_stockorg where code in ('C018','C029','C033','C039','C020','C019') and pk_stockorg='" | ||||
| 				+ pk_stockorg + "' "; | ||||
| 		String saleorderPK = (String) getQueryService().executeQuery(sql, new ColumnProcessor()); | ||||
| 		return saleorderPK; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
		Loading…
	
		Reference in New Issue