Browse Source

添加重置站点接口

callm 1 day ago
parent
commit
b379658982

+ 2 - 1
src/main/java/com/uas/eis/entity/HelperType.java

@@ -58,7 +58,8 @@ public enum HelperType {
     GetMakeInfo("GetMakeInfo","获取工单相关参数"),
     ReSetSN("ReSetSN","重置SN到第一个工站"),
     GetMakeMaterial("GetMakeMaterial","获取用料表"),
-    CancelCollection("CancelCollection","取消采集"); //取消采集
+    CancelCollection("CancelCollection","取消采集") ,//取消采集
+    KeyFreeze("KeyFreeze","重置站点并冻结Key"); //重置站点并冻结Key(解冻该SN占用的Key)
 
     private String code;
     private String name;

+ 182 - 0
src/main/java/com/uas/eis/serviceImpl/MESHelperServiceImpl.java

@@ -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