diff --git a/pu/src/client/nccloud/web/pu/arrivalqc/action/QualityCheckAction.java b/pu/src/client/nccloud/web/pu/arrivalqc/action/QualityCheckAction.java new file mode 100644 index 00000000..f879791c --- /dev/null +++ b/pu/src/client/nccloud/web/pu/arrivalqc/action/QualityCheckAction.java @@ -0,0 +1,477 @@ +package nccloud.web.pu.arrivalqc.action; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import nc.bs.dao.BaseDAO; +import nc.bs.dao.DAOException; +import nc.bs.framework.common.NCLocator; +import nc.bs.logging.Log; +import nc.bs.trade.business.HYPubBO; +import nc.bs.uapbd.util.MyHelper; +import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; +import nc.itf.bd.supplier.baseinfo.ISupplierBaseInfoQryService; +import nc.itf.pu.m23.qc.IArriveForQC; +import nc.pubitf.pu.m23.pubquery.IArrivePubQuery; +import nc.pubitf.qc.c001.pu.ReturnObjectFor23; +import nc.vo.am.common.util.StringUtils; +import nc.vo.bd.material.MaterialVO; +import nc.vo.bd.material.measdoc.MeasdocVO; +import nc.vo.bd.psn.PsndocVO; +import nc.vo.bd.supplier.SupplierVersionVO; +import nc.vo.org.OrgVO; +import nc.vo.pu.m23.entity.ArriveHeaderVO; +import nc.vo.pu.m23.entity.ArriveItemVO; +import nc.vo.pu.m23.entity.ArriveVO; +import nc.vo.pu.m23.entity.ArriveViewVO; +import nc.vo.pu.pub.util.AggVOUtil; +import nc.vo.pub.BusinessException; +import nc.vo.pub.lang.UFDouble; +import nc.vo.pubapp.pattern.model.entity.view.AbstractDataView; +import nc.vo.pubapp.pattern.model.tool.BillComposite; +import nc.vo.qc.c003.entity.ReportHeaderVO; +import nc.vo.qc.c003.entity.ReportItemVO; +import nc.vo.qc.pub.enumeration.StrictLevelEnum; +import nc.vo.sm.UserVO; +import nccloud.baseapp.core.log.NCCForUAPLogger; +import nccloud.commons.lang.ArrayUtils; +import nccloud.dto.pu.puinvoice.entity.DataInfo; +import nccloud.framework.core.exception.ExceptionUtils; +import nccloud.framework.core.json.IJson; +import nccloud.framework.service.ServiceLocator; +import nccloud.framework.web.action.itf.ICommonAction; +import nccloud.framework.web.container.IRequest; +import nccloud.framework.web.json.JsonFactory; +import nccloud.framework.web.processor.template.GridConvertProcessor; +import nccloud.pubitf.pu.arrival.service.IArrivalQueryService; +import nccloud.web.pu.arrivalqc.entity.QualityCheckInfo; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + + +/** + * @description 检验 + * @author ligangt + * @date 2018年8月28日 下午1:43:35 + * @version ncc1.0 + */ +public class QualityCheckAction implements ICommonAction { + private static final String LOG_INFO_NAME = "qyMesLog"; + private static final Log logger = Log.getInstance(LOG_INFO_NAME); + private static final String reqUrl = "/IF_QyErpApi.ashx?action=addsjd"; + private Map configParams; + @Override + public Object doAction(IRequest request) { + try { + // 获取前台json + IJson json = JsonFactory.create(); + QualityCheckInfo info = json.fromJson(request.read(), + QualityCheckInfo.class); + + ArriveViewVO[] views = null; + if (info.isQcEnable()) { + DataInfo[] idTs = info.getIdTs(); + views = queryViewVOs(idTs); + } else { + GridConvertProcessor processor = new GridConvertProcessor(); + views = processor.fromGrid(info.getGrid()); + } + + if (views != null && views.length > 0) { + // IPubUtilService pubService = ServiceLocator + // .find(IPubUtilService.class); + // if (pubService.isOrgQcEnable(info.getPk_org())) { + // 非紧急放行入库数量>0,即根据质检入库 + // ArriveItemVO item = views[0].getBVO(); + // if + // (MathTool.compareTo(MathTool.sub(item.getNaccumstorenum(), + // item.getNaccumletgoinnum()), UFDouble.ZERO_DBL) > 0) { + // //ExceptionUtils.wrapBusinessException("紧急放行数量大于入库数量"); + // return false; + // } + // } + ArriveVO[] vos = this.getArriveVOs(views); + for (ArriveVO vo : vos) { + ArriveItemVO[] bvos = vo.getBVO(); + for (ArriveItemVO bvo : bvos) { + UFDouble nchecknum = bvo.getNchecknum(); + UFDouble nwillelignum = bvo.getNwillelignum(); + if (nchecknum != null && nwillelignum != null) { + if (nchecknum.compareTo(UFDouble.ZERO_DBL) < 0 + || nwillelignum.compareTo(UFDouble.ZERO_DBL) < 0) { + ExceptionUtils.wrapBusinessException( + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4004100_0", "04004100-0010")/* + * @res "报检数量和合格主数量不允许为负数" + */); + } + } + UFDouble naccumchecknum = bvo.getNaccumchecknum(); + if (naccumchecknum != null) { + if (naccumchecknum.compareTo(bvo.getNnum()) == 0) { + UFDouble naccumstorenum = bvo.getNaccumstorenum(); + if (naccumstorenum != null + && naccumstorenum.compareTo(UFDouble.ZERO_DBL) > 0) { +// ExceptionUtils.wrapBusinessException( +// nc.vo.ml.NCLangRes4VoTransl.getNCLangRes() +// .getStrByID("4004100_0", "04004100-0012") +// /* @res "第" */ + bvo.getCrowno() +// + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes() +// .getStrByID("4004100_0", +// "04004100-0307")/* @res 04004100-0062 "行已经完全入库,不能生成报检单" +// NCC-362748 修改后:行已经生成过报检单且正在检验中,不允许复检!*/); + ExceptionUtils.wrapBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008015_0", + "04008015-0077"+"\n", null, new String[] { + bvo.getCrowno() + })); + /* @res 04004100-0062 "行已经完全入库,不能生成报检单" + NCC-362748 修改后:第{0}行已经生成过报检单且正在检验中,不允许复检!*/ + + + } + } + } + } + } + ArriveVO[] returnVos = this.check(vos, info.isCheck()); + if (null == returnVos) { + ExceptionUtils.wrapBusinessException( + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4004100_0", + "04004100-0011")/* @res "到货单检验失败!" */); + } + List validArriveList = new ArrayList<>(); + + configParams = MyHelper.getConfigParams("xb-config", null); + if (configParams.isEmpty()) { + throw new BusinessException("箱变的QMS接口缺少配置"); + } + for (ArriveVO arriveVO : returnVos) { + ArriveItemVO[] bvos = arriveVO.getBVO(); + boolean needSkip = false; // 标记是否需要跳过当前ArriveVO + + // 检查当前到货单的所有明细,只要有一个明细的vbdef23为Y/y,就跳过整个到货单 + if (bvos != null && bvos.length > 0) { + for (ArriveItemVO itemVO : bvos) { + // 获取vbdef23字段值,处理null情况 + String vbdef32 = (String) itemVO.getAttributeValue("vbdef32"); + if (vbdef32 != null && "Y".equalsIgnoreCase(vbdef32)) { + needSkip = true; + break; // 只要有一个明细符合,直接跳出明细循环 + } + } + } + + // 不需要跳过的,加入有效列表 + if (!needSkip) { + validArriveList.add(arriveVO); + } + } + buildSyncData(returnVos); + ServiceLocator.find(IArriveForQC.class).pushWmsByArriveVOs(vos); + // 把后台返回的轻量级聚合VO转换为视图VO + // new ClientBillCombinServer().combine(vos, + // returnVos); + // ArriveViewVO[] newViews = ArrivePublicUtil + // .convertAggToViewVO(vos); + // grid = processor.convert(info.getGrid().getPageid(), + // newViews); + + // String[] successIds = this.getSuccessBIDs(returnVos); + // return successIds; + } + } catch (Exception e) { + ExceptionUtils.wrapException(e); + } + return null; + } + + private ArriveViewVO[] queryViewVOs(DataInfo[] idTs) { + List bids = new ArrayList(); + Map idTsIndex = new HashMap(); + for (DataInfo item : idTs) { + bids.add(item.getId()); + idTsIndex.put(item.getId(), item.getTs()); + } + + IArrivalQueryService qryService = ServiceLocator + .find(IArrivalQueryService.class); + ArriveViewVO[] viewvos = qryService + .queryViewByBIDs(bids.toArray(new String[0])); + // 重设ts + for (ArriveViewVO viewvo : viewvos) { + viewvo.setAttributeValue("ts", + idTsIndex.get(viewvo.getPk_arriveorder_b())); + } + + return viewvos; + } + + // private String[] getSuccessBIDs(ArriveVO[] returnVos) { + // List bid_l = new ArrayList(); + // for (ArriveVO arrivevo : returnVos) { + // ArriveItemVO[] itemvos = arrivevo.getBVO(); + // for (ArriveItemVO item : itemvos) { + // bid_l.add(item.getPk_arriveorder_b()); + // } + // } + // return bid_l.toArray(new String[0]); + // } + + private ArriveVO[] getArriveVOs(ArriveViewVO[] views) { + List headers = new ArrayList(); + List items = new ArrayList(); + for (AbstractDataView view : views) { + headers.add((ArriveHeaderVO) view.getVO(ArriveHeaderVO.class)); + items.add((ArriveItemVO) view.getVO(ArriveItemVO.class)); + } + + BillComposite bc = new BillComposite(ArriveVO.class); + ArriveVO tempVO = new ArriveVO(); + bc.append(tempVO.getMetaData().getParent(), + headers.toArray(new ArriveHeaderVO[headers.size()])); + bc.append(tempVO.getMetaData().getVOMeta(ArriveItemVO.class), + items.toArray(new ArriveItemVO[items.size()])); + return bc.composite(); + } + + /** + * 调用后台接口进行检验 + * + * @param vos + * 到货单vo + * @param isCheck + * @return 检验结果数组 + * @throws Exception + */ + private ArriveVO[] check(ArriveVO[] vos, boolean isCheck) throws Exception { + Object[] objs = ServiceLocator.find(IArriveForQC.class).qualityCheck(vos, + isCheck); + ArriveVO[] result = (ArriveVO[]) objs[0]; + ReturnObjectFor23 rof = (ReturnObjectFor23) objs[1]; + // 得到质检模块的提示信息 + if (rof != null) { + Map strictMap = rof.getCsourcebid_strictlevel(); + Set keySet = strictMap.keySet(); + IArrivePubQuery arriveQuery = ServiceLocator.find(IArrivePubQuery.class); + ArriveItemVO[] items = arriveQuery + .queryItemVOByBids(keySet.toArray(new String[keySet.size()])); + + String[] bpks = AggVOUtil.getPrimaryKeys(items); + if (strictMap.size() > 0) { + for (Map.Entry entry : strictMap.entrySet()) { + String itempk = entry.getKey(); + int dji = entry.getValue().intValue(); + if (StrictLevelEnum.FREE.getReturnType() == dji) { + int i = Arrays.binarySearch(bpks, itempk); + items[i].getCrowno(); + ExceptionUtils.wrapBusinessException( + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes() + .getStrByID("4004100_0", "04004100-0012")/* @res "第" */ + + items[i].getCrowno() + + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4004100_0", + "04004100-0013")/* + * @res "行为质检连续批的严格程度为免检,不需要生成报检单!" + */); + } else if (StrictLevelEnum.PAUSE.getReturnType() == dji) { + int i = Arrays.binarySearch(bpks, itempk); + items[i].getCrowno(); + ExceptionUtils.wrapBusinessException( + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes() + .getStrByID("4004100_0", "04004100-0012")/* @res "第" */ + + items[i].getCrowno() + + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID( + "4004100_0", + "04004100-0014")/* + * @res "行为质检连续批的严格程度为暂停, 不能生成报检单!" + */);/* + * 第 { 0 } 行为质检连续批的严格程度为暂停 , + * 不能生成报检单 ! + */ + } + } + } + } + if (!ArrayUtils.isEmpty(result)) { + return result; + } + return null; + } + + + + + /** + * 构建同步数据 + * + * @param arriveVOS 到货单VO + */ + private void buildSyncData(ArriveVO[] arriveVOS) throws BusinessException { + List update =new ArrayList<>(); + for (ArriveVO arriveVO : arriveVOS) { + ArriveHeaderVO hvo = arriveVO.getHVO(); + ArriveItemVO[] bvo = arriveVO.getBVO(); + String pk_arriveorder = hvo.getPk_arriveorder(); + String pkOrg = hvo.getPk_org(); + // 判断物料的业务单元是否是箱变公司,不是则跳过 + String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); + if (checkIfOrg(orgCode, configParams)) { + continue; + } + // 查询供应商信息 + String pk_supplier_v = hvo.getPk_supplier_v(); + SupplierVersionVO supplierVersionVO = new SupplierVersionVO(); + if (pk_supplier_v != null && !pk_supplier_v.isEmpty() && !"~".equals(pk_supplier_v)) { + ISupplierBaseInfoQryService baseQryService = NCLocator.getInstance().lookup(ISupplierBaseInfoQryService.class); + supplierVersionVO = baseQryService.querySupplierVersionByVID(pk_supplier_v); + } + // 制单人名称 + String creatorName = MyHelper.getStrValByCondition("sm_user", UserVO.USER_NAME, + UserVO.CUSERID + " = '" + hvo.getBillmaker() + "'"); + JSONObject singleObj = new JSONObject(); + // 采购合同号 + String cghth = getCghthVal(hvo, bvo); + // 启源送检单主表 + long cts = System.currentTimeMillis(); + singleObj.put("batchid", cts); + singleObj.put("csdh", hvo.getVbillcode());// 送检单号,BIP到货单号 + singleObj.put("sjrq", hvo.getDmakedate().toString());// 送检日期,格式建议为 yyyy-MM-dd + singleObj.put("wlgysid", supplierVersionVO.getCode());// 供应商编码 + singleObj.put("wlgysmc", supplierVersionVO.getName());// 供应商名称 + singleObj.put("sjr", creatorName);// 送检人,BIP制单人 + singleObj.put("cghth", cghth);// 采购合同号,关联对应的采购合同 + singleObj.put("bz", hvo.getVmemo());// 摘要备注,用于填写送检单的补充说明信息 + // 查询关联的质检报告-传入启源送检单的明细 + HYPubBO hybo = new HYPubBO(); + ReportItemVO[] reportItemVOS = (ReportItemVO[]) hybo.queryByCondition(ReportItemVO.class, " cfirstid = '" + pk_arriveorder + "'"); + JSONArray contentArray = new JSONArray(); + for (ReportItemVO reportItemVO : reportItemVOS) { + String pkReportbill = reportItemVO.getPk_reportbill(); + ReportHeaderVO reportHeaderVO = (ReportHeaderVO) hybo.queryByPrimaryKey(ReportHeaderVO.class, pkReportbill); + String pkMaterial = reportHeaderVO.getPk_material(); + Map materialMap = MyHelper.getMapValByCondition(MaterialVO.getDefaultTableName(), "code,name,materialspec,materialtype", + "pk_material = '" + pkMaterial + "'"); + String cunitid = reportHeaderVO.getCunitid();// 主单位 + String cunitname = MyHelper.getStrValByCondition(MeasdocVO.getDefaultTableName(), MeasdocVO.NAME, + MeasdocVO.PK_MEASDOC + " = '" + cunitid + "'"); + JSONObject itemObj = new JSONObject(); + itemObj.put("wlbh", materialMap.getOrDefault("code", "")); // 物料编码 + itemObj.put("wlmc", materialMap.getOrDefault("name", "")); // 物料名称 + String materialtype = skipNull(materialMap.get("materialtype")); + String materialspec = skipNull(materialMap.get("materialspec")); + itemObj.put("wlxhgg", materialtype + materialspec); // 物料型号规格 + itemObj.put("sjsl", reportHeaderVO.getNapplynum().toString()); // 送检数量(设计单位),按设计计量单位统计的送检数量 + itemObj.put("jldw", cunitname); // 计量单位 + itemObj.put("bz", getBz(bvo,reportItemVO.getCfirstbid())); // 明细备注,用于填写该送检物料的补充说明 + itemObj.put("bipzyid", pkReportbill); // 质检报告ID + itemObj.put("bipqdid", reportItemVO.getPk_reportbill_b()); // 质检报告明细ID + contentArray.add(itemObj); + } + singleObj.put("Content", contentArray); + pushData(singleObj); + update.add(hvo.getPk_arriveorder()); + updateArrveOrder(hvo.getPk_arriveorder()); + } + + } + private Object getBz(ArriveItemVO[] bvo, String cfirstbid) { + for (ArriveItemVO arriveItemVO : bvo) { + if(arriveItemVO.getPk_arriveorder_b().equals(cfirstbid)) { + return arriveItemVO.getVmemob(); + } + } + return null; + } + + private void updateArrveOrder(String pkArriveorder) throws DAOException { + BaseDAO dao = new BaseDAO(); + String sql = "update po_arriveorder_b set vbdef32='Y' where pk_arriveorder='" + + pkArriveorder + "'"; + dao.executeUpdate(sql); + } + + private String getCghthVal(ArriveHeaderVO hvo, ArriveItemVO[] bvo) throws BusinessException { + String cghth = ""; + String pkPupsndoc = hvo.getPk_pupsndoc(); + // 查询采购员名称 + String name = ""; + if (pkPupsndoc != null && !pkPupsndoc.isEmpty() && !"~".equals(pkPupsndoc)) { + name = MyHelper.getStrValByCondition(PsndocVO.getDefaultTableName(), PsndocVO.NAME, + PsndocVO.PK_PSNDOC + " = '" + pkPupsndoc + "'"); + } + if (bvo != null && bvo.length > 0) { + StringBuilder cghthBuilder = new StringBuilder(); + for (int i = 0; i < bvo.length; i++) { + String vsourcecode = bvo[i].getVsourcecode(); + if (vsourcecode == null || vsourcecode.isEmpty() || "~".equals(vsourcecode)) { + continue; + } + if (i > 0) { + cghthBuilder.append(","); + } + cghthBuilder.append(vsourcecode); + if (!name.isEmpty()) { + cghthBuilder.append(name); + } + } + cghth = cghthBuilder.toString(); + } + return cghth; + } + + /** + * 推送同步数据 + */ + private void pushData(JSONObject param) throws BusinessException { + // String jsonString = param.toJSONString(); + // 转json字符串的时候保留null值 + String jsonStr = JSON.toJSONString(param, + SerializerFeature.WriteMapNullValue, + SerializerFeature.WriteNullStringAsEmpty + ); + logger.error("QMS-QC-param = " + jsonStr); + NCCForUAPLogger.debug("QMS-QC-param = " + jsonStr); + String baseUrl = configParams.get("qmsBaseUrl"); + String requestUrl = baseUrl + reqUrl; + logger.error("QMS-QC-url = " + requestUrl); + // String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr); + // NCCForUAPLogger.debug("QMS-QC-result = " + result); + // JSONObject resultObj = JSONObject.parseObject(result); + // logger.error("QMS-QC-res = " + result); + // + // if (!"true".equals(resultObj.getString("success"))) { + // logger.error("QMS-QC-error,result[" + resultObj.toJSONString() + "]"); + // throw new BusinessException("QMS-QC-error:" + resultObj.getString("message")); + // } + } + + private boolean checkIfOrg(String code, Map configParams) throws BusinessException { + String targetCode = configParams.get("xbqcOrg"); + if (targetCode == null || StringUtils.isEmpty(targetCode)) { + throw new BusinessException("未配置组织参数"); + } + if (targetCode.contains("qc-")) { + targetCode = targetCode.replace("qc-", ""); + } + String[] orgItem = targetCode.split(","); + for (String orgCode : orgItem) { + if (!orgCode.isEmpty() && orgCode.equals(code)) { + return false; + } + } + return true; + } + + public String skipNull(Object value) { + if ((value == null) || (value.toString().trim().length() == 0)) { + return ""; + } + return value.toString().trim(); + } +} \ No newline at end of file