package nccloud.api.mmbd.dchangemanage.dchangemaster; import java.lang.reflect.Field; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import java.lang.StringBuilder; import java.math.BigDecimal; import java.util.*; import java.util.Map.Entry; import nc.bs.dao.BaseDAO; import nc.bs.dao.DAOException; import nc.bs.trade.business.HYPubBO; import nc.bs.uapbd.util.MyHelper; import nc.itf.mmbd.dchange.dchangemaster.IDchangeMasterVOService; import nc.itf.mmpac.pickm.IPickmQueryService; import nc.jdbc.framework.processor.MapListProcessor; import nc.jdbc.framework.processor.MapProcessor; import nc.uif.pub.exception.UifException; import nc.util.mmf.framework.base.MMValueCheck; import nc.vo.dchange.dchange.*; import nc.vo.mmpac.pickm.entity.AggPickmVO; import nc.vo.mmpps.mps0202.AggregatedPoVO; import nccloud.framework.service.ServiceLocator; import nccloud.pubift.commen.itf.utils.IHttpPostOtherSys; import org.json.JSONString; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import nccloud.ws.rest.resource.AbstractNCCRestResource; import nccloud.api.rest.utils.ResultMessageUtil; import nccloud.commons.lang.ArrayUtils; import nccloud.commons.lang.StringUtils; import nc.bs.framework.common.NCLocator; import nc.vo.pub.JavaType; import nc.vo.pub.IAttributeMeta; import nc.vo.pub.BusinessException; import nc.vo.pub.SuperVO; import nc.vo.pub.VOStatus; import nc.vo.pub.lang.UFBoolean; import nc.vo.pub.lang.UFDate; import nc.vo.pub.lang.UFDateTime; import nc.vo.pub.lang.UFDouble; import nc.vo.pub.lang.UFLiteralDate; import nc.vo.pub.lang.UFTime; @Path("mmbd/dchangemanage/dchangeMaster") public class DchangeMasterManageResources extends AbstractNCCRestResource { private Map fieldsNameAndType = new HashMap<>(); private Map> bodyFieldsNameAndTypes = new HashMap<>(); @Override public String getModule() { return "mmbd"; } @POST @Path("/adddchangeMasterVO") @Consumes({ "application/json" }) @Produces({ "application/json" }) public JSONString adddchangeMasterVO(JSONString json) { return dealJson(json, "adddchangeMasterVO"); } @POST @Path("/deletedchangeMasterVO") @Consumes({ "application/json" }) @Produces({ "application/json" }) public JSONString deletedchangeMasterVO(JSONString json) { return dealJson(json, "deletedchangeMasterVO"); } @POST @Path("/updatedchangeMasterVO") @Consumes({ "application/json" }) @Produces({ "application/json" }) public JSONString updatedchangeMasterVO(JSONString json) { return dealJson(json, "updatedchangeMasterVO"); } @POST @Path("/querydchangeMasterVO") @Consumes({ "application/json" }) @Produces({ "application/json" }) public JSONString querydchangeMasterVO(JSONString json) { return dealJson(json, "querydchangeMasterVO"); } @POST @Path("/insert") @Consumes({ "application/json" }) @Produces({ "application/json" }) public JSONString insert(JSONString json) throws BusinessException { JSONObject obj = JSON.parseObject(json.toJSONString()); // 调用接口新增 DchangeMasterVO vo = buildVO1(obj, true); DchangeMasterVO[] result = null; try{ result = getService().saveDchangeMasterVO(vo); } catch(BusinessException e) { return ResultMessageUtil.exceptionToJSON(e); } JSONObject returnJson = new JSONObject(); returnJson.put("result", result); return ResultMessageUtil.toJSON(returnJson); } private JSONString dealJson(JSONString json, String methodName) { if(json == null) { return ResultMessageUtil.exceptionToJSON(new NullPointerException("输入参数不能为空!")); } JSONObject obj = JSON.parseObject(json.toJSONString()); if(methodName.indexOf("add") >= 0) { StringBuilder builder = requiredFieldsValidate(obj); if(builder.length() > 0) { String addError = "新增时必输项存在空值,为空的必输项有:" + builder.deleteCharAt(builder.length() - 1).toString(); return ResultMessageUtil.exceptionToJSON(new NullPointerException(addError)); } else { // 调用接口新增 DchangeMasterVO vo = buildVO(obj, true); DchangeMasterVO[] result = null; try{ result = getService().saveDchangeMasterVO(vo); } catch(BusinessException e) { return ResultMessageUtil.exceptionToJSON(e); } JSONObject returnJson = new JSONObject(); returnJson.put("result", result); return ResultMessageUtil.toJSON(returnJson); } } else if(methodName.indexOf("delete") >= 0) { String entityPk = obj.getString("pk_dchangemaster"); if(StringUtils.isEmpty(entityPk)) { return ResultMessageUtil.exceptionToJSON(new NullPointerException("删除时主键为必输项,不能为空!")); } // 删除需要区分全局、集团和业务单元 String pk_org = obj.getString("pk_org"); // 如果没有传pk_org, 默认是全局 if(StringUtils.isEmpty(pk_org)) { pk_org = "GLOBLE00000000000000"; } // 调用接口删除 JSONObject returnJson = new JSONObject(); Map tsMap = new HashMap<>(); DchangeMasterVO[] vos = null; try { vos = getService().listDchangeMasterVOByPk("pk_dchangemaster = '" + entityPk + "'", false); } catch (BusinessException e) { ResultMessageUtil.exceptionToJSON(e); } if(ArrayUtils.isNotEmpty(vos)) { tsMap.put(vos[0].getAttributeValue("pk_dchangemaster").toString(), vos[0].getTs().toString()); } DchangeMasterVO[] result = null; try { result = getService().deleteDchangeMasterVOs(tsMap); } catch (BusinessException e) { ResultMessageUtil.exceptionToJSON(e); } returnJson.put("result", result); return ResultMessageUtil.toJSON(returnJson); } else if(methodName.indexOf("update") >= 0) { JSONObject object = (JSONObject)obj.get("dchangeMaster"); String entityPk = object.getString("pk_dchangemaster"); if(StringUtils.isEmpty(entityPk)) { return ResultMessageUtil.exceptionToJSON(new NullPointerException("修改时主键为必输项,不能为空!")); } StringBuilder builder = requiredFieldsValidate(obj); if(builder.length() > 0) { String updateError = "修改时必输项存在空值,为空的必输项有:" + builder.deleteCharAt(builder.length() - 1).toString(); return ResultMessageUtil.exceptionToJSON(new NullPointerException(updateError)); } else { // 调用接口修改 DchangeMasterVO vo = buildVO(obj, false); DchangeMasterVO[] result = null; JSONObject returnJson = new JSONObject(); try{ result = getService().saveDchangeMasterVO(vo); } catch(BusinessException e) { return ResultMessageUtil.exceptionToJSON(e); } returnJson.put("result", result); return ResultMessageUtil.toJSON(returnJson); } } else if(methodName.indexOf("query") >= 0) { // 查询时需要接收业务单元作为参数吗? StringBuilder sqlBuilder = new StringBuilder(" isnull(dr, 0) = 0"); Set> entrySet = obj.entrySet(); Iterator> iterator = entrySet.iterator(); while(iterator.hasNext()) { Entry entry = iterator.next(); if(entry.getValue() != null) { sqlBuilder.append(" and " + entry.getKey() + "='" + entry.getValue() + "'"); } } DchangeMasterVO[] results = null; try { String[] pks = getService().listDchangeMasterVOPkByCond(sqlBuilder.toString()); results = getService().listDchangeMasterVOByPk(pks, false); } catch (BusinessException e) { return ResultMessageUtil.exceptionToJSON(e); } JSONObject returnJson = new JSONObject(); returnJson.put("result", results); return ResultMessageUtil.toJSON(returnJson); } return null; } private StringBuilder requiredFieldsValidate(JSONObject obj) { StringBuilder builder = new StringBuilder(); List notNullFields = getRequiredFields(obj); JSONObject object = (JSONObject)obj.get("dchangeMaster"); for(String notNullField : notNullFields) { Object val = object.get(notNullField); if(val == null){ builder.append(notNullField + ","); } } return builder; } private DchangeMasterVO buildVO(JSONObject json, boolean isAdd) { if(json.get("dchangeMaster") == null) { throw new NullPointerException("传入参数中不存在主实体数据!"); } int voStatus = isAdd ? VOStatus.NEW : VOStatus.UPDATED; // 主实体 JSONObject headJson = (JSONObject) json.get("dchangeMaster"); DchangeMasterVO headVO = new DchangeMasterVO(); IAttributeMeta[] headAttrs = headVO.getMetaData().getAttributes(); for (IAttributeMeta attribute : headAttrs) { Object value = getValueByAttr(headJson, attribute); headVO.setAttributeValue(attribute.getName(), value); } headVO.setStatus(voStatus); return headVO; } private DchangeMasterVO buildVO1(JSONObject json, boolean isAdd) throws BusinessException { if(json.get("dchangeMaster") == null) { throw new NullPointerException("传入参数中不存在主实体数据!"); } HYPubBO hy = new HYPubBO(); int voStatus = isAdd ? VOStatus.NEW : VOStatus.UPDATED; // 主实体 JSONObject headJson = (JSONObject) json.get("dchangeMaster"); // BOM版本号-父项编码-子项编码-变更前数量-变更后数量 String bomVersion = headJson.getString("bomVersion"); /*bom版本号等于销售订单号加行号*/ String[] s=bomVersion.split("\\+"); if(s.length!=2){ throw new NullPointerException("传入参数中BOM版本号格式错误!"); } String so_saleorder=s[0]; String vrow=s[1]; // Object pk_material = hy.findColValue("bd_material", "pk_material", "code = '"+pcode+"' and nvl(dr,0)=0 "); String pcode=headJson.getString("pcode"); String ccode=headJson.getString("ccode"); UFDouble beforenum=new UFDouble(headJson.getString("beforenum")) ; UFDouble afternum=new UFDouble(headJson.getString("afternum")) ; // 先根据bom版本号和父项编码(产品编码)查询备料计划 先查询物料id,在查询bom版本 Object pk_material = hy.findColValue("bd_material", "pk_material", "code = '"+pcode+"' and nvl(dr,0)=0 "); Object cmrl = hy.findColValue("bd_material", "pk_material", "code = '"+ccode+"' and nvl(dr,0)=0 "); Object pmoid = hy.findColValue("cpickmid", "mm_pickm", "vfirstmocode = '"+so_saleorder+"' and vfirstmorowcode=‘"+vrow+"’ and nvl(dr,0)=0 "); Object cbomid = hy.findColValue("vbomversion", "mm_pickm", "cpickmid = '"+pmoid+"' and nvl(dr,0)=0 "); if(null ==cbomid){ return null; } Object cpickmid=hy.findColValue("mm_pickm", "cpickmid", "cmaterialvid = '"+pk_material+"' and vbomversion=‘"+cbomid+"’ and nvl(dr,0)=0 "); AggPickmVO aggVOs = null; IPickmQueryService service =NCLocator.getInstance().lookup(IPickmQueryService.class); aggVOs =service.querySingleBillByPk((String) cpickmid); DchangeMasterVO dchangeMasterVO = new DchangeMasterVO(); dchangeMasterVO.setBom_v((String) cbomid); dchangeMasterVO.setPcode(pcode); // DchangeSlave0VO[] dchangeSlave0VOS=null; // 查询的备料子表插入 物料变更明细 List list = null; List code =new ArrayList<>(); if (aggVOs != null) { code.add(aggVOs.getParentVO().getVbillcode()); for (int j=0;j map = new HashMap<>(); if(aggVOs.getChildrenVO()[j].getAttributeValue("cbmaterialvid").equals(cmrl)){ DchangeSlave0VO slave0VO=new DchangeSlave0VO(); slave0VO.setAfternum(afternum); slave0VO.setCbmaterialvid((String) cmrl); slave0VO.setBeforenum(beforenum); list.add(slave0VO); } } } dchangeMasterVO.setDchangeslave0_dchangeslave0(list.toArray(new DchangeSlave0VO[0])); // 查询出来时mrp计划订单放入正计划 和 负计划 // AggregatedPoVO aggregatedPoVO = // SELECT // cmaterialvid, // nassaccponum, // nassaccpraynum //FROM // mm_plo //WHERE // fpotype = '1' // AND vsrccode IN ('55A32025031500426880') // OrgVO orgvo = (OrgVO)hy.queryByPrimaryKey(OrgVO.class, ); List> mrpPlan=getMRPPlan(code); List list1=new ArrayList<>(); for (Map map : mrpPlan) { if(!map.get("cmaterialvid").equals(cmrl)){ continue; } DchangeSlave1VO slave1VO=new DchangeSlave1VO(); slave1VO.setPlannum((UFDouble) map.get("nassaccpraynum")); slave1VO.setCbmaterialvid((String) map.get("cmaterialvid")); slave1VO.setMrpbillcode((String) map.get("vbillcode")); list1.add(slave1VO); } dchangeMasterVO.setDchangeslave1_dchangeslave1(list1.toArray(new DchangeSlave1VO[0])); List list2=new ArrayList<>(); List mrpbillcode=new ArrayList<>(); for (Map map : mrpPlan) { if(!map.get("cmaterialvid").equals(cmrl)){ continue; } DchangeSlave2VO slave1VO=new DchangeSlave2VO(); slave1VO.setPlannum((UFDouble) map.get("nassaccpraynum")); slave1VO.setCbmaterialvid((String) map.get("cmaterialvid")); slave1VO.setMrpbillcode((String) map.get("mrpbillcode")); list2.add(slave1VO); mrpbillcode.add((String) map.get("mrpbillcode")); } dchangeMasterVO.setDchangeslave2_dchangeslave2(list2.toArray(new DchangeSlave2VO[0])); //根据计划订单查询采购订单 List> buyingreq=getbuyingreq(mrpbillcode); List list3=new ArrayList<>(); for (Map map : buyingreq) { if(!map.get("cmaterialvid").equals(cmrl)){ continue; } DchangeSlave3VO slave1VO=new DchangeSlave3VO(); // slave1VO.setNewnum(new UFDouble((Double) map.get("nastnum")).add()); slave1VO.setNewnum(afternum); slave1VO.setPk_material((String) map.get("cmaterialvid")); slave1VO.setParybillcode((String) map.get("mrpbillcode")); list3.add(slave1VO); // mrpbillcode.add((String) map.get("mrpbillcode")); } dchangeMasterVO.setDchangeslave3_dchangeslave3(list3.toArray(new DchangeSlave3VO[0])); Object pk_org = hy.findColValue("org_orgs", "pk_org", "code = '"+headJson.get("pk_org")+"' and nvl(dr,0)=0 and isbusinessunit='Y' "); headJson.put("pk_org", pk_org); DchangeMasterVO headVO = new DchangeMasterVO(); IAttributeMeta[] headAttrs = headVO.getMetaData().getAttributes(); for (IAttributeMeta attribute : headAttrs) { Object value = getValueByAttr(headJson, attribute); headVO.setAttributeValue(attribute.getName(), value); } headVO.setStatus(voStatus); return headVO; } private List> getbuyingreq(List code) throws DAOException { String placeholders = String.join(",", Collections.nCopies(code.size(), "?")); String sql = " SELECT * from po_praybill_b WHERE vsourcecode IN (" + placeholders + ")"; List> remain = (List>) new BaseDAO().executeQuery(sql, new MapListProcessor()); return remain; } // 获取mrp计划订单 private List> getMRPPlan(List codes) throws BusinessException { // 生成与codes数量匹配的占位符(如: ?, ?, ?) String placeholders = String.join(",", Collections.nCopies(codes.size(), "?")); String sql = " \t\tSELECT\n" + "\tcmaterialvid," + " vbillcode,\n" + "\tnassaccponum,\n" + "\tnassaccpraynum\n" + "FROM\n" + "\tmm_plo\n" + "WHERE\n" + "\tfpotype = '1'\n" + " AND vsrccode IN (" + placeholders + ")"; List> remain = (List>) new BaseDAO().executeQuery(sql, new MapListProcessor()); return remain; } private Object getValueByAttr(JSONObject json, IAttributeMeta attribute) { Object value = json.get(attribute.getName()); if (value == null || StringUtils.isEmpty(value.toString())) { return null; } JavaType javaType = attribute.getJavaType(); switch (javaType) { case String: case UFStringEnum: return value.toString(); case BigDecimal: return new BigDecimal(value.toString()); case Integer: case UFFlag: return Integer.valueOf(value.toString()); case UFDouble: return new UFDouble(value.toString()); case UFBoolean: return new UFBoolean(value.toString()); case UFDate: return new UFDate(value.toString()); case UFDateTime: return new UFDateTime(value.toString()); case UFTime: return new UFTime(value.toString()); case UFLiteralDate: return new UFLiteralDate(value.toString()); default: return value; } } private List getRequiredFields(JSONObject obj) { List notNullFields = new ArrayList(); return notNullFields; } private IDchangeMasterVOService getService() { return NCLocator.getInstance().lookup(IDchangeMasterVOService.class); } }