作业量新增接口

This commit is contained in:
lihao 2025-08-22 14:30:09 +08:00
parent 5596bef445
commit bb79ead554
5 changed files with 403 additions and 0 deletions

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding='gb2312'?>
<module>
<rest>
<resource classname="nc.api.mmpac.resource.ApplytaskRestResource" exinfo="作业量新增接口"/>
</rest>

View File

@ -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;
}
}
}

View File

@ -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());
}
}

View File

@ -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());
}
}

View File

@ -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);
}
}
}