作业量新增接口
This commit is contained in:
		
							parent
							
								
									5596bef445
								
							
						
					
					
						commit
						bb79ead554
					
				|  | @ -0,0 +1,5 @@ | |||
| <?xml version="1.0" encoding='gb2312'?> | ||||
| <module> | ||||
| <rest> | ||||
| 	<resource classname="nc.api.mmpac.resource.ApplytaskRestResource"  exinfo="作业量新增接口"/> | ||||
| </rest> | ||||
|  | @ -0,0 +1,160 @@ | |||
| package nc.api.mmpac.resource; | ||||
| 
 | ||||
| import com.alibaba.fastjson.JSONObject; | ||||
| import nc.bs.framework.common.NCLocator; | ||||
| import nc.bs.logging.Log; | ||||
| import nc.bs.trade.business.HYPubBO; | ||||
| import nc.bs.trade.business.HYSuperDMO; | ||||
| import nc.impl.mmpac.apply.task.TaskAMaintainServiceImpl; | ||||
| import nc.itf.mmpac.apply.task.ITaskABusinessService; | ||||
| import nc.itf.mmpac.apply.task.ITaskAMaintainService; | ||||
| import nc.itf.mmpac.apply.task.ITaskAQueryService; | ||||
| import nc.itf.mmpac.pmo.pac0002.IPMOQueryService; | ||||
| import nc.itf.uap.IUAPQueryBS; | ||||
| import nc.itf.uap.pf.IPfExchangeService; | ||||
| import nc.util.mmf.framework.base.MMArrayUtil; | ||||
| import nc.util.mmf.framework.base.MMCollectionUtil; | ||||
| import nc.util.mmf.framework.base.MMValueCheck; | ||||
| import nc.vo.mmpac.apply.task.entity.AggTaskAVO; | ||||
| import nc.vo.mmpac.apply.task.entity.TaskABVO; | ||||
| import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; | ||||
| import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO; | ||||
| import nc.vo.pub.BusinessException; | ||||
| import nc.vo.pub.CircularlyAccessibleValueObject; | ||||
| import nc.vo.pub.compiler.PfParameterVO; | ||||
| import nc.vo.pub.lang.UFDate; | ||||
| import nc.vo.pub.lang.UFDouble; | ||||
| import nccloud.api.rest.utils.ResultMessageUtil; | ||||
| import nccloud.framework.service.ServiceLocator; | ||||
| import nccloud.pubitf.mmpac.pmo.service.IPublicPMOService4Activity; | ||||
| import nccloud.ws.rest.resource.AbstractNCCRestResource; | ||||
| import org.json.JSONString; | ||||
| 
 | ||||
| import javax.ws.rs.Consumes; | ||||
| import javax.ws.rs.POST; | ||||
| import javax.ws.rs.Path; | ||||
| import javax.ws.rs.Produces; | ||||
| import java.util.*; | ||||
| 
 | ||||
| @Path("mmpac/applytask") | ||||
| public class ApplytaskRestResource  extends AbstractNCCRestResource { | ||||
|     HYSuperDMO dmo = null; | ||||
|     private static final Log logger = Log.getInstance("pmoresoucelogger"); | ||||
|     public HYSuperDMO getSuperDMO() { | ||||
|         if (dmo == null) { | ||||
|             dmo = new HYSuperDMO(); | ||||
|         } | ||||
|         return dmo; | ||||
|     } | ||||
|     public ApplytaskRestResource() { | ||||
|     } | ||||
|     @Override | ||||
|     public String getModule() { | ||||
|         return "mmpac"; | ||||
|     } | ||||
| 
 | ||||
|     @POST | ||||
|     @Path("/save") | ||||
|     @Consumes({"application/json"}) | ||||
|     @Produces({"application/json"}) | ||||
|     public JSONString save(Map<String, Object> paramMap) throws BusinessException { | ||||
|         logger.debug("=================开始进行================"); | ||||
|         List<Map<String, Object>> paramList = (List) paramMap.get("data"); | ||||
|         if (paramList == null || paramList.size() == 0) { | ||||
|             throw new BusinessException("数据不能为空"); | ||||
|         } | ||||
|         HYPubBO hybo = new HYPubBO(); | ||||
|         List<String> ids = new ArrayList<String>(); | ||||
|         List<String> bids= new ArrayList<>(); | ||||
|         List<AggTaskAVO> aggTaskAVOS = new ArrayList<>(); | ||||
|         for (Map<String, Object> param : paramList) { | ||||
|            Object orderId= hybo.findColValue("mm_pmo","cpmohid"," vbillcode  ='" + param.get("billcode") + "' "); | ||||
|            String mrlCode= (String) param.get("mrlcode"); | ||||
|            String mrlid=(String) hybo.findColValue("bd_material","pk_material"," code  = '" + mrlCode + "' "); | ||||
|            if(mrlid == null){ | ||||
|                throw new BusinessException("产品编码不能为空"); | ||||
|            } | ||||
|             if (orderId != null && !orderId.equals("")) { | ||||
|                PMOAggVO[] pmoaggvos = ((IPMOQueryService)NCLocator.getInstance().lookup(IPMOQueryService.class)).queryByPks(new String[]{(String) orderId}); | ||||
|                if (pmoaggvos == null || pmoaggvos.length == 0) { | ||||
| 
 | ||||
|                }else{ | ||||
|                    for (PMOAggVO pmoaggvo : pmoaggvos) { | ||||
|                        for (PMOItemVO pmoItemVO:   pmoaggvo.getChildrenVO()){ | ||||
|                               if(pmoItemVO.getCmaterialvid().equals(mrlid)){ | ||||
|                                   ids.add(pmoaggvo.getParentVO().getCpmohid()) ; | ||||
|                                   bids.add(pmoItemVO.getCmoid()); | ||||
|                                   AggTaskAVO[] aggvos = pushActivity((String[]) ids.toArray(new String[ids.size()]), (String[]) bids.toArray(new String[ids.size()])); | ||||
|                                   if (aggvos == null || aggvos.length == 0) { | ||||
| 
 | ||||
|                                   }else { | ||||
|                                       Object cactivityid= hybo.findColValue("bd_activity","cactivityid"," vactivitycode  ='G001' "); | ||||
| 
 | ||||
|                                       for (AggTaskAVO aggTaskAVO : aggvos) { | ||||
|                                           aggTaskAVO.getParentVO(); | ||||
|                                           TaskABVO[] taskABVOS= (TaskABVO[])aggTaskAVO.getChildrenVO(); | ||||
|                                           for (TaskABVO taskABVO : taskABVOS) { | ||||
|                                               taskABVO.setCactivityid((String) cactivityid); | ||||
|                                               taskABVO.setNactnum(new UFDouble((double) param.get("workTime")) ); | ||||
|                                               String month = (String) param.get("month"); | ||||
| 
 | ||||
|                                               taskABVO.setDtaskdate(UFDate.getDate(month) ); | ||||
| //                                              taskABVO.setNactnum(new UFDouble((double) param.get("workTime")) ); | ||||
| 
 | ||||
|                                           } | ||||
|                                           aggTaskAVOS.add(aggTaskAVO); | ||||
|                                       } | ||||
|                                   } | ||||
|                               } | ||||
|                        } | ||||
|                    } | ||||
|                } | ||||
| 
 | ||||
|            } | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         ITaskAMaintainService iTaskAQueryService = NCLocator.getInstance().lookup(ITaskAMaintainService.class); | ||||
|         AggTaskAVO[] sourceVOs = iTaskAQueryService.insert(aggTaskAVOS.toArray(new AggTaskAVO[aggTaskAVOS.size()])); | ||||
|         JSONObject errojson = new JSONObject(); | ||||
|         errojson.put("data", sourceVOs); | ||||
|         errojson.put("status", "1"); | ||||
|         errojson.put("message", "保存成功"); | ||||
|         errojson.put("codeList", ""); | ||||
|         // 返回表示操作成功的JSON字符串 | ||||
|         return ResultMessageUtil.toJSON(errojson); | ||||
|     } | ||||
|     public AggTaskAVO[] pushActivity(String[] ids, String[] bids) throws BusinessException { | ||||
|         PMOAggVO[] pmoaggvos = ((IPMOQueryService)NCLocator.getInstance().lookup(IPMOQueryService.class)).queryByPks(ids); | ||||
|         if (MMArrayUtil.isEmpty(pmoaggvos)) { | ||||
|             return null; | ||||
|         } else { | ||||
|             if (MMArrayUtil.isNotEmpty(bids)) { | ||||
|                 Set<String> bidSet = new HashSet(); | ||||
| 
 | ||||
|                 for(String bid : bids) { | ||||
|                     bidSet.add(bid); | ||||
|                 } | ||||
| 
 | ||||
|                 PMOAggVO cardAggvo = pmoaggvos[0]; | ||||
|                 List<PMOItemVO> filterList = new ArrayList(); | ||||
|                 PMOItemVO[] items = cardAggvo.getChildrenVO(); | ||||
|                 if (MMArrayUtil.isNotEmpty(items)) { | ||||
|                     for(PMOItemVO item : items) { | ||||
|                         if (!MMValueCheck.isEmpty(item) && bidSet.contains(item.getCmoid())) { | ||||
|                             filterList.add(item); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 if (MMCollectionUtil.isNotEmpty(filterList)) { | ||||
|                     cardAggvo.setChildrenVO((CircularlyAccessibleValueObject[])filterList.toArray(new PMOItemVO[filterList.size()])); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             AggTaskAVO[] taskvos = ((ITaskABusinessService)NCLocator.getInstance().lookup(ITaskABusinessService.class)).fillTaskPmoInfo(pmoaggvos); | ||||
|             return taskvos; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,30 @@ | |||
| // | ||||
| // Source code recreated from a .class file by IntelliJ IDEA | ||||
| // (powered by FernFlower decompiler) | ||||
| // | ||||
| 
 | ||||
| package nc.impl.pu.m23.maintain.action; | ||||
| 
 | ||||
| import nc.bs.pu.m23.maintain.ArriveInsertBP; | ||||
| import nc.bs.pu.m23.plugin.ArriveActionPlugInPoint; | ||||
| import nc.impl.pu.m23.maintain.rule.CheckBillDateRule; | ||||
| import nc.impl.pubapp.pattern.rule.processer.AroundProcesser; | ||||
| import nc.vo.pu.m23.entity.ArriveVO; | ||||
| import nc.vo.pu.m23.env.ArrivalUIToBSEnv; | ||||
| 
 | ||||
| public class ArriveInsertAction { | ||||
|     public ArriveInsertAction() { | ||||
|     } | ||||
| 
 | ||||
|     public ArriveVO[] insertArrive(ArriveVO[] voArray, ArrivalUIToBSEnv env) { | ||||
|         AroundProcesser<ArriveVO> processer = new AroundProcesser(ArriveActionPlugInPoint.ArriveInsertAction); | ||||
|         addBeforeRule(processer); | ||||
|         ArriveInsertBP bp = new ArriveInsertBP(env); | ||||
|         ArriveVO[] ret = bp.insertArrive(voArray); | ||||
|         processer.after(ret); | ||||
|         return ret; | ||||
|     } | ||||
|     private void addBeforeRule(AroundProcesser<ArriveVO> processer) { | ||||
|         processer.addBeforeFinalRule(new CheckBillDateRule()); | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,43 @@ | |||
| // | ||||
| // Source code recreated from a .class file by IntelliJ IDEA | ||||
| // (powered by FernFlower decompiler) | ||||
| // | ||||
| 
 | ||||
| package nc.impl.pu.m23.maintain.action; | ||||
| 
 | ||||
| import nc.bs.mmpac.pmo.pac0002.bp.rule.saveBeforeCheckRule; | ||||
| import nc.bs.mmpac.pmo.pac0002.flowbiz.PMOCommitFlowCheckRule; | ||||
| import nc.bs.pu.m23.maintain.ArriveUpdateBP; | ||||
| import nc.bs.pu.m23.plugin.ArriveActionPlugInPoint; | ||||
| import nc.impl.pu.m23.maintain.rule.CheckBillDateRule; | ||||
| import nc.impl.pubapp.pattern.rule.processer.AroundProcesser; | ||||
| import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser; | ||||
| import nc.itf.pu.reference.ic.ATPServices; | ||||
| import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; | ||||
| import nc.vo.pu.m21.entity.OrderVO; | ||||
| import nc.vo.pu.m23.entity.ArriveVO; | ||||
| import nc.vo.pu.m23.env.ArrivalUIToBSEnv; | ||||
| import nc.vo.pu.m23.utils.ExtBillHasGrandsonDataUtils; | ||||
| import nc.vo.scmpub.res.billtype.POBillType; | ||||
| 
 | ||||
| public class ArriveUpdateAction { | ||||
|     public ArriveUpdateAction() { | ||||
|     } | ||||
| 
 | ||||
|     public ArriveVO[] updateArrive(ArriveVO[] voArray, ArrivalUIToBSEnv env) { | ||||
|         AroundProcesser<ArriveVO> processer = new AroundProcesser(ArriveActionPlugInPoint.ArriveUpdateAction); | ||||
|         addBeforeRule(processer); | ||||
|         processer.addBeforeRule(new CheckBillDateRule()); | ||||
|         processer.before(voArray); | ||||
|         ExtBillHasGrandsonDataUtils<ArriveVO> tool = new ExtBillHasGrandsonDataUtils(voArray); | ||||
|         ArriveVO[] originVOArray = (ArriveVO[])tool.getOriginBills(); | ||||
|         ArriveUpdateBP bp = new ArriveUpdateBP(env); | ||||
|         ArriveVO[] ret = bp.updateArrive(voArray, originVOArray); | ||||
| 
 | ||||
|         processer.after(ret); | ||||
|         return ret; | ||||
|     } | ||||
|     private void addBeforeRule(AroundProcesser<ArriveVO> processer) { | ||||
|         processer.addBeforeFinalRule(new CheckBillDateRule()); | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,165 @@ | |||
| // | ||||
| // Source code recreated from a .class file by IntelliJ IDEA | ||||
| // (powered by FernFlower decompiler) | ||||
| // | ||||
| 
 | ||||
| package nc.impl.pu.m23.maintain.rule; | ||||
| 
 | ||||
| import nc.bs.framework.common.NCLocator; | ||||
| import nc.impl.pubapp.pattern.rule.IRule; | ||||
| import nc.pubitf.so.m30.api.ISaleOrderQueryAPI; | ||||
| import nc.vo.pu.m21.entity.OrderItemVO; | ||||
| import nc.vo.pu.m21.entity.OrderVO; | ||||
| import nc.vo.pu.m23.entity.ArriveItemVO; | ||||
| import nc.vo.pu.m23.entity.ArriveVO; | ||||
| import nc.vo.pu.pub.util.BillQuery; | ||||
| import nc.vo.pub.BusinessException; | ||||
| import nc.vo.so.m30.entity.SaleOrderBVO; | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| 
 | ||||
| import java.text.SimpleDateFormat; | ||||
| import java.util.Date; | ||||
| 
 | ||||
| public class CheckBillDateRule  implements IRule<ArriveVO> { | ||||
|     public CheckBillDateRule() { | ||||
|     } | ||||
|     // 日期格式化工具,使用Java标准库 | ||||
|     private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd"); | ||||
| 
 | ||||
|     public void process(ArriveVO[] vos) { | ||||
| 
 | ||||
| 
 | ||||
| // 提取API服务实例到循环外,提升性能 | ||||
|           try{for (ArriveVO vo : vos) { | ||||
|               // 校验到货单主信息是否存在 | ||||
|               if (vo == null || vo.getHVO() == null) { | ||||
|                   throw new BusinessException("到货单主信息不能为空"); | ||||
|               } | ||||
| 
 | ||||
|               Date arriveMakeDate = vo.getHVO().getDmakedate().toDate(); | ||||
|               // 校验制单日期是否存在 | ||||
|               if (arriveMakeDate == null) { | ||||
|                   throw new BusinessException("到货单制单日期不能为空"); | ||||
|               } | ||||
| 
 | ||||
|               // 遍历到货单明细 | ||||
|               ArriveItemVO[] itemVOs = vo.getBVO(); | ||||
|               if (itemVOs == null || itemVOs.length==0) { | ||||
|                   continue; // 没有明细则跳过当前到货单处理 | ||||
|               } | ||||
| 
 | ||||
|               for (ArriveItemVO itemVO : itemVOs) { | ||||
|                   // 校验明细必要字段 | ||||
|                   if (itemVO == null) { | ||||
|                       throw new BusinessException("到货单明细不能为空"); | ||||
|                   } | ||||
|                   String pkOrder = itemVO.getPk_order(); | ||||
|                   String pkOrderB = itemVO.getPk_order_b(); | ||||
|                   if (StringUtils.isEmpty(pkOrder) || StringUtils.isEmpty(pkOrderB)) { | ||||
|                       throw new BusinessException("采购订单ID或订单明细ID不能为空"); | ||||
|                   } | ||||
| 
 | ||||
|                   try { | ||||
|                       // 查询对应的销售订单 | ||||
|                       OrderVO[] orderVOs =new BillQuery<OrderVO>(OrderVO.class).query(new String[]{pkOrder}); | ||||
|                       if (orderVOs == null || orderVOs.length == 0) { | ||||
|                           return; | ||||
| //                          throw new BusinessException("未找到ID为" + pkOrder + "的采购订单"); | ||||
|                       } | ||||
| 
 | ||||
|                       // 获取订单明细 | ||||
|                       OrderVO o = orderVOs[0]; | ||||
|                       OrderItemVO[] orderItemVOs = o.getBVO(); | ||||
|                       if (orderItemVOs == null || orderItemVOs.length == 0) { | ||||
|                           return; | ||||
| //                          throw new BusinessException("采购订单" + pkOrder + "没有明细数据"); | ||||
|                       } | ||||
| 
 | ||||
|                       // 查找匹配的订单明细 | ||||
|                       boolean found = false; | ||||
|                       for (OrderItemVO orderItem : orderItemVOs) { | ||||
|                           if (orderItem != null && pkOrderB.equals(orderItem.getPk_order_b())) { | ||||
|                               found = true; | ||||
|                               Date expectArriveDate = orderItem.getDplanarrvdate().toDate(); | ||||
|                               if (expectArriveDate == null) { | ||||
|                                   throw new BusinessException("采购订单明细" + pkOrderB + "的计划到货时间不能为空"); | ||||
|                               } | ||||
| 
 | ||||
|                               // 核心逻辑:只允许提前3天到货 | ||||
|                               // 1. 计算预计到货时间前3天的日期(最早允许的制单日期) | ||||
|                               Date earliestAllowedDate = addDays(expectArriveDate, -3); | ||||
| 
 | ||||
|                               // 2. 判断规则 | ||||
|                               boolean isTooEarly = arriveMakeDate.before(earliestAllowedDate); | ||||
|                               boolean isTooLate = arriveMakeDate.after(expectArriveDate); | ||||
| 
 | ||||
|                               if (isTooEarly || isTooLate) { | ||||
|                                   String errorMsg; | ||||
|                                   if (isTooEarly) { | ||||
|                                       errorMsg = String.format( | ||||
|                                               "到货单制单日期(%s)早于采购订单预计到货时间(%s)超过3天,不允许保存。最早允许制单日期为%s。订单编号:%s,明细行号:%s", | ||||
|                                               formatDate(arriveMakeDate), | ||||
|                                               formatDate(expectArriveDate), | ||||
|                                               formatDate(earliestAllowedDate), | ||||
|                                               o.getHVO().getVbillcode(), | ||||
|                                               orderItem.getCrowno() | ||||
|                                       ); | ||||
|                                   } else { // isTooLate | ||||
|                                       errorMsg = String.format( | ||||
|                                               "到货单制单日期(%s)晚于采购订单预计到货时间(%s),不符合提前到货规则,不允许保存。订单编号:%s,明细行号:%s", | ||||
|                                               formatDate(arriveMakeDate), | ||||
|                                               formatDate(expectArriveDate), | ||||
|                                               o.getHVO().getVbillcode(), | ||||
|                                               orderItem.getCrowno() | ||||
|                                       ); | ||||
|                                   } | ||||
|                                   throw new BusinessException(errorMsg); | ||||
|                               } | ||||
|                               break; // 找到匹配明细后退出循环 | ||||
|                           } | ||||
|                       } | ||||
| 
 | ||||
|                       if (!found) { | ||||
|                           throw new BusinessException("未找到采购订单" + pkOrder + "中ID为" + pkOrderB + "的明细"); | ||||
|                       } | ||||
| 
 | ||||
|                   } catch (BusinessException e) { | ||||
|                       // 直接抛出业务异常,中断流程 | ||||
|                       throw e; | ||||
|                   } catch (Exception e) { | ||||
|                       // 捕获其他异常并包装为业务异常 | ||||
|                       throw new BusinessException("校验采购订单与到货单时间关系时发生错误:" + e.getMessage(), e); | ||||
|                   } | ||||
|               } | ||||
|           } | ||||
| 
 | ||||
|           } catch (Exception e) { | ||||
|               throw new RuntimeException(e); | ||||
|           } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     // 自定义日期加减方法,替代DateUtils.addDays | ||||
|     private static Date addDays(Date date, int days) { | ||||
|         if (date == null) { | ||||
|             return null; | ||||
|         } | ||||
|         long time = date.getTime() + (long) days * 24 * 60 * 60 * 1000; | ||||
|         return new Date(time); | ||||
|     } | ||||
| 
 | ||||
|     // 自定义日期格式化方法,替代DateUtils.format | ||||
|     private static String formatDate(Date date) { | ||||
|         if (date == null) { | ||||
|             return ""; | ||||
|         } | ||||
|         synchronized (DATE_FORMATTER) { // 解决线程安全问题 | ||||
|             return DATE_FORMATTER.format(date); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
		Loading…
	
		Reference in New Issue