StepWorkServiceImpl.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. package com.uas.eis.serviceImpl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.uas.eis.core.support.TokenHandler;
  4. import com.uas.eis.dao.BaseDao;
  5. import com.uas.eis.dao.SqlMap;
  6. import com.uas.eis.dao.SqlRowList;
  7. import com.uas.eis.entity.ErrorMessage;
  8. import com.uas.eis.entity.ErrorMsg;
  9. import com.uas.eis.entity.StepWork.StationReq;
  10. import com.uas.eis.entity.StepWork.TestReq;
  11. import com.uas.eis.exception.ApiStepWorkException;
  12. import com.uas.eis.exception.SystemException;
  13. import com.uas.eis.sdk.entity.ApiResult;
  14. import com.uas.eis.sdk.entity.StepWorkApiResult;
  15. import com.uas.eis.sdk.resp.StepWorkApiResponse;
  16. import com.uas.eis.service.StepWorkService;
  17. import com.uas.eis.utils.*;
  18. import org.aspectj.weaver.ast.Test;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import javax.servlet.http.HttpServletRequest;
  23. import java.util.*;
  24. @Service
  25. public class StepWorkServiceImpl implements StepWorkService {
  26. @Autowired
  27. private BaseDao baseDao;
  28. @Override
  29. public String login(String username, String password) {
  30. SqlRowList rs = baseDao.queryForRowSet("select AE_SECRET from APIEMPLOYEE where AE_KEY=?",username);
  31. if(rs.next()){
  32. System.out.println("secret:"+MD5Util.encrypt32Up(rs.getString("ae_secret")));
  33. if(!password.equals(MD5Util.encrypt32Up(rs.getString("ae_secret")))){
  34. throw new ApiStepWorkException(new StepWorkApiResult(ErrorMessage.ACCESSSECRET_ERROR));
  35. }else{
  36. return TokenHandler.createToken(username,rs.getString("ae_secret"));
  37. }
  38. }else{
  39. throw new ApiStepWorkException(new StepWorkApiResult(ErrorMessage.ACCESSKEY_ERROR));
  40. }
  41. }
  42. /**
  43. * 保存测试信息并且过站
  44. * @param data
  45. * @return
  46. * {
  47. * "workOrderNo":"WO20220826000002SHD", //工单号 必填
  48. * "stationCode":"GW--001", //工位编码 必填
  49. * "routeCode":"22b443b4fa379a546330f4e984cc6ed1", //工序编号 必填
  50. * "sequenceNumber":"[P]2022083426046[B]",//产品SN 必填
  51. * "eventResult":"PASS", 测试结果:PASS(合格),FAIL(不合格) 必填
  52. * failureCode MES不良配置里维护的信息 * 注:PASS可以不用传, 如果是FAIL不良代码就必传 非必填
  53. * extendSequenceNumber 测试合格后会把三方条码和组合体SN组合,后续扫描其中任意条码都可以识别。多个条码中间用逗分隔 非必填
  54. * machineTestData 设备测试数据 非必填 Json可以传产品多次测试记录。results的键值需要和titles的键值对应Titles中的键值不能重复
  55. * isInputSn 是否属于投入产品 非必填 Boolean (true:根据投入SN过站并生成产品数据,false[默认]:从工单中查找是否有过站SN)
  56. * }
  57. *
  58. */
  59. @Override
  60. public StepWorkApiResult<Map<String,Object>> test(HttpServletRequest request ,String data) {
  61. insertLogger(data,"test");
  62. return testmain(request,data);
  63. }
  64. /**
  65. * * {
  66. * * "workOrderNo":"WO20220826000002SHD", //工单号
  67. * * "stationCode":"GW--001", //工位编码
  68. * * "routeCode":"22b443b4fa379a546330f4e984cc6ed1", //工序编号
  69. * * "sequenceNumber":"[P]2022083426046[B]" //产品SN
  70. * * }
  71. * @param data
  72. * @return
  73. */
  74. @Override
  75. public StepWorkApiResult<Map<String,Object>> station(HttpServletRequest request , String data) {
  76. insertLogger(data,"station");
  77. return stationmain(request,data);
  78. }
  79. /**
  80. * 工单绑定,工序检测
  81. *
  82. */
  83. private Map<String,Object> checkStep(String macode,String sourcecode,String sncode,String usercode,String stepcode ){
  84. Map<String,Object> map = new HashMap<>();
  85. /* String code = baseDao.getJdbcTemplate().queryForObject("select max(sc_code) from source where sc_code=? and sc_stepcode=?",
  86. String.class,sourcecode,stepcode);
  87. if(!StringUtil.hasText(code)){
  88. map.put("success",false);
  89. map.put("msg","工位:"+sourcecode+"+工序:"+stepcode+",在系统岗位资源中不存在!");
  90. return map;
  91. }*/
  92. List<String> list = new ArrayList<String>();
  93. /**
  94. * v_i_macode in varchar2 ,
  95. * v_i_sourcecode in varchar2,
  96. * v_i_sncode in varchar2,
  97. * v_i_usercode in varchar2,
  98. * v_o_macode out varchar2,
  99. * v_o_msid out int,
  100. * v_o_errmsg out varchar2
  101. */
  102. list = baseDao.callProcedureWithOut("CS_CHECKSTEPSNANDMACODE", new Object[]{
  103. macode, stepcode,sncode,usercode
  104. }, new Integer[]{1, 2, 3, 4}, new Integer[]{5, 6, 7});
  105. String msg = list.get(2);
  106. if(StringUtil.hasText(msg)){
  107. map.put("success",false);
  108. map.put("msg",msg);
  109. }else{
  110. map.put("success",true);
  111. map.put("macode",list.get(0));
  112. map.put("msid",list.get(1));
  113. }
  114. return map;
  115. }
  116. private boolean stepPassed(String iMakeCode, String iSourceCode, String iSN, String iUserCode, String iResult) {
  117. String msg = baseDao.callProcedure("CS_SETSTEPRESULT",
  118. iMakeCode,
  119. iSourceCode,
  120. iSN,
  121. iUserCode,
  122. iResult);
  123. if(StringUtil.hasText(msg)){
  124. throw new ApiStepWorkException(new StepWorkApiResult(false,400,msg));
  125. }else{
  126. return true;
  127. }
  128. }
  129. /**
  130. * 保存测试数据并且过站
  131. * @param macode
  132. * @param sccode //工位编号
  133. * @param sncode
  134. * @param isok
  135. * @param failureCode
  136. * @param machineTestData
  137. * "machineTestData":{
  138. * "machineCode":"JT001",
  139. * "titles":{
  140. * "芯片型号":"100",
  141. * "开机电流":"200",
  142. *"线损补偿":"300",
  143. * "输出功率":"400",
  144. * "测试时长":"500",
  145. * "测试结果":"600"},
  146. * "results":[{
  147. * "芯片型号":"XXC5121",
  148. * "开机电流":"9.438",
  149. * "线损补偿":"11.00",
  150. * "输出功率":"11.683",
  151. * "测试时长":"31.37",
  152. * "测试结果":"成功"
  153. * }]}
  154. */
  155. private void saveTestDataAndPassed(String macode, String stepcode,String sccode, String sncode, String isok, String failureCode,
  156. Object isinput,Object machineTestData,Object extendSequenceNumber,String usercode) {
  157. //保存测试数据
  158. Object machinecode = "";
  159. List<Map<Object,Object>> sqldata = new ArrayList<>();
  160. int mainid = baseDao.getSeqId("STEPTESTMAIN_SEQ");
  161. if(StringUtil.hasText(machineTestData)){
  162. Map<Object, Object> map = null;
  163. if (machineTestData instanceof Map) {
  164. map = (Map<Object, Object>) machineTestData;
  165. }else{
  166. map = BaseUtil.parseFormStoreToMap(machineTestData.toString());
  167. }
  168. if(!map.isEmpty()) {
  169. int detno=1;
  170. machinecode = map.containsKey("machineCode")?map.get("machineCode"):"";
  171. Object titles = map.get("titles");
  172. Object results = map.get("results");
  173. if(StringUtil.hasText(titles) && StringUtil.hasText(results)){
  174. // SD_SN,SD_MAKECODE,SD_MACHINECODE,SD_INDATE,
  175. Map<Object,Object> baseData = new HashMap<>() ;
  176. baseData.put("SD_SN",sncode);
  177. baseData.put("SD_MAKECODE",macode);
  178. baseData.put("SD_MACHINECODE",machinecode);
  179. baseData.put("SD_INDATE",DateUtil.parseDateToString(new Date(), Constant.YMD_HMS));
  180. Map<String,Object> titledata = null;
  181. if (machineTestData instanceof Map) {
  182. titledata = (Map<String, Object>) titles;
  183. }else{
  184. titledata = FlexJsonUtil.fromJson(titles.toString());
  185. }
  186. List<Map<String,Object>> resultdata = null;
  187. if (results instanceof List) {
  188. resultdata = (List<Map<String,Object>>) results;
  189. }else{
  190. resultdata = FlexJsonUtil.fromJsonArray(results.toString(),HashMap.class);
  191. }
  192. for(Map<String,Object> m : resultdata){
  193. Iterator<Map.Entry<String, Object>> iterator = titledata.entrySet().iterator();
  194. baseData.put("SD_DETNO", detno);
  195. detno++;
  196. while (iterator.hasNext()) {
  197. Map.Entry<String, Object> entry = iterator.next();
  198. String key = entry.getKey();
  199. Object value = entry.getValue();
  200. Map<Object,Object> sqlm = new HashMap<>();
  201. sqlm.putAll(baseData);
  202. sqlm.put("SD_CLASS", key);
  203. sqlm.put("SD_LENGTH", value);
  204. sqlm.put("SD_SMID",mainid);
  205. Object v = m.get(key);
  206. sqlm.put("SD_ACTVALUE",v);
  207. sqlm.put("SD_ID",null);
  208. sqldata.add(sqlm);
  209. }
  210. }
  211. }
  212. }
  213. }
  214. //测试项和测试结果不一致
  215. /**
  216. * insert into STEPTESTMAIN(SM_ID,SM_SN,SM_MAKECODE,SM_STEPCODE,SM_SCCODE,SM_RESULT,SM_BADCODE,SM_ISINPUT,SM_INDATE)
  217. * insert into STEPTESTDETAIL(SD_ID,SD_SMID,SD_SN,SD_MAKECODE,SD_MACHINECODE,SD_INDATE,SD_CLASS,SD_StandardVALUE,SD_ACTVALUE)
  218. */
  219. //插入数据
  220. 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)" +
  221. "select ?,?,?,?,?,?,?,?,?,sysdate,?,'EIS' from dual ",mainid,sncode,extendSequenceNumber,macode,stepcode,sccode,isok,failureCode,isinput,machinecode);
  222. if(sqldata.size()>0){
  223. baseDao.execute(SqlUtil.getInsertSqlbyList(sqldata,"STEPTESTDETAIL","SD_ID"));
  224. }
  225. Object msstepcode = baseDao.getFieldDataByCondition("Makeserial", "ms_stepcode", "ms_sncode='" + sncode + "' and ms_makecode='" + macode + "'");
  226. Object BgCode = baseDao.getFieldDataByCondition("step", "nvl(st_badgroupcode,' ')", "st_code='" + stepcode + "'");
  227. Map<Object, Object> rmap = new HashMap<>();
  228. if("FAIL".equals(isok)){
  229. //将历史的不良记录更新状态
  230. baseDao.execute("update makebad set mb_status=-1 where mb_sncode=? and mb_makecode=? and mb_stepcode=? and mb_status=0",sncode,macode);
  231. 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)" +
  232. " 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 " +
  233. " stepproduct on sp_mothercode=ma_prodcode and sp_stepcode=ms_nextstepcode where ms_sncode=? and ms_makecode=?",stepcode,sccode,failureCode,BgCode,sncode,macode);
  234. //将不良的序列号的状态码设为3
  235. //baseDao.execute("update "+Master+".makeserial set ms_status='3' where ms_sncode='" + iSN + "' and ms_makecode='" + iMakeCode + "'");
  236. }else if("PASS".equals(isok) && StringUtil.hasText(failureCode)){ //强制良品也有不良代码的
  237. 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)" +
  238. " select makebad_seq.nextval,ma_code,ms_code,ms_sncode,'EIS对接',sysdate,?,?,?,'',?,sp_soncode,-1 from make left join makeserial on ms_makecode=ma_code left join " +
  239. " stepproduct on sp_mothercode=ma_prodcode and sp_stepcode=ms_nextstepcode where ms_sncode=? and ms_makecode=?",stepcode,sccode,failureCode,BgCode,sncode,macode);
  240. }
  241. //不良采集为良品是更新 ,不支持更新
  242. /*if (msstepcode!=null && msstepcode.toString().equals(stepcode) && isok == "PASS") {
  243. Object[] ob = baseDao.getFieldsDataByCondition("makeserial", "ms_status,ms_craftcode,ms_prodcode", "ms_sncode='" + sncode + "' and ms_makecode='" + macode + "'");
  244. if (ob!=null){
  245. String ms_status =ob[0].toString();
  246. String ms_craftcode= ob[1].toString();
  247. String ms_prodcode = ob[2].toString();
  248. if (ms_status == "3") {
  249. 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();
  250. baseDao.updateByCondition("makeserial", "ms_status=1,ms_nextstepcode='" + nextstepcode + "'", "ms_sncode='" + sncode + "' and ms_makecode='" + macode + "'");
  251. baseDao.updateByCondition("makebad", "mb_status=-1", "mb_sncode='" + sncode + "' and mb_makecode='" + macode + "'");
  252. }
  253. }
  254. }*/
  255. //转号:CS_SNCHANGEANDBURN
  256. if(StringUtil.hasText(extendSequenceNumber)){
  257. snChange(macode,stepcode,sncode,extendSequenceNumber.toString(),usercode);
  258. }else {
  259. stepPassed(macode, stepcode, sncode, usercode, "PASS".equals(isok) ? "OK" : "NG");
  260. }
  261. }
  262. //记录日志
  263. private void insertLogger(String data,String type){
  264. baseDao.execute("insert into EISDATA(ed_id,ed_data,ed_indate,ED_TYPE)" +
  265. "values(EISDATA_seq.nextval,?,sysdate,?)", data,type);
  266. }
  267. @Transactional
  268. public StepWorkApiResult<Map<String,Object>> testmain(HttpServletRequest request,String data){
  269. Map<Object,Object> map = BaseUtil.parseFormStoreToMap(data);
  270. String macode = " ";
  271. if(StringUtil.hasText(map.get("workOrderNo"))){//工单号可填写可不填
  272. macode = map.get("workOrderNo").toString();
  273. }
  274. Object sccode = map.get("stationCode");
  275. if(!StringUtil.hasText(sccode)){
  276. return StepWorkApiResponse.failRsp(400,"工位编码(stationCode)不能为空!");
  277. }
  278. Object stepcode = map.get("routeCode");
  279. if(!StringUtil.hasText(stepcode)){
  280. return StepWorkApiResponse.failRsp(400,"工序编号(routeCode)不能为空!");
  281. }
  282. Object sncode = map.get("sequenceNumber");
  283. if(!StringUtil.hasText(sncode)){
  284. return StepWorkApiResponse.failRsp(400,"产品SN(sequenceNumber)不能为空!");
  285. }
  286. //测试结果
  287. Object isok = map.get("eventResult"); //测试结果:PASS(合格),FAIL(不合格) 必填 ,测试强制合格有的时候也会有不良代码
  288. Object failureCode =map.get("failureCode");
  289. if(!StringUtil.hasText(isok)){
  290. return StepWorkApiResponse.failRsp(400,"测试结果(eventResult)不能为空!");
  291. }else{
  292. if(!"PASS".equals(isok) && !"FAIL".equals(isok)){
  293. return StepWorkApiResponse.failRsp(400,"测试结果值【"+isok+"】,只能是PASS或者FAIL!");
  294. }
  295. if("FAIL".equals(isok) && !StringUtil.hasText(failureCode)){
  296. return StepWorkApiResponse.failRsp(400,"测试结果为不合格,不良代码(failureCode)值必填!");
  297. }
  298. }
  299. if(StringUtil.hasText("failureCode")) {
  300. String bccode = baseDao.getJdbcTemplate().queryForObject("select max(bc_code) from badcode where bc_code=?", String.class, failureCode);//oErrMessage = "不良代码"+BadCode[i]+"不存在";
  301. if (null == bccode) {
  302. throw new ApiStepWorkException(new StepWorkApiResult(false, 400, "测试不良代码:" + failureCode + "在MES系统不存在!"));
  303. }
  304. }
  305. String usercode = String.valueOf(request.getSession().getAttribute("usercode"));
  306. //工序校验
  307. Map<String,Object> remap = checkStep(macode,sccode.toString(),sncode.toString(),usercode,stepcode.toString());
  308. if(Boolean.valueOf(remap.get("success").toString())){
  309. //工序保存测试数据并且过站
  310. //刚采集过当前工序,不允许再次采集
  311. String mscode = baseDao.getJdbcTemplate().queryForObject("select wm_concat(ms_sncode) from makeserial where ms_id=? and ms_stepcode=?",String.class,remap.get("msid"),stepcode.toString());
  312. if(StringUtil.hasText(mscode)){
  313. return StepWorkApiResponse.successRsp(400, "【" + sncode + "】序列号工序【"+stepcode+"】已经过站,请勿重复过站!");
  314. }
  315. saveTestDataAndPassed(remap.get("macode").toString(),stepcode.toString(),sccode.toString(),sncode.toString(),
  316. isok.toString(),failureCode.toString(),map.get("isinput"),map.get("machineTestData"),
  317. map.get("extendSequenceNumber"),usercode);
  318. return StepWorkApiResponse.successRsp(200,"【"+sncode+"】产品序列号过站成功!");
  319. }else{
  320. return StepWorkApiResponse.failRsp(400,remap.get("msg").toString());
  321. }
  322. }
  323. @Transactional
  324. public StepWorkApiResult<Map<String,Object>> stationmain(HttpServletRequest request ,String data) {
  325. Map<Object, Object> map = BaseUtil.parseFormStoreToMap(data);
  326. String macode = " ";
  327. if (StringUtil.hasText(map.get("workOrderNo"))) {//工单号可填写可不填
  328. macode = map.get("workOrderNo").toString();
  329. }
  330. Object sccode = map.get("stationCode");
  331. if (!StringUtil.hasText(sccode)) {
  332. return StepWorkApiResponse.failRsp(400, "工位编码(stationCode)不能为空!");
  333. }
  334. Object stepcode = map.get("routeCode");
  335. if (!StringUtil.hasText(stepcode)) {
  336. return StepWorkApiResponse.failRsp(400, "工序编号(routeCode)不能为空!");
  337. }
  338. Object sncode = map.get("sequenceNumber");
  339. if (!StringUtil.hasText(sncode)) {
  340. return StepWorkApiResponse.failRsp(400, "产品SN(sequenceNumber)不能为空!");
  341. }
  342. String usercode = String.valueOf(request.getSession().getAttribute("usercode"));
  343. Map<String, Object> remap = checkStep(macode, sccode.toString(), sncode.toString(), usercode,stepcode.toString());
  344. if (Boolean.valueOf(remap.get("success").toString())) {
  345. //刚采集过当前工序,不允许再次采集
  346. String mscode = baseDao.getJdbcTemplate().queryForObject("select wm_concat(ms_sncode) from makeserial where ms_id=? and ms_stepcode=?",String.class,remap.get("msid"),stepcode.toString());
  347. if(StringUtil.hasText(mscode)){
  348. return StepWorkApiResponse.successRsp(400, "【" + sncode + "】序列号工序【"+stepcode+"】已经过站,请勿重复过站!");
  349. }
  350. stepPassed(remap.get("macode").toString(), stepcode.toString(), sncode.toString(), usercode, "OK");
  351. return StepWorkApiResponse.successRsp(200, "【" + sncode + "】产品序列号过站成功!");
  352. } else {
  353. return StepWorkApiResponse.failRsp(400, remap.get("msg").toString());
  354. }
  355. }
  356. private boolean snChange(String iMakeCode, String iSourceCode, String tsn,String iSN, String iUserCode) {
  357. //v_i_ifrechange in number default 0,-- 标识是否重复转号 0否,1是
  358. String msg = baseDao.callProcedure("CS_SNCHANGEANDBURN",
  359. tsn,iSN,iSourceCode,iUserCode,iMakeCode,0,
  360. null,null,null,null,null,
  361. iSN,null,null,null,null,null,null,null,null
  362. );
  363. if(StringUtil.hasText(msg)){
  364. throw new ApiStepWorkException(new StepWorkApiResult(false,400,msg));
  365. }else{
  366. return true;
  367. }
  368. }
  369. /* 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+"'");
  370. if(rs.next()){
  371. String st_ifinput=rs.getString("st_ifinput");
  372. String st_ifoqc=rs.getString("st_ifinput");
  373. String st_ifweigh=rs.getString("st_ifweigh");
  374. if(st_ifinput.equals("-1")){
  375. oErrMessage = "上料工序必须在客户端进行过站";
  376. rmap.put("oErrMessage",oErrMessage);
  377. return rmap;
  378. }
  379. if(st_ifoqc.equals("-1")){
  380. oErrMessage = "OQC必须在客户端进行过站";
  381. rmap.put("oErrMessage",oErrMessage);
  382. return rmap;
  383. }
  384. if(st_ifweigh.equals("-1")){
  385. oErrMessage = "称重工序必须在客户端进行过站";
  386. rmap.put("oErrMessage",oErrMessage);
  387. return rmap;
  388. }
  389. }*/
  390. }