StepWorkServiceImpl.java 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666
  1. package com.uas.eis.serviceImpl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.uas.eis.annotation.ApiLog;
  4. import com.uas.eis.core.support.TokenHandler;
  5. import com.uas.eis.dao.BaseDao;
  6. import com.uas.eis.dao.SqlMap;
  7. import com.uas.eis.dao.SqlRowList;
  8. import com.uas.eis.entity.ErrorMessage;
  9. import com.uas.eis.entity.ErrorMsg;
  10. import com.uas.eis.entity.StepWork.StationReq;
  11. import com.uas.eis.entity.StepWork.TestReq;
  12. import com.uas.eis.exception.ApiStepWorkException;
  13. import com.uas.eis.exception.SystemException;
  14. import com.uas.eis.sdk.entity.ApiResult;
  15. import com.uas.eis.sdk.entity.StepWorkApiResult;
  16. import com.uas.eis.sdk.resp.StepWorkApiResponse;
  17. import com.uas.eis.service.StepWorkService;
  18. import com.uas.eis.utils.*;
  19. import org.aspectj.weaver.ast.Test;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.transaction.annotation.Transactional;
  23. import javax.servlet.http.HttpServletRequest;
  24. import java.util.*;
  25. @Service
  26. public class StepWorkServiceImpl implements StepWorkService {
  27. @Autowired
  28. private BaseDao baseDao;
  29. @Override
  30. public Map<String,Object> login(String username, String password) {
  31. Map<String,Object> map = new HashMap<>();
  32. SqlRowList rs = baseDao.queryForRowSet("select AE_SECRET from APIEMPLOYEE where AE_KEY=?",username);
  33. if(rs.next()){
  34. System.out.println("secret:"+MD5Util.encrypt32Up(rs.getString("ae_secret")));
  35. if(!password.toUpperCase().equals(MD5Util.encrypt32Up(rs.getString("ae_secret")))){
  36. map.put("success","0");
  37. map.put("error","password");
  38. map.put("error_description","密码错误");
  39. return map;
  40. }else{
  41. map.put("token",TokenHandler.createToken(username,rs.getString("ae_secret")));
  42. map.put("success","1");
  43. return map;
  44. }
  45. }else{
  46. map.put("success","0");
  47. map.put("error","username");
  48. map.put("error_description","用户名不存在");
  49. return map;
  50. }
  51. }
  52. /**
  53. * 保存测试信息并且过站
  54. * @param data
  55. * @return
  56. * {
  57. * "workOrderNo":"WO20220826000002SHD", //工单号 必填
  58. * "stationCode":"GW--001", //工位编码 必填
  59. * "routeCode":"22b443b4fa379a546330f4e984cc6ed1", //工序编号 必填
  60. * "sequenceNumber":"[P]2022083426046[B]",//产品SN 必填
  61. * "eventResult":"PASS", 测试结果:PASS(合格),FAIL(不合格) 必填
  62. * failureCode MES不良配置里维护的信息 * 注:PASS可以不用传, 如果是FAIL不良代码就必传 非必填
  63. * extendSequenceNumber 测试合格后会把三方条码和组合体SN组合,后续扫描其中任意条码都可以识别。多个条码中间用逗分隔 非必填
  64. * machineTestData 设备测试数据 非必填 Json可以传产品多次测试记录。results的键值需要和titles的键值对应Titles中的键值不能重复
  65. * isInputSn 是否属于投入产品 非必填 Boolean (true:根据投入SN过站并生成产品数据,false[默认]:从工单中查找是否有过站SN)
  66. * }
  67. *
  68. */
  69. @Override
  70. public StepWorkApiResult<Map<String,Object>> test(HttpServletRequest request ,String data) {
  71. insertLogger(data,"test");
  72. return testmain(request,data);
  73. }
  74. /**
  75. * * {
  76. * * "workOrderNo":"WO20220826000002SHD", //工单号
  77. * * "stationCode":"GW--001", //工位编码
  78. * * "routeCode":"22b443b4fa379a546330f4e984cc6ed1", //工序编号
  79. * * "sequenceNumber":"[P]2022083426046[B]" //产品SN
  80. * * }
  81. * @param data
  82. * @return
  83. */
  84. @Override
  85. public StepWorkApiResult<Map<String,Object>> station(HttpServletRequest request , String data) {
  86. insertLogger(data,"station");
  87. return stationmain(request,data);
  88. }
  89. @Override
  90. public StepWorkApiResult<Map<String,Object>> UploadThruputLog(HttpServletRequest request, String data) {
  91. Map<Object,Object> map = BaseUtil.parseFormStoreToMap(data);
  92. String SN = map.get("sequenceNumber").toString();
  93. String WO = map.get("workOrderNo").toString();
  94. String stationCode = map.get("stationCode").toString();
  95. String routeCode = map.get("routeCode").toString();
  96. String eventResult = map.get("eventResult").toString();
  97. try{
  98. String testName = Objects.toString(baseDao.getFieldDataByCondition("make,prodtestparam","pp_stepname","ma_code = '"+WO+"' AND pp_prodcode = ma_prodcode AND pp_stepcode = '"+routeCode+"'"),"");
  99. if(testName.isEmpty()){
  100. return new StepWorkApiResult(false,500,"工单:"+WO+"未维护测试参数列表");
  101. }
  102. int sdId = baseDao.getSeqId("steptestdata_seq");
  103. Object testDataObj = map.get("TestData");
  104. if (testDataObj instanceof List) {
  105. List<Object> testDataList = (List<Object>) testDataObj;
  106. for (Object item : testDataList) {
  107. if (item instanceof Map) {
  108. Map<Object, Object> testDataMap = (Map<Object, Object>) item;
  109. String testItem = Objects.toString(testDataMap.get("testItem"),"");
  110. String threshold = Objects.toString(testDataMap.get("threshold"),"");
  111. String actualValue = Objects.toString(testDataMap.get("actualValue"),"");
  112. String result = Objects.toString(testDataMap.get("result"),"");
  113. String paramName = Objects.toString(testDataMap.get("paramName"),"");
  114. String duration = Objects.toString(testDataMap.get("duration"),"");
  115. String description = Objects.toString(testDataMap.get("description"),"");
  116. if(!baseDao.checkIf("prodtestparam,make","pp_prodcode=ma_prodcode AND ma_code='"+WO+"' AND pp_stepcode='"+routeCode+"' AND pp_paramname='"+paramName+"'")){
  117. return new StepWorkApiResult(false,500,"工单:"+WO+"测试参数列表,测试项目中参数名称无"+ paramName);
  118. }
  119. String sql = "INSERT INTO steptestdatadet( sdd_id, sdd_detno, sdd_sdid, sdd_sncode, sdd_makecode, " +
  120. "sdd_resultdesc, sdd_testitem, sdd_pmenxdesc, sdd_result, sdd_paramname, " +
  121. "sdd_testtime, sdd_value, sdd_okmin, sdd_okmax) " +
  122. "SELECT steptestdatadet_seq.NEXTVAL, pp_detno, '"+sdId+"', '"+SN+"', ma_code, " +
  123. "'"+description+"', pp_testitem, pp_menxdesc, '"+result+"', pp_paramname, " +
  124. "pp_testtimes, '"+actualValue+"', pp_okmin, pp_okmax " +
  125. "FROM prodtestparam, make WHERE pp_prodcode = ma_prodcode " +
  126. "AND ma_code = '"+WO+"' AND pp_stepcode = '"+routeCode+"' AND pp_paramname = '"+paramName+"'";
  127. baseDao.execute(sql);
  128. }
  129. }
  130. baseDao.execute("INSERT INTO steptestdata(sd_id, sd_sn, sd_makecode, sd_sccode, " +
  131. "sd_stepcode, sd_result, sd_indate, sd_recorddate) " +
  132. "SELECT "+sdId+", '"+SN+"', '"+WO+"', sc_stepcode, " +
  133. "'"+routeCode+"', '"+eventResult+"', sysdate, sysdate FROM source WHERE sc_code = '"+stationCode+"'");
  134. }
  135. List<String> list = baseDao.callProcedureWithOut("CS_CHECKSTEPSNANDMACODE", new Object[]{
  136. WO, stationCode,SN,""
  137. }, new Integer[]{1, 2, 3, 4}, new Integer[]{5, 6, 7});
  138. String msg = Objects.toString(list.get(2),"");
  139. if(!msg.isEmpty()){
  140. return new StepWorkApiResult(false,500,"过站前核对失败:"+msg);
  141. }
  142. stepPassed(WO, stationCode, SN, "", "OK");
  143. }catch (Exception ex){
  144. return new StepWorkApiResult(false,500,"记录失败:" + ex.getMessage());
  145. }
  146. insertLogger(data,"UploadThruputLog");
  147. return new StepWorkApiResult(true,200,"上传MES测试信息成功");
  148. }
  149. /**
  150. *
  151. * @param request
  152. * @param data
  153. * 数据格式
  154. * {
  155. * "DeviceType":"", //必填
  156. * "MacStart":"",
  157. * "MacEnd":"",
  158. * "WholeDeviceCode":"", //必填 表示SN号
  159. * "CameraID":"",
  160. * "ExtCode":"",
  161. * "EncryKey":"",
  162. * "RSANORM":""
  163. * }
  164. * @return
  165. */
  166. @ApiLog(actionType = "产品SN个参校对")
  167. @Transactional
  168. @Override
  169. public StepWorkApiResult<Map<String, Object>> checkProdParam(HttpServletRequest request, String data) {
  170. if (!FlexJsonUtil.isValid(data)) {
  171. return StepWorkApiResponse.failRsp("传参JSON格式非法,请检查是否包含未转义的特殊字符(如反斜杠)");
  172. }
  173. //解析data 获取数据
  174. Map<Object,Object> map = BaseUtil.parseFormStoreToMap(data);
  175. Object sn = map.get("WholeDeviceCode");
  176. if(!StringUtil.hasText(sn)){
  177. return StepWorkApiResponse.failRsp("传参:WholeDeviceCode,异常不能为空!");
  178. }
  179. Object prodcode = map.get("DeviceType");
  180. if(!StringUtil.hasText(prodcode)){
  181. return StepWorkApiResponse.failRsp("传参:DeviceType,异常不能为空!");
  182. }
  183. // 判断产品是否有设置个参字段
  184. String paramCodes = null;
  185. SqlRowList rsParam = baseDao.queryForRowSet(
  186. "select wm_concat(pp_paramcode) as paramcodes " +
  187. " from (select distinct pp_paramcode from product left join prodparam on pr_id=pp_prid " +
  188. " where pr_code=? and pp_id>0 and pp_paramcode is not null)", prodcode);
  189. if (rsParam.next()) {
  190. paramCodes = rsParam.getGeneralString("paramcodes");
  191. }
  192. if (!StringUtil.hasText(paramCodes)) {
  193. return StepWorkApiResponse.failRsp("产品[" + prodcode + "]未配置个参字段,无法校对!");
  194. }
  195. //根据产品编号+sn号,寻找工作中心是组装的工单
  196. String macode = "";
  197. SqlRowList rs = baseDao.queryForRowSet("select ma_code from makeserial left join make on ma_code=ms_makecode where ms_sncode=? and ma_prodcode=? and ma_wccode='103'",sn,prodcode);
  198. if(rs.next()){
  199. macode = rs.getGeneralString("ma_code");
  200. }else{
  201. return StepWorkApiResponse.failRsp("(WholeDeviceCode:"+sn+"和DeviceType:"+prodcode+"),未找到工作中心是组装的工单!");
  202. }
  203. // 解析配置字段列表
  204. Set<String> configFields = new HashSet<>();
  205. for (String field : paramCodes.split(",")) {
  206. configFields.add(field.trim().toUpperCase());
  207. }
  208. // 提取传入参数 key 转大写
  209. Map<String, Object> inputMap = new HashMap<>();
  210. for (Map.Entry<Object, Object> entry : map.entrySet()) {
  211. String key = entry.getKey().toString();
  212. if (!"DEVICETYPE".equalsIgnoreCase(key)) {
  213. inputMap.put(key.toUpperCase(), entry.getValue());
  214. }
  215. }
  216. // 1. 校验字段一致性:传入字段必须在配置列表中,配置字段必须全部传入且非空
  217. Set<String> inputFields = inputMap.keySet();
  218. for (String field : inputFields) {
  219. if (!configFields.contains(field)) {
  220. return StepWorkApiResponse.failRsp("传入个参字段[" + field + "]不在产品个参配置中!");
  221. }
  222. }
  223. for (String field : configFields) {
  224. Object value = inputMap.get(field);
  225. if (value == null || !StringUtil.hasText(value.toString())) {
  226. return StepWorkApiResponse.failRsp("产品个参设置字段[" + field + "]传入值为空,必须提供!");
  227. }
  228. }
  229. // 2. 动态构建查询条件,检查 PRODPARAMDATA 中是否存在一条记录与传入数据完全匹配
  230. StringBuilder sqlWhere = new StringBuilder(" where DeviceType=? and pd_makecode=? ");
  231. List<Object> params = new ArrayList<>();
  232. params.add(prodcode);
  233. params.add(macode);
  234. StringBuilder sqlWhere2 = new StringBuilder(" where DeviceType=? and pd_makecode=? ");
  235. List<Object> params2 = new ArrayList<>();
  236. params2.add(prodcode);
  237. params2.add(macode);
  238. String err ="";
  239. // 将配置的所有字段作为等值条件加入查询
  240. for (String field : configFields) {
  241. Object val = inputMap.get(field);
  242. // 传入值必非空(已校验),直接做等值匹配
  243. sqlWhere.append(" and ").append(field).append("=? ");
  244. params.add(val.toString());
  245. params2.add(val.toString());
  246. Integer pd_id = baseDao.getJdbcTemplate().queryForObject("select max(pd_id) from PRODPARAMDATA "+sqlWhere2 +" and "+field+"=? ",
  247. Integer.class, params2.toArray()); // 根据实际 DAO 调整方法名
  248. if (null == pd_id || pd_id <= 0) {
  249. err += "个参-"+field+":"+val.toString()+",错误不存在!";
  250. }
  251. params2.remove(2);
  252. }
  253. if(!"".equals(err)){
  254. return StepWorkApiResponse.failRsp(err);
  255. }
  256. String sql = "select max(pd_id) from PRODPARAMDATA " + sqlWhere.toString();
  257. Integer pd_id = baseDao.getJdbcTemplate().queryForObject(sql,Integer.class, params.toArray()); // 根据实际 DAO 调整方法名
  258. if (null != pd_id && pd_id > 0) {
  259. baseDao.execute("update PRODPARAMDATA set pd_checkcount=nvl(pd_checkcount,0)+1 where pd_id=?",pd_id);
  260. }else{
  261. return StepWorkApiResponse.failRsp("工单[" + macode + "]+产品["+prodcode+"]中传入数据组合与个参数据不匹配!");
  262. }
  263. // ========== 所有校验通过,写入日志 ==========
  264. long id = baseDao.getSeqId("PRODPARAMCHECKLOGGER_SEQ"); // 请确认序列名
  265. String inman = request.getSession().getAttribute("usercode").toString(); // 从 request 或 session 获取操作人,示例留空
  266. String sqlLog = "insert into prodparamchecklogger(pl_id, pl_indate, pl_inman, pl_sncode, pl_makecode, pl_prodcode) " +
  267. "values(?, sysdate, ?, ?, ?, ?)";
  268. baseDao.execute(sqlLog,id, inman,sn,macode,prodcode);
  269. baseDao.saveClob("prodparamchecklogger", "PL_INDATA",data, "pl_id=" + id);
  270. return new StepWorkApiResult(true,200,"SN:"+sn+",个参校对成功!");
  271. }
  272. /**
  273. * 工单绑定,工序检测
  274. *
  275. */
  276. private Map<String,Object> checkStep(String macode,String sourcecode,String sncode,String usercode,String stepcode ){
  277. Map<String,Object> map = new HashMap<>();
  278. /* String code = baseDao.getJdbcTemplate().queryForObject("select max(sc_code) from source where sc_code=? and sc_stepcode=?",
  279. String.class,sourcecode,stepcode);
  280. if(!StringUtil.hasText(code)){
  281. map.put("success",false);
  282. map.put("msg","工位:"+sourcecode+"+工序:"+stepcode+",在系统岗位资源中不存在!");
  283. return map;
  284. }*/
  285. List<String> list = new ArrayList<String>();
  286. /**
  287. * v_i_macode in varchar2 ,
  288. * v_i_sourcecode in varchar2,
  289. * v_i_sncode in varchar2,
  290. * v_i_usercode in varchar2,
  291. * v_o_macode out varchar2,
  292. * v_o_msid out int,
  293. * v_o_errmsg out varchar2
  294. */
  295. list = baseDao.callProcedureWithOut("CS_CHECKSTEPSNANDMACODE", new Object[]{
  296. macode, stepcode,sncode,usercode
  297. }, new Integer[]{1, 2, 3, 4}, new Integer[]{5, 6, 7});
  298. String msg = list.get(2);
  299. if(StringUtil.hasText(msg)){
  300. map.put("success",false);
  301. map.put("msg",msg);
  302. }else{
  303. map.put("success",true);
  304. map.put("macode",list.get(0));
  305. map.put("msid",list.get(1));
  306. }
  307. return map;
  308. }
  309. private boolean stepPassed(String iMakeCode, String iSourceCode, String iSN, String iUserCode, String iResult) {
  310. String msg = baseDao.callProcedure("CS_SETSTEPRESULT",
  311. iMakeCode,
  312. iSourceCode,
  313. iSN,
  314. iUserCode,
  315. iResult);
  316. if(StringUtil.hasText(msg)){
  317. throw new ApiStepWorkException(new StepWorkApiResult(false,400,msg));
  318. }else{
  319. return true;
  320. }
  321. }
  322. /**
  323. * 保存测试数据并且过站
  324. * @param macode
  325. * @param sccode //工位编号
  326. * @param sncode
  327. * @param isok
  328. * @param failureCode
  329. * @param machineTestData
  330. * "machineTestData":{
  331. * "machineCode":"JT001",
  332. * "titles":{
  333. * "芯片型号":"100",
  334. * "开机电流":"200",
  335. *"线损补偿":"300",
  336. * "输出功率":"400",
  337. * "测试时长":"500",
  338. * "测试结果":"600"},
  339. * "results":[{
  340. * "芯片型号":"XXC5121",
  341. * "开机电流":"9.438",
  342. * "线损补偿":"11.00",
  343. * "输出功率":"11.683",
  344. * "测试时长":"31.37",
  345. * "测试结果":"成功"
  346. * }]}
  347. */
  348. private void saveTestDataAndPassed(String macode, String sccode,String gwcode, String sncode, String isok, String failureCode,
  349. Object isinput,Object machineTestData,Object extendSequenceNumber,String usercode) {
  350. String result = isok;
  351. //保存测试数据
  352. Object machinecode = "";
  353. List<Map<Object,Object>> sqldata = new ArrayList<>();
  354. int mainid = baseDao.getSeqId("STEPTESTMAIN_SEQ");
  355. if(StringUtil.hasText(machineTestData)){
  356. Map<Object, Object> map = null;
  357. if (machineTestData instanceof Map) {
  358. map = (Map<Object, Object>) machineTestData;
  359. }else{
  360. map = BaseUtil.parseFormStoreToMap(machineTestData.toString());
  361. }
  362. if(!map.isEmpty()) {
  363. int detno=1;
  364. machinecode = map.containsKey("machineCode")?map.get("machineCode"):"";
  365. Object titles = map.get("titles");
  366. Object results = map.get("results");
  367. if(StringUtil.hasText(titles) && StringUtil.hasText(results)){
  368. // SD_SN,SD_MAKECODE,SD_MACHINECODE,SD_INDATE,
  369. Map<Object,Object> baseData = new HashMap<>() ;
  370. baseData.put("SD_SN",sncode);
  371. baseData.put("SD_MAKECODE",macode);
  372. baseData.put("SD_MACHINECODE",machinecode);
  373. baseData.put("SD_INDATE",DateUtil.parseDateToString(new Date(), Constant.YMD_HMS));
  374. Map<String,Object> titledata = null;
  375. if (machineTestData instanceof Map) {
  376. titledata = (Map<String, Object>) titles;
  377. }else{
  378. titledata = FlexJsonUtil.fromJson(titles.toString());
  379. }
  380. List<Map<String,Object>> resultdata = null;
  381. if (results instanceof List) {
  382. resultdata = (List<Map<String,Object>>) results;
  383. }else{
  384. resultdata = FlexJsonUtil.fromJsonArray(results.toString(),HashMap.class);
  385. }
  386. for(Map<String,Object> m : resultdata){
  387. Iterator<Map.Entry<String, Object>> iterator = titledata.entrySet().iterator();
  388. baseData.put("SD_DETNO", detno);
  389. detno++;
  390. while (iterator.hasNext()) {
  391. Map.Entry<String, Object> entry = iterator.next();
  392. String key = entry.getKey();
  393. Object value = entry.getValue();
  394. Map<Object,Object> sqlm = new HashMap<>();
  395. sqlm.putAll(baseData);
  396. sqlm.put("SD_CLASS", key);
  397. sqlm.put("SD_LENGTH", value);
  398. sqlm.put("SD_SMID",mainid);
  399. Object v = m.get(key);
  400. sqlm.put("SD_ACTVALUE",v);
  401. sqlm.put("SD_ID",null);
  402. sqldata.add(sqlm);
  403. //测试参数里面有值是失败,则整个结果需要更新成失败
  404. if("结果".equals(key) && !"0".equals(v)){
  405. result = "FAIL";
  406. }
  407. }
  408. }
  409. }
  410. }
  411. }
  412. //测试项和测试结果不一致
  413. /**
  414. * insert into STEPTESTMAIN(SM_ID,SM_SN,SM_MAKECODE,SM_STEPCODE,SM_SCCODE,SM_RESULT,SM_BADCODE,SM_ISINPUT,SM_INDATE)
  415. * insert into STEPTESTDETAIL(SD_ID,SD_SMID,SD_SN,SD_MAKECODE,SD_MACHINECODE,SD_INDATE,SD_CLASS,SD_StandardVALUE,SD_ACTVALUE)
  416. */
  417. //插入数据
  418. String stepcode="",BgCode="";
  419. SqlRowList rs2 = baseDao.queryForRowSet("select st_code,st_badgroupcode from source left join step on sc_stepcode=st_code where sc_code=?",sccode);
  420. if(rs2.next()){
  421. stepcode =rs2.getGeneralString("st_code");
  422. BgCode = rs2.getGeneralString("st_badgroupcode");
  423. }
  424. baseDao.execute("insert into STEPTESTMAIN(SM_ID,SM_SN,SM_TSN,SM_MAKECODE,SM_STEPCODE,SM_SCCODE,SM_RESULT,SM_BADCODE,SM_ISINPUT,SM_INDATE,sm_machineCode,SM_SOURCETYPE,sm_sourceisok,sm_gwcode)" +
  425. "select ?,?,?,?,?,?,?,?,?,sysdate,?,'EIS',?,? from dual ",mainid,sncode,extendSequenceNumber,macode,stepcode,sccode,result,failureCode,isinput,machinecode,isok,gwcode);
  426. if(sqldata.size()>0){
  427. baseDao.execute(SqlUtil.getInsertSqlbyList(sqldata,"STEPTESTDETAIL","SD_ID"));
  428. }
  429. Object msstepcode = baseDao.getFieldDataByCondition("Makeserial", "ms_stepcode", "ms_sncode='" + sncode + "' and ms_makecode='" + macode + "'");
  430. Map<Object, Object> rmap = new HashMap<>();
  431. if ("FAIL".equals(result) && StringUtil.hasText(failureCode)) {
  432. //将历史的不良记录更新状态
  433. baseDao.execute("update makebad set mb_status=-1 where mb_sncode=? and mb_makecode=? and mb_stepcode=? and mb_status=0", sncode, macode);
  434. if("GX0030".equals(stepcode)) { //只是这道工序需要这样
  435. int cn = baseDao.getJdbcTemplate().queryForObject(" select count(1) from MAKEBADCOUNT_USING " +
  436. " where mbc_sncode=? and mbc_stepcode=? and nvl(mbc_status,0)=0", Integer.class, sncode, stepcode);
  437. if (cn == 0) {
  438. //如果当前工序是第一次不良则不过站
  439. baseDao.execute("insert into MAKEBADCOUNT_USING(mbc_id,mbc_sncode,mbc_stepcode,mbc_status,mbc_indate) " +
  440. " values(MAKEBADCOUNT_USING_seq.nextval,?,?,0,sysdate)", sncode, stepcode);
  441. throw new ApiStepWorkException(new StepWorkApiResult(false,400,"上传MES失败,第一次不良!"));
  442. } else {
  443. //多个不良代码是用逗号分割的
  444. String[] badcode = failureCode.split(",");
  445. for (String item : badcode) {
  446. baseDao.execute("insert into makebad(mb_id,mb_makecode,mb_mscode,mb_sncode,mb_inman,mb_indate,mb_stepcode,mb_sourcecode,mb_badcode,mb_badtable,mb_bgcode,mb_soncode,mb_status)" +
  447. " select makebad_seq.nextval,ma_code,ms_code,ms_sncode,'EIS对接',sysdate,?,?,?,'',?,sp_soncode,0 from make left join makeserial on ms_makecode=ma_code left join " +
  448. " stepproduct on sp_mothercode=ma_prodcode and sp_stepcode=ms_nextstepcode where ms_sncode=? and ms_makecode=?", stepcode, sccode, item, BgCode, sncode, macode);
  449. }
  450. //将不良的序列号的状态码设为3
  451. baseDao.execute("update makeserial set ms_status='3' where ms_sncode=? and ms_makecode=?", sncode, macode);
  452. stepPassed(macode, sccode, sncode, usercode, "NG");
  453. }
  454. }else{
  455. //多个不良代码是用逗号分割的
  456. String[] badcode = failureCode.split(",");
  457. for (String item : badcode) {
  458. baseDao.execute("insert into makebad(mb_id,mb_makecode,mb_mscode,mb_sncode,mb_inman,mb_indate,mb_stepcode,mb_sourcecode,mb_badcode,mb_badtable,mb_bgcode,mb_soncode,mb_status)" +
  459. " select makebad_seq.nextval,ma_code,ms_code,ms_sncode,'EIS对接',sysdate,?,?,?,'',?,sp_soncode,0 from make left join makeserial on ms_makecode=ma_code left join " +
  460. " stepproduct on sp_mothercode=ma_prodcode and sp_stepcode=ms_nextstepcode where ms_sncode=? and ms_makecode=?", stepcode, sccode, item, BgCode, sncode, macode);
  461. }
  462. //将不良的序列号的状态码设为3
  463. baseDao.execute("update makeserial set ms_status='3' where ms_sncode=? and ms_makecode=?", sncode, macode);
  464. stepPassed(macode, sccode, sncode, usercode, "NG");
  465. }
  466. } else {
  467. //不良采集为良品是更新
  468. if (msstepcode!=null && msstepcode.toString().equals(stepcode) && result == "PASS") {
  469. Object[] ob = baseDao.getFieldsDataByCondition("makeserial", "ms_status,ms_craftcode,ms_prodcode", "ms_sncode='" + sncode + "' and ms_makecode='" + macode + "'");
  470. if (ob!=null){
  471. String ms_status =ob[0].toString();
  472. String ms_craftcode= ob[1].toString();
  473. String ms_prodcode = ob[2].toString();
  474. if (ms_status == "3") {
  475. String nextstepcode =baseDao.getFieldDataByCondition("craft left join craftdetail on cr_id=cd_crid ", "cd_nextstepcode", "cr_code='" + ms_craftcode + "' and cr_prodcode='" + ms_prodcode + "' and cd_stepcode='" + stepcode + "'").toString();
  476. baseDao.updateByCondition("makeserial", "ms_status=1,ms_nextstepcode='" + nextstepcode + "'", "ms_sncode='" + sncode + "' and ms_makecode='" + macode + "'");
  477. baseDao.updateByCondition("makebad", "mb_status=-1", "mb_sncode='" + sncode + "' and mb_makecode='" + macode + "'");
  478. baseDao.updateByCondition("MAKEBADCOUNT_USING","mbc_status=-1","mbc_sncode='"+sncode+"' and mbc_stepcode='"+stepcode+"' and nvl(mbc_status,0)=0");
  479. }
  480. }
  481. }
  482. baseDao.updateByCondition("MAKEBADCOUNT_USING","mbc_status=-1","mbc_sncode='"+sncode+"' and mbc_stepcode='"+stepcode+"' and nvl(mbc_status,0)=0");
  483. //转号:CS_SNCHANGEANDBURN,两个号一样不需要转号,实际就是返修工单m不需要转号
  484. if (StringUtil.hasText(extendSequenceNumber) && !sncode.equals(extendSequenceNumber) && "PASS".equals(result)) {
  485. snChange(macode, sccode, sncode, extendSequenceNumber.toString(), usercode);
  486. } else {
  487. stepPassed(macode, sccode, sncode, usercode, "PASS".equals(result) ? "OK" : "NG");
  488. }
  489. }
  490. }
  491. //记录日志
  492. private void insertLogger(String data,String type){
  493. baseDao.execute("insert into EISDATA(ed_id,ed_data,ed_indate,ED_TYPE)" +
  494. "values(EISDATA_seq.nextval,?,sysdate,?)", data,type);
  495. }
  496. @Transactional
  497. public StepWorkApiResult<Map<String,Object>> testmain(HttpServletRequest request,String data){
  498. Map<Object,Object> map = BaseUtil.parseFormStoreToMap(data);
  499. String macode = " ";
  500. if(StringUtil.hasText(map.get("workOrderNo"))){//工单号可填写可不填
  501. macode = map.get("workOrderNo").toString();
  502. }
  503. Object sccode = map.get("stationCode");
  504. if(!StringUtil.hasText(sccode)){
  505. return StepWorkApiResponse.failRsp(400,"工位编码(stationCode)不能为空!");
  506. }
  507. Object stepcode = map.get("routeCode");
  508. if(!StringUtil.hasText(stepcode)){
  509. return StepWorkApiResponse.failRsp(400,"工序编号(routeCode)不能为空!");
  510. }
  511. Object sncode = map.get("sequenceNumber");
  512. if(!StringUtil.hasText(sncode)){
  513. return StepWorkApiResponse.failRsp(400,"产品SN(sequenceNumber)不能为空!");
  514. }
  515. //测试结果
  516. Object isok = map.get("eventResult"); //测试结果:PASS(合格),FAIL(不合格) 必填 ,测试强制合格有的时候也会有不良代码
  517. Object failureCode =map.get("failureCode");
  518. if(!StringUtil.hasText(isok)){
  519. return StepWorkApiResponse.failRsp(400,"测试结果(eventResult)不能为空!");
  520. }else{
  521. if(!"PASS".equals(isok) && !"FAIL".equals(isok)){
  522. return StepWorkApiResponse.failRsp(400,"测试结果值【"+isok+"】,只能是PASS或者FAIL!");
  523. }
  524. if("FAIL".equals(isok) && !StringUtil.hasText(failureCode)){
  525. return StepWorkApiResponse.failRsp(400,"测试结果为不合格,不良代码(failureCode)值必填!");
  526. }
  527. }
  528. /*if(StringUtil.hasText(failureCode)) {
  529. String bccode = baseDao.getJdbcTemplate().queryForObject("select max(bc_code) from badcode where bc_code=?", String.class, failureCode);//oErrMessage = "不良代码"+BadCode[i]+"不存在";
  530. if (null == bccode) {
  531. throw new ApiStepWorkException(new StepWorkApiResult(false, 400, "测试不良代码:" + failureCode + "在MES系统不存在!"));
  532. }
  533. }*/
  534. String usercode = String.valueOf(request.getSession().getAttribute("usercode"));
  535. //工序校验
  536. Map<String,Object> remap = checkStep(macode,sccode.toString(),sncode.toString(),usercode,stepcode.toString());
  537. if(Boolean.valueOf(remap.get("success").toString())){
  538. //指定返修:2025120011,不需要校验,如果有转号 map.get("extendSequenceNumber"),限制转号跟原来的要不一样,判断前6位
  539. //增加并且结果是良品的时候才需要校验
  540. if(!"2025120011".equals(remap.get("macode").toString()) && StringUtil.hasText(map.get("extendSequenceNumber"))
  541. && (sncode.equals(map.get("extendSequenceNumber"))
  542. || (sncode.toString().length()>6 && map.get("extendSequenceNumber").toString().length()>6
  543. && sncode.toString().startsWith(map.get("extendSequenceNumber").toString().substring(0, Math.min(map.get("extendSequenceNumber").toString().length(),6))))
  544. )
  545. && "PASS".equals(isok)
  546. ){
  547. return StepWorkApiResponse.failRsp(400,"转号(extendSequenceNumber)【"+map.get("extendSequenceNumber")+"】" +
  548. " 和产品序列号(sequenceNumber)【"+sncode+"】不能一样!");
  549. }
  550. //工序保存测试数据并且过站
  551. //刚采集过当前工序,不允许再次采集
  552. String mscode = baseDao.getJdbcTemplate().queryForObject("select wm_concat(ms_sncode) from source left join makeserial on ms_stepcode=sc_stepcode where ms_id=? and sc_code=? and nvl(ms_nextstepcode,' ')<>' ' and ms_status=1",String.class,remap.get("msid"),stepcode.toString());
  553. if(StringUtil.hasText(mscode)){
  554. return StepWorkApiResponse.successRsp(400, "【" + sncode + "】序列号工序【"+stepcode+"】已经过站,请勿重复过站!");
  555. }
  556. saveTestDataAndPassed(remap.get("macode").toString(),stepcode.toString(),sccode.toString(),sncode.toString(),
  557. isok.toString(),failureCode.toString(),map.get("isinput"),map.get("machineTestData"),
  558. map.get("extendSequenceNumber"),usercode);
  559. return StepWorkApiResponse.successRsp(200,"【"+sncode+"】产品序列号过站成功!");
  560. }else{
  561. return StepWorkApiResponse.failRsp(400,remap.get("msg").toString());
  562. }
  563. }
  564. @Transactional
  565. public StepWorkApiResult<Map<String,Object>> stationmain(HttpServletRequest request ,String data) {
  566. Map<Object, Object> map = BaseUtil.parseFormStoreToMap(data);
  567. String macode = " ";
  568. if (StringUtil.hasText(map.get("workOrderNo"))) {//工单号可填写可不填
  569. macode = map.get("workOrderNo").toString();
  570. }
  571. Object sccode = map.get("stationCode");
  572. if (!StringUtil.hasText(sccode)) {
  573. return StepWorkApiResponse.failRsp(400, "工位编码(stationCode)不能为空!");
  574. }
  575. Object stepcode = map.get("routeCode");
  576. if (!StringUtil.hasText(stepcode)) {
  577. return StepWorkApiResponse.failRsp(400, "工序编号(routeCode)不能为空!");
  578. }
  579. Object sncode = map.get("sequenceNumber");
  580. if (!StringUtil.hasText(sncode)) {
  581. return StepWorkApiResponse.failRsp(400, "产品SN(sequenceNumber)不能为空!");
  582. }
  583. String usercode = String.valueOf(request.getSession().getAttribute("usercode"));
  584. Map<String, Object> remap = checkStep(macode, sccode.toString(), sncode.toString(), usercode,stepcode.toString());
  585. if (Boolean.valueOf(remap.get("success").toString())) {
  586. //刚采集过当前工序,不允许再次采集
  587. String mscode = baseDao.getJdbcTemplate().queryForObject("select wm_concat(ms_sncode) from source left join makeserial on ms_stepcode=sc_stepcode where ms_id=? and sc_code=?",String.class,remap.get("msid"),stepcode.toString());
  588. if(StringUtil.hasText(mscode)){
  589. return StepWorkApiResponse.successRsp(400, "【" + sncode + "】序列号工序【"+stepcode+"】已经过站,请勿重复过站!");
  590. }
  591. stepPassed(remap.get("macode").toString(), stepcode.toString(), sncode.toString(), usercode, "OK");
  592. return StepWorkApiResponse.successRsp(200, "【" + sncode + "】产品序列号过站成功!");
  593. } else {
  594. return StepWorkApiResponse.failRsp(400, remap.get("msg").toString());
  595. }
  596. }
  597. private boolean snChange(String iMakeCode, String iSourceCode, String tsn,String iSN, String iUserCode) {
  598. //v_i_ifrechange in number default 0,-- 标识是否重复转号 0否,1是
  599. String msg = baseDao.callProcedure("CS_SNCHANGEANDBURN",
  600. tsn,iSN,iSourceCode,iUserCode,iMakeCode,0,
  601. null,null,null,null,null,
  602. iSN,null,null,null,null,null,null,null,null
  603. );
  604. if(StringUtil.hasText(msg)){
  605. throw new ApiStepWorkException(new StepWorkApiResult(false,400,msg));
  606. }else{
  607. return true;
  608. }
  609. }
  610. /* SqlRowList rs=baseDao.queryForRowSet("select nvl(st_ifinput,0)st_ifinput,nvl(st_ifoqc,0)st_ifoqc,nvl(st_ifweigh,0)st_ifweigh from "+Master+".source left join "+Master+".step on sc_stepcode=st_code where sc_code='"+iResCode+"'");
  611. if(rs.next()){
  612. String st_ifinput=rs.getString("st_ifinput");
  613. String st_ifoqc=rs.getString("st_ifinput");
  614. String st_ifweigh=rs.getString("st_ifweigh");
  615. if(st_ifinput.equals("-1")){
  616. oErrMessage = "上料工序必须在客户端进行过站";
  617. rmap.put("oErrMessage",oErrMessage);
  618. return rmap;
  619. }
  620. if(st_ifoqc.equals("-1")){
  621. oErrMessage = "OQC必须在客户端进行过站";
  622. rmap.put("oErrMessage",oErrMessage);
  623. return rmap;
  624. }
  625. if(st_ifweigh.equals("-1")){
  626. oErrMessage = "称重工序必须在客户端进行过站";
  627. rmap.put("oErrMessage",oErrMessage);
  628. return rmap;
  629. }
  630. }*/
  631. }