备料计划api类同步代码-张明&李正
This commit is contained in:
parent
e9a6d413a8
commit
2c12487d2a
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding='gb2312'?>
|
||||||
|
<module>
|
||||||
|
<rest>
|
||||||
|
<resource classname="nccloud.openapi.mmpac.pickm.PickmResouce" exinfo="流程备料计划增删改查接口"/>
|
||||||
|
</rest>
|
||||||
|
|
@ -0,0 +1,585 @@
|
||||||
|
package nc.impl.mmpac.pickm;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import nc.bs.dao.BaseDAO;
|
||||||
|
import nc.bs.framework.common.NCLocator;
|
||||||
|
import nc.bs.logging.Log;
|
||||||
|
import nc.bs.mmpac.pickm.bp.PickmApproveBP;
|
||||||
|
import nc.bs.mmpac.pickm.bp.PickmDeleteBP;
|
||||||
|
import nc.bs.mmpac.pickm.bp.PickmFinishBP;
|
||||||
|
import nc.bs.mmpac.pickm.bp.PickmInsertBP;
|
||||||
|
import nc.bs.mmpac.pickm.bp.PickmUnApproveBP;
|
||||||
|
import nc.bs.mmpac.pickm.bp.PickmUnFinishBP;
|
||||||
|
import nc.bs.mmpac.pickm.bp.PickmUpdateBP;
|
||||||
|
import nc.bs.uapbd.util.ThirdPartyPostRequestUtil;
|
||||||
|
import nc.impl.pubapp.pattern.data.vo.VOQuery;
|
||||||
|
import nc.itf.bd.material.baseinfo.IMaterialBaseInfoQueryService;
|
||||||
|
import nc.itf.mmpac.pickm.IPickmMaintainService;
|
||||||
|
import nc.itf.mmpac.pickm.IPickmTransTypeService;
|
||||||
|
import nc.jdbc.framework.processor.ColumnProcessor;
|
||||||
|
import nc.pubitf.para.SysInitQuery;
|
||||||
|
import nc.util.mmf.framework.base.MMValueCheck;
|
||||||
|
import nc.vo.bc.pmpub.project.ProjectHeadVO;
|
||||||
|
import nc.vo.bd.material.MaterialVO;
|
||||||
|
import nc.vo.cmp.util.StringUtils;
|
||||||
|
import nc.vo.mmpac.pickm.entity.AggPickmVO;
|
||||||
|
import nc.vo.mmpac.pickm.entity.PickmHeadVO;
|
||||||
|
import nc.vo.mmpac.pickm.entity.PickmItemVO;
|
||||||
|
import nc.vo.mmpac.pickm.entity.PickmTransTypeVO;
|
||||||
|
import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO;
|
||||||
|
import nc.vo.org.OrgVO;
|
||||||
|
import nc.vo.pub.BusinessException;
|
||||||
|
import nc.vo.pub.ISuperVO;
|
||||||
|
import nc.vo.pub.IVOMeta;
|
||||||
|
import nc.vo.pub.VOStatus;
|
||||||
|
import nc.vo.pub.lang.UFBoolean;
|
||||||
|
import nc.vo.pub.lang.UFDate;
|
||||||
|
import nc.vo.pub.lang.UFDouble;
|
||||||
|
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||||
|
import nc.vo.pubapp.pattern.model.entity.bill.AbstractBill;
|
||||||
|
import nc.vo.pubapp.pattern.model.meta.entity.bill.IBillMeta;
|
||||||
|
import nc.vo.pubapp.pattern.model.transfer.bill.ClientBillCombinServer;
|
||||||
|
import nc.vo.pubapp.pattern.pub.SqlBuilder;
|
||||||
|
import nc.vo.scmpub.util.ArrayUtil;
|
||||||
|
import nc.vo.scmpub.util.CollectionUtils;
|
||||||
|
import nc.vo.util.CloneUtil;
|
||||||
|
import nccloud.pubitf.mmpub.commit.service.IBatchRunScriptService;
|
||||||
|
import nccloud.pubitf.riart.pflow.CloudPFlowContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备料计划操作实现类
|
||||||
|
*/
|
||||||
|
public class PickmMaintainServiceImpl implements IPickmMaintainService {
|
||||||
|
private static Log log = Log.getInstance("rzmomlog");
|
||||||
|
|
||||||
|
private static BaseDAO dao = new BaseDAO();
|
||||||
|
/**
|
||||||
|
* 备料计划审核,分别有流程和离散重写
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AggPickmVO[] auditPickm(AggPickmVO[] vos) throws BusinessException {
|
||||||
|
// 审批操作
|
||||||
|
PickmApproveBP auditbp = new PickmApproveBP();
|
||||||
|
return auditbp.batchApprovePickm(vos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除备料计划
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void delete(AggPickmVO[] vos) throws BusinessException {
|
||||||
|
try {
|
||||||
|
// 删除操作
|
||||||
|
PickmDeleteBP deleteBP = new PickmDeleteBP();
|
||||||
|
deleteBP.delete(vos, false);
|
||||||
|
} catch (Exception e) {
|
||||||
|
ExceptionUtils.marsh(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备料计划完成,分别有流程离散重写
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AggPickmVO[] finishPickm(AggPickmVO[] vos) throws BusinessException {
|
||||||
|
// 完成操作
|
||||||
|
PickmFinishBP finishbp = new PickmFinishBP();
|
||||||
|
return finishbp.finish(vos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增备料计划
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AggPickmVO[] insert(AggPickmVO[] vos) throws BusinessException {
|
||||||
|
// vos =
|
||||||
|
// NCLocator.getInstance().lookup(IPickmMaintainService.class).insert_RequiresNew(vos);
|
||||||
|
// // 根据交易类型进行保存即审核规则
|
||||||
|
// IRule<AggPickmVO> pickmAutoApproveRule = new PickmAutoApproveAfterSaveRule();
|
||||||
|
// pickmAutoApproveRule.process(vos);
|
||||||
|
try {
|
||||||
|
PickmInsertBP bp = new PickmInsertBP();
|
||||||
|
return bp.insert(vos);
|
||||||
|
} catch (Exception e) {
|
||||||
|
ExceptionUtils.marsh(e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备料计划弃审,分别由流程离散重写
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AggPickmVO[] unAuditPickm(AggPickmVO[] vos) throws BusinessException {
|
||||||
|
// 审批操作
|
||||||
|
PickmUnApproveBP auditbp = new PickmUnApproveBP();
|
||||||
|
return auditbp.batchUnApprovePickm(vos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备料计划取消完成,分别有流程离散备料计划重写
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AggPickmVO[] unfinishPickm(AggPickmVO[] vos) throws BusinessException {
|
||||||
|
// 取消完成操作
|
||||||
|
PickmUnFinishBP finishbp = new PickmUnFinishBP();
|
||||||
|
return finishbp.unfinish(vos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改备料计划
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AggPickmVO[] update(AggPickmVO[] vos) throws BusinessException {
|
||||||
|
try {
|
||||||
|
// 更新操作
|
||||||
|
PickmUpdateBP bp = new PickmUpdateBP();
|
||||||
|
vos = bp.update(vos, false, false);
|
||||||
|
} catch (Exception e) {
|
||||||
|
ExceptionUtils.marsh(e);
|
||||||
|
}
|
||||||
|
return vos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改备料计划,同时更新预留
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AggPickmVO[] updateForYL(AggPickmVO[] vos) throws BusinessException {
|
||||||
|
try {
|
||||||
|
// 更新操作
|
||||||
|
PickmUpdateBP bp = new PickmUpdateBP(true);
|
||||||
|
vos = bp.update(vos, true, false);
|
||||||
|
} catch (Exception e) {
|
||||||
|
ExceptionUtils.marsh(e);
|
||||||
|
}
|
||||||
|
return vos;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AggPickmVO[] updateForYLForNcc(AggPickmVO[] vos) throws BusinessException {
|
||||||
|
try {
|
||||||
|
// 更新操作
|
||||||
|
PickmUpdateBP bp = new PickmUpdateBP(true);
|
||||||
|
vos = bp.update(vos, true, false);
|
||||||
|
} catch (Exception e) {
|
||||||
|
ExceptionUtils.marsh(e);
|
||||||
|
}
|
||||||
|
return vos;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AggPickmVO[] saveAndCommitPickm(AggPickmVO[] vos, UFBoolean isUpdate, UFBoolean isUpdateForYL)
|
||||||
|
throws BusinessException {
|
||||||
|
ClientBillCombinServer<AbstractBill> utils = new ClientBillCombinServer<AbstractBill>();
|
||||||
|
PickmUpdateBP updateBP = new PickmUpdateBP(true);
|
||||||
|
Object[] objects = null;
|
||||||
|
if (MMValueCheck.isTrue(isUpdate)) {
|
||||||
|
if (MMValueCheck.isTrue(isUpdateForYL)) {
|
||||||
|
objects = updateBP.update(vos, true, false);
|
||||||
|
} else {
|
||||||
|
objects = updateBP.update(vos, false, false);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PickmInsertBP insertBP = new PickmInsertBP();
|
||||||
|
objects = insertBP.insert(vos);
|
||||||
|
}
|
||||||
|
this.filterDeleteBodyData(vos);
|
||||||
|
utils.combine(vos, (AbstractBill[]) objects);
|
||||||
|
|
||||||
|
UFBoolean autoAuditFlag = this.getBSaveToAuditByTransTypeID(vos[0].getParentVO().getVbusitypeid());
|
||||||
|
if (MMValueCheck.isNotEmpty(vos)) {
|
||||||
|
if (autoAuditFlag.booleanValue()) {// 非保存即审核时执行提交
|
||||||
|
return vos;
|
||||||
|
}
|
||||||
|
// 执行提交
|
||||||
|
CloudPFlowContext context = new CloudPFlowContext();
|
||||||
|
context.setBillType("55A3");
|
||||||
|
context.setActionName("SAVE");
|
||||||
|
context.setBillVos(vos);
|
||||||
|
IBatchRunScriptService service = NCLocator.getInstance().lookup(IBatchRunScriptService.class);
|
||||||
|
Object[] obj = service.run(context, AggPickmVO.class);
|
||||||
|
this.filterDeleteBodyData(vos);
|
||||||
|
utils.combine(vos, (AbstractBill[]) obj);
|
||||||
|
return vos;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AggPickmVO[] pushRZMes(AggPickmVO[] vos) throws BusinessException {
|
||||||
|
if (ArrayUtil.isEmpty(vos)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
AggPickmVO[] cloneOrderVOS = (AggPickmVO[]) CloneUtil.deepClone(vos);
|
||||||
|
// 检查并筛选领料组织
|
||||||
|
List<AggPickmVO> newAggPickmVOS = checkAndFilterBillSrcOrg(cloneOrderVOS);
|
||||||
|
if (newAggPickmVOS.isEmpty()) {
|
||||||
|
return vos;
|
||||||
|
}
|
||||||
|
Boolean is55A2OR30=checkSrcBillType(newAggPickmVOS);
|
||||||
|
if(is55A2OR30){
|
||||||
|
//来源生产订单
|
||||||
|
pushToRZMOMBy55A2(newAggPickmVOS.toArray(new AggPickmVO[0]));
|
||||||
|
}else{
|
||||||
|
//来源委外订单
|
||||||
|
pushToRZMOMBy61(newAggPickmVOS.toArray(new AggPickmVO[0]));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
ExceptionUtils.wrappException(e);
|
||||||
|
}
|
||||||
|
return vos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 过滤删除的行 TODO
|
||||||
|
*
|
||||||
|
* @param uiBillArrays
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private void filterDeleteBodyData(AbstractBill[] uiBillArrays) {
|
||||||
|
for (AbstractBill bill : uiBillArrays) {
|
||||||
|
// change by zhangshqb 改为支持一主多子的聚合VO
|
||||||
|
IBillMeta metaData = bill.getMetaData();
|
||||||
|
IVOMeta[] children = metaData.getChildren();
|
||||||
|
for (IVOMeta ivoMeta : children) {
|
||||||
|
List<ISuperVO> normal = new ArrayList<ISuperVO>();
|
||||||
|
ISuperVO[] childs = bill.getChildren(ivoMeta);
|
||||||
|
if (childs != null && childs.length > 0) {
|
||||||
|
for (ISuperVO child : childs) {
|
||||||
|
if (child.getStatus() != VOStatus.DELETED) {
|
||||||
|
normal.add(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bill.setChildren(ivoMeta, CollectionUtils.listToArray(normal));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private UFBoolean getBSaveToAuditByTransTypeID(String vbusitypeid) {
|
||||||
|
|
||||||
|
IPickmTransTypeService service = NCLocator.getInstance().lookup(IPickmTransTypeService.class);
|
||||||
|
try {
|
||||||
|
PickmTransTypeVO typevo = service.queryTransTypeVO(vbusitypeid);
|
||||||
|
if (MMValueCheck.isEmpty(typevo)) {
|
||||||
|
return UFBoolean.FALSE;
|
||||||
|
}
|
||||||
|
return typevo.getBautoaduitaftersave() == null ? UFBoolean.FALSE : typevo.getBautoaduitaftersave();
|
||||||
|
|
||||||
|
} catch (BusinessException e) {
|
||||||
|
ExceptionUtils.wrappException(e);
|
||||||
|
}
|
||||||
|
return UFBoolean.FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Boolean checkSrcBillType(List<AggPickmVO> newAggPickmVOS) throws BusinessException {
|
||||||
|
UFBoolean is61=UFBoolean.FALSE;
|
||||||
|
UFBoolean is55A2OR30=UFBoolean.FALSE;
|
||||||
|
for (AggPickmVO aggPickmVO : newAggPickmVOS) {
|
||||||
|
String vfirstbilltype = aggPickmVO.getParentVO().getVfirstbilltype();
|
||||||
|
if("61".equals(vfirstbilltype)){
|
||||||
|
is61=UFBoolean.TRUE;
|
||||||
|
}else if("55A2".equals(vfirstbilltype)){
|
||||||
|
is55A2OR30=UFBoolean.TRUE;
|
||||||
|
}else if("30".equals(vfirstbilltype)){
|
||||||
|
is55A2OR30=UFBoolean.TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(is55A2OR30.booleanValue()&&is61.booleanValue()){
|
||||||
|
throw new BusinessException("备料计划推送锐制失败,原因:不允许源头单据类型为生产订单和委外订单的单据同时审批");
|
||||||
|
}
|
||||||
|
return is55A2OR30.booleanValue();
|
||||||
|
}
|
||||||
|
private void buildSyncDataBy55A2(PickmHeadVO head, PickmItemVO[] bodys, JSONArray details) throws BusinessException {
|
||||||
|
Integer fsourcetype = head.getFsourcetype();
|
||||||
|
if(fsourcetype!=0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//2025年8月12日08点55分--新增生产订单项目字段信息
|
||||||
|
String csourcebillrowid = head.getCsourcebillrowid();
|
||||||
|
PMOItemVO[] srcBVOs = new VOQuery<PMOItemVO>(PMOItemVO.class).query(new String[]{csourcebillrowid});
|
||||||
|
ProjectHeadVO[] cprojectVOs=null;
|
||||||
|
if(srcBVOs!=null&&srcBVOs.length>0){
|
||||||
|
String cprojectid = srcBVOs[0].getCprojectid();
|
||||||
|
if(!StringUtils.isEmpty(cprojectid)){
|
||||||
|
cprojectVOs= new VOQuery<ProjectHeadVO>(ProjectHeadVO.class).query(new String[]{cprojectid});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//end
|
||||||
|
for (PickmItemVO body : bodys) {
|
||||||
|
JSONObject singleObj = new JSONObject();
|
||||||
|
String vsourcebillcode = head.getVsourcebillcode();
|
||||||
|
String wlbm_wbid =body.getCbmaterialvid();
|
||||||
|
String scgx_wbid =head.getVstdprocid();
|
||||||
|
//wbid varchar (200) 第三方系统主键id
|
||||||
|
singleObj.put("wbid", head.getCpickmid()+"_"+body.getCpickm_bid()); // 第三方系统主键id
|
||||||
|
//operate int 操作状态 必填 1新增/修改、2删除(删除时只需上传wbid)
|
||||||
|
singleObj.put("operate", "1");
|
||||||
|
//wbzbid varchar (200) 第三方系统分组id
|
||||||
|
singleObj.put("wbzbid", head.getCpickmid());
|
||||||
|
|
||||||
|
//wbqjpx varchar(2000) 全局排序 必填 BOM表物料行号
|
||||||
|
singleObj.put("wbqjpx", body.getVrowno());
|
||||||
|
|
||||||
|
//scjh_wbid varchar(100) 第三方系统生产计划ID 必填 生产计划号外部ID,一般ERP系统的生产订单号。
|
||||||
|
singleObj.put("scjh_wbid", head.getCsourcebillid());
|
||||||
|
|
||||||
|
|
||||||
|
//jhxh numeric(5) 计划序号 -生产订单行号
|
||||||
|
singleObj.put("jhxh", head.getVsourcebillrowno());
|
||||||
|
|
||||||
|
singleObj.put("wlbm_wbid", wlbm_wbid); // 第三方系统材料id
|
||||||
|
|
||||||
|
//bomlx int BOM类型 必填 默认=0,即传入生产BOM(1为包装BOM)。
|
||||||
|
singleObj.put("bomlx", 0);
|
||||||
|
if(body.getNunituseastnum()==null ){
|
||||||
|
singleObj.put("dwyl", UFDouble.ZERO_DBL.getDouble()); // 单位用量nunituseastnum
|
||||||
|
singleObj.put("djyl", UFDouble.ZERO_DBL.getDouble()); // 单据用量nunituseastnum
|
||||||
|
}else{
|
||||||
|
singleObj.put("dwyl", body.getNunituseastnum().getDouble()); // 单位用量nunituseastnum
|
||||||
|
singleObj.put("djyl", body.getNunituseastnum().getDouble()); // 单据用量nunituseastnum
|
||||||
|
}
|
||||||
|
|
||||||
|
singleObj.put("clyl", body.getNplanoutastnum().getDouble()); // 材料用量
|
||||||
|
|
||||||
|
// String rccode = transferCodeByPk(RcVO.getDefaultTableName(), RcVO.VRCCODE, RcVO.CRCID, head.getVstdprocid());
|
||||||
|
singleObj.put("scgx_wbid", body.getVbdef11());
|
||||||
|
// singleObj.put("scgx_wbid", rccode); // 第三方系统使用工序id
|
||||||
|
|
||||||
|
//sdbj int 锁定标记 必填 默认1:正常业务ERP审核后,传输至锐制MOM
|
||||||
|
singleObj.put("sdbj", 1);
|
||||||
|
//shbj int 审核标记 必填 默认1:正常业务ERP审核后,传输至锐制MOM
|
||||||
|
singleObj.put("shbj", 1);
|
||||||
|
|
||||||
|
//jylxbm --
|
||||||
|
singleObj.put("jylxbm", head.getVbusitype());
|
||||||
|
|
||||||
|
//2025年8月12日08点55分--新增生产订单项目字段信息 start
|
||||||
|
if(cprojectVOs!=null && cprojectVOs.length>0){
|
||||||
|
singleObj.put("wlzdycs06", cprojectVOs[0].getProject_code());
|
||||||
|
singleObj.put("wlzdycs11", cprojectVOs[0].getProject_name());
|
||||||
|
}
|
||||||
|
//2025年8月12日08点55分--新增生产订单项目字段信息 end
|
||||||
|
|
||||||
|
//2025年9月1日15点14分--新增需用日期字段 -start
|
||||||
|
UFDate drequiredate = body.getDrequiredate();
|
||||||
|
singleObj.put("wlzdycs19", drequiredate==null?null:drequiredate.toStdString());
|
||||||
|
//2025年9月1日15点14分--新增需用日期字段 -end
|
||||||
|
|
||||||
|
details.add(singleObj);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void buildSyncDataBy61(PickmHeadVO head, PickmItemVO[] bodys, JSONArray details) throws BusinessException {
|
||||||
|
Integer fsourcetype = head.getFsourcetype();
|
||||||
|
if(fsourcetype!=1){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (PickmItemVO body : bodys) {
|
||||||
|
JSONObject singleObj = new JSONObject();
|
||||||
|
String vsourcebillcode = head.getVsourcebillcode();
|
||||||
|
String wlbm_wbid =body.getCbmaterialvid();
|
||||||
|
|
||||||
|
String scgx_wbid =head.getVstdprocid();
|
||||||
|
//wbid varchar (200) 第三方系统主键id
|
||||||
|
singleObj.put("wbid", head.getCpickmid()+"_"+body.getCpickm_bid()); // 第三方系统主键id
|
||||||
|
//wbzbid varchar (200) 第三方系统分组id
|
||||||
|
singleObj.put("wbpid", head.getCpickmid());
|
||||||
|
//operate int 操作状态 必填 1新增/修改、2删除(删除时只需上传wbid)
|
||||||
|
singleObj.put("operate", "1");
|
||||||
|
//djly varchar(20) 来源单据 必填 取值read_djlyb中编号
|
||||||
|
//领料通知默认1011
|
||||||
|
singleObj.put("djly", "1011");
|
||||||
|
|
||||||
|
//_id varchar(50) 单据id 必填 后台该单据类型的唯一ID
|
||||||
|
singleObj.put("djbh_id", head.getCpickmid());
|
||||||
|
|
||||||
|
//djbh varchar(100) 单据编号 必填 前台单据编号
|
||||||
|
singleObj.put("djbh", head.getVbillcode());
|
||||||
|
|
||||||
|
//djxh numeric(5) 单据序号 必填 前台单据序号
|
||||||
|
singleObj.put("djxh", body.getVrowno());
|
||||||
|
|
||||||
|
//djrq datetime 单据日期 必填
|
||||||
|
singleObj.put("djrq", head.getDmakedate().toString());
|
||||||
|
|
||||||
|
//wlbm_wbid varchar(100) 第三方系统物料名称id 必填 物料编码的后台ID
|
||||||
|
singleObj.put("wlbm_wbid", wlbm_wbid);
|
||||||
|
|
||||||
|
//djsl numeric(18,3) 单据数量 必填
|
||||||
|
UFDouble djsl = body.getNplanoutastnum() == null ? UFDouble.ZERO_DBL : body.getNplanoutastnum();
|
||||||
|
singleObj.put("djsl", djsl.getDouble());
|
||||||
|
|
||||||
|
//sddd varchar(510)送达地点 必填 传仓库名称,要求上位ERP仓库名称不重复。
|
||||||
|
// singleObj.put("sddd", transferCodeByPk(StordocVO.getDefaultTableName(), StordocVO.NAME, StordocVO.PK_STORDOC, body.getCoutstockid()));
|
||||||
|
|
||||||
|
//ckbh_wbid varchar(100) 第三方系统仓库id 必填 储区根据仓库默认,同仓库多储区时,两者必填;
|
||||||
|
// singleObj.put("ckbh_wbid",body.getCoutstockid());
|
||||||
|
|
||||||
|
//qfbj int 签发标记 必填 默认1;上位系统审核传至MOM 1
|
||||||
|
singleObj.put("qfbj", 1);
|
||||||
|
|
||||||
|
//cght_wbid varchar(100) 第三方系统合同id 必填 委外订单主键ID
|
||||||
|
singleObj.put("cght_wbid",head.getCfirstbillid());
|
||||||
|
//htbh varchar(100) 合同号 委外订单单据号
|
||||||
|
singleObj.put("htbh",head.getVfirstbillcode());
|
||||||
|
|
||||||
|
//htxh numeric(5) 合同序号 委外订单单据序号
|
||||||
|
singleObj.put("htxh",head.getVfirstbillrowno());
|
||||||
|
|
||||||
|
//cght_wbid varchar(100) 第三方系统合同id 必填
|
||||||
|
// singleObj.put("cght_wbid", transferCodeByPk("bd_defdoc", DefdocVO.CODE, DefdocVO.PK_DEFDOC, body.getVbdef5()));
|
||||||
|
details.add(singleObj);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<AggPickmVO> checkAndFilterBillSrcOrg(AggPickmVO[] aggPickmVOS) throws BusinessException {
|
||||||
|
List<AggPickmVO> aggvoList = new ArrayList<>();
|
||||||
|
List<AggPickmVO> finalList = new ArrayList<>();
|
||||||
|
|
||||||
|
for (AggPickmVO aggvo : aggPickmVOS) {
|
||||||
|
String pkOrg = aggvo.getParentVO().getPk_org();
|
||||||
|
String orgCode = transferCodeByPk(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg);
|
||||||
|
//过滤上游不是生产订单和委外订单的备料计划
|
||||||
|
String vfirstbilltype = aggvo.getParentVO().getVfirstbilltype();
|
||||||
|
String vdef20 = aggvo.getParentVO().getVdef20();
|
||||||
|
if(vdef20==null||"N".equals(vdef20)){
|
||||||
|
if ("C022".equals(orgCode)&& 1 == aggvo.getParentVO().getFbillstatus()&&aggvo.getChildrenVO()!=null && aggvo.getChildrenVO().length > 0) {
|
||||||
|
if("61".equals(vfirstbilltype)||"55A2".equals(vfirstbilltype)||"30".equals(vfirstbilltype)){
|
||||||
|
//2025年7月2日10点33分--新增不传--表体物料编码前三位为103时不传
|
||||||
|
//获取表体物料信息
|
||||||
|
aggvoList.add(aggvo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
//再次筛选
|
||||||
|
//2025年7月2日10点33分--新增不传--表体物料编码前三位为103时不传
|
||||||
|
//获取表体物料信息
|
||||||
|
if(aggvoList.isEmpty()){
|
||||||
|
return aggvoList;
|
||||||
|
}
|
||||||
|
Set<String> materialpks=new HashSet<>();
|
||||||
|
for (AggPickmVO aggvo : aggvoList) {
|
||||||
|
PickmItemVO[] items = (PickmItemVO[]) aggvo.getChildren(PickmItemVO.class);
|
||||||
|
for (PickmItemVO item : items) {
|
||||||
|
String cbmaterialvid = item.getCbmaterialvid();
|
||||||
|
materialpks.add(cbmaterialvid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(materialpks.isEmpty()){
|
||||||
|
return aggvoList;
|
||||||
|
}
|
||||||
|
//根据物料id查询物料信息
|
||||||
|
MaterialVO[] vos = NCLocator.getInstance().lookup(IMaterialBaseInfoQueryService.class).queryDataByPks(materialpks.toArray(new String[0]));
|
||||||
|
//组装Map
|
||||||
|
Map<String, String> materialMap = new HashMap<>();
|
||||||
|
if(vos==null || vos.length<1){
|
||||||
|
throw new BusinessException("Failed to query material info , please check !!!");
|
||||||
|
}
|
||||||
|
for (MaterialVO vo : vos) {
|
||||||
|
String cmaterialvid = vo.getPk_material();
|
||||||
|
String cmaterialcode =vo.getCode();
|
||||||
|
materialMap.put(cmaterialvid, cmaterialcode);
|
||||||
|
}
|
||||||
|
//筛选行数据
|
||||||
|
for (AggPickmVO aggvo : aggvoList) {
|
||||||
|
List<PickmItemVO> newItems = new ArrayList<>();
|
||||||
|
PickmItemVO[] items = (PickmItemVO[]) aggvo.getChildren(PickmItemVO.class);
|
||||||
|
for (PickmItemVO item : items) {
|
||||||
|
String cmaterialvid = item.getCbmaterialvid();
|
||||||
|
if (materialMap.containsKey(cmaterialvid)) {
|
||||||
|
String materialCode = materialMap.get(cmaterialvid);
|
||||||
|
if(!materialCode.startsWith("103")){
|
||||||
|
newItems.add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!newItems.isEmpty()) {
|
||||||
|
aggvo.setChildren(PickmItemVO.class,newItems.toArray(new PickmItemVO[0]));
|
||||||
|
finalList.add(aggvo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return finalList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pushToRZMOMBy55A2(AggPickmVO[] aggPickmVOS) throws BusinessException {
|
||||||
|
String rzwmsip = SysInitQuery.getParaString("GLOBLE00000000000000", "RZWMSIP");
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
JSONObject dataIn = new JSONObject();
|
||||||
|
JSONObject dataIn2 = new JSONObject();
|
||||||
|
JSONArray details = new JSONArray();
|
||||||
|
jsonObject.put("dataflow", "用友BIP→RZMOMv6");
|
||||||
|
jsonObject.put("actionCode", "scbomb");
|
||||||
|
|
||||||
|
for (AggPickmVO aggPickmVO : aggPickmVOS) {
|
||||||
|
PickmHeadVO head = aggPickmVO.getParentVO();
|
||||||
|
PickmItemVO[] bodys = (PickmItemVO[]) aggPickmVO.getChildrenVO();
|
||||||
|
buildSyncDataBy55A2(head, bodys, details);
|
||||||
|
}
|
||||||
|
dataIn2.put("Details", details);
|
||||||
|
dataIn.put("Data", dataIn2);
|
||||||
|
jsonObject.put("data", dataIn);
|
||||||
|
log.error("生产BOW推送锐制请求报文:" + jsonObject.toJSONString());
|
||||||
|
String result = ThirdPartyPostRequestUtil.sendPostRequest(rzwmsip, jsonObject.toJSONString());
|
||||||
|
JSONObject resultObj = JSONObject.parseObject(result);
|
||||||
|
if (resultObj == null || !"true".equals(resultObj.getString("success"))) {
|
||||||
|
String errorMsg = resultObj == null ? "接口返回为空" : resultObj.getString("msg");
|
||||||
|
throw new BusinessException("RZ同步失败,原因:" + errorMsg);
|
||||||
|
}else{
|
||||||
|
log.error("RZMOM同步成功,返回参数【"+resultObj.toJSONString()+"】");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void pushToRZMOMBy61(AggPickmVO[] aggPickmVOS) throws BusinessException {
|
||||||
|
String rzwmsip = SysInitQuery.getParaString("GLOBLE00000000000000", "RZWMSIP");
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
JSONObject dataIn = new JSONObject();
|
||||||
|
JSONObject dataIn2 = new JSONObject();
|
||||||
|
JSONArray details = new JSONArray();
|
||||||
|
jsonObject.put("dataflow", "用友BIP→RZMOMv6");
|
||||||
|
jsonObject.put("actionCode", "wwfhtzdb");
|
||||||
|
|
||||||
|
for (AggPickmVO aggPickmVO : aggPickmVOS) {
|
||||||
|
PickmHeadVO head = aggPickmVO.getParentVO();
|
||||||
|
PickmItemVO[] bodys = (PickmItemVO[]) aggPickmVO.getChildrenVO();
|
||||||
|
buildSyncDataBy61(head, bodys, details);
|
||||||
|
}
|
||||||
|
dataIn2.put("Details", details);
|
||||||
|
dataIn.put("Data", dataIn2);
|
||||||
|
jsonObject.put("data", dataIn);
|
||||||
|
log.error("生产BOW推送锐制请求报文:" + jsonObject.toJSONString());
|
||||||
|
String result = ThirdPartyPostRequestUtil.sendPostRequest(rzwmsip, jsonObject.toJSONString());
|
||||||
|
JSONObject resultObj = JSONObject.parseObject(result);
|
||||||
|
if (resultObj == null || !"true".equals(resultObj.getString("success"))) {
|
||||||
|
String errorMsg = resultObj == null ? "接口返回为空" : resultObj.getString("msg");
|
||||||
|
throw new BusinessException("RZ同步失败,原因:" + errorMsg);
|
||||||
|
}else{
|
||||||
|
log.error("RZMOM同步成功,返回参数【"+resultObj.toJSONString()+"】");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private String transferCodeByPk(String tableName, String selectField, String pkField, String pk) throws BusinessException {
|
||||||
|
if (StringUtils.isEmpty(pk)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
SqlBuilder sqlBuilder = new SqlBuilder();
|
||||||
|
sqlBuilder.append(" select " + selectField);
|
||||||
|
sqlBuilder.append(" from " + tableName);
|
||||||
|
sqlBuilder.append(" where ");
|
||||||
|
sqlBuilder.append(pkField, pk);
|
||||||
|
Object o = dao.executeQuery(sqlBuilder.toString(), new ColumnProcessor());
|
||||||
|
if (o == null) {
|
||||||
|
throw new BusinessException("未查询到编码信息,sql【" + sqlBuilder + "】");
|
||||||
|
}
|
||||||
|
return o.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,103 @@
|
||||||
|
package nc.itf.mmpac.pickm;
|
||||||
|
|
||||||
|
import nc.vo.mmpac.pickm.entity.AggPickmVO;
|
||||||
|
import nc.vo.pub.BusinessException;
|
||||||
|
import nc.vo.pub.lang.UFBoolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标准单据业务操作接口,增删改查
|
||||||
|
*
|
||||||
|
* @since 6.0
|
||||||
|
* @version 2010-12-16 下午04:36:00
|
||||||
|
* @author
|
||||||
|
*/
|
||||||
|
public interface IPickmMaintainService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除备料计划单据
|
||||||
|
*
|
||||||
|
* @param AggPickmVO
|
||||||
|
* @throws BusinessException
|
||||||
|
*/
|
||||||
|
void delete(AggPickmVO[] vos) throws BusinessException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增备料计划单据
|
||||||
|
*
|
||||||
|
* @param AggPickmVO
|
||||||
|
* @return AggPickmVO
|
||||||
|
* @throws BusinessException
|
||||||
|
*/
|
||||||
|
AggPickmVO[] insert(AggPickmVO[] vos) throws BusinessException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新备料计划单据
|
||||||
|
*
|
||||||
|
* @param AggPickmVO
|
||||||
|
* @return AggPickmVO
|
||||||
|
* @throws BusinessException
|
||||||
|
*/
|
||||||
|
AggPickmVO[] update(AggPickmVO[] vos) throws BusinessException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 为预留更新单据
|
||||||
|
*
|
||||||
|
* @param AggPickmVO
|
||||||
|
* @return AggPickmVO
|
||||||
|
* @throws BusinessException
|
||||||
|
*/
|
||||||
|
AggPickmVO[] updateForYL(AggPickmVO[] vos) throws BusinessException;
|
||||||
|
AggPickmVO[] updateForYLForNcc(AggPickmVO[] vos) throws BusinessException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备料计划审核
|
||||||
|
*
|
||||||
|
* @param AggPickmVO
|
||||||
|
* @return AggPickmVO
|
||||||
|
* @throws BusinessException
|
||||||
|
*/
|
||||||
|
AggPickmVO[] auditPickm(AggPickmVO[] vos) throws BusinessException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备料计划取消审核
|
||||||
|
*
|
||||||
|
* @param AggPickmVO
|
||||||
|
* @return AggPickmVO
|
||||||
|
* @throws BusinessException
|
||||||
|
*/
|
||||||
|
AggPickmVO[] unAuditPickm(AggPickmVO[] vos) throws BusinessException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备料计划完成
|
||||||
|
*
|
||||||
|
* @param AggPickmVO
|
||||||
|
* @return AggPickmVO
|
||||||
|
* @throws BusinessException
|
||||||
|
*/
|
||||||
|
AggPickmVO[] finishPickm(AggPickmVO[] vos) throws BusinessException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备料计划取消完成
|
||||||
|
*
|
||||||
|
* @param AggPickmVO
|
||||||
|
* @return AggPickmVO
|
||||||
|
* @throws BusinessException
|
||||||
|
*/
|
||||||
|
AggPickmVO[] unfinishPickm(AggPickmVO[] vos) throws BusinessException;
|
||||||
|
/**
|
||||||
|
* 备料计划保存提交
|
||||||
|
*
|
||||||
|
* @param AggPickmVO
|
||||||
|
* @return AggPickmVO
|
||||||
|
* @throws BusinessException
|
||||||
|
*/
|
||||||
|
AggPickmVO[] saveAndCommitPickm(AggPickmVO[] vos,UFBoolean isUpdate,UFBoolean isUpdateForYL) throws BusinessException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 推送RZMES
|
||||||
|
* @param vos
|
||||||
|
* @return
|
||||||
|
* @throws BusinessException
|
||||||
|
*/
|
||||||
|
AggPickmVO[] pushRZMes(AggPickmVO[] vos) throws BusinessException;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,702 @@
|
||||||
|
package nccloud.openapi.mmpac.pickm;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.Produces;
|
||||||
|
|
||||||
|
import nc.bs.dao.BaseDAO;
|
||||||
|
import nc.bs.framework.common.NCLocator;
|
||||||
|
import nc.bs.logging.Log;
|
||||||
|
import nc.bs.scmpub.query.SCMBillQuery;
|
||||||
|
import nc.itf.mmpac.pickm.IPickmMaintainService;
|
||||||
|
import nc.jdbc.framework.processor.BeanListProcessor;
|
||||||
|
import nc.jdbc.framework.processor.ColumnProcessor;
|
||||||
|
import nc.jdbc.framework.processor.MapListProcessor;
|
||||||
|
import nc.util.mmf.framework.base.MMCollectionUtil;
|
||||||
|
import nc.vo.bd.bom.bom0202.entity.AggBomVO;
|
||||||
|
import nc.vo.bd.bom.bom0202.entity.BomItemVO;
|
||||||
|
import nc.vo.bd.bom.bom0202.entity.BomVO;
|
||||||
|
import nc.vo.bd.material.MaterialVO;
|
||||||
|
import nc.vo.bd.material.measdoc.MeasdocVO;
|
||||||
|
import nc.vo.bd.psn.PsndocVO;
|
||||||
|
import nc.vo.mmpac.pickm.entity.AggPickmVO;
|
||||||
|
import nc.vo.mmpac.pickm.entity.PickmHeadVO;
|
||||||
|
import nc.vo.mmpac.pickm.entity.PickmItemVO;
|
||||||
|
import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO;
|
||||||
|
import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO;
|
||||||
|
import nc.vo.org.GroupVO;
|
||||||
|
import nc.vo.org.OrgVO;
|
||||||
|
import nc.vo.org.StockOrgVO;
|
||||||
|
import nc.vo.pub.*;
|
||||||
|
import nc.vo.pub.lang.UFBoolean;
|
||||||
|
import nc.vo.pubapp.AppContext;
|
||||||
|
import nc.vo.pubapp.pattern.pub.SqlBuilder;
|
||||||
|
import nc.vo.vorg.StockOrgVersionVO;
|
||||||
|
import nc.ws.opm.pub.utils.result.APIErrCodeEnum;
|
||||||
|
import nccloud.api.rest.utils.ResultMessageUtil;
|
||||||
|
|
||||||
|
import nccloud.ws.rest.resource.AbstractNCCRestResource;
|
||||||
|
import org.json.JSONString;
|
||||||
|
|
||||||
|
@Path("mmpac/pickm")
|
||||||
|
public class PickmResouce extends AbstractNCCRestResource {
|
||||||
|
private static String HEADTABLE = "mm_pickm";
|
||||||
|
private static String BODYTABLE = "mm_pickm_b";
|
||||||
|
private static final BaseDAO BASE_DAO = new BaseDAO();
|
||||||
|
private static final Log logger = Log.getInstance("pmoresouceLogger");
|
||||||
|
|
||||||
|
private static Map<String, String> entityNameToClassName = new HashMap();
|
||||||
|
|
||||||
|
public PickmResouce() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备料计划 新增修改删除三个接口 openapi , 提供给mes,
|
||||||
|
* 备料计划是审批后的, 传递的是流程生产订单明细行主键,
|
||||||
|
* 操作的是流程备料计划的明细行,新增修改删除是针对于明细行来说的
|
||||||
|
* 根据流程生产订单明细行的主键 可以查询到流程备料计划的AggVO,然后操作他的明细
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("save")
|
||||||
|
@Consumes({"application/json"})
|
||||||
|
@Produces({"application/json"})
|
||||||
|
public JSONString save(Map<String, Object> paramMap) {
|
||||||
|
logger.debug("开始进行备料计划明细行的新增操作");
|
||||||
|
// 如果没有传递data属性
|
||||||
|
if (!paramMap.containsKey("data")) {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含data", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
List<Map<String, Object>> batchData = (List) paramMap.get("data");
|
||||||
|
IPickmMaintainService serv = (IPickmMaintainService) NCLocator.getInstance().lookup(IPickmMaintainService.class);
|
||||||
|
// 如果没有数据
|
||||||
|
if (MMCollectionUtil.isEmpty(batchData)) {
|
||||||
|
logger.info("传入数据异常,参数要包含data");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含data", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
List<AggPickmVO> resAggVOS = new ArrayList<>();
|
||||||
|
// 批量处理每一个主子表对象
|
||||||
|
for (Map<String, Object> singleData : batchData) {
|
||||||
|
if (!singleData.containsKey("pk_pmo")) {
|
||||||
|
logger.info("传入数据异常,参数要包含pk_pmo");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含pk_pmo", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
String pk_pmo = (String) singleData.get("pk_pmo");
|
||||||
|
// 查询表头
|
||||||
|
String searchHeadSql = "SELECT * FROM mm_pickm WHERE nvl(dr,0) = 0 AND vsourcemocode = '" + pk_pmo + "'";
|
||||||
|
List<Map<String, Object>> pickmHeadRows = (List<Map<String, Object>>) BASE_DAO.executeQuery(searchHeadSql, new MapListProcessor());
|
||||||
|
if (pickmHeadRows == null) {
|
||||||
|
logger.info("根据pk_pmo查询的流程备料计划不存在");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("根据pk_pmo查询的流程备料计划不存在", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
PickmHeadVO pickmHeadVO = transferToPickmHeadVO(pickmHeadRows.get(0), VOStatus.UPDATED);
|
||||||
|
if (!singleData.containsKey("mm_pickm_b")) {
|
||||||
|
logger.info("传入数据异常,参数要包含mm_pickm_b");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含mm_pickm_b", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
List<Map<String, Object>> batchPickms = (List<Map<String, Object>>) singleData.get("mm_pickm_b");
|
||||||
|
|
||||||
|
// 循环请求体中每一个备料计划明细
|
||||||
|
List<PickmItemVO> finalPickmItemVOS = null;
|
||||||
|
for (Map<String, Object> singlePickm : batchPickms) {
|
||||||
|
// 需要将singleData中的每一个code转为主键重新存储
|
||||||
|
Map<String, Object> newMap = transferSingleDataCodeToPk(singlePickm);
|
||||||
|
PickmItemVO pickmItemVO = transferToPickmItemVO(newMap, VOStatus.NEW);
|
||||||
|
// 查询表体
|
||||||
|
String searchBodySql = "SELECT * FROM mm_pickm_b WHERE nvl(dr,0) = 0 AND cpickmid = '" + pickmHeadVO.getCpickmid() + "'";
|
||||||
|
List<PickmItemVO> existingPickmItemVOS = (List<PickmItemVO>) BASE_DAO.executeQuery(searchBodySql, new BeanListProcessor(PickmItemVO.class));
|
||||||
|
if (existingPickmItemVOS == null) {
|
||||||
|
logger.info("根据pk_pmo查询的流程备料计划明细不存在");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("根据pk_pmo查询的流程备料计划明细不存在", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
// 如果已存在的不为空
|
||||||
|
finalPickmItemVOS = new ArrayList<>(existingPickmItemVOS);
|
||||||
|
// 如果新增加的不为空
|
||||||
|
finalPickmItemVOS.add(pickmItemVO);
|
||||||
|
}
|
||||||
|
if (finalPickmItemVOS == null) {
|
||||||
|
logger.info("数据异常 处理后备料计划明细为空");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("数据异常 处理后备料计划明细为空", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
// 转换为AggVO
|
||||||
|
PickmItemVO[] array = (PickmItemVO[]) finalPickmItemVOS.toArray(new PickmItemVO[0]);
|
||||||
|
AggPickmVO aggPickmVO = new AggPickmVO();
|
||||||
|
aggPickmVO.setParent(pickmHeadVO);
|
||||||
|
aggPickmVO.setChildren(PickmItemVO.class, array);
|
||||||
|
aggPickmVO.getParentVO().setStatus(VOStatus.UPDATED);
|
||||||
|
this.setDefaultValue(aggPickmVO);
|
||||||
|
resAggVOS.add(aggPickmVO);
|
||||||
|
}
|
||||||
|
// 更新
|
||||||
|
AggPickmVO[] updatedAggVOS = (AggPickmVO[]) resAggVOS.toArray(new AggPickmVO[0]);
|
||||||
|
AggPickmVO[] insertBills = serv.update(updatedAggVOS);
|
||||||
|
logger.info("备料计划明细行新增成功");
|
||||||
|
return ResultMessageUtil.toJSON(insertBills, "备料计划明细行新增成功");
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("备料计划明细行新增异常", e);
|
||||||
|
return ResultMessageUtil.exceptionToJSON(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("update")
|
||||||
|
@Consumes({"application/json"})
|
||||||
|
@Produces({"application/json"})
|
||||||
|
public JSONString update(Map<String, Object> paramMap) {
|
||||||
|
logger.debug("开始进行备料计划明细行的修改操作");
|
||||||
|
// 如果没有传递data属性
|
||||||
|
if (!paramMap.containsKey("data")) {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含data", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
List<Map<String, Object>> batchData = (List) paramMap.get("data");
|
||||||
|
IPickmMaintainService serv = (IPickmMaintainService) NCLocator.getInstance().lookup(IPickmMaintainService.class);
|
||||||
|
// 如果没有数据
|
||||||
|
if (MMCollectionUtil.isEmpty(batchData)) {
|
||||||
|
logger.info("传入数据异常,参数要包含data");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含data", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
List<AggPickmVO> resAggVOS = new ArrayList<>();
|
||||||
|
// 批量处理每一个主子表对象
|
||||||
|
for (Map<String, Object> singleData : batchData) {
|
||||||
|
if (!singleData.containsKey("pk_pmo")) {
|
||||||
|
logger.info("传入数据异常,参数要包含pk_pmo");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含pk_pmo", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
// 根据流程生产订单明细
|
||||||
|
String pk_pmo = (String) singleData.get("pk_pmo");
|
||||||
|
PMOItemVO pmoItemVO = (PMOItemVO) BASE_DAO.retrieveByPK(PMOItemVO.class, pk_pmo);
|
||||||
|
if (pmoItemVO == null) {
|
||||||
|
logger.info("根据pk_pmo查询的流程生产订单明细行不存在");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("根据pk_pmo查询的流程生产订单明细行不存在", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
List<PickmHeadVO> pickmHeadVOS = (List<PickmHeadVO>) BASE_DAO.retrieveByClause(PickmHeadVO.class, PickmHeadVO.VSOURCEMOROWID + " = '" + pk_pmo + "'");
|
||||||
|
if (pickmHeadVOS == null || pickmHeadVOS.isEmpty()) {
|
||||||
|
logger.info("根据流程生产订单明细主键查询备料计划失败");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("根据流程生产订单明细主键查询备料计划失败", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
PickmHeadVO pickmHeadVO = pickmHeadVOS.get(0);
|
||||||
|
if (!singleData.containsKey("mm_pickm_b")) {
|
||||||
|
logger.info("传入数据异常,参数要包含mm_pickm_b");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含mm_pickm_b", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 拿到每一个明细 进行修改
|
||||||
|
List<Map<String, Object>> batchPickms = (List<Map<String, Object>>) singleData.get("mm_pickm_b");
|
||||||
|
|
||||||
|
// 先将物料编码相同的明细进行分组
|
||||||
|
Map<String, List<Map<String, Object>>> materialGroups = new HashMap<>();
|
||||||
|
for (Map<String, Object> singlePicm : batchPickms) {
|
||||||
|
String cbmaterialvid = (String) singlePicm.get("cbmaterialvid");
|
||||||
|
if (cbmaterialvid == null) {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,流程备料计划明细行中参数要包含cbmaterialvid", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
materialGroups.computeIfAbsent(cbmaterialvid, k -> new ArrayList<>()).add(singlePicm);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询该备料计划下的所有明细
|
||||||
|
String searchBodySql = "SELECT * FROM mm_pickm_b WHERE nvl(dr,0) = 0 AND cpickmid = '" + pickmHeadVO.getCpickmid() + "'";
|
||||||
|
List<PickmItemVO> existingPickmItemVOS = (List<PickmItemVO>) BASE_DAO.executeQuery(searchBodySql, new BeanListProcessor(PickmItemVO.class));
|
||||||
|
if (existingPickmItemVOS == null || existingPickmItemVOS.isEmpty()) {
|
||||||
|
logger.info("根据备料计划主键查询的流程备料计划明细不存在");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("根据备料计划主键查询的流程备料计划明细不存在", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
List<PickmItemVO> finalPickmItemVOS = new ArrayList<>();
|
||||||
|
|
||||||
|
// 处理每个物料组
|
||||||
|
for (Map.Entry<String, List<Map<String, Object>>> entry : materialGroups.entrySet()) {
|
||||||
|
String materialCode = entry.getKey();
|
||||||
|
List<Map<String, Object>> materialItems = entry.getValue();
|
||||||
|
|
||||||
|
// 将物料编码转换为主键
|
||||||
|
String materialPk = transferPkByCode(MaterialVO.getDefaultTableName(), MaterialVO.PK_MATERIAL, MaterialVO.CODE, materialCode);
|
||||||
|
|
||||||
|
// 查询该物料对应的所有备料计划明细
|
||||||
|
List<PickmItemVO> materialPickmItems = new ArrayList<>();
|
||||||
|
for (PickmItemVO item : existingPickmItemVOS) {
|
||||||
|
if (materialPk.equals(item.getCbmaterialvid())) {
|
||||||
|
materialPickmItems.add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (materialPickmItems.isEmpty()) {
|
||||||
|
logger.info("未找到物料编码 " + materialCode + " 对应的备料计划明细");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("未找到物料编码 " + materialCode + " 对应的备料计划明细", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断是否有重复物料(同一物料编码但isvirtual不同)
|
||||||
|
if (materialItems.size() == 1) {
|
||||||
|
// 无重复,直接更新
|
||||||
|
Map<String, Object> singlePicm = materialItems.get(0);
|
||||||
|
Map<String, Object> newSinglePicm = transferSingleDataCodeToPk(singlePicm);
|
||||||
|
PickmItemVO pickmItemVO = transferToPickmItemVO(newSinglePicm, VOStatus.UPDATED);
|
||||||
|
|
||||||
|
// 直接取第一个匹配的明细进行更新
|
||||||
|
PickmItemVO existingPickmItemVO = materialPickmItems.get(0);
|
||||||
|
for (String attributeName : pickmItemVO.getAttributeNames()) {
|
||||||
|
if (pickmItemVO.getAttributeValue(attributeName) != null) {
|
||||||
|
existingPickmItemVO.setAttributeValue(attributeName, pickmItemVO.getAttributeValue(attributeName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finalPickmItemVOS.add(existingPickmItemVO);
|
||||||
|
|
||||||
|
} else if (materialItems.size() == 2) {
|
||||||
|
// 有重复,需要通过BOM逻辑进行匹配
|
||||||
|
// 先查询BOM信息
|
||||||
|
String bomSql = "cbmaterialvid = '" + pmoItemVO.getCmaterialvid() + "' and vbbomversionnumber = '" + pmoItemVO.getVbomversion() + "'";
|
||||||
|
BomVO bomHeadVO = (BomVO) BASE_DAO.retrieveByClause(BomVO.class, bomSql);
|
||||||
|
if (bomHeadVO == null) {
|
||||||
|
logger.info("未找到对应的BOM信息");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("未找到对应的BOM信息", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
String bombSql = BomVO.CBOMID + " = '" + bomHeadVO.getCbomid() + "'";
|
||||||
|
List<BomItemVO> bomItemVOS = (List<BomItemVO>) BASE_DAO.retrieveByClause(BomItemVO.class, bombSql);
|
||||||
|
|
||||||
|
// 分离实项和虚项
|
||||||
|
Map<String, Object> realItem = null;
|
||||||
|
Map<String, Object> virtualItem = null;
|
||||||
|
|
||||||
|
for (Map<String, Object> item : materialItems) {
|
||||||
|
String isVirtual = (String) item.get("isvirtual");
|
||||||
|
if (isVirtual == null || (!isVirtual.equals("Y") && !isVirtual.equals("N"))) {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("isvirtual参数错误,必须为Y或者N", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("N".equals(isVirtual)) {
|
||||||
|
realItem = item;
|
||||||
|
} else {
|
||||||
|
virtualItem = item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (realItem == null || virtualItem == null) {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("重复物料组中必须包含一个实项(isvirtual=N)和一个虚项(isvirtual=Y)", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理实项 - 通过BOM查找对应的备料计划明细
|
||||||
|
Map<String, Object> newRealItem = transferSingleDataCodeToPk(realItem);
|
||||||
|
PickmItemVO realPickmItemVO = transferToPickmItemVO(newRealItem, VOStatus.UPDATED);
|
||||||
|
|
||||||
|
PickmItemVO realExistingItem = null;
|
||||||
|
|
||||||
|
// 先检查BOM表头
|
||||||
|
String hcmaterialvid = bomHeadVO.getHcmaterialvid();
|
||||||
|
UFBoolean hisvirtual = bomHeadVO.getHisvirtual();
|
||||||
|
if (hcmaterialvid != null && hisvirtual != null &&
|
||||||
|
hcmaterialvid.equals(realPickmItemVO.getCbmaterialvid()) && !hisvirtual.booleanValue()) {
|
||||||
|
for (PickmItemVO item : materialPickmItems) {
|
||||||
|
if (bomHeadVO.getCbomid().equals(item.getCbombid())) {
|
||||||
|
realExistingItem = item;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果表头没找到,查找BOM明细
|
||||||
|
if (realExistingItem == null) {
|
||||||
|
for (BomItemVO bomItemVO : bomItemVOS) {
|
||||||
|
if (bomItemVO != null) {
|
||||||
|
String cmaterialvid = bomItemVO.getCmaterialvid();
|
||||||
|
UFBoolean bisvirtual = bomItemVO.getBisvirtual();
|
||||||
|
if (cmaterialvid != null && bisvirtual != null &&
|
||||||
|
cmaterialvid.equals(realPickmItemVO.getCbmaterialvid()) && !bisvirtual.booleanValue()) {
|
||||||
|
for (PickmItemVO item : materialPickmItems) {
|
||||||
|
if (bomItemVO.getCbom_bid().equals(item.getCbombid())) {
|
||||||
|
realExistingItem = item;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (realExistingItem != null) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (realExistingItem == null) {
|
||||||
|
logger.error("未找到实项对应的备料计划明细");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("未找到实项对应的备料计划明细", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新实项
|
||||||
|
for (String attributeName : realPickmItemVO.getAttributeNames()) {
|
||||||
|
if (realPickmItemVO.getAttributeValue(attributeName) != null) {
|
||||||
|
realExistingItem.setAttributeValue(attributeName, realPickmItemVO.getAttributeValue(attributeName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finalPickmItemVOS.add(realExistingItem);
|
||||||
|
|
||||||
|
// 处理虚项 - 排除法找到另一个明细
|
||||||
|
PickmItemVO virtualExistingItem = null;
|
||||||
|
for (PickmItemVO item : materialPickmItems) {
|
||||||
|
if (!item.equals(realExistingItem)) {
|
||||||
|
virtualExistingItem = item;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virtualExistingItem == null) {
|
||||||
|
logger.error("未找到虚项对应的备料计划明细");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("未找到虚项对应的备料计划明细", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新虚项
|
||||||
|
Map<String, Object> newVirtualItem = transferSingleDataCodeToPk(virtualItem);
|
||||||
|
PickmItemVO virtualPickmItemVO = transferToPickmItemVO(newVirtualItem, VOStatus.UPDATED);
|
||||||
|
|
||||||
|
for (String attributeName : virtualPickmItemVO.getAttributeNames()) {
|
||||||
|
if (virtualPickmItemVO.getAttributeValue(attributeName) != null) {
|
||||||
|
virtualExistingItem.setAttributeValue(attributeName, virtualPickmItemVO.getAttributeValue(attributeName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finalPickmItemVOS.add(virtualExistingItem);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("同一物料编码最多只能有2个明细(一个实项一个虚项)", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PickmItemVO[] array = finalPickmItemVOS.toArray(new PickmItemVO[0]);
|
||||||
|
AggPickmVO aggPickmVO = new AggPickmVO();
|
||||||
|
aggPickmVO.setParent(pickmHeadVO);
|
||||||
|
aggPickmVO.setChildren(PickmItemVO.class, array);
|
||||||
|
aggPickmVO.getParentVO().setStatus(VOStatus.UPDATED);
|
||||||
|
this.setDefaultValue(aggPickmVO);
|
||||||
|
resAggVOS.add(aggPickmVO);
|
||||||
|
}
|
||||||
|
// 更新
|
||||||
|
AggPickmVO[] updatedAggVOS = resAggVOS.toArray(new AggPickmVO[0]);
|
||||||
|
AggPickmVO[] updateBills = serv.update(updatedAggVOS);
|
||||||
|
logger.info("备料计划明细行修改成功");
|
||||||
|
return ResultMessageUtil.toJSON(updateBills, "备料计划明细行修改成功");
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("备料计划明细行修改异常", e);
|
||||||
|
return ResultMessageUtil.exceptionToJSON(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("delete")
|
||||||
|
@Consumes({"application/json"})
|
||||||
|
@Produces({"application/json"})
|
||||||
|
public JSONString delete(Map<String, Object> paramMap) {
|
||||||
|
logger.debug("开始进行备料计划明细行的删除操作");
|
||||||
|
// 如果没有传递data属性
|
||||||
|
if (!paramMap.containsKey("data")) {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含data", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
List<Map<String, Object>> paramList = (List) paramMap.get("data");
|
||||||
|
if (MMCollectionUtil.isEmpty(paramList)) {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含data", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
IPickmMaintainService serv = (IPickmMaintainService) NCLocator.getInstance().lookup(IPickmMaintainService.class);
|
||||||
|
List<AggPickmVO> resultAggVOList = new ArrayList<>();
|
||||||
|
|
||||||
|
// 按pk_pmo分组处理
|
||||||
|
Map<String, List<Map<String, Object>>> pmoGroups = new HashMap<>();
|
||||||
|
for (Map<String, Object> map : paramList) {
|
||||||
|
String pk_pmo = (String) map.get("pk_pmo");
|
||||||
|
if (pk_pmo == null) {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含pk_pmo", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
pmoGroups.computeIfAbsent(pk_pmo, k -> new ArrayList<>()).add(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Map.Entry<String, List<Map<String, Object>>> pmoEntry : pmoGroups.entrySet()) {
|
||||||
|
String pk_pmo = pmoEntry.getKey();
|
||||||
|
List<Map<String, Object>> pmoItems = pmoEntry.getValue();
|
||||||
|
|
||||||
|
// 根据流程生产订单明细查询PMO信息
|
||||||
|
PMOItemVO pmoItemVO = (PMOItemVO) BASE_DAO.retrieveByPK(PMOItemVO.class, pk_pmo);
|
||||||
|
if (pmoItemVO == null) {
|
||||||
|
logger.info("根据pk_pmo查询的流程生产订单明细行不存在");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("根据pk_pmo查询的流程生产订单明细行不存在", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据流程生产订单明细主键查询备料计划
|
||||||
|
List<PickmHeadVO> pickmHeadVOS = (List<PickmHeadVO>) BASE_DAO.retrieveByClause(PickmHeadVO.class, PickmHeadVO.VSOURCEMOID + " = '" + pmoItemVO.getCmoid() + "'");
|
||||||
|
if (pickmHeadVOS == null || pickmHeadVOS.isEmpty()) {
|
||||||
|
logger.info("根据流程生产订单明细主键查询备料计划失败");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("根据流程生产订单明细主键查询备料计划失败", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
PickmHeadVO pickmHeadVO = pickmHeadVOS.get(0);
|
||||||
|
|
||||||
|
// 获取当前head对应所有子项
|
||||||
|
String searchBodySql = "SELECT * FROM mm_pickm_b WHERE nvl(dr,0) = 0 AND CPICKMID = '" + pickmHeadVO.getCpickmid() + "'";
|
||||||
|
List<PickmItemVO> existingPickmItemVOS = (List<PickmItemVO>) BASE_DAO.executeQuery(searchBodySql, new BeanListProcessor(PickmItemVO.class));
|
||||||
|
if (existingPickmItemVOS == null || existingPickmItemVOS.isEmpty()) {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("未找到对应的备料计划明细,pk_pmo: " + pk_pmo, APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 收集所有materials并按物料编码分组
|
||||||
|
Map<String, List<Map<String, Object>>> materialGroups = new HashMap<>();
|
||||||
|
for (Map<String, Object> pmoItem : pmoItems) {
|
||||||
|
List<Map<String, Object>> materials = (List<Map<String, Object>>) pmoItem.get("materials");
|
||||||
|
if (MMCollectionUtil.isEmpty(materials)) {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含materials", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Map<String, Object> material : materials) {
|
||||||
|
String cbmaterialvid = (String) material.get("cbmaterialvid");
|
||||||
|
String isvirtual = (String) material.get("isvirtual");
|
||||||
|
if (cbmaterialvid == null || isvirtual == null) {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("传入数据异常,material要包含cbmaterialvid和isvirtual", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
materialGroups.computeIfAbsent(cbmaterialvid, k -> new ArrayList<>()).add(material);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理每个物料组
|
||||||
|
for (Map.Entry<String, List<Map<String, Object>>> materialEntry : materialGroups.entrySet()) {
|
||||||
|
String materialCode = materialEntry.getKey();
|
||||||
|
List<Map<String, Object>> materialItems = materialEntry.getValue();
|
||||||
|
|
||||||
|
// 将物料编码转换为主键
|
||||||
|
String materialPk = transferPkByCode(MaterialVO.getDefaultTableName(), MaterialVO.PK_MATERIAL, MaterialVO.CODE, materialCode);
|
||||||
|
|
||||||
|
// 查询该物料对应的所有备料计划明细
|
||||||
|
List<PickmItemVO> materialPickmItems = new ArrayList<>();
|
||||||
|
for (PickmItemVO item : existingPickmItemVOS) {
|
||||||
|
if (materialPk.equals(item.getCbmaterialvid())) {
|
||||||
|
materialPickmItems.add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (materialPickmItems.isEmpty()) {
|
||||||
|
logger.info("未找到物料编码 " + materialCode + " 对应的备料计划明细");
|
||||||
|
return ResultMessageUtil.exceptionToJSON("未找到物料编码 " + materialCode + " 对应的备料计划明细", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断删除逻辑
|
||||||
|
if (materialItems.size() == 1) {
|
||||||
|
// 删除单个物料明细
|
||||||
|
Map<String, Object> material = materialItems.get(0);
|
||||||
|
String isvirtual = (String) material.get("isvirtual");
|
||||||
|
|
||||||
|
if (materialPickmItems.size() == 1) {
|
||||||
|
// 只有一个明细,直接删除
|
||||||
|
materialPickmItems.get(0).setStatus(VOStatus.DELETED);
|
||||||
|
} else if (materialPickmItems.size() == 2) {
|
||||||
|
// 有两个明细,根据isvirtual判断删除哪个
|
||||||
|
if ("N".equals(isvirtual)) {
|
||||||
|
// 删除实项,通过BOM逻辑查找
|
||||||
|
PickmItemVO realItem = findRealItemByBOM(materialPickmItems, pmoItemVO, materialPk);
|
||||||
|
if (realItem != null) {
|
||||||
|
realItem.setStatus(VOStatus.DELETED);
|
||||||
|
} else {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("未找到对应的实项备料计划明细", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
} else if ("Y".equals(isvirtual)) {
|
||||||
|
// 删除虚项,通过排除法查找
|
||||||
|
PickmItemVO realItem = findRealItemByBOM(materialPickmItems, pmoItemVO, materialPk);
|
||||||
|
PickmItemVO virtualItem = null;
|
||||||
|
for (PickmItemVO item : materialPickmItems) {
|
||||||
|
if (!item.equals(realItem)) {
|
||||||
|
virtualItem = item;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (virtualItem != null) {
|
||||||
|
virtualItem.setStatus(VOStatus.DELETED);
|
||||||
|
} else {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("未找到对应的虚项备料计划明细", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (materialItems.size() == 2) {
|
||||||
|
// 删除两个明细,验证必须包含一个实项和一个虚项
|
||||||
|
boolean hasReal = false;
|
||||||
|
boolean hasVirtual = false;
|
||||||
|
for (Map<String, Object> material : materialItems) {
|
||||||
|
String isvirtual = (String) material.get("isvirtual");
|
||||||
|
if ("N".equals(isvirtual)) {
|
||||||
|
hasReal = true;
|
||||||
|
} else if ("Y".equals(isvirtual)) {
|
||||||
|
hasVirtual = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasReal || !hasVirtual) {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("删除重复物料组必须包含一个实项(isvirtual=N)和一个虚项(isvirtual=Y)", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除该物料的所有明细
|
||||||
|
for (PickmItemVO item : materialPickmItems) {
|
||||||
|
item.setStatus(VOStatus.DELETED);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return ResultMessageUtil.exceptionToJSON("同一物料编码的删除项数量不能超过2个", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置未删除的明细状态为更新
|
||||||
|
for (PickmItemVO item : existingPickmItemVOS) {
|
||||||
|
if (item.getStatus() != VOStatus.DELETED) {
|
||||||
|
item.setStatus(VOStatus.UPDATED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PickmItemVO[] array = existingPickmItemVOS.toArray(new PickmItemVO[0]);
|
||||||
|
AggPickmVO aggPickmVO = new AggPickmVO();
|
||||||
|
aggPickmVO.setParent(pickmHeadVO);
|
||||||
|
aggPickmVO.getParentVO().setStatus(VOStatus.UPDATED);
|
||||||
|
aggPickmVO.setChildren(PickmItemVO.class, array);
|
||||||
|
this.setDefaultValue(aggPickmVO);
|
||||||
|
resultAggVOList.add(aggPickmVO);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!resultAggVOList.isEmpty()) {
|
||||||
|
serv.update(resultAggVOList.toArray(new AggPickmVO[0]));
|
||||||
|
}
|
||||||
|
logger.info("备料计划明细行删除成功");
|
||||||
|
return ResultMessageUtil.toJSON(new String[0], "备料计划明细行删除成功");
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("备料计划明细行删除异常", e);
|
||||||
|
return ResultMessageUtil.exceptionToJSON(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过BOM逻辑查找实项(isvirtual=N对应的明细)
|
||||||
|
*/
|
||||||
|
private PickmItemVO findRealItemByBOM(List<PickmItemVO> materialPickmItems, PMOItemVO pmoItemVO, String materialPk) throws BusinessException {
|
||||||
|
try {
|
||||||
|
// 查询BOM信息
|
||||||
|
String bomSql = "cbmaterialvid = '" + pmoItemVO.getCmaterialvid() + "' and vbbomversionnumber = '" + pmoItemVO.getVbomversion() + "'";
|
||||||
|
BomVO bomHeadVO = (BomVO) BASE_DAO.retrieveByClause(BomVO.class, bomSql);
|
||||||
|
if (bomHeadVO == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
String bombSql = BomVO.CBOMID + " = '" + bomHeadVO.getCbomid() + "'";
|
||||||
|
List<BomItemVO> bomItemVOS = (List<BomItemVO>) BASE_DAO.retrieveByClause(BomItemVO.class, bombSql);
|
||||||
|
|
||||||
|
// 先检查BOM表头
|
||||||
|
String hcmaterialvid = bomHeadVO.getHcmaterialvid();
|
||||||
|
UFBoolean hisvirtual = bomHeadVO.getHisvirtual();
|
||||||
|
if (hcmaterialvid != null && hisvirtual != null &&
|
||||||
|
hcmaterialvid.equals(materialPk) && !hisvirtual.booleanValue()) {
|
||||||
|
for (PickmItemVO item : materialPickmItems) {
|
||||||
|
if (bomHeadVO.getCbomid().equals(item.getCbombid())) {
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果表头没找到,查找BOM明细
|
||||||
|
for (BomItemVO bomItemVO : bomItemVOS) {
|
||||||
|
if (bomItemVO != null) {
|
||||||
|
String cmaterialvid = bomItemVO.getCmaterialvid();
|
||||||
|
UFBoolean bisvirtual = bomItemVO.getBisvirtual();
|
||||||
|
if (cmaterialvid != null && bisvirtual != null &&
|
||||||
|
cmaterialvid.equals(materialPk) && !bisvirtual.booleanValue()) {
|
||||||
|
for (PickmItemVO item : materialPickmItems) {
|
||||||
|
if (bomItemVO.getCbom_bid().equals(item.getCbombid())) {
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("查找实项明细异常", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将请求参数转换为PickmHeadVO
|
||||||
|
*/
|
||||||
|
public static PickmHeadVO transferToPickmHeadVO(Map<String, Object> row, Integer type) throws BusinessException {
|
||||||
|
if (row == null) {
|
||||||
|
throw new BusinessException("根据pk_pmo未查询出相关流程备料计划");
|
||||||
|
}
|
||||||
|
PickmHeadVO pickmHeadVO = new PickmHeadVO();
|
||||||
|
pickmHeadVO.setPk_group(AppContext.getInstance().getPkGroup());
|
||||||
|
pickmHeadVO.setStatus(type);
|
||||||
|
for (String key : row.keySet()) {
|
||||||
|
pickmHeadVO.setAttributeValue(key, row.get(key));
|
||||||
|
}
|
||||||
|
return pickmHeadVO;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将请求参数mm_pickm_b数组中的每一个个体转换为PickmItemVO个体
|
||||||
|
*/
|
||||||
|
public static PickmItemVO transferToPickmItemVO(Map<String, Object> pickmBody, Integer type) throws BusinessException {
|
||||||
|
PickmItemVO body = new PickmItemVO();
|
||||||
|
for (String key : pickmBody.keySet()) {
|
||||||
|
body.setAttributeValue(key, pickmBody.get(key));
|
||||||
|
}
|
||||||
|
body.setStatus(type);
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setDefaultValue(AggPickmVO vo) {
|
||||||
|
String pk = vo.getParentVO().getCpickmid();
|
||||||
|
|
||||||
|
for (PickmItemVO item : (PickmItemVO[]) vo.getChildrenVO()) {
|
||||||
|
if (2 == item.getStatus()) {
|
||||||
|
item.setCpickmid(pk);
|
||||||
|
item.setCpickm_bid((String) null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据编码查询主键
|
||||||
|
*/
|
||||||
|
private String transferPkByCode(String tableName, String selectField, String codeField, String code) throws BusinessException {
|
||||||
|
if (code == null || code.trim().isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
SqlBuilder sqlBuilder = new SqlBuilder();
|
||||||
|
sqlBuilder.append(" select " + selectField);
|
||||||
|
sqlBuilder.append(" from " + tableName);
|
||||||
|
sqlBuilder.append(" where ");
|
||||||
|
sqlBuilder.append(codeField, code);
|
||||||
|
Object o = BASE_DAO.executeQuery(sqlBuilder.toString(), new ColumnProcessor());
|
||||||
|
if (o == null) {
|
||||||
|
throw new BusinessException("未查询到主键信息,sql【" + sqlBuilder + "】");
|
||||||
|
}
|
||||||
|
return o.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// transferSingleDataCodeToPk
|
||||||
|
private Map<String, Object> transferSingleDataCodeToPk(Map<String, Object> singleData) throws BusinessException {
|
||||||
|
// 1. 创建新 Map,复制原始数据(浅拷贝)
|
||||||
|
Map<String, Object> newData = new HashMap<>(singleData);
|
||||||
|
// 2. 只修改需要的字段(其他字段保持不变)
|
||||||
|
String org_code = transferPkByCode(OrgVO.getDefaultTableName(), OrgVO.PK_ORG, OrgVO.CODE, (String) singleData.get("pk_org"));
|
||||||
|
newData.put("pk_org", org_code); // 修改新 Map,不影响原 Map
|
||||||
|
String group_code = transferPkByCode(GroupVO.getDefaultTableName(), GroupVO.PK_GROUP, GroupVO.CODE, (String) singleData.get("pk_group"));
|
||||||
|
newData.put("pk_group", group_code);
|
||||||
|
String csupplyorgvidcode = transferPkByCode(StockOrgVersionVO.getDefaultTableName(), StockOrgVersionVO.PK_VID, StockOrgVersionVO.CODE, (String) singleData.get("csupplyorgvid"));
|
||||||
|
newData.put("csupplyorgvid", csupplyorgvidcode);
|
||||||
|
String cbmaterialvidcode = transferPkByCode(MaterialVO.getDefaultTableName(), MaterialVO.PK_MATERIAL, MaterialVO.CODE, (String) singleData.get("cbmaterialvid"));
|
||||||
|
newData.put("cbmaterialvid", cbmaterialvidcode);
|
||||||
|
String cdeliverorgvidcode = transferPkByCode(StockOrgVersionVO.getDefaultTableName(), StockOrgVersionVO.PK_VID, StockOrgVersionVO.CODE, (String) singleData.get("cdeliverorgvid"));
|
||||||
|
newData.put("cdeliverorgvid", cdeliverorgvidcode);
|
||||||
|
String cdeliverorgidcode = transferPkByCode(StockOrgVO.getDefaultTableName(), StockOrgVO.PK_STOCKORG, StockOrgVO.CODE, (String) singleData.get("cdeliverorgid"));
|
||||||
|
newData.put("cdeliverorgid", cdeliverorgidcode);
|
||||||
|
String cbunitidcode = transferPkByCode(MeasdocVO.getDefaultTableName(), MeasdocVO.PK_MEASDOC, MeasdocVO.CODE, (String) singleData.get("cbunitid"));
|
||||||
|
newData.put("cbunitid", cbunitidcode);
|
||||||
|
return newData;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getModule() {
|
||||||
|
return "mmpac";
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue