package com.shlanbao.tzsc.pms.sch.stat.service.impl; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Hashtable; import java.util.List; import java.util.Map; import com.shlanbao.tzsc.base.dao.*; import com.shlanbao.tzsc.base.mapping.*; import com.shlanbao.tzsc.data.runtime.bean.BoxerData; import com.shlanbao.tzsc.data.runtime.bean.FilterData; import com.shlanbao.tzsc.data.runtime.bean.PackerData; import com.shlanbao.tzsc.data.runtime.bean.RollerData; import com.shlanbao.tzsc.pms.sch.workorder.beans.WorkOrderBean; import com.shlanbao.tzsc.utils.tools.*; import net.sf.json.JSONObject; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.shlanbao.tzsc.base.interceptor.WorkOrderFeedbackInterceptor; import com.shlanbao.tzsc.base.model.Combobox; import com.shlanbao.tzsc.base.model.DataGrid; import com.shlanbao.tzsc.base.model.PageParams; import com.shlanbao.tzsc.base.service.BaseService; import com.shlanbao.tzsc.data.runtime.handler.DbOutputOrInputInfos; import com.shlanbao.tzsc.data.runtime.handler.FaultDataCalc; import com.shlanbao.tzsc.pms.md.unit.beans.UnitBean; import com.shlanbao.tzsc.pms.sch.manualshift.beans.SchCalendarBean; import com.shlanbao.tzsc.pms.sch.stat.beans.InputBean; import com.shlanbao.tzsc.pms.sch.stat.beans.OutputBean; import com.shlanbao.tzsc.pms.sch.stat.beans.RoutputBean; import com.shlanbao.tzsc.pms.sch.stat.service.StatServiceI; import com.shlanbao.tzsc.utils.excel.ExportExcel; import com.shlanbao.tzsc.utils.params.SysEqpTypeBase; import javax.servlet.http.HttpServletRequest; @Service public class StatServiceImpl extends BaseService implements StatServiceI { @Autowired private SchStatInputDaoI schStatInputDao; @Autowired private SchStatOutputDaoI schStatOutputDao; @Autowired private SchStatInputFbDaoI schStatInputFbDao; @Autowired private SchStatOutputFbDaoI schStatOutputFbDao; @Autowired private SchWorkorderBomDaoI schWorkorderBomDao; @Autowired private SchWorkorderDaoI schWorkorderDao; @Autowired private MdUnitDaoI mdUnitDao; @Autowired private SchStatFaultDaoI SchStatFaultDao; @Autowired private EqmQtyRecordsDaoI eqmQtyRecordsDao;//手动追加封箱机数据 @Autowired private HttpServletRequest request; private StringBuffer sqlbf = new StringBuffer(1000); @Override public DataGrid getAllOutputs(OutputBean outputBean, PageParams pageParams) { return this.queryOutInfo(outputBean, pageParams, 1,"SCH_STAT_OUTPUT"); } @Override public DataGrid getAllOutputsFb(OutputBean outputBean, PageParams pageParams) { return this.queryOutInfo(outputBean, pageParams, 1,"SCH_STAT_OUTPUT_FB"); } private DataGrid queryOutInfo(OutputBean outputBean, PageParams pageParams, int type,String table) { StringBuffer sb = new StringBuffer(); sb.append("select * from( select ROWNUM as rownums,t.* from ("); sb.append("SELECT "); StringBuffer col = new StringBuffer(); col.append(" SSO.id as outId,SSO.UNIT as ssoUnit,SSO.oid as orderId,SSO.qty as ssoQty,SSO.BAD_QTY as ssoBadQty,"); col.append(" SSO.STIM as ssoStim,SSO.ETIM as ssoEtim,SSO.RUN_TIME as ssoRunTime,SSO.STOP_TIME as ssoStopTime,"); col.append(" SSO.STOP_TIMES as ssoStopTimes,SSO.TIME_UNIT as ssoTimeUnit,SSO.LAST_RECV_TIME ,SSO.LAST_UPDATE_TIME,"); col.append(" SSO.IS_FEEDBACK,SSO.FEEDBACK_TIME,SSO.FEEDBACK_USER,SSO.DEL,SSO.DACQTY,"); col.append("to_char(SWO.DATE_,'yyyy-mm-dd'), "); col.append("shift.name as shift, "); col.append("team.name as team, "); col.append("eqp.equipment_name, "); col.append("swo.CODE, "); col.append("MAT.name as mat, "); col.append("unit1.name as unit1,"); col.append("unit2.name as unit2 ,sso.rec_qty1,sso.rec_qty2, "); col.append("sso.CREATE_USER_NAME as createUserName,sso.CREATE_USER_TIME as createUserTime,sso.UPDATE_USER_NAME as updateUserName,sso.UPDATE_USER_TIME as updateUserTime "); sb.append(col); StringBuffer param = new StringBuffer(); param.append("FROM "+table+" sso "); param.append("LEFT JOIN SCH_WORKORDER swo ON SSO.OID=SWO.ID "); param.append("LEFT JOIN MD_EQUIPMENT eqp ON swo.EQP=eqp.id "); param.append("LEFT JOIN MD_EQP_TYPE met ON met.id=eqp.EQP_TYPE_ID "); param.append("LEFT JOIN MD_MAT mat ON mat.id=swo.mat "); param.append("left join MD_TEAM team on swo.team=team.id "); param.append("left join MD_SHIFT shift on shift.id=swo.shift "); param.append("left join MD_UNIT unit1 on sso.UNIT=unit1.id "); param.append("LEFT JOIN MD_UNIT unit2 on sso.TIME_UNIT=unit2.id "); param.append("LEFT JOIN MD_WORKSHOP workshop on eqp.WORK_SHOP=workshop.id "); param.append("where SSO.DEL='0' AND swo.sts=4 "); if (type == 1) { param.append(" and swo.type<4 "); } else if (type == 2) { param.append(" and swo.type=4 "); } if (StringUtil.notNull(outputBean.getWorkShop())) { param.append(" and workshop.code='" + outputBean.getWorkShop() + "'"); } if (StringUtil.notNull(outputBean.getShift())) { param.append(" and shift.id='" + outputBean.getShift() + "'"); } if (StringUtil.notNull(outputBean.getTeam())) { param.append(" and team.id='" + outputBean.getTeam() + "'"); } if (outputBean.getIsFeedback() != null) { param.append(" and sso.is_Feedback=" + outputBean.getIsFeedback()); } if (StringUtil.notNull(outputBean.getDate())) { param.append(" and swo.date_ >= to_date('" + outputBean.getDate() + "','yyyy-mm-dd')"); } if (StringUtil.notNull(outputBean.getDate2())) { param.append(" and swo.date_ <= to_date('" + outputBean.getDate2() + "','yyyy-mm-dd')"); } if (StringUtil.notNull(outputBean.getEquipment())) { param.append(" and eqp.id='" + outputBean.getEquipment() + "'"); } if (StringUtil.notNull(outputBean.getEqpType())) { param.append(" and swo.type=" + outputBean.getEqpType()); } sb.append(param); sb.append(" order by swo.date_ desc,swo.shift asc,eqp.EQUIPMENT_CODE asc ) t )where rownums >" + pageParams.getRows() * (pageParams.getPage() - 1) + " and rownums <=" + pageParams.getRows() * (pageParams.getPage())); List rows = schStatOutputDao.queryBySql(sb.toString()); List outputBeans = new ArrayList<>(); OutputBean bean = null; Object str[] = null; try { for (Object obj : rows) { str = (Object[]) obj; bean = new OutputBean(); bean.setId(StringUtil.convertObjToString(str[1])); if (str[6] != null) { bean.setStim(DateUtil.formatDateToString((Date) str[6], "yyyy-MM-dd HH:mm:ss")); } if (str[7] != null) { bean.setEtim(DateUtil.formatDateToString((Date) str[7], "yyyy-MM-dd HH:mm:ss")); } bean.setRunTime(StringUtil.converObj2Double(str[8])); bean.setStopTime(StringUtil.converObj2Double(str[9])); bean.setStopTimes(StringUtil.converObj2Long(str[10])); if (str[12] != null) { bean.setLastRecvTime(DateUtil.formatDateToString((Date) str[12], "yyyy-MM-dd HH:mm:ss")); } if (str[13] != null) { bean.setLastUpdateTime(DateUtil.formatDateToString((Date) str[13], "yyyy-MM-dd HH:mm:ss")); } bean.setIsFeedback(StringUtil.converObj2Long(str[14])); if (str[15] != null) { bean.setFeedbackTime(DateUtil.formatDateToString((Date) str[15], "yyyy-MM-dd HH:mm:ss")); } bean.setFeedbackUser(StringUtil.convertObjToString(str[16])); bean.setDel(StringUtil.converObj2Long(str[17])); bean.setDacQty(StringUtil.converObj2Double(str[18])); bean.setDate(StringUtil.convertObjToString(str[19])); bean.setShift(StringUtil.convertObjToString(str[20])); bean.setTeam(StringUtil.convertObjToString(str[21])); bean.setEquipment(StringUtil.convertObjToString(str[22])); bean.setQty(StringUtil.converObj2Double(str[4])); bean.setBadQty(MathUtil.roundHalfUp(StringUtil.converObj2Double(str[5]), 4)); bean.setWorkorder(StringUtil.convertObjToString(str[3])); bean.setWorkorderCode(StringUtil.convertObjToString(str[23])); bean.setMatProd(StringUtil.convertObjToString(str[24])); bean.setUnit(StringUtil.convertObjToString(str[25])); bean.setTimeunit(StringUtil.convertObjToString(str[26])); bean.setRecQty1(StringUtil.converObj2Double(str[26])); bean.setRecQty2(StringUtil.converObj2Double(str[26])); bean.setCreateUserName(StringUtil.convertObjToString(str[29])); bean.setCreateUserTime((Date) str[30]); bean.setUpdateUserName(StringUtil.convertObjToString(str[31])); bean.setUpdateUserTime((Date) str[32]); outputBeans.add(bean); bean = null; } String countSql = "select * from(SELECT count(0) ".concat(param.toString()).concat(" )"); BigDecimal total = new BigDecimal(schStatOutputDao.queryBySql(countSql).get(0).toString()); return new DataGrid(outputBeans, total.longValue()); } catch (Exception e) { log.error("POVO转换异常", e); } return null; } /** * 查询成型生产实绩 * * @author 张璐 * @create 2015年10月12日 */ @Override public DataGrid getAllForming(OutputBean outputBean, PageParams pageParams) { return queryOutInfo(outputBean, pageParams, 2,"SCH_STAT_OUTPUT"); } @Override public DataGrid getAllFormingFb(OutputBean outputBean, PageParams pageParams) { return queryOutInfo(outputBean, pageParams, 2,"SCH_STAT_OUTPUT_FB"); } @Override public DataGrid getAllInputsByOutput(String id) throws Exception { // 根据产出表id查询辅料消耗明细 List list = schStatInputDao.query("from SchStatInput o left join fetch o.mdMat mm left join fetch o.mdUnit mu where o.schStatOutput.id=?", id); List rows = new ArrayList(); StringBuilder dacSql = new StringBuilder("SELECT nvl(o.dacqty, 0) FROM sch_stat_output o WHERE o.id='"); dacSql.append(id).append("'"); //当前选中行的DAC产量查询出来,传递到消耗表格中 List dacList = schStatInputDao.queryBySql(dacSql.toString()); Double dacQty = Double.parseDouble(StringUtil.convertObjToString(dacList.get(0))); InputBean bean = null; for (SchStatInput schStatInput : list) { bean = BeanConvertor.copyProperties(schStatInput, InputBean.class); bean.setMat(schStatInput.getMdMat().getName()); bean.setUnit(schStatInput.getMdUnit().getName()); String order = schStatInput.getSchStatOutput().getSchWorkorder().getCode(); order = order.substring(0,order.indexOf('#')); String matCode = schStatInput.getMdMat().getCode(); List inputs = schStatInputDao.queryBySql("select t1.num-t2.num num, t1.uom from (select nvl(sum(quantity),0) num,uom from SCH_WORKORDER_IO a " + " where a.replace_material like ? and a.MATERIAL_CODE = ? and a.inout_type in ('1','4') group by uom) t1,("+ "SELECT nvl(sum(quantity),0) num FROM SCH_WORKORDER_IO swi WHERE REPLACE_MATERIAL LIKE " + "'%'||(SELECT SUBSTR(code,0,instr(code,'#')-1) FROM (" + "SELECT sw2.* FROM SCH_WORKORDER sw JOIN SCH_WORKORDER sw2 ON sw.EQP = sw2.EQP AND sw.TYPE = sw2.TYPE AND sw2.STIM > sw.STIM " + "WHERE sw.code = ? ORDER BY sw2.stim ASC) WHERE rownum = 1) ||'%' AND INOUT_TYPE IN ('4') and MATERIAL_CODE = ?) t2" ,"%"+order+"%", matCode, schStatInput.getSchStatOutput().getSchWorkorder().getCode(), matCode); // List nextXuLing = schStatInputDao.queryBySql("SELECT sum(quantity) FROM SCH_WORKORDER_IO swi WHERE REPLACE_MATERIAL LIKE " + // "'%'||(SELECT SUBSTR(code,0,instr(code,'#')-1) FROM (" + // "SELECT sw2.* FROM SCH_WORKORDER sw JOIN SCH_WORKORDER sw2 ON sw.EQP = sw2.EQP AND sw.TYPE = sw2.TYPE AND sw2.STIM > sw.STIM " + // "WHERE sw.code = ? ORDER BY sw2.stim ASC) WHERE rownum = 1) ||'%' AND INOUT_TYPE IN ('4') AND and MATERIAL_CODE = ?" // ,schStatInput.getSchStatOutput().getSchWorkorder().getCode(), matCode); if (inputs!=null && inputs.size() >0) { Object[] obj = (Object[]) inputs.get(0); bean.setInputQty(StringUtil.convertObjToString(obj[0])+StringUtil.convertObjToString(obj[1])); } //查询每个物料消耗对应标准单耗表的上限值,下限值。 StringBuilder sql = new StringBuilder("SELECT DISTINCT s.uval, s.lval FROM SCH_CON_STD s WHERE s.mat='"); sql.append(schStatInput.getMdMat().getId()).append("'"); List data = schStatInputDao.queryBySql(sql.toString()); Object str[] = null; for (Object obj : data) { str = (Object[]) obj; //单耗的上限值,封装到消耗数据对象 bean.setUval(Double.parseDouble(StringUtil.convertObjToString(str[0]))); //单耗的下限值,封装到消耗数据对象 bean.setLval(Double.parseDouble(StringUtil.convertObjToString(str[1]))); } FillUserInfoUtil.fillCreateAndUpdateUserInfo(schStatInput,bean); //当前选中行的DAC产量,封装到消耗数据对象 bean.setDacQty(dacQty); rows.add(bean); bean = null; } return new DataGrid(rows, 0L); } @Override public DataGrid getAllInputsFbByOutput(String id) throws Exception { List list = schStatInputFbDao.query("from SchStatInputFb o left join fetch o.mdMat mm left join fetch o.mdUnit mu where o.schStatOutputFb.id=?", id); List rows = new ArrayList(); StringBuilder dacSql = new StringBuilder("SELECT nvl(o.dacqty, 0) FROM sch_stat_output_fb o WHERE o.id='"); dacSql.append(id).append("'"); //当前选中行的DAC产量查询出来,传递到消耗表格中 List dacList = schStatInputDao.queryBySql(dacSql.toString()); Double dacQty = Double.parseDouble(StringUtil.convertObjToString(dacList.get(0))); InputBean bean = null; for (SchStatInputFb schStatInput : list) { bean = BeanConvertor.copyProperties(schStatInput, InputBean.class); bean.setMat(schStatInput.getMdMat().getName()); bean.setUnit(schStatInput.getMdUnit().getName()); //查询每个物料消耗对应标准单耗表的上限值,下限值。 StringBuilder sql = new StringBuilder("SELECT DISTINCT s.uval, s.lval FROM SCH_CON_STD s WHERE s.mat='"); sql.append(schStatInput.getMdMat().getId()).append("'"); List data = schStatInputDao.queryBySql(sql.toString()); Object str[] = null; for (Object obj : data) { str = (Object[]) obj; //单耗的上限值,封装到消耗数据对象 bean.setUval(Double.parseDouble(StringUtil.convertObjToString(str[0]))); //单耗的下限值,封装到消耗数据对象 bean.setLval(Double.parseDouble(StringUtil.convertObjToString(str[1]))); } FillUserInfoUtil.fillCreateAndUpdateUserInfo(schStatInput,bean); //当前选中行的DAC产量,封装到消耗数据对象 bean.setDacQty(dacQty); rows.add(bean); bean = null; } return new DataGrid(rows, 0L); } @LogAnno(operateType = "新增产出数据") @Override public int addOutput(OutputBean outputBean, int flag) throws Exception { SchStatOutput o = new SchStatOutput(); String workorder = outputBean.getWorkorder(); SchWorkorder schWorkorder = schWorkorderDao.findById(SchWorkorder.class, workorder); List outlist = schStatOutputDao.query("from SchStatOutput o where o.del='0' and o.schWorkorder.id=?", outputBean.getWorkorder()); if (flag == 1) {//人为新增 if (schWorkorder.getSts() == 1||schWorkorder.getSts()==0){ return 3; } //判断当前新增工单是否已经在生产实绩中有记录 if (outlist != null && outlist.size() > 0) { return 0; } o = BeanConvertor.copyProperties(outputBean, SchStatOutput.class); o.setMdUnit(new MdUnit(outputBean.getUnit()));//来源于工单计划产量单位 //时间单位统一用分钟 o.setLastUpdateTime(new Date()); } else if (flag == 0) { if (outlist != null && outlist.size() > 0) { o = outlist.get(0); } else { o.setStim(DateUtil.formatStringToDate(outputBean.getStim(), "yyyy-MM-dd HH:mm:ss")); //初始值未空 o.setQty(0D); o.setBadQty(0D); o.setRunTime(0D); o.setStopTime(0D); o.setStopTimes(0L); //给产量单位赋值 o.setMdUnit(mdUnitDao.unique(MdUnit.class, "select o.mdUnit from SchWorkorder o where o.id=?", workorder)); o.setSchWorkorder(new SchWorkorder(workorder));//工单 o.setTimeUnit(mdUnitDao.unique(MdUnit.class, "from MdUnit o where o.name=?", "分钟")); o.setIsFeedback(0L);//是否反馈 o.setDel(0L);//是否删除 } } FillUserInfoUtil.fillCreateUserInfo(o, request); schStatOutputDao.save(o); if (flag == 0) {//运行工单时,新增的生产实绩的消耗数据从工单bom中来 Map type_statInput = addInputsFromWorkOrderBoms(schWorkorder, o); //保存产出实绩和消耗实绩信息到内存中,避免轮询保存实时数据时,重复从数据库获得这些信息 DbOutputOrInputInfos outputOrInputInfos = new DbOutputOrInputInfos(); outputOrInputInfos.setStatOutputId(o.getId()); outputOrInputInfos.setType_statInputId(type_statInput); SchWorkorder order = schWorkorderDao.findById(SchWorkorder.class, workorder); String equipmentCode = order.getMdEquipment().getEquipmentCode(); if (!RedisUtil.hasKey("outputInput")) { RedisUtil.setMap("outputInput", new HashMap<>()); } RedisUtil.addMap("outputInput", equipmentCode, JSONObject.fromObject(outputOrInputInfos).toString()); } return 1; } public Map addInputsFromWorkOrderBoms(SchWorkorder workorder, SchStatOutput schStatOutput) { Map inputs = new HashMap(); List inputList = schStatInputDao.query("from SchStatInput o where o.schStatOutput.id = ?", schStatOutput.getId()); if (inputList != null && inputList.size() > 0) { for (SchStatInput input : inputList) { inputs.put(input.getMdMat().getMdMatType().getCode(), input.getId()); } return inputs; } //查询工单的bom String hql = "from SchWorkorderBom o where o.del=0 and o.bom_lot_id=? "; if (workorder.getType() == 1) { hql += " and o.mdMat.mdMatType.code in (2,3,4)"; } else if (workorder.getType() == 2) { hql += " and o.mdMat.mdMatType.code in (5,6,7,8,9,20)"; } else if (workorder.getType() == 3) { hql += " and o.mdMat.mdMatType.code in (22)"; } else if (workorder.getType() == 4) { hql += " and o.mdMat.mdMatType.code in (13)"; } List boms = schWorkorderBomDao.query(hql, workorder.getBomVersion()); //循环保存bom到input中,计数为零 //优点:及时采集程序没有采集到数据,补录数据也无需做新增这一繁琐工作,只需修改数据即可 for (SchWorkorderBom schWorkorderBom : boms) { SchStatInput o = new SchStatInput(schWorkorderBom.getMdUnit(), schStatOutput, schWorkorderBom.getMdMat(), 0D, 0D); schStatInputDao.save(o); inputs.put(schWorkorderBom.getMdMat().getMdMatType().getCode(), o.getId()); } return inputs; } /** * 新增 * 修改 */ @LogAnno(operateType = "编辑产出数据") @Override public int editOutput(OutputBean outputBean) { SchStatOutput output = schStatOutputDao.findById(SchStatOutput.class, outputBean.getId()); try { BeanConvertor.copyProperties(outputBean, output); output.setLastUpdateTime(new Date()); FillUserInfoUtil.fillUpdateUserInfo(output,request); schWorkorderDao.updateBySqlParam("update sch_workorder set real_etim = ? where id = ? ",output.getEtim(),output.getSchWorkorder().getId()); String sql="delete from eqm_qty_records where oid in (select oid from SCH_STAT_OUTPUT where id='"+outputBean.getId()+"' ) "; schWorkorderBomDao.updateBySql(sql,null); //先删除 后添加 EqmQtyRecords eq = null; for(int i=0;i<7;i++){ eq = new EqmQtyRecords(); if(i==0){ eq.setType("1"); eq.setQty(outputBean.getQty1()); }else if(i==1){ eq.setType("2"); eq.setQty(outputBean.getQty2()); }else if(i==2){ eq.setType("3"); eq.setQty(outputBean.getQty3()); }else if(i==3){ eq.setType("4"); eq.setQty(outputBean.getQty4()); }else if(i==4){ eq.setType("5"); eq.setQty(outputBean.getQty5()); }else if(i==5){ eq.setType("6"); eq.setQty(outputBean.getQty6()); }else if(i==6){ eq.setType("7"); eq.setQty(outputBean.getQty7()); } eq.setCreateTime(new Date()); eq.setCreateUserName(outputBean.getFeedbackUser()); eq.setEqp(outputBean.getEquipment()); eq.setShift(outputBean.getShift()); eq.setOid(outputBean.getWorkorder()); eq.setDel("0"); eqmQtyRecordsDao.save(eq); } } catch (Exception e) { log.error("转换异常", e); } return 1; } /** * @Description // 编辑待反馈产出 * @Author bsw * @Date 2020/6/13 15:27 * @Param [outputBean] * @return int **/ @LogAnno(operateType = "编辑待反馈产出数据") @Override public void editOutputFb(OutputBean outputBean) { SchStatOutputFb output = schStatOutputFbDao.findById(SchStatOutputFb.class, outputBean.getId()); try { BeanConvertor.copyProperties(outputBean, output); output.setLastUpdateTime(new Date()); FillUserInfoUtil.fillUpdateUserInfo(output,request); } catch (Exception e) { log.error("转换异常", e); } } @LogAnno(operateType = "删除产出数据") @Override public void deleteOutput(String id) { schStatOutputDao.updateByParams("update SchStatOutput o set o.del='1' where o.id=?", id); } @LogAnno(operateType = "批量删除产出数据") @Override public void batchDeleteOutput(String ids) { try { String[] id=ids.split(","); for (int i = 0; i < id.length; i++) { this.deleteOutput(id[i]); } } catch (Exception e) { e.printStackTrace(); } } @Override public void deleteOutputByWorkOrder(String workorder) { schStatOutputDao.updateByParams("update SchStatOutput o set o.del='1' where o.schWorkorder.id=?", workorder); } @LogAnno(operateType = "新增消耗数据") @Override public int addInput(InputBean inputBean) throws Exception { SchStatInput o = BeanConvertor.copyProperties(inputBean, SchStatInput.class); o.setMdUnit(new MdUnit(inputBean.getUnit())); o.setSchStatOutput(new SchStatOutput(inputBean.getOutputId())); o.setMdMat(new MdMat(inputBean.getMat())); FillUserInfoUtil.fillCreateUserInfo(o, request); schStatInputDao.save(o); return 1; } @LogAnno(operateType = "编辑消耗数据") @Override public int editInput(InputBean inputBean) { SchStatInput o = schStatInputDao.findById(SchStatInput.class, inputBean.getId()); o.setQty(inputBean.getQty());//只编辑消耗量 FillUserInfoUtil.fillUpdateUserInfo(o, request); return 1; } @LogAnno(operateType = "编辑待反馈消耗数据") @Override public void editInputFb(InputBean inputBean) { SchStatInputFb o = schStatInputFbDao.findById(SchStatInputFb.class, inputBean.getId()); o.setQty(inputBean.getQty());//只编辑消耗量 FillUserInfoUtil.fillUpdateUserInfo(o, request); } @LogAnno(operateType = "删除消耗数据") @Override public void deleteInput(String id) { schStatInputDao.deleteById(id, SchStatInput.class); } @Override public OutputBean getOutputById(String id) { try { SchStatOutput output = schStatOutputDao.findById(SchStatOutput.class, id); OutputBean bean = null; if (output!=null) { bean = BeanConvertor.copyProperties(output, OutputBean.class); SchWorkorder workorder = output.getSchWorkorder(); String wd = String.valueOf(workorder.getType()); bean.setDate(DateUtil.formatDateToString(workorder.getDate(), "yyyy-MM-dd")); bean.setEqpType(wd); bean.setShift(workorder.getMdShift().getName()); bean.setTeam(workorder.getMdTeam().getName()); bean.setEquipment(workorder.getMdEquipment().getEquipmentName()); bean.setWorkorder(workorder.getId()); bean.setWorkorderCode(workorder.getCode()); bean.setMatProd(workorder.getMdMat().getName()); bean.setUnitName(output.getMdUnit().getName()); bean.setUnit(output.getMdUnit().getId()); bean.setTimeunit(output.getTimeUnit().getName()); bean.setDacQty(output.getDACqty()); bean.setMainQty(output.getMainQty()); bean.setPbjQty("".equals(output.getPbjQty()) || output.getPbjQty() == null ? 0 : output.getPbjQty()); bean.setTbjQty(output.getTbjQty()); bean.setCxpz(output.getCxpz());//成型盘纸 bean.setCxdb(output.getCxdb());//成型大包 bean.setCxkl(output.getCxkl());//创库发料 bean.setRecQty1(output.getRecQty1()); bean.setRecQty2(output.getRecQty2()); if ("2".equals(wd)) {//封箱机时查询是否已手动录入产量 String sql = "select qty,type from EQM_QTY_RECORDS where oid = '" + workorder.getId() + "'"; List eqList = eqmQtyRecordsDao.queryBySql(sql); for (int i = 0; i < eqList.size(); i++) { Object[] obj = (Object[]) eqList.get(i); if ("1".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty1(StringUtil.converObj2Double(obj[0])); } else if ("2".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty2(StringUtil.converObj2Double(obj[0])); } else if ("3".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty3(StringUtil.converObj2Double(obj[0])); } else if ("4".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty4(StringUtil.converObj2Double(obj[0])); } else if ("5".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty5(StringUtil.converObj2Double(obj[0])); } else if ("6".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty6(StringUtil.converObj2Double(obj[0])); } else if ("7".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty7(StringUtil.converObj2Double(obj[0])); } } } } return bean; } catch (Exception e) { e.printStackTrace(); } return null; } @Override public OutputBean getOutputFbById(String id) { try { SchStatOutputFb output = schStatOutputFbDao.findById(SchStatOutputFb.class, id); OutputBean bean = null; if (output!=null) { bean = BeanConvertor.copyProperties(output, OutputBean.class); SchWorkorder workorder = output.getSchWorkorder(); String wd = String.valueOf(workorder.getType()); bean.setDate(DateUtil.formatDateToString(workorder.getDate(), "yyyy-MM-dd")); bean.setEqpType(wd); bean.setShift(workorder.getMdShift().getName()); bean.setTeam(workorder.getMdTeam().getName()); bean.setEquipment(workorder.getMdEquipment().getEquipmentName()); bean.setWorkorder(workorder.getId()); bean.setWorkorderCode(workorder.getCode()); bean.setMatProd(workorder.getMdMat().getName()); bean.setUnitName(output.getMdUnit().getName()); bean.setUnit(output.getMdUnit().getId()); bean.setTimeunit(output.getTimeUnit().getName()); bean.setDacQty(output.getDACqty()); bean.setMainQty(output.getMainQty()); bean.setPbjQty("".equals(output.getPbjQty()) || output.getPbjQty() == null ? 0 : output.getPbjQty()); bean.setTbjQty(output.getTbjQty()); bean.setCxpz(output.getCxpz());//成型盘纸 bean.setCxdb(output.getCxdb());//成型大包 bean.setCxkl(output.getCxkl());//创库发料 bean.setRecQty1(output.getRecQty1()); bean.setRecQty2(output.getRecQty2()); if ("2".equals(wd)) {//封箱机时查询是否已手动录入产量 String sql = "select qty,type from EQM_QTY_RECORDS where oid = '" + workorder.getId() + "'"; List eqList = eqmQtyRecordsDao.queryBySql(sql); for (int i = 0; i < eqList.size(); i++) { Object[] obj = (Object[]) eqList.get(i); if ("1".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty1(StringUtil.converObj2Double(obj[0])); } else if ("2".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty2(StringUtil.converObj2Double(obj[0])); } else if ("3".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty3(StringUtil.converObj2Double(obj[0])); } else if ("4".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty4(StringUtil.converObj2Double(obj[0])); } else if ("5".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty5(StringUtil.converObj2Double(obj[0])); } else if ("6".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty6(StringUtil.converObj2Double(obj[0])); } else if ("7".equals(StringUtil.convertObjToString(obj[1]))) { bean.setQty7(StringUtil.converObj2Double(obj[0])); } } } } return bean; } catch (Exception e) { e.printStackTrace(); } return null; } @Override public InputBean getInputById(String id) throws Exception { SchStatInput input = schStatInputDao.findById(SchStatInput.class, id); InputBean bean = BeanConvertor.copyProperties(input, InputBean.class); bean.setUnit(input.getMdUnit().getName()); bean.setMat(input.getMdMat().getName()); return bean; } @Override public InputBean getInputFbById(String id) throws Exception { SchStatInputFb input = schStatInputFbDao.findById(SchStatInputFb.class, id); InputBean bean = BeanConvertor.copyProperties(input, InputBean.class); bean.setUnit(input.getMdUnit().getName()); bean.setMat(input.getMdMat().getName()); return bean; } @Override public List getBomsWorkorderId(WorkOrderBean bean) throws Exception { String hql = "select o.mdMat from SchWorkorderBom o , MdEquipment e " + "where o.eqptype = e.equipmentPosition and o.bom_lot_id=? and o.mdMat.id not in " + "(select i.mdMat.id from SchStatInput i where i.schStatOutput.schWorkorder.id=?) " + "and e.id = ? "; return BeanConvertor.copyList(schStatInputDao.query(List.class, hql, bean.getBomVersion(), bean.getId(),bean.getEquipmentId()), Combobox.class); } @Override public UnitBean getUnitByMatId(String bomVersion, String matId) { String hql = "select o.mdUnit from SchWorkorderBom o where o.bom_lot_id=? and o.mdMat.id=?"; MdUnit obj = (MdUnit) schStatOutputDao.unique(hql, bomVersion, matId); return new UnitBean(obj.getId(), obj.getName()); } /** * 修改人 shisihai 工单反馈 */ @Override public int sendDataToMES(String idOrIds, String feedbackUser) { WorkOrderFeedbackInterceptor workOrderFeedback = new WorkOrderFeedbackInterceptor(); return workOrderFeedback.sendWorkOrderDetails(idOrIds, feedbackUser); } // // /** // * [功能说明]:工单实际反馈 // * 1)通过ID集合,查询工单表集合,返回MES; // * 2)发送成功后修改工单状态; // * // * */ // @Override // public int sendDataToMES(String idOrIds,String feedbackUser,Integer type) { // //ids=ids.replaceAll(",", "','");//如: 1,2拼接成 1','2 // String[] idst=idOrIds.split(","); // for(int i=0;i wklist=schStatInputDao.queryBySql(sql.toString()); // sql.setLength(0); // //查询辅料消耗 // sql.append("select a.qty,( select name from MD_UNIT where id=a.unit) as unitName,b.code from SCH_STAT_INPUT a , MD_MAT b where a.mat=b.id "); // if (type==1) { // sql.append("and a.out_id in ( select id from SCH_STAT_OUTPUT where oid in ('"+idst[i]+"') ) "); // } // if (type==2) { // sql.append("and a.out_id in ('"+idst[i]+"')"); // } // // List fllist=schStatInputDao.queryBySql(sql.toString()); // getListMesWorkOrder(wklist,fllist); // } // return 1; // } // // // public List getListMesWorkOrder(List wklist,List fllist){ // List fllt=new ArrayList(); // MesWorkOrderBean bean=null; // if(wklist.size()>0){ // for(Object o:wklist){ // bean=new MesWorkOrderBean(); // Object[] temp=(Object[]) o; // bean.setCode(temp[0].toString()); // // bean.setShift(temp[1].toString()); //班次 // bean.setTeam(temp[2].toString()); //班组 // bean.setReal_stim(temp[3].toString()); //实际开始时间 // bean.setReal_etim(temp[4].toString()); //实际结束时间 // bean.setMatName(temp[5].toString()); //物料名称 // if(temp[6]!=null){ // bean.setOutput(Double.parseDouble( temp[6].toString() ));//实际产量 // } // if(temp[7]!=null){ // bean.setEqpCode( temp[7].toString() );//设备mes——code // } // if(temp[8]!=null){ // bean.setDowntimeTimes(Integer.parseInt( temp[8].toString() )); //停机次数 // } // if(temp[9]!=null){ // bean.setDowntimeDuration( temp[9].toString() ); //停机时间 // } // //添加物料 // if(wklist.size()>0){ // MesMdMatBean mesMdMat=null; // for(Object o2:fllist){ // mesMdMat=new MesMdMatBean(); // Object[] temp2=(Object[]) o2; // if(temp2[0]!=null){ // mesMdMat.setQuantity( Float.parseFloat(temp2[0].toString() )); //辅料产量 // } // if(temp2[1]!=null){ // mesMdMat.setUom(temp2[1].toString() ); //辅料单位 // } // if(temp2[2]!=null){ // mesMdMat.setMaterialCode( temp2[2].toString() ); //辅料编码 // } // fllt.add(mesMdMat); // } // } // bean.setListFl(fllt); // //循环向MES发送 // WorkOrderStatChangeInterceptor.getInstance().DASSendOrderResult(bean); // } // } // return null; // } // // /** * 修改生产实绩反馈状态 * * @author Leejean * @create 2014年12月4日下午2:58:50 */ public void editOutputIsFeedback(String id, String feedbackUser) { SchStatOutput output = schStatOutputDao.findById(SchStatOutput.class, id); output.setIsFeedback(1L); output.setFeedbackTime(new Date()); output.setFeedbackUser(feedbackUser); } /** * 根据设备ID保存设备故障汇总信息 * * @param eid * @return */ public boolean saveTrouble(String eid, Hashtable faultHt) { //根据设备ID获取设备故障集合,String[] //0:机台Code,1:班次,2:故障描述,3:次数,4:故障发生总时长 List list = null; if (StringUtil.notNull(eid)) { list = FaultDataCalc.getInstance().getFaultList(eid); } else { list = FaultDataCalc.getInstance().getAllFaultList(); } for (String[] string : list) { if (!StringUtil.notNull(string[0])) { log.error("保存故障信息失败,设备CODE(" + string[0] + ")不存在。"); continue; } String value = eqpCodeOutputList.get(string[0]); if (value == null || !StringUtil.notNull(value)) { log.info("数据为空【无法获取当前设备Code(" + string[0] + ")对应的运行工单实际产量ID信息】"); continue; } SchStatFault fault = new SchStatFault(); //如果故障ID已存在,并且故障名称一致,则进行修改 if (StringUtil.notNull(value)) { String faultId = faultHt.get(string[0] + string[2]); if (faultId != null) { fault.setId(faultId); } } //SCH_STAT_OUTPUT ID fault.setSchStatOutput(new SchStatOutput(value)); //故障名称 fault.setName(string[2]); //时长 fault.setTime(Double.parseDouble(string[4])); //次数 fault.setTimes((long) Double.parseDouble(string[3])); //反馈状态 fault.setFlag(0L); SchStatFaultDao.saveOrUpdate(fault); } return false; } @Override public void saveAllErrorData(List list) { Hashtable ht = getAllWorkOrderOutputListHT(); log.info("保存所有机台故障汇总信息……"); //故障 saveTrouble(null, ht); } private Hashtable eqpCodeOutputList; /** * 获取所有运行的设备output Id * * @return ht */ public Hashtable getAllWorkOrderOutputListHT() { StringBuffer sqlBuffer = new StringBuffer(); //设备Code,实际生产数据ID,故障id,日期 sqlBuffer.append("select e.EQUIPMENT_CODE,ou.ID,fault.ID as fault_id,fault.NAME,wo.DATE_ from SCH_WORKORDER wo "); sqlBuffer.append("left join SCH_STAT_OUTPUT ou on wo.ID=ou.OID "); sqlBuffer.append("left join SCH_STAT_FAULT fault on ou.ID=fault.OID "); sqlBuffer.append("left join MD_EQUIPMENT e on wo.EQP=e.ID "); sqlBuffer.append("where wo.del=0 and wo.IS_CHECK=1 and wo.sts=2 "); sqlBuffer.append("and ou.ID is not null order by wo.DATE_ desc "); Hashtable ht = new Hashtable(); eqpCodeOutputList = new Hashtable(); List list = SchStatFaultDao.queryBySql(sqlBuffer.toString()); for (Object o : list) { Object[] temp = (Object[]) o; //保存设备code和正在运行工单的生产实绩表 对应关系 //key eqpCode,value output ID if (eqpCodeOutputList.get(temp[0].toString().trim()) == null) { eqpCodeOutputList.put(temp[0].toString().trim(), StringUtil.convertObj(temp[1])); } //过滤没有当前设备运行工单没有故障信息 if (temp[3] != null && StringUtil.notNull(temp[3].toString()) && ht.get(temp[0].toString().trim() + StringUtil.convertObj(temp[3])) == null) { //key 设备code,value 0:生产实际ID,1:故障ID,2:故障名称 ht.put(temp[0].toString().trim() + StringUtil.convertObj(temp[3]), StringUtil.convertObj(temp[2])); } } return ht; } /** * [功能描述]:提升机数据,在开始结束本班次后,保存提升机产量到相关机台 * * @author wanchanghuang * @createTime 2015年11月27日17:43:30 */ @Override public Map queryByEquiment() { Map map = new HashMap(); //获取包装机code Integer code = SysEqpTypeBase.packerEqpTypeCode; String sql = "select id,EQUIPMENT_CODE from MD_EQUIPMENT where EQP_TYPE_ID in(select a.id from MD_EQP_TYPE a,MD_EQP_CATEGORY b where a.cid=b.id and b.code='" + code + "')"; List list = schStatInputDao.queryBySql(sql); if (list.size() > 0 && list != null) { for (int i = 0; i < list.size(); i++) { Object[] temp = (Object[]) list.get(i); if (temp[0] != null && temp[1] != null) { map.put(temp[1].toString(), temp[0].toString()); } } } return map; } /** * [功能说明]:用提升机产量更新工单产量 * * @param -提升机产量 eqp_id-工单ID * @param tSQty=条 /250 =箱 * @author wanchanghuang * @createTime 2015年11月30日08:43:06 */ @Override public void supdateSchStatInputOutById(SchCalendarBean bean, Double tSQty, String eqp_id) { //StringBuffer hql=new StringBuffer(1000); sqlbf.setLength(0); sqlbf.append(" update SCH_STAT_OUTPUT set dacqty=qty,qty='" + tSQty + "' where oid=( "); sqlbf.append(" select b.id from SCH_STAT_OUTPUT a ,SCH_WORKORDER b where "); sqlbf.append(" a.oid=b.id and b.shift='" + bean.getMdShiftCode() + "' and CONVERT(varchar(50),b.date,23)=CONVERT(varchar(50),GETDATE(),23) and b.eqp='" + eqp_id + "' "); sqlbf.append(" and a.dacqty is null ) "); //修改 try { schStatInputDao.updateInfo(sqlbf.toString(), null); } catch (Exception e) { e.printStackTrace(); } } /** * 导出PMS卷包机产量信息 * TODO * * @param date * @param date2 * @return TRAVLER * 2015年12月2日下午2:48:51 */ @LogAnno(operateType = "导出PMS卷包机产量信息") @Override public HSSFWorkbook exportQtyInfo(String date, String date2, String shift, String team, String eqp, String eqpType) { HSSFWorkbook workBook = null; ExportExcel ee = new ExportExcel(); workBook = new HSSFWorkbook(); HSSFSheet sheet = workBook.createSheet(); workBook.setSheetName(0, "temp1"); sheet.setVerticallyCenter(true); sheet.setDefaultColumnWidth((short) 15); sheet.setDefaultRowHeight((short) 15); HSSFCellStyle tableStyle = ee.getTableStyle(workBook, true); HSSFCellStyle tdStyle = ee.getTableStyle(workBook, false); tdStyle.setWrapText(false); try { // th 当前开始行,当前结束行, 从1开始计算行 一共多少列 从0开始计算总列数 int[] thTables = {1, 3, 13}; List th = new ArrayList(); th.add("1,1,13,1,卷包生产实绩");//开始行 开始列 结束列 结束行 th.add("2,1,2,2,日期"); th.add("2,3,5,2," + date + " 到 " + date2); th.add("3,1,1,3,班次"); th.add("3,2,2,3,班组"); th.add("3,3,3,3,设备"); th.add("3,4,4,3,计划产量"); th.add("3,5,5,3,计划开始时间"); th.add("3,6,6,3,计划结束时间"); th.add("3,7,7,3,实际产量"); th.add("3,8,8,3,实际剔除"); th.add("3,9,9,3,实际开始时间"); th.add("3,10,10,3,实际结束时间"); th.add("3,11,11,3,实际运行时间"); th.add("3,12,12,3,实际停机时间"); th.add("3,13,13,3,实际停机次数"); //获取List集合 List ls = this.queryQtyInfo(date, date2, shift, team, eqp, eqpType); //方法集合,同表头一致 String[] method = new String[]{"getShift", "getTeam", "getEqpName", "getpQty", "getpSTime" , "getpETime", "getQty", "getBadQty", "getStime", "getEtime", "getRunTime", "getStopTime", "getStopTimes" }; //开始行 int startLine = 3; ee.exportExcelMoreTh(thTables, th, startLine, method, RoutputBean.class, ls, sheet, tableStyle, tdStyle, null, null, null, null, null); } catch (Exception e) { e.printStackTrace(); } return workBook; } /** * 查询PMS卷包产量数据查询 * TODO * * @param date * @param date2 * @return TRAVLER * 2015年12月2日下午2:52:22 */ private List queryQtyInfo(String date, String date2, String shift, String team, String eqp, String eqpType) { List beans = new ArrayList(); StringBuffer sb = new StringBuffer(); sb.append(" select (select name from MD_SHIFT where id=a.shift) ,(select equipment_name from MD_EQUIPMENT where id=a.eqp), "); sb.append(" a.qty as qty_,TO_CHAR( A .stim, 'yyyy-MM-dd hh24:mi:ss'),to_char( A .etim, 'yyyy-MM-dd hh24:mi:ss'), "); sb.append(" b.qty,b.bad_qty,to_char ( b.stim, 'yyyy-MM-dd hh24:mi:ss'),"); sb.append(" to_char ( b.etim, 'yyyy-MM-dd hh24:mi:ss'),b.run_time,b.stop_time,"); sb.append(" b.stop_times,(SELECT name FROM MD_TEAM WHERE id = a.TEAM ) from SCH_WORKORDER a,SCH_STAT_OUTPUT b where a.id=b.oid "); sb.append(" and 1=1 "); if (StringUtil.notNull(date)) { sb.append(" and to_char ( A . DATE_, 'yyyy-MM-dd')>='" + date + "'"); } if (StringUtil.notNull(date2)) { sb.append(" and to_char ( A . DATE_, 'yyyy-MM-dd')<='" + date2 + "'"); } //班组 if (StringUtil.notNull(team)) { sb.append(" AND a.TEAM=" + team); } //班次 if (StringUtil.notNull(shift)) { sb.append(" AND a.SHIFT=" + shift); } //机台 if (StringUtil.notNull(eqp)) { sb.append(" AND a.EQP='" + eqp + "'"); } //机型 if (StringUtil.notNull(eqpType)) { sb.append(" and a.type=" + eqpType); } sb.append(" and a.STS=4 order by a.date_,(select equipment_name from MD_EQUIPMENT where id=a.eqp)"); List ls = schStatOutputDao.queryBySql(sb.toString()); Object[] o = null; RoutputBean b = null; if (ls != null && ls.size() > 0) { for (Object obj : ls) { b = new RoutputBean(); o = (Object[]) obj; b.setShift(StringUtil.convertObjToString(o[0])); b.setEqpName(StringUtil.convertObjToString(o[1])); b.setpQty(this.convDouble(o[2])); b.setpSTime(StringUtil.convertObjToString(o[3])); b.setpETime(StringUtil.convertObjToString(o[4])); b.setQty(this.convDouble(o[5])); b.setBadQty(this.convDouble(o[6])); b.setStime(StringUtil.convertObjToString(o[7])); b.setEtime(StringUtil.convertObjToString(o[8])); b.setRunTime(StringUtil.convertObjToString(o[9])); b.setStopTime(StringUtil.convertObjToString(o[10])); b.setStopTimes(StringUtil.convertObjToString(o[11])); b.setTeam(StringUtil.convertObjToString(o[12])); beans.add(b); } } //添加合计 b = new RoutputBean(); b.setEqpName("合计"); //计划产量 Double pQty = 0.0; //实际产量 Double rQty = 0.0; //实际剔除 Double badQty = 0.0; //实际运行时间 Double runTime = 0.0; //实际停机时间 Double stopTime = 0.0; //实际停机次数 Double stopTimes = 0.0; for (RoutputBean b0 : beans) { pQty += this.convDouble(b0.getpQty()); rQty += this.convDouble(b0.getQty()); badQty += this.convDouble(b0.getBadQty()); runTime += this.convDouble(b0.getRunTime()); stopTime += this.convDouble(b0.getStopTime()); stopTimes += this.convDouble(b0.getStopTimes()); } b.setpQty(pQty); b.setQty(rQty); b.setBadQty(badQty); b.setRunTime(runTime.toString()); b.setStopTime(stopTime.toString()); b.setStopTimes(stopTimes.toString()); beans.add(b); return beans; } /** * Obje 转Double * TODO * * @param o * @return TRAVLER * 2015年12月2日下午4:30:32 */ private Double convDouble(Object o) { Double d = 0.0; if (o != null && StringUtil.isDouble(o.toString())) { d = Double.valueOf(o.toString()); } return d; } /** * @param outputBean * @return void * @title saveEquipmentData * @description 保存单个机台实时数据 * @author bsw * @params [equipmentCode, data] * @updateTime 13:26 2019/8/6 0006 */ @Override public void saveEquipmentData(OutputBean outputBean) { String shiftId = (String) RedisUtil.getMapKey("shift", "ID"); if (null != outputBean) { String equipmentCode = outputBean.getEqpCode(); int eqpCode = Integer.valueOf(equipmentCode); Map dbOutputOrInputInfos = RedisUtil.getMap("outputInput"); DbOutputOrInputInfos info = (DbOutputOrInputInfos) JSONUtil.JSONString2Bean(dbOutputOrInputInfos.get(equipmentCode).toString(), DbOutputOrInputInfos.class); String dbOutputId = info.getStatOutputId(); //当前运行的工单的产出表id String oid = outputBean.getId(); //判断产出表id是否一致,不一致将dbOutputId设置为null。 if (oid == null || (oid != null && !oid.equals(dbOutputId))) { dbOutputId = null; } //手动点击工单运行 if (null == dbOutputId || "".equals(dbOutputId)) {//如果卷烟机 包装机 成型机 封箱机 查询 辅料数据 try { outputBean.setStim(DateUtil.getNowDateTime("yyyy-MM-dd HH:mm:ss")); this.addOutput(outputBean, 0); } catch (Exception e) { log.error("StatServiceImpl->addOutput:" + e.getMessage()); } dbOutputOrInputInfos = RedisUtil.getMap("outputInput"); info = (DbOutputOrInputInfos) JSONUtil.JSONString2Bean(dbOutputOrInputInfos.get(equipmentCode).toString(), DbOutputOrInputInfos.class); dbOutputId = info.getStatOutputId(); } if (dbOutputId == null || "".equals(dbOutputId)) { log.info("工单未运行[equipmentCode=" + equipmentCode + "];或者sch_stat_output表没有生成对应数据"); return; } OutputBean bean = getOutputById(dbOutputId); if (bean == null ){ return; } //卷烟机===================== if (100 <= eqpCode && eqpCode <= 199) { RollerData edata = getRollerData(shiftId, equipmentCode, null); try { log.info("保存产量[equipmentCode=" + equipmentCode + ",value=" + edata.getQty() + "]"); if (edata.getQty() > 0 && edata.getQty() >= bean.getQty()) {//产量只要大于0 才记录,防止 PLC换班了,程序自动换班没有换班,赋值 0 //保存产量 this.editOutput(new OutputBean(dbOutputId, edata.getQty() > 0 ? edata.getQty() : null, edata.getBadQty() > 0 ? edata.getBadQty() : null, edata.getRunTime() > 0 ? edata.getRunTime() : null, edata.getStopTime() > 0 ? edata.getStopTime() : null, Long.valueOf(edata.getStopTimes()), edata.getQty(), 0D, 0D, 0D, 0D, 0D, 0D, edata.getRecQty1(), edata.getRecQty2())); String inputId = info.getInputIdByType("2"); InputBean inputBean = null; if (inputId != null) {//装配、保存【卷烟纸】 inputBean = new InputBean(inputId, 0D, edata.getJuanyanzhiVal()); if (edata.getJuanyanzhiVal() > 1) {//产量大于 0 才更新//if(edata.getQty()>0){//产量大于 0 才更新 editInput(inputBean); log.info("保存消耗[equipmentCode=" + equipmentCode + ",type=卷烟纸,value=" + edata.getJuanyanzhiVal() + "]"); } } inputId = info.getInputIdByType("3"); if (inputId != null) {//装配、保存【水松纸】 inputBean = new InputBean(inputId, 0D, edata.getShuisongzhiVal()); if (edata.getShuisongzhiVal() > 1) {//if(edata.getQty()>0){//产量大于 0 才更新 editInput(inputBean); log.info("保存消耗[equipmentCode=" + equipmentCode + ",type=水松纸,value=" + edata.getShuisongzhiVal() + "]"); } } inputId = info.getInputIdByType("4"); if (inputId != null) {//装配、保存【滤棒】 inputBean = new InputBean(inputId, 0D, edata.getLvbangVal()); if (edata.getLvbangVal() > 1) {//if(edata.getQty()>0){//产量大于 0 才更新 editInput(inputBean); log.info("保存消耗[equipmentCode=" + equipmentCode + ",type=滤棒,value=" + edata.getLvbangVal() + "]"); } } } } catch (Exception e) { log.info("实时保存卷烟机产量异常" + equipmentCode + ">>>>>>>>>>>" + dbOutputId); e.printStackTrace(); } /* Map rollerMap = RedisUtil.getMap(shiftId+equipmentCode+"M"); if (rollerMap!=null){ }*/ return; } //==================== //包装机=====================产量为提升机产量 dacqty保存的是包转箱数据 if (200 <= eqpCode && eqpCode <= 299) { PackerData edata = getPackerDatas(shiftId, equipmentCode); try { if (edata.getQty() > 1) { log.info("保存产量[equipmentCode=" + equipmentCode + ",value=" + edata.getQty() + "]"); //保存产量 this.editOutput(new OutputBean( dbOutputId, MathUtil.roundHalfUp(edata.getTsQty() / 250.000, 3) > 0 ? MathUtil.roundHalfUp(edata.getTsQty() / 250.000, 3) : null, edata.getBadQty() > 0 ? edata.getBadQty() : null, edata.getRunTime() > 0 ? edata.getRunTime() : null, edata.getStopTime() > 0 ? edata.getStopTime() : null, Long.valueOf(edata.getStopTimes()), edata.getQty() > 0 ? edata.getQty() : null, edata.getMainQty() > 0 ? edata.getMainQty() : null, edata.getMainBadQty() > 0 ? edata.getMainBadQty() : null, edata.getTbjQty() > 0 ? edata.getTbjQty() : null, edata.getTbjGdQty() > 0 ? edata.getTbjGdQty() : null, edata.getTbjBadQty() > 0 ? edata.getTbjBadQty() : null, 0D,0D,0D ) ); //保存物料消耗 String inputId = info.getInputIdByType("5"); InputBean inputBean = null; if (inputId != null) {//装配、保存 inputBean = new InputBean(inputId, 0D, edata.getXiaohemoVal()); if (edata.getXiaohemoVal() > 1) {//if(edata.getQty()>0){//产量大于 0 才更新 editInput(inputBean); log.info("保存消耗[equipmentCode=" + equipmentCode + ",type=小盒膜,value=" + edata.getXiaohemoVal() + "]"); } } inputId = info.getInputIdByType("6"); if (inputId != null) {//装配、保存 inputBean = new InputBean(inputId, 0D, edata.getTiaohemoVal()); if (edata.getTiaohemoVal() > 1) {//if(edata.getQty()>0){//产量大于 0 才更新 editInput(inputBean); log.info("保存消耗[equipmentCode=" + equipmentCode + ",type=条盒膜,value=" + edata.getTiaohemoVal() + "]"); } } inputId = info.getInputIdByType( "7"); if (inputId != null) {//装配、保存 inputBean = new InputBean(inputId, 0D, edata.getXiaohezhiVal()); if (edata.getXiaohezhiVal() > 1) {//if(edata.getQty()>0){//产量大于 0 才更新 editInput(inputBean); log.info("保存消耗[equipmentCode=" + equipmentCode + ",type=小盒纸,value=" + edata.getXiaohezhiVal() + "]"); } } inputId = info.getInputIdByType("8"); if (inputId != null) {//装配、保存 inputBean = new InputBean(inputId, 0D, edata.getTiaohezhiVal()); if (edata.getTiaohezhiVal() > 1) {//if(edata.getQty()>0){//产量大于 0 才更新 editInput(inputBean); log.info("保存消耗[equipmentCode=" + equipmentCode + ",type=条盒纸,value=" + edata.getTiaohezhiVal() + "]"); } } inputId = info.getInputIdByType("9"); if (inputId != null) {//装配、保存 inputBean = new InputBean(inputId, 0D, edata.getNeichenzhiVal()); if (edata.getNeichenzhiVal() > 1) {//if(edata.getQty()>0){//产量大于 0 才更新 editInput(inputBean); log.info("保存消耗[equipmentCode=" + equipmentCode + ",type=内衬纸,value=" + edata.getNeichenzhiVal() + "]"); } } } } catch (Exception e) { log.error("实时保存包装机产量异常" + equipmentCode + ">>>>>>>>>>>" + dbOutputId + e.getMessage()); } return; } //封箱机=====================需要确认封箱机能采集的数据 if (300 <= eqpCode && eqpCode <= 399) { BoxerData edata = getBoxerDatas(shiftId, equipmentCode); try { if (edata.getQty() > 0 && edata.getQty() >= bean.getQty()) { this.editOutput(new OutputBean(dbOutputId, edata.getQty(), 0D, 0D, 0D, 0L, edata.getQty(), 0D, 0D, 0D, 0D, 0D, edata.getPbjQty(), 0d, 0d)); log.info("保存产量[equipmentCode=" + equipmentCode + ",value=" + edata.getQty() + "]"); String inputId =info.getInputIdByType("22"); InputBean inputBean = null; if (inputId != null) {//装配、保存 if (edata.getQty() > 0) {//产量大于 0 才更新 1大箱=5小箱 inputBean = new InputBean(inputId, 0D, edata.getQty() * 5); editInput(inputBean); log.info("保存消耗[equipmentCode=" + equipmentCode + ",type=纸箱,value=" + edata.getQty() * 5 + "]"); } } } } catch (Exception e) { log.error("实时保存装箱机数据异常!!!!" + e.getMessage()); } return; } //成型机=========================== if (500 <= eqpCode && eqpCode <= 599) { FilterData edata = getFilterData(shiftId, equipmentCode); try { if (edata.getQty() > 0 && edata.getQty() >= bean.getQty()) { this.editOutput(new OutputBean(dbOutputId, edata.getQty(), edata.getBadQty(), MathUtil.roundHalfUp(edata.getRunTime() / 60, 2), MathUtil.roundHalfUp(edata.getStopTime() / 60, 2), Long.valueOf(edata.getStopTimes().toString()), edata.getQty(), 0D, 0D, 0D, 0D, 0D, 0D, 0d, 0d)); log.info("保存产量[equipmentCode=" + equipmentCode + ",value=" + edata.getQty() + "]"); String inputId = info.getInputIdByType("4");//滤棒 if ("".equals(inputId) || null == inputId) { inputId = info.getInputIdByType("13");//滤棒盘纸 } InputBean inputBean = null; if (inputId != null) {//装配、保存 inputBean = new InputBean(inputId, 0D, edata.getPanzhiVal()); editInput(inputBean); log.info("保存消耗[equipmentCode=" + equipmentCode + ",type=滤棒盘纸,value=" + edata.getPanzhiVal() + "]"); } } } catch (Exception e) { e.printStackTrace(); } return; } } } @LogAnno(operateType = "批量删除消耗数据") @Override public void batchDeleteInput(String ids) { try { String[] id=ids.split(","); for (int i = 0; i < id.length; i++) { schStatInputDao.deleteById(id[i], SchStatInput.class); } } catch (Exception e) { e.printStackTrace(); } } /** * @return com.shlanbao.tzsc.data.runtime.bean.RollerData * @title getRollerData * @description 从redis中获取卷烟机实时数据 * @author bsw * @params [shiftId, equipmentCode, equipmentType] * @updateTime 13:01 2019/8/7 0007 **/ public RollerData getRollerData(String shiftId, String equipmentCode, String equipmentType) { Integer online = 0; //网络状态(0异常 1正常) Double qty = 0D; //产量 Double badQty = 0D; //剔除产量 Double lvbangVal = 0D; //滤棒消耗 Double juanyanzhiVal = 0D; //卷烟纸消耗 Double shuisongzhiVal = 0D; //水松纸消耗 Double runTime = 0D; //运行时间 Double stopTime = 0D; //停机时间 Integer stopTimes = 0; //停机次数 Integer speed = 0; //车速 Integer runStatus = 0; //卷烟机状态:1:Online / 0:offline Double cy = 0D; //储烟设备储量 Integer cy_cs = 0; //储烟设备车速(1-包装机 6-卷烟机) Integer cy_online = 0; //储烟装置状态:1:Online / 0:offline Integer js_online = 0; //接收机状态:1:Online / 0:offline Double recQty1 = 0D; //接收机量 Double recQty2 = 0D; //接收机量2 //拼接获得key值(如:1101) String key = shiftId + equipmentCode; //获得卷烟机设备的实时数据 Map rollerDataMap = RedisUtil.getMap(key); if (rollerDataMap != null && !rollerDataMap.isEmpty()) { //online的值根据redis中key为"设备类型State"来获取数据 // online = GetValueUtil.getIntegerValue(rollerDataMap.get(equipmentType + "State").toString()); //online与runStatus的数据一样 runStatus = online; //获得储烟机状态 cy_online = GetValueUtil.getIntegerValue(String.valueOf(RedisUtil.getMapKey(key + "C", "NETSTATE"))); //获得接收机状态 js_online = GetValueUtil.getIntegerValue(String.valueOf(RedisUtil.getMapKey(key + "J", "NETSTATE"))); recQty1 = GetValueUtil.getDoubleValue(String.valueOf(rollerDataMap.get("recQty1"))); runTime = GetValueUtil.getDoubleValue(String.valueOf(rollerDataMap.get("runTime"))); lvbangVal = GetValueUtil.getDoubleValue(String.valueOf(rollerDataMap.get("lvbangVal"))); stopTimes = GetValueUtil.getIntegerValue(String.valueOf(rollerDataMap.get("stopTimes"))); shuisongzhiVal = GetValueUtil.getDoubleValue(String.valueOf(rollerDataMap.get("shuisongzhiVal"))); juanyanzhiVal = GetValueUtil.getDoubleValue(String.valueOf(rollerDataMap.get("juanyanzhiVal"))); stopTime = GetValueUtil.getDoubleValue(String.valueOf(rollerDataMap.get("stopTime"))); qty = GetValueUtil.getDoubleValue(String.valueOf(rollerDataMap.get("qty"))); cy = GetValueUtil.getDoubleValue(String.valueOf(rollerDataMap.get("cy"))); cy_cs = GetValueUtil.getIntegerValue(String.valueOf(rollerDataMap.get("cySpeed"))); recQty2 = GetValueUtil.getDoubleValue(String.valueOf(rollerDataMap.get("recQty2"))); badQty = GetValueUtil.getDoubleValue(String.valueOf(rollerDataMap.get("badQty"))); Long speedL = Math.round(GetValueUtil.getDoubleValue(String.valueOf(rollerDataMap.get("speed")))); speed = speedL.intValue(); } else { log.error("ERROR>>>>卷烟机实时数据为空!!!"); } return new RollerData(online, qty, badQty, lvbangVal, juanyanzhiVal, shuisongzhiVal, runTime, stopTime, stopTimes, speed, runStatus, cy, cy_cs, cy_online, js_online, recQty1, recQty2); } /** * @return com.shlanbao.tzsc.data.runtime.bean.PackerData * @title getPackerDatas * @description 从redis 中获取包装机实时数据 * @author bsw * @params [shift, equipmentCode] * @updateTime 13:02 2019/8/7 0007 **/ public PackerData getPackerDatas(String shift, String equipmentCode) { int id = Integer.valueOf(equipmentCode); Map packerData = RedisUtil.getMap(shift + equipmentCode); //提升机数据 Map TSData = RedisUtil.getMap(shift + "601"); //网络 Integer online = 0; //停机次数 Integer stopTimes = 0; //产量 Double qty = 0D; //剔除量 double badQty = 0D; //车速 Integer speed = 0; //运行时间 Double runTime = 0D; //停机时间 Double stopTime = 0D; //消耗数据(小盒膜,条盒膜,小盒纸,条盒纸,内衬纸) Double xiaohemoVal = 0D; Double tiaohemoVal = 0D; Double xiaohezhiVal = 0D; Double tiaohezhiVal = 0D; Double neichenzhiVal = 0D; Double mainQty = 0D; //主机产量(小包机) Double mainBadQty = 0D; //主机剔除量 Double tbjQty = 0D; //透包机产量 Double tbjGdQty = 0D; //主机剔除量 Double tbjBadQty = 0D; //透包机产量 Double tsQty = 0D;//提升机产量 if (packerData != null) { //车速 speed = GetValueUtil.getIntegerValue(String.valueOf(packerData.get("x2ptSpeed"))); //网络 online = speed > 0 ? 1 : 0; //产量 qty = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(packerData.get("chcQty"))) / 2500, 3); //剔除量 badQty = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(packerData.get("chcRejQty"))) / 2500, 2); //运行时间 runTime = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(packerData.get("ptchRunTime"))) / 60, 0); //停机时间 stopTime = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(packerData.get("ptchStopTime"))) / 60, 0); //停机次数 stopTimes = GetValueUtil.getIntegerValue(String.valueOf(packerData.get("ptchStopCount"))); //# 106铝箔纸 107小盒纸 108小盒烟膜 109条盒纸 110条盒烟膜 neichenzhiVal = GetValueUtil.getDoubleValue(String.valueOf(packerData.get("foilPaper"))); xiaohezhiVal = GetValueUtil.getDoubleValue(String.valueOf(packerData.get("brandPaper"))); xiaohemoVal = GetValueUtil.getDoubleValue(String.valueOf(packerData.get("boxFilm"))); tiaohezhiVal = GetValueUtil.getDoubleValue(String.valueOf(packerData.get("barrelPaper"))); tiaohemoVal = GetValueUtil.getDoubleValue(String.valueOf(packerData.get("barrelFilm"))); //获得:主机产量/主机剔除 ,透包机产量/透包机剔除好包/透包机剔除坏包 try { mainQty = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(packerData.get("x2Qty"))) / 2500, 3); // x2Qty mainBadQty = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(packerData.get("x2RejQty"))), 3); // x2RejQty tbjQty = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(packerData.get("chQty"))) / 2500, 3); // chQty tbjGdQty = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(packerData.get("chRejGoodQty"))), 3); // chRejGoodQty tbjBadQty = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(packerData.get("chRejBadQty"))), 3); // chRejBadQty } catch (Exception e) { log.info("获取主机产量,透包机产量异常..."); e.printStackTrace(); } } //提升机数据id和机台code对应关系 if (TSData != null) { tsQty = MathUtil.roundHalfUp(GetValueUtil.getIntegerValue(String.valueOf(TSData.get("tQty" + (id - 200)))) * 1.000, 3); } return new PackerData(online, qty, badQty, xiaohemoVal, tiaohemoVal, xiaohezhiVal, tiaohezhiVal, neichenzhiVal, runTime, stopTime, stopTimes, speed, tsQty, mainQty, mainBadQty, tbjQty, tbjGdQty, tbjBadQty); } /** * @return com.shlanbao.tzsc.data.runtime.bean.BoxerData * @title getBoxerDatas * @description 从redis 中获取包装机实时数据 * @author bsw * @params [shift, equipmentCode] * @updateTime 13:02 2019/8/7 0007 **/ public BoxerData getBoxerDatas(String shift, String equipmentCode) { double qty = 0D; int online = 0; double pbjQty = 0d; if (StringUtil.isInteger(equipmentCode)) { int id = Integer.valueOf(equipmentCode); Map mainData = RedisUtil.getMap(shift + equipmentCode); if (mainData != null) { //网络 online = GetValueUtil.getIntegerValue(String.valueOf(mainData.get("CONVEYORState"))); qty = GetValueUtil.getIntegerValue(String.valueOf(mainData.get("qty1"))); //封箱机的产量是件,5件是1箱 qty = MathUtil.roundHalfUp(qty / 5, 2); } try { pbjQty = GetValueUtil.getIntegerValue(String.valueOf(mainData.get("pQty" + (id - 300)))); } catch (Exception e) { log.info("获取排包机异常..."); e.printStackTrace(); } } return new BoxerData(equipmentCode, online, qty, pbjQty); } /** * @return com.shlanbao.tzsc.data.runtime.bean.FilterData * @title getFilterData * @description 从redis 中获取成型机实时数据 * @author bsw * @params [shift, equipmentCode] * @updateTime 13:03 2019/8/7 0007 **/ public FilterData getFilterData(String shift, String equipmentCode) { try { //网络 Integer online = 0; //停机次数 Integer stopTimes = 0; //产量 Double qty = 0D; //剔除量 Double badQty = 0D; //车速 Integer speed = 0; //运行时间 Double runTime = 0D; //停机时间 Double stopTime = 0D; //消耗数据(盘纸) Double pzVal = 0D; //装盘机数量 Double zpVal = 0D; if (StringUtil.isInteger(equipmentCode)) { int id = Integer.valueOf(equipmentCode); Map mainData = RedisUtil.getMap(shift + equipmentCode); if (mainData != null) { //车速 speed = GetValueUtil.getIntegerValue(String.valueOf(mainData.get("speed"))); //产量 qty = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(mainData.get("qty"))) / 10000, 2); //剔除量 badQty = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(mainData.get("badQty"))) / 10000, 2); //运行时间 runTime = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(mainData.get("runTime"))), 0); // runTime //停机时间 stopTime = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(mainData.get("stopTime"))), 0); // stopTime //停机次数 stopTimes = 0; pzVal = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(mainData.get("paperQty"))), 2); // paperQty zpVal = MathUtil.roundHalfUp(GetValueUtil.getDoubleValue(String.valueOf(mainData.get("trayQty"))), 1); // trayQty } } return new FilterData(equipmentCode, zpVal, online, qty, badQty, pzVal, runTime, stopTime, stopTimes, speed); } catch (Exception e) { // TODO: handle exception } return null; } }