|
|
@@ -223,6 +223,9 @@ public class MESHelperServiceImpl implements MESHelperService {
|
|
|
case CancelCollection:
|
|
|
remap = CancelCollection(json,AE_MASTER);
|
|
|
break;
|
|
|
+ case KeyFreeze:
|
|
|
+ remap = KeyFreeze(json,AE_MASTER);
|
|
|
+ break;
|
|
|
default:
|
|
|
err = -1;
|
|
|
break;
|
|
|
@@ -900,6 +903,185 @@ public class MESHelperServiceImpl implements MESHelperService {
|
|
|
return rmap;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 重置站点并冻结Key
|
|
|
+ * 对应客户端 Special_ResetKeyFreeze.ReSN
|
|
|
+ * 与ReSetSN(纯重置站点)的区别:除重置站点外,还会解冻该SN占用的Key(置为主动冻结,状态-2),
|
|
|
+ * 把SN置为未激活(ms_isactive=0)并清空ms_keyid,同时作废MACRELEASE发放记录。
|
|
|
+ * <p>
|
|
|
+ * Key发放表按客户区分:华硕固定取makeimeilist(mil_*),其它客户取Key_Release.kr_key指定的表(mk_*)。
|
|
|
+ * 该SN在Key表里没有记录时跳过解冻(说明本来就没占用Key),不影响站点重置。
|
|
|
+ */
|
|
|
+ private Map<Object,Object> KeyFreeze(JSONObject map,String Master){
|
|
|
+ Map<Object, Object> rmap = new HashMap<Object, Object>();
|
|
|
+ String oErrMessage=null;
|
|
|
+
|
|
|
+ if(map.get("iSN")==null){
|
|
|
+ rmap.put("oErrMessage","SN不能为空");
|
|
|
+ return rmap;
|
|
|
+ }
|
|
|
+ String iSN=map.get("iSN").toString();
|
|
|
+
|
|
|
+ //回流工序,替代客户端cd_stepcode.Text
|
|
|
+ if(map.get("iStepCode")==null){
|
|
|
+ rmap.put("oErrMessage","回流工序不能为空");
|
|
|
+ return rmap;
|
|
|
+ }
|
|
|
+ String iStepCode=map.get("iStepCode").toString();
|
|
|
+
|
|
|
+ //客户,可传Key_Release的kr_custcode或kr_custname,替代客户端cu_code
|
|
|
+ if(map.get("iCustCode")==null){
|
|
|
+ rmap.put("oErrMessage","客户不能为空");
|
|
|
+ return rmap;
|
|
|
+ }
|
|
|
+ String iCustCode=map.get("iCustCode").toString();
|
|
|
+
|
|
|
+ //操作人,对应客户端User.UserCode
|
|
|
+ String iUserCode=map.get("iUserCode")==null?"":map.get("iUserCode").toString();
|
|
|
+ //岗位资源,对应客户端User.UserSourceCode
|
|
|
+ String iSourceCode=map.get("iSourceCode")==null?"":map.get("iSourceCode").toString();
|
|
|
+ //备注,对应客户端Remark文本框(客户端用于拼接到操作日志结果中)
|
|
|
+ String iRemark=map.get("iRemark")==null?"":map.get("iRemark").toString();
|
|
|
+
|
|
|
+ //客户对应的Key发放表:华硕固定makeimeilist,其它客户取Key_Release.kr_key
|
|
|
+ String custName="";
|
|
|
+ String keyTable="";
|
|
|
+ SqlRowList rsKey=baseDao.queryForRowSet("select kr_custcode,kr_custname,kr_key from "+Master+".Key_Release " +
|
|
|
+ "where kr_custcode='"+iCustCode+"' or kr_custname='"+iCustCode+"'");
|
|
|
+ if(rsKey.next()){
|
|
|
+ custName=rsKey.getString("kr_custname")==null?"":rsKey.getString("kr_custname");
|
|
|
+ keyTable=rsKey.getString("kr_key")==null?"":rsKey.getString("kr_key");
|
|
|
+ }
|
|
|
+ boolean isAsus="华硕".equals(custName);
|
|
|
+ if(isAsus){
|
|
|
+ keyTable="makeimeilist";
|
|
|
+ }
|
|
|
+ if("".equals(keyTable)){
|
|
|
+ rmap.put("oErrMessage","客户"+iCustCode+"未配置Key发放表(Key_Release.kr_key)");
|
|
|
+ return rmap;
|
|
|
+ }
|
|
|
+
|
|
|
+ //取该SN最新一条记录,校验是否允许冻结
|
|
|
+ SqlRowList rs=baseDao.queryForRowSet("select ms_id,ms_makecode,ms_status,ms_paststep,ms_outboxcode," +
|
|
|
+ "nvl(ms_isactive,0)ms_isactive,nvl(ms_qccheck,0)ms_qccheck,nvl(ms_ifqccheck,0)ms_ifqccheck," +
|
|
|
+ "nvl(ms_outstatus,0)ms_outstatus,nvl(pr_ifrepaircheck,0)pr_ifrepaircheck " +
|
|
|
+ "from "+Master+".makeserial left join "+Master+".product on pr_code=ms_prodcode " +
|
|
|
+ "where ms_sncode='"+iSN+"' order by ms_id desc");
|
|
|
+ String ms_id="";
|
|
|
+ String ms_makecode="";
|
|
|
+ if(!rs.next()){
|
|
|
+ rmap.put("oErrMessage","序列号"+iSN+"不存在");
|
|
|
+ return rmap;
|
|
|
+ }
|
|
|
+ ms_id=rs.getString("ms_id");
|
|
|
+ ms_makecode=rs.getString("ms_makecode");
|
|
|
+ String ms_paststep=rs.getString("ms_paststep")==null?"":rs.getString("ms_paststep");
|
|
|
+ //只能回流到已执行工序
|
|
|
+ if(!ms_paststep.contains(iStepCode)){
|
|
|
+ rmap.put("oErrMessage","序列号"+iSN+"不允许回流到未执行工序");
|
|
|
+ return rmap;
|
|
|
+ }
|
|
|
+ //已出货不允许回流
|
|
|
+ if("-1".equals(rs.getString("ms_outstatus"))){
|
|
|
+ rmap.put("oErrMessage","序列号"+iSN+"已出货不允许回流");
|
|
|
+ return rmap;
|
|
|
+ }
|
|
|
+ //抽检状态不允许重置站点
|
|
|
+ if(("-1".equals(rs.getString("ms_qccheck")) && "-1".equals(rs.getString("pr_ifrepaircheck")))
|
|
|
+ || "-1".equals(rs.getString("ms_ifqccheck"))){
|
|
|
+ rmap.put("oErrMessage","序列号"+iSN+"处于抽检状态,不允许重置站点");
|
|
|
+ return rmap;
|
|
|
+ }
|
|
|
+
|
|
|
+ //取回流工序在工艺路线中的执行顺序,用于判断用料表需要拆解的项次
|
|
|
+ Object stepno=baseDao.getFieldDataByCondition(Master+".craft left join "+Master+".craftdetail on cr_id=cd_crid",
|
|
|
+ "cd_stepno","cr_code=(select ms_craftcode from "+Master+".makeserial where ms_id='"+ms_id+"') " +
|
|
|
+ "and cr_prodcode=(select ms_prodcode from "+Master+".makeserial where ms_id='"+ms_id+"') " +
|
|
|
+ "and cd_stepcode='"+iStepCode+"'");
|
|
|
+ String cd_stepno=stepno==null?"":stepno.toString();
|
|
|
+ if("".equals(cd_stepno)){
|
|
|
+ rmap.put("oErrMessage","工序"+iStepCode+"不在该SN的工艺路线中");
|
|
|
+ return rmap;
|
|
|
+ }
|
|
|
+
|
|
|
+ //工序名称,用于返回与记录操作日志
|
|
|
+ Object stname=baseDao.getFieldDataByCondition(Master+".step","st_name","st_code='"+iStepCode+"'");
|
|
|
+ String st_name=stname==null?"":stname.toString();
|
|
|
+
|
|
|
+ //取该SN占用的Key记录
|
|
|
+ String keyIdCol=isAsus?"mil_id":"mk_id";
|
|
|
+ String keySnCol=isAsus?"mil_sncode":"mk_sncode";
|
|
|
+ String keyNetCol=isAsus?"mil_netcode":"MK_DPK";
|
|
|
+ String keyId="";
|
|
|
+ String keyNet="";
|
|
|
+ SqlRowList rsKeySn=baseDao.queryForRowSet("select "+keyIdCol+" keyid,"+keyNetCol+" keynet from "+Master+"."+keyTable+
|
|
|
+ " where "+keySnCol+"='"+iSN+"' order by "+keyIdCol+" desc");
|
|
|
+ if(rsKeySn.next()){
|
|
|
+ keyId=rsKeySn.getString("keyid")==null?"":rsKeySn.getString("keyid");
|
|
|
+ keyNet=rsKeySn.getString("keynet")==null?"":rsKeySn.getString("keynet");
|
|
|
+ }
|
|
|
+
|
|
|
+ StringBuffer sql=new StringBuffer();
|
|
|
+ List<String> sqls=new ArrayList<String>();
|
|
|
+ //解冻该SN占用的Key
|
|
|
+ if(!"".equals(keyId)){
|
|
|
+ sql.setLength(0);
|
|
|
+ if(isAsus){
|
|
|
+ sql.append("update "+Master+".makeimeilist set mil_sncode='',mil_status=-2,MIL_REMARK='主动冻结' where mil_id='"+keyId+"'");
|
|
|
+ }else{
|
|
|
+ sql.append("update "+Master+"."+keyTable+" set mk_sncode='',MK_STATUS=-2,mk_remark='主动冻结' where mk_id='"+keyId+"'");
|
|
|
+ }
|
|
|
+ sqls.add(sql.toString());
|
|
|
+ }
|
|
|
+ //重置makeserial:置为未激活并清空Key,ms_paststep截断到回流工序之前
|
|
|
+ sql.setLength(0);
|
|
|
+ sql.append("update "+Master+".makeserial set ms_status=1,ms_isactive=0,ms_outboxcode='',ms_keyid='',ms_printcount=0,ms_stepcode='',ms_nextstepcode='"+iStepCode+"',");
|
|
|
+ sql.append("ms_paststep=case when instr(ms_paststep,'"+iStepCode+"')>0 then substr(ms_paststep,0,instr(ms_paststep,'"+iStepCode+"')-2) else ms_paststep end ");
|
|
|
+ sql.append("where ms_sncode='"+iSN+"' and ms_makecode='"+ms_makecode+"'");
|
|
|
+ sqls.add(sql.toString());
|
|
|
+ //当前工序回退到ms_paststep里的最后一道工序
|
|
|
+ sql.setLength(0);
|
|
|
+ sql.append("update "+Master+".makeserial set ms_currentstep=REGEXP_SUBSTR(ms_paststep,'[^,]+$') ");
|
|
|
+ sql.append("where ms_sncode='"+iSN+"' and ms_makecode='"+ms_makecode+"'");
|
|
|
+ sqls.add(sql.toString());
|
|
|
+ //清空SN与Key的绑定
|
|
|
+ sql.setLength(0);
|
|
|
+ sql.append("update "+Master+".sninfo set si_keyid='' where si_sn='"+iSN+"'");
|
|
|
+ sqls.add(sql.toString());
|
|
|
+ //删除未处理的不良记录
|
|
|
+ sql.setLength(0);
|
|
|
+ sql.append("delete "+Master+".makebad where mb_sncode='"+iSN+"' and mb_makecode='"+ms_makecode+"' and mb_status=0");
|
|
|
+ sqls.add(sql.toString());
|
|
|
+ //删除标签打印记录
|
|
|
+ sql.setLength(0);
|
|
|
+ sql.append("delete "+Master+".labelprintlog where lpl_value='"+iSN+"'");
|
|
|
+ sqls.add(sql.toString());
|
|
|
+ //作废该SN的发放记录
|
|
|
+ sql.setLength(0);
|
|
|
+ sql.append("update "+Master+".MACRELEASE set MR_STATUS=-1 where mr_sncode='"+iSN+"'");
|
|
|
+ sqls.add(sql.toString());
|
|
|
+ //拆解用料表,回流工序及之后已上料的明细置为拆解状态
|
|
|
+ sql.setLength(0);
|
|
|
+ sql.append("update "+Master+".craftmaterial set cm_status=-1,cm_lastdeco=-1,cm_dropman='"+iUserCode+"',");
|
|
|
+ sql.append("cm_dropdate=sysdate,CM_REMARK='重置站点拆解',cm_dropstep='"+iStepCode+"',");
|
|
|
+ sql.append("cm_dropsccode='"+iSourceCode+"' where cm_sncode='"+iSN+"' and cm_makecode='"+ms_makecode+"' ");
|
|
|
+ sql.append("and cm_stepcode in (select cd_stepcode from "+Master+".craftdetail left join "+Master+".step on st_code=cd_stepcode " +
|
|
|
+ "left join "+Master+".craft on cd_crid=cr_id where ST_STATUSCODE='AUDITED' " +
|
|
|
+ "and cr_code=(select ms_craftcode from "+Master+".makeserial where ms_id='"+ms_id+"') " +
|
|
|
+ "and cr_prodcode=(select ms_prodcode from "+Master+".makeserial where ms_id='"+ms_id+"') " +
|
|
|
+ "and cd_stepno>="+cd_stepno+")");
|
|
|
+ sqls.add(sql.toString());
|
|
|
+ //同一次提交内完成Key解冻与站点重置,避免中途失败导致数据不一致
|
|
|
+ baseDao.execute(sqls);
|
|
|
+
|
|
|
+ rmap.put("oErrMessage",null);
|
|
|
+ rmap.put("oStepName",st_name);
|
|
|
+ rmap.put("oMakeCode",ms_makecode);
|
|
|
+ rmap.put("oKeyNet",keyNet);
|
|
|
+ rmap.put("oRemark",iRemark);
|
|
|
+ return rmap;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 取消采集:解除SN与当前工单的绑定,回退过站数量、上料、号段及各种绑定记录
|
|
|
* 对应客户端 Special_CancelCollection.Confirm_Click
|