1. 程式人生 > >用友NC63 醫藥行業 消耗彙總 出庫單批次模糊查詢

用友NC63 醫藥行業 消耗彙總 出庫單批次模糊查詢

背景: v6醫藥行業 消耗彙總  參照 銷售出庫單  彈出的查詢對話方塊裡的 產品批號  條件原本是參照格式,根據vfree6 自有輔助屬性6 linked 得到的 。

           客戶不滿意該處,需要找物料才能進行查詢,要求只需要輸入一個模糊的 批號的值, 就可以查詢該批號的出庫單。 

   修改後程式碼如下:liljb編輯。 

package nc.ui.ic.m50.action;

import java.util.ArrayList;
import java.util.List;

import nc.bs.framework.common.NCLocator;
import nc.itf.ic.vmirule.IVmiRuleService;
import nc.itf.uap.IUAPQueryBS;
import nc.pubitf.rbac.IFunctionPermissionPubService;
import nc.ui.ic.m50.model.VmiSumModelService;
import nc.ui.ic.m50.query.VmiSumQueryCondProcessor;
import nc.ui.ic.m50.view.ICVmiSumDialog;
import nc.ui.pubapp.uif2app.query2.QueryConditionDLGDelegator;
import nc.ui.pubapp.uif2app.query2.action.DefaultQueryAction;
import nc.ui.pubapp.uif2app.query2.model.ModelDataManager;
import nc.ui.querytemplate.querytree.FromWhereSQL;
import nc.ui.querytemplate.querytree.FromWhereSQLImpl;
import nc.ui.querytemplate.querytree.IQueryScheme;
import nc.ui.scmpub.action.SCMActionInitializer;
import nc.vo.ic.m50.entity.VmiSumGenerateParam;
import nc.vo.ic.m50.entity.VmiSumQueryParam;
import nc.vo.ic.pub.define.ICPubMetaNameConst;
import nc.vo.ic.pub.util.CollectionUtils;
import nc.vo.ic.pub.util.ValueCheckUtil;
import nc.vo.ic.vmirule.entity.VmiRuleHeadVO;
import nc.vo.ic.vmirule.entity.VmiRuleVO;
import nc.vo.org.OrgVO;
import nc.vo.pub.BusinessException;
import nc.vo.pubapp.AppContext;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.pub.PubAppTool;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
import nc.vo.pubapp.query2.sql.process.QuerySchemeProcessor;
import nc.vo.scmpub.res.SCMActionCode;

/**
 * 消耗彙總查詢Action;此動作查詢出庫單進行消耗彙總
 */
public class VmiSumOutBillAction extends DefaultQueryAction {

  private static final long serialVersionUID = 2010090423320001L;

  /**
   * 顯示生成消耗彙總單查詢結果的對話方塊,即顯示出庫單VO和銷售發票VO的對話方塊
   */
  private ICVmiSumDialog icVmiSumDialog;

  private VmiSumQueryCondProcessor vmiSumQueryCondProcessor = null;

  public VmiSumOutBillAction() {
    SCMActionInitializer.initializeAction(this, SCMActionCode.IC_VMISUMOUTBILL);
  }

  public ICVmiSumDialog getIcVmiSumDialog() {
    if (this.icVmiSumDialog == null) {
      this.icVmiSumDialog =
          new ICVmiSumDialog(this.getModel().getContext().getEntranceUI());
      this.icVmiSumDialog.initQueryDialog(this, this.icVmiSumDialog);
    }
    return this.icVmiSumDialog;
  }

  public VmiSumGenerateParam getVmiSumGenerateParam() {
    return this.getCondProcessor().getVmiSumGenerateParam();
  }

  public VmiSumQueryParam getVmiSumQueryParam() {
    return this.getCondProcessor().getVmiSumQueryParam();
  }

  public void setIcVmiSumDialog(ICVmiSumDialog dialog) {
    this.icVmiSumDialog = dialog;
  }

  private void constructParams(QueryConditionDLGDelegator delegator) {
    // 獲取Sql串時,不需要生成真正的Sql串,而是生成一個查詢條件物件vmiSumQueryParam
    FromWhereSQL querySQL =
        delegator.getQueryConditionDLG().getTableJoinFromWhereSQL();
    String fromPart = querySQL.getFrom();
    String wherePart = querySQL.getWhere();
    if (!PubAppTool.isNull(fromPart)) {
      fromPart = fromPart.replace(" ic_flow", " flow");
    }
    if (!PubAppTool.isNull(wherePart)) {
      wherePart = wherePart.replace("ic_flow.", "flow.");
    }
    this.getCondProcessor()
        .fillVmiSumQueryParam(delegator, fromPart, wherePart);
    this.getCondProcessor().fillVmiSumGenerateParam(delegator);
  }

  private VmiSumQueryCondProcessor getCondProcessor() {
    if (this.vmiSumQueryCondProcessor == null) {
      this.vmiSumQueryCondProcessor = new VmiSumQueryCondProcessor();
    }
    return this.vmiSumQueryCondProcessor;
  }

  private String[] getFuncPermissionOrg(OrgVO[] orgVOs) {
    if (orgVOs == null) {
      return null;
    }
    String[] pk_orgs = new String[orgVOs.length];
    for (int i = 0; i < pk_orgs.length; i++) {
      pk_orgs[i] = orgVOs[i].getPk_org();
    }
    return pk_orgs;
  }

  /**
   * 許可權校驗
   * 
   * @param cvmiruleid
   */
  private void validatePower(String cvmiruleid) {
    VmiRuleVO[] ruleVO = null;
    try {
      SqlBuilder sqlpart = new SqlBuilder();
      sqlpart.append(
          VmiRuleHeadVO.TABLE_NAME + "." + VmiRuleHeadVO.CVMIRULEHID,
          cvmiruleid);
      ruleVO =
          NCLocator.getInstance().lookup(IVmiRuleService.class)
              .query(sqlpart.toString());
    }
    catch (BusinessException e) {
      ExceptionUtils.wrappException(e);
      return;
    }
    final String funcode = "40082802";
    String cuserid = AppContext.getInstance().getPkUser();
    String pkGroup = AppContext.getInstance().getPkGroup();
    List<String> orgList = new ArrayList<String>();
    try {
      OrgVO[] orgVOs =
          NCLocator.getInstance().lookup(IFunctionPermissionPubService.class)
              .getUserPermissionOrg(cuserid, funcode, pkGroup);
      String[] orgs = this.getFuncPermissionOrg(orgVOs);
      CollectionUtils.addArrayToList(orgList, orgs);
    }
    catch (BusinessException e) {
      ExceptionUtils.wrappException(e);
    }
    if (ValueCheckUtil.isNullORZeroLength(ruleVO)) {
      ExceptionUtils
          .wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes()
              .getStrByID("4008015_0", "04008015-0011")/*@res "請檢查消耗彙總規則是否已經被刪除"*/);
      return;
    }
    for (VmiRuleVO rule : ruleVO) {
      if (!orgList.contains(rule.getParentVO().getAttributeValue(
          VmiRuleHeadVO.PK_ORG))) {
        ExceptionUtils
            .wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes()
                .getStrByID("4008015_0", "04008015-0012")/*@res "當前使用者沒有彙總規則定義中財務組織的資料許可權"*/);
        return;
      }
    }
  }

  @Override
  protected void executeQuery(IQueryScheme queryScheme) {
    QueryConditionDLGDelegator delegator = this.getQryDLGDelegator();
    this.constructParams(delegator);
    // 注:通過引數傳過來的sqlWhere沒有用,生成消耗彙總單不需要這個引數
    // 因為
    // 1. 查詢引數已經包裝成vmiSumQueryParam,需要傳到後臺進行復雜的sql邏輯處理
    // 2. 生成消耗彙總單的引數已經包裝成vmiSumGenerateParam,需要傳到後臺進行消耗彙總
    VmiSumQueryParam vmiSumQueryParam = this.getVmiSumQueryParam();
//    String sqlold=queryScheme.getTableJoinFromWhereSQL();
    String old=queryScheme.getTableJoinFromWhereSQL().getWhere().toString(); //liljb add
    String new1="";//liljb add
    FromWhereSQLImpl newFrom= (FromWhereSQLImpl) queryScheme.getTableJoinFromWhereSQL();//liljb add
    //增加下面的if 判斷 如果有vfree7 的sql  進行替換處理 liljb 
    if(old.contains("AND ic_flow.vfree7 = '")){
    	old.length();
    	int indexofnext = old.indexOf("AND ic_flow.vfree7 = '");
    	String old2=old.substring(indexofnext+22, old.length());
    	int indexofnext2=old2.indexOf("'");
    	int len=indexofnext+22+indexofnext2;
    	String old3=old.substring(indexofnext, len+1);
      new1=	old.substring(indexofnext+22, indexofnext+22+indexofnext2);
    System.out.println(new1);
    String sqlmid="AND ic_flow.vfree6 IN (  SELECT mlot.pk_lotno FROM med_lotno_148  mlot where mlot.vlotno like '%"+new1+"%'  AND nvl(mlot.dr,0)=0 ) ";
  String old4=  old.replace(old3, sqlmid);
  newFrom.setWhere(old4);
    }
    //return FromWhereSQL 介面
    queryScheme.getTableJoinFromWhereSQL();
//    vmiSumQueryParam.setFromWhereSQL(queryScheme.getTableJoinFromWhereSQL()); OLD liljb 消耗彙總出庫單查詢替換vfree6為7
    vmiSumQueryParam.setFromWhereSQL(newFrom);//liljb  替換上行程式碼 
    QuerySchemeProcessor proc = new QuerySchemeProcessor(queryScheme);
    String[] dbilldate =
        proc.getQueryCondition(ICPubMetaNameConst.DBILLDATE).getValues();
    vmiSumQueryParam.setDbilldate(dbilldate);
    this.validatePower(vmiSumQueryParam.getCvmirulehid());
    ModelDataManager dataManager = (ModelDataManager) super.getDataManager();

    VmiSumModelService service =
        (VmiSumModelService) dataManager.getQryService();
    try {
      this.getIcVmiSumDialog().setViewData(
          service.generateVmiSumQuery(vmiSumQueryParam));
      this.getIcVmiSumDialog().setVmiSumGenerateParam(
          this.getVmiSumGenerateParam());
      this.getIcVmiSumDialog().showModal();
    }
    catch (Exception e) {
      ExceptionUtils.wrappException(e);
    }
  }

  /**
   * 生成消耗彙總單彙總條件提示資訊
   */
  @Override
  protected void showQueryInfo() {
    //
  }

}