材料出库接口重排行号

This commit is contained in:
李正@用友 2025-05-24 11:29:38 +08:00
parent a59b2f60c8
commit a3447b46b6
1 changed files with 272 additions and 0 deletions

View File

@ -0,0 +1,272 @@
package nccloud.api.impl.ic.m4d;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import nc.bs.framework.common.NCLocator;
import nc.bs.scmpub.query.SCMBillQuery;
import nc.itf.scmpub.reference.uap.pf.PfServiceScmUtil;
import nc.pubimpl.ic.api.maintain.BillMaintainTool;
import nc.pubitf.ic.m4d.api.IMaterialOutMaintainAPI;
import nc.vo.ic.general.define.ICBillFlag;
import nc.vo.ic.general.define.ICBillHeadVO;
import nc.vo.ic.general.util.ICLocationUtil;
import nc.vo.ic.location.ICLocationVO;
import nc.vo.ic.m4d.entity.MaterialOutBodyVO;
import nc.vo.ic.m4d.entity.MaterialOutHeadVO;
import nc.vo.ic.m4d.entity.MaterialOutVO;
import nc.vo.ic.pub.define.ICPubMetaNameConst;
import nc.vo.pub.BusinessException;
import nc.vo.pub.VOStatus;
import nc.vo.scmpub.check.billvalidate.BillVOsCheckRule;
import nc.vo.scmpub.res.billtype.ICBillType;
import nccloud.api.ic.m4d.IAPIMaterialOutMaintain;
import nccloud.api.impl.ic.m4d.check.CheckMaterialOutSaveValidator;
import nccloud.api.impl.ic.m4d.fill.MaterialOutSaveFillValue;
import nccloud.api.impl.ic.m4d.fill.MaterialOutUpdateFillValue;
import nccloud.api.impl.ic.pub.check.CheckProhibitUpdateFields;
import nccloud.openapi.ic.util.ICAPILocationVOUtils;
import nccloud.openapi.scmpub.pub.TransferCodeToPKTool;
import nccloud.openapi.scmpub.pub.TransferMapToVOTool;
/**
*
* @Description: 库存材料出库单维护实现类
*
* @author: 曹军
* @date: 2019-5-17 上午10:49:30
* @version NCC1909
*/
public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain{
@Override
public MaterialOutVO[] save(List<Map<String, Object>> paramList) throws BusinessException {
// MapList转聚合VOList
List<MaterialOutVO> aggVOList =
TransferMapToVOTool.transferMapToAggVO(paramList, MaterialOutVO.class);
MaterialOutVO[] vos =
aggVOList.toArray(new MaterialOutVO[aggVOList.size()]);
// 设置货位序列号VO
ICAPILocationVOUtils.setLocationVO(ICBillType.MaterialOut.getCode(),vos);
// 1传入数据基本非空校验
BillVOsCheckRule checker =
new BillVOsCheckRule(new CheckMaterialOutSaveValidator());
checker.check(vos);
// 2编码翻译成pk
aggVOList = TransferCodeToPKTool.transferAggVO(aggVOList);
// 翻译货位
ICAPILocationVOUtils.translate(vos);
//其他数据填充
new MaterialOutSaveFillValue().setDefaultValue(vos);
IMaterialOutMaintainAPI materialOut = NCLocator.getInstance().lookup(IMaterialOutMaintainAPI.class);
//设置每行行号
setMaterialOutRowNum(vos);
return materialOut.insertBills(vos);
}
private void setMaterialOutRowNum(MaterialOutVO[] vos) {
for (int i = 0; i < vos.length; i++) {
MaterialOutVO vo = vos[i];
MaterialOutBodyVO[] bodys = vo.getBodys();
if (bodys != null && bodys.length > 0) {
for (int j = 0; j < bodys.length; j++) {
MaterialOutBodyVO body = bodys[j];
body.setCrowno(String.valueOf((j +1)*10));
}
}
}
}
@Override
public MaterialOutVO[] update(List<Map<String, Object>> paramList) throws BusinessException {
// MapList转聚合VOList
List<MaterialOutVO> aggVOList =
TransferMapToVOTool.transferMapToAggVO(paramList, MaterialOutVO.class);
// 2编码翻译成pk
aggVOList = TransferCodeToPKTool.transferAggVO(aggVOList);
MaterialOutVO[] vos =
aggVOList.toArray(new MaterialOutVO[aggVOList.size()]);
// 设置货位序列号VO
ICAPILocationVOUtils.setLocationVO(ICBillType.MaterialOut.getCode(),vos);
MaterialOutHeadVO newVO = vos[0].getHead();
String cgeneralhid = newVO.getCgeneralhid();
if(StringUtils.isEmpty(cgeneralhid)){
throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0391")/*@res "修改材料出库单请指定表头主键cgeneralhid值。"*/);
}
SCMBillQuery<MaterialOutVO> queryTool =
new SCMBillQuery<MaterialOutVO>(MaterialOutVO.class);
MaterialOutVO[] materialOutVOs = queryTool.queryVOByIDs(new String[]{cgeneralhid});
Map<String, ICLocationVO[]> deleteLoc =
new HashMap<String, ICLocationVO[]>();
// 加载原始单据和货位信息
MaterialOutVO[] originBills = queryTool.queryVOByIDs(new String[] {
cgeneralhid
});
ICLocationUtil.loadLocationVOs(originBills);
if(ArrayUtils.isEmpty(materialOutVOs)){
throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0360")/*@res "没找到要修改的出库单信息请检查数据的表头主键cgeneralhid。"*/);
}else{
List<String> headProFields = CheckProhibitUpdateFields.getHeadProhibitFields("4D");
List<String> bodyProFields = CheckProhibitUpdateFields.getBodyProhibitFields("4D");
MaterialOutHeadVO origVO = materialOutVOs[0].getHead();
if(origVO.getFbillflag() == null ||
0 != ((Integer) ICBillFlag.FREE.value())
.compareTo((Integer) origVO.getFbillflag())){
throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0361")/*@res "当前出库单编号:"*/ + origVO.getVbillcode() + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0362")/*@res "不是自由状态,不能修改"*/);
}
origVO.setStatus(VOStatus.UPDATED);
for(String attr : newVO.getAttributeNames()){
if(newVO.getAttributeValue(attr) == null) {
continue;
}
if(headProFields.contains(attr)
&& !newVO.getAttributeValue(attr).equals(origVO.getAttributeValue(attr))){
throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0363")/*@res "表头字段:"*/ + attr + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0364")/*@res "不允许修改。"*/ );
}
origVO.setAttributeValue(attr, newVO.getAttributeValue(attr));
}
for (MaterialOutVO orivo : originBills) {
MaterialOutBodyVO[] oribodys = orivo.getBodys();
for (MaterialOutBodyVO oribody : oribodys) {
ICLocationVO[] locationVOs = oribody.getLocationVOs();
if (null != locationVOs) {
deleteLoc.put(oribody.getCgeneralbid(), locationVOs);
}
}
}
if(vos[0].getBodys() != null){
Map<String, MaterialOutBodyVO> pkbs = new HashMap<String, MaterialOutBodyVO>();
for(MaterialOutBodyVO origBvo : materialOutVOs[0].getBodys()){
origBvo.setStatus(VOStatus.UPDATED);
pkbs.put(origBvo.getCgeneralbid(), origBvo);
}
for(MaterialOutBodyVO newBvo : vos[0].getBodys()){
MaterialOutBodyVO roigBvo = pkbs.get(newBvo.getCgeneralbid());
if(newBvo.getCgeneralbid() == null || roigBvo == null){
throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0365")/*@res "没有匹配到原始出库单表体信息请检查数据的表体主键cgeneralbid。"*/);
}
Set<String> bfields = new HashSet<String>();
for(String battr : newBvo.getAttributeNames()){
if(newBvo.getAttributeValue(battr) == null) {
continue;
}
if(bodyProFields.contains(battr)
&& !newBvo.getAttributeValue(battr).equals(roigBvo.getAttributeValue(battr))){
throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0366")/*@res "表体字段:"*/ + battr + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0364")/*@res "不允许修改。"*/ );
}
roigBvo.setAttributeValue(battr, newBvo.getAttributeValue(battr));
bfields.add(battr);
}
//设置货位序列号孙表,把原来的孙表删除修改的货位置为新增
if(null != newBvo.getLocationVOs()) {
List<ICLocationVO> allloc = new ArrayList<ICLocationVO>();
if(null != deleteLoc && null != deleteLoc.get(roigBvo.getCgeneralbid())) {
for(ICLocationVO delloc : deleteLoc.get(roigBvo.getCgeneralbid())) {
delloc.setStatus(VOStatus.DELETED);
allloc.add(delloc);
}
}
for(ICLocationVO loc : newBvo.getLocationVOs()) {
loc.setStatus(VOStatus.NEW);
allloc.add(loc);
}
roigBvo.setLocationVOs(allloc.toArray(new ICLocationVO[allloc.size()]));
}
// 翻译货位
ICAPILocationVOUtils.translate(materialOutVOs);
//其他数据填充
new MaterialOutUpdateFillValue().setDefaultValue(materialOutVOs,bfields);
}
}
}
BillMaintainTool<MaterialOutVO> tool =
new BillMaintainTool<MaterialOutVO>(MaterialOutVO.class,
ICBillType.MaterialOut.getCode());
tool.doBeforeInsert(materialOutVOs);
return NCLocator.getInstance()
.lookup(nc.itf.ic.m4d.IMaterialOutMaintain.class).update(materialOutVOs,originBills);
}
@Override
public MaterialOutVO[] delete(MaterialOutVO[] vos) throws BusinessException {
if(ArrayUtils.isEmpty(vos)){
return null;
}
for(MaterialOutVO aggvo : vos){
ICBillHeadVO parentVO = aggvo.getParentVO();
if(parentVO.getFbillflag() == null ||
0 != ((Integer) ICBillFlag.FREE.value())
.compareTo((Integer) parentVO.getFbillflag())){
throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0361")/*@res "当前出库单编号:"*/ + parentVO.getVbillcode() + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0367")/*@res "不是自由状态,不能删除"*/);
}
}
return (MaterialOutVO[]) PfServiceScmUtil.processBatch("DELETE", "4D", vos, null, null);
}
@Override
public MaterialOutVO[] sign(MaterialOutVO[] vos) throws BusinessException {
if(ArrayUtils.isEmpty(vos)){
return null;
}
for(MaterialOutVO aggvo : vos){
ICBillHeadVO parentVO = aggvo.getParentVO();
if(parentVO.getFbillflag() == null ||
0 != ((Integer) ICBillFlag.FREE.value())
.compareTo((Integer) parentVO.getFbillflag())){
throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0361")/*@res "当前出库单编号:"*/ + parentVO.getVbillcode() + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0330")/*@res "不是自由状态,不能签字"*/);
}
if(aggvo.getChildrenVO() != null && aggvo.getChildrenVO().length > 0){
if(aggvo.getChildrenVO()[0].getAttributeValue(ICPubMetaNameConst.NNUM) == null){
throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0361")/*@res "当前出库单编号:"*/ + parentVO.getVbillcode() + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0392")/*@res "总数量为空,不能签字"*/);
}
}
}
ICLocationUtil.loadLocationVOs(vos);
return (MaterialOutVO[]) PfServiceScmUtil.processBatch("SIGN", "4D", vos, null, null);
}
@Override
public MaterialOutVO[] unSign(MaterialOutVO[] vos) throws BusinessException {
if(ArrayUtils.isEmpty(vos)){
return null;
}
for(MaterialOutVO aggvo : vos){
ICBillHeadVO parentVO = aggvo.getParentVO();
if(parentVO.getFbillflag() == null ||
0 != ((Integer) ICBillFlag.SIGN.value())
.compareTo((Integer) parentVO.getFbillflag())){
throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0361")/*@res "当前出库单编号:"*/ + parentVO.getVbillcode() + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0","04008027-0332")/*@res "不是签字状态,不能取消签字"*/);
}
}
return (MaterialOutVO[]) PfServiceScmUtil.processBatch("CANCELSIGN", "4D", vos, null, null);
}
@Override
public MaterialOutVO[] saveByRef(List<Map<String, Object>> paramList) throws BusinessException{
// MapList转聚合VOList
List<MaterialOutVO> aggVOList =
TransferMapToVOTool.transferMapToAggVO(paramList, MaterialOutVO.class);
MaterialOutVO[] vos =
aggVOList.toArray(new MaterialOutVO[aggVOList.size()]);
// 1传入数据基本非空校验
BillVOsCheckRule checker =
new BillVOsCheckRule(new CheckMaterialOutSaveValidator());
checker.check(vos);
// 2编码翻译成pk
aggVOList = TransferCodeToPKTool.transferAggVO(aggVOList);
IMaterialOutMaintainAPI materialOut = NCLocator.getInstance().lookup(IMaterialOutMaintainAPI.class);
return materialOut.insertBills(vos);
}
}