diff --git a/mmpac/META-INF/applyTaskResources.rest b/mmpac/META-INF/applyTaskResources.rest new file mode 100644 index 0000000..7efbf63 --- /dev/null +++ b/mmpac/META-INF/applyTaskResources.rest @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/mmpac/src/public/nc/api/mmpac/resource/ApplytaskRestResource.java b/mmpac/src/public/nc/api/mmpac/resource/ApplytaskRestResource.java new file mode 100644 index 0000000..1a2061a --- /dev/null +++ b/mmpac/src/public/nc/api/mmpac/resource/ApplytaskRestResource.java @@ -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 paramMap) throws BusinessException { + logger.debug("=================开始进行================"); + List> paramList = (List) paramMap.get("data"); + if (paramList == null || paramList.size() == 0) { + throw new BusinessException("数据不能为空"); + } + HYPubBO hybo = new HYPubBO(); + List ids = new ArrayList(); + List bids= new ArrayList<>(); + List aggTaskAVOS = new ArrayList<>(); + for (Map 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 bidSet = new HashSet(); + + for(String bid : bids) { + bidSet.add(bid); + } + + PMOAggVO cardAggvo = pmoaggvos[0]; + List 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; + } + } +} diff --git a/pu/src/private/nc/impl/pu/m23/maintain/action/ArriveInsertAction.java b/pu/src/private/nc/impl/pu/m23/maintain/action/ArriveInsertAction.java new file mode 100644 index 0000000..f85eeb7 --- /dev/null +++ b/pu/src/private/nc/impl/pu/m23/maintain/action/ArriveInsertAction.java @@ -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 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 processer) { + processer.addBeforeFinalRule(new CheckBillDateRule()); + } +} diff --git a/pu/src/private/nc/impl/pu/m23/maintain/action/ArriveUpdateAction.java b/pu/src/private/nc/impl/pu/m23/maintain/action/ArriveUpdateAction.java new file mode 100644 index 0000000..37ac5ee --- /dev/null +++ b/pu/src/private/nc/impl/pu/m23/maintain/action/ArriveUpdateAction.java @@ -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 processer = new AroundProcesser(ArriveActionPlugInPoint.ArriveUpdateAction); + addBeforeRule(processer); + processer.addBeforeRule(new CheckBillDateRule()); + processer.before(voArray); + ExtBillHasGrandsonDataUtils 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 processer) { + processer.addBeforeFinalRule(new CheckBillDateRule()); + } +} diff --git a/pu/src/private/nc/impl/pu/m23/maintain/rule/CheckBillDateRule.java b/pu/src/private/nc/impl/pu/m23/maintain/rule/CheckBillDateRule.java new file mode 100644 index 0000000..da92785 --- /dev/null +++ b/pu/src/private/nc/impl/pu/m23/maintain/rule/CheckBillDateRule.java @@ -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 { + 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.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); + } + } + + +}