tags/yfai-mes-ext-v1.0
yxw 2 years ago
parent 63ea5b6e11
commit b8bf5649a0

@ -0,0 +1,16 @@
package cn.estsh.i3plus.ext.mes.api.busi.jx;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesManualReportTravel;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
public interface IJxManualReportTravelService {
/**
*
* @param manualReportTravel
* @return
*/
ListPager<MesManualReportTravel> queryManualReportTravelByPager(MesManualReportTravel manualReportTravel, Pager pager);
}

@ -0,0 +1,49 @@
package cn.estsh.i3plus.ext.mes.api.busi.jx;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
public interface IJxWorkOrderService {
/**
*
* @param workOrderNo
* @return
*/
void deleteSnRepairByType(String workOrderNo, String[] produceSnArr, String organizeCode, String userName);
/**
*
* @param workOrderNo
* @return
*/
void deleteProduceSnRepair(String workOrderNo, String[] produceSnArr, String organizeCode, String userName);
/**
*
* @param workOrderNo
* @return
*/
void deletePackageNoRepair(String workOrderNo, String[] packageNoArr, String organizeCode, String userName);
/**
*
* @param workOrderNo
* @return
*/
ListPager queryRepairSnByPager(String workOrderNo, String packageNo, String organizeCode, Pager pager);
/**
*
* @param workOrderNo
* @return
*/
ListPager queryRepairPackageByPager(String workOrderNo, String packageNo, String organizeCode, Pager pager);
/**
*
* @param workOrderNo
* @return
*/
ListPager queryRepairProduceSnByPager(String workOrderNo, String sn, String organizeCode, Pager pager);
}

@ -257,7 +257,7 @@ public class BuWorkOrderExtController extends MesBaseController {
public ResultBean doBindProduceSn(String produceSnList, String workOrderNo) { public ResultBean doBindProduceSn(String produceSnList, String workOrderNo) {
boolean flag = true; boolean flag = true;
// 该redis 锁与 解绑条码绑定导入 一致 // 该redis 锁与 解绑条码绑定导入 一致
String moduleKey = AuthUtil.getOrganize().getOrganizeCode() + ":MES_EXT_IMPORT_MODULE:" + MesExtEnumUtil.MES_EXT_EXCEL.MES_WORK_BIND_UNBIND_SN; String moduleKey = AuthUtil.getOrganize().getOrganizeCode() + ":MES_EXT_IMPORT_MODULE:" + MesExtEnumUtil.MES_EXT_EXCEL.MES_REWORK_ORDER_BIND_UNBIND_SN;
try { try {
if (!doLock(moduleKey)) { if (!doLock(moduleKey)) {
flag = false; flag = false;

@ -0,0 +1,46 @@
package cn.estsh.i3plus.ext.mes.apiservice.controller.base.jx;
import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxManualReportTravelService;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesManualReportTravel;
import cn.estsh.i3plus.platform.common.util.CommonConstWords;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ResultBean;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @PROJECT_NAME: i3plus-mes-panasonic-jx
* @DESCRIPTION:
* @USER: xinwang.yi
* @DATE: 2023-10-27 10:14
*/
@RestController
@Api(tags = "手动报工 控制层")
@RequestMapping(CommonConstWords.BASE_URL_MES + "/manual-report-travel")
public class JxManualReportTravelController {
@Autowired
private IJxManualReportTravelService manualReportTravelService;
@GetMapping(value = "/query-pager")
public ResultBean queryManualReportTravelByPager(MesManualReportTravel manualReportTravel, Pager pager) {
try {
manualReportTravel.setOrganizeCode(AuthUtil.getOrganize().getOrganizeCode());
return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode())
.setListPager(manualReportTravelService.queryManualReportTravelByPager(manualReportTravel, pager));
} catch (ImppBusiException busExcep) {
return ResultBean.fail(busExcep);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -0,0 +1,68 @@
package cn.estsh.i3plus.ext.mes.apiservice.controller.busi.jx;
import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxWorkOrderService;
import cn.estsh.i3plus.platform.common.util.CommonConstWords;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;
import cn.estsh.impp.framework.base.controller.MesBaseController;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ResultBean;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @PROJECT_NAME: i3plus-mes-panasonic-jx
* @DESCRIPTION:
* @USER: xinwang.yi
* @DATE: 2023-10-30 15:26
*/
@RestController
@Api(tags = "嘉兴生产工单 控制层")
@RequestMapping(CommonConstWords.BASE_URL_MES + "/jx/work-order")
public class JxWorkOrderController extends MesBaseController {
@Autowired
private IJxWorkOrderService jxWorkOrderService;
@PostMapping("/delete-rework-sn")
@ApiOperation("删除返工条码")
public ResultBean deleteProduceSnRepair(String workOrderNo, String[] snArr) {
try {
ValidatorBean.checkNotNull(workOrderNo, "工单号不能为空");
ValidatorBean.checkNotNull(snArr, "条码不能为空");
jxWorkOrderService.deleteSnRepairByType(workOrderNo, snArr, AuthUtil.getOrganize().getOrganizeCode(), AuthUtil.getSessionUser().getUserName());
return ResultBean.success("修改成功")
.setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
} catch (ImppBusiException busExcep) {
return ResultBean.fail(busExcep);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@GetMapping("/query-repair-sn-by-pager")
@ApiOperation("查询返工条码 组件/本体")
public ResultBean deletePackageSnRepairByPager(String workOrderNo, String sn, Pager pager) {
try {
ValidatorBean.checkNotNull(workOrderNo, "工单号不能为空");
return ResultBean.success("修改成功")
.setListPager(jxWorkOrderService.queryRepairSnByPager(workOrderNo, sn, AuthUtil.getOrganize().getOrganizeCode(), pager))
.setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
} catch (ImppBusiException busExcep) {
return ResultBean.fail(busExcep);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -35,7 +35,8 @@ public class FirstOrderDetailDao implements IFirstOrderDetailDao {
"forder.shiftCode,fdetail.processCode,fdetail.processName,fdetail.checkMessage,fdetail.checkStand,fdetail.checkValue," + "forder.shiftCode,fdetail.processCode,fdetail.processName,fdetail.checkMessage,fdetail.checkStand,fdetail.checkValue," +
"fdetail.checkResult,fdetail.spotCheckUser,fdetail.spotCheckTime,fdetail.teamConfirmUser," + "fdetail.checkResult,fdetail.spotCheckUser,fdetail.spotCheckTime,fdetail.teamConfirmUser," +
"fdetail.teamConfirmTime,fdetail.qualityConfirmUser,fdetail.qualityConfirmTime,fdetail.orderNo,forder.createDatetime," + "fdetail.teamConfirmTime,fdetail.qualityConfirmUser,fdetail.qualityConfirmTime,fdetail.orderNo,forder.createDatetime," +
"fdetail.isQualityConfirm,fdetail.isTeamConfirm,fdetail.upLimit,fdetail.downLimit,fdetail.resultValue)" + "fdetail.isQualityConfirm,fdetail.isTeamConfirm,fdetail.upLimit,fdetail.downLimit,fdetail.resultValue,fdetail.importanceSafePartNo," +
"fdetail.checkFrequency,fdetail.sampleQty,fdetail.confirmMethod)" +
" from MesFirstOrderDetail fdetail" + " from MesFirstOrderDetail fdetail" +
" LEFT JOIN MesOrderJob forder on fdetail.orderNo = forder.orderNo" + " LEFT JOIN MesOrderJob forder on fdetail.orderNo = forder.orderNo" +
" and fdetail.organizeCode = forder.organizeCode and fdetail.isValid = forder.isValid " + " and fdetail.organizeCode = forder.organizeCode and fdetail.isValid = forder.isValid " +
@ -82,6 +83,22 @@ public class FirstOrderDetailDao implements IFirstOrderDetailDao {
if (!StringUtils.isEmpty(mesFirstOrderDetail.getCheckResult())) { if (!StringUtils.isEmpty(mesFirstOrderDetail.getCheckResult())) {
hql += " and fdetail.checkResult = :checkResult "; hql += " and fdetail.checkResult = :checkResult ";
} }
if (!StringUtils.isEmpty(mesFirstOrderDetail.getImportanceSafePartNo())) {
hql += " and fdetail.importanceSafePartNo = :importanceSafePartNo ";
}
if (!StringUtils.isEmpty(mesFirstOrderDetail.getCheckFrequency())) {
hql += " and fdetail.checkFrequency = :checkFrequency ";
}
if (!StringUtils.isEmpty(mesFirstOrderDetail.getSampleQty())) {
hql += " and fdetail.sampleQty = :sampleQty ";
}
if (!StringUtils.isEmpty(mesFirstOrderDetail.getConfirmMethod())) {
hql += " and fdetail.confirmMethod = :confirmMethod ";
}
hql += " order by fdetail.spotCheckTime desc "; hql += " order by fdetail.spotCheckTime desc ";

@ -116,7 +116,7 @@ public class PartExtDao implements IPartExtDao {
" pe.japanDesc, pe.goodsCode, pe.prefix, pe.qualityAssureCode, pe.identifyCode, pe.snLastCode, pe.fileId, " + " pe.japanDesc, pe.goodsCode, pe.prefix, pe.qualityAssureCode, pe.identifyCode, pe.snLastCode, pe.fileId, " +
" pe.fileOriginName, pe.uploadDatetime, pe.organizeCode, pe.createUser, pe.createDatetime, pe.modifyUser, pe.modifyDatetime, " + " pe.fileOriginName, pe.uploadDatetime, pe.organizeCode, pe.createUser, pe.createDatetime, pe.modifyUser, pe.modifyDatetime, " +
" f.fileUrl, pe.packNoPrintTimes, pe.snPrintTimes, pe.bigProcessMatchType, pe.snPrintColumnNumber, pe.isPrintQualityAssureIndia , pe.shiXiangDiCode," + " f.fileUrl, pe.packNoPrintTimes, pe.snPrintTimes, pe.bigProcessMatchType, pe.snPrintColumnNumber, pe.isPrintQualityAssureIndia , pe.shiXiangDiCode," +
" pe.model , pe.productNumber , pe.snPackagePrintColumnNumber , pe.bigPackageMatchType , pe.isRepairWorkReport, pe.partPrice ) "); " pe.model , pe.productNumber , pe.snPackagePrintColumnNumber , pe.bigPackageMatchType , pe.isRepairWorkReport, pe.partPrice, pe.isManualReport ) ");
packHqlForQueryPart(hql, partExt); packHqlForQueryPart(hql, partExt);
hql.append(" order by pe.modifyDatetime desc "); hql.append(" order by pe.modifyDatetime desc ");

@ -266,6 +266,7 @@ public class PartExtDataService implements IPartExtDataService {
partExtDb.setSnPackagePrintColumnNumber(partExt.getSnPackagePrintColumnNumber()); partExtDb.setSnPackagePrintColumnNumber(partExt.getSnPackagePrintColumnNumber());
partExtDb.setBigPackageMatchType(partExt.getBigPackageMatchType()); partExtDb.setBigPackageMatchType(partExt.getBigPackageMatchType());
partExtDb.setIsRepairWorkReport(partExt.getIsRepairWorkReport()); partExtDb.setIsRepairWorkReport(partExt.getIsRepairWorkReport());
partExtDb.setIsManualReport(partExt.getIsManualReport());
new ConvertBeanExt(partExtDb).convertBean(partExtDb); new ConvertBeanExt(partExtDb).convertBean(partExtDb);
MesPartExt mesPartExt = partExtRepository.save(partExtDb); MesPartExt mesPartExt = partExtRepository.save(partExtDb);

@ -191,7 +191,7 @@ public class BuWorkOrderExtService implements IBuWorkOrderExtService {
throw ImppExceptionBuilder.newInstance() throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("物料【】不存在",mesWorkOrderExt.getPartNo()) .setErrorDetail("物料【%s】不存在",mesWorkOrderExt.getPartNo())
.build(); .build();
} }
//如果是返工工单 设置是否生成条码为不生成 //如果是返工工单 设置是否生成条码为不生成

@ -0,0 +1,37 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxManualReportTravelService;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesManualReportTravel;
import cn.estsh.i3plus.ext.mes.pojo.repository.MesManualReportTravelRepository;
import cn.estsh.i3plus.ext.mes.pojo.sqlpack.MesExtHqlPack;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.common.PagerHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @PROJECT_NAME: i3plus-mes-panasonic-jx
* @DESCRIPTION:
* @USER: xinwang.yi
* @DATE: 2023-10-27 10:18
*/
@Service
public class JxManualReportTravelService implements IJxManualReportTravelService {
@Autowired
private MesManualReportTravelRepository manualReportTravelRepository;
@Override
public ListPager<MesManualReportTravel> queryManualReportTravelByPager(MesManualReportTravel manualReportTravel, Pager pager) {
DdlPackBean packBean = MesExtHqlPack.getMesManualReportTravel(manualReportTravel);
pager = PagerHelper.getPager(pager, manualReportTravelRepository.findByHqlWhereCount(packBean));
packBean.setOrderByStr(manualReportTravel.orderBy());
return new ListPager(manualReportTravelRepository.findByHqlWhere(packBean), pager);
}
}

@ -0,0 +1,255 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxWorkOrderService;
import cn.estsh.i3plus.ext.mes.pojo.bean.*;
import cn.estsh.i3plus.ext.mes.pojo.model.AntiStaticCheckModel;
import cn.estsh.i3plus.ext.mes.pojo.model.jx.JxReworkSnModel;
import cn.estsh.i3plus.ext.mes.pojo.repository.*;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtEnumUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.common.PagerHelper;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.sqlpack.MesHqlPack;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.ldap.DataLdapTest;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @PROJECT_NAME: i3plus-mes-panasonic-jx
* @DESCRIPTION:
* @USER: xinwang.yi
* @DATE: 2023-10-30 15:44
*/
@Service
public class JxWorkOrderService implements IJxWorkOrderService {
@Autowired
private MesProduceSnExtRepository produceSnExtRepository;
@Autowired
private MesWorkOrderExtRepository workOrderExtRepository;
@Autowired
private MesWorkCenterExtRepository workCenterExtRepository;
@Autowired
private MesProduceSnRepairRepository produceSnRepairRepository;
@Autowired
private MesSubassemblyRemadeRecordRepository subassemblyRemadeRecordRepository;
// 产品条码
public static final Integer PRODUCT_SN_TYPE = 10;
// 包装条码
public static final Integer PACKAGE_SN_TYPE = 20;
@Override
public void deleteSnRepairByType(String workOrderNo, String[] snArr, String organizeCode, String userName) {
MesWorkCenterExt workCenterExt = getMesWorkCenterExt4WorkOrderNo(workOrderNo);
if (workCenterExt.getLineType().equals(MesExtEnumUtil.LINE_TYPE.ONTOLOGY_LINE.getDescription())) {
// 本体
deleteProduceSnRepair(workOrderNo, snArr, organizeCode, userName);
} else {
// 组件
deletePackageNoRepair(workOrderNo, snArr, organizeCode, userName);
}
}
@Override
public void deleteProduceSnRepair(String workOrderNo, String[] produceSnArr, String organizeCode, String userName) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workOrderNo, MesExtConstWords.WORK_ORDER_NO, packBean);
DdlPreparedPack.getInPackArray(produceSnArr, MesExtConstWords.PRODUCT_SN, packBean);
List<MesProduceSnRepair> produceSnRepairList = produceSnRepairRepository.findByHqlWhere(packBean);
Map<String, MesProduceSnRepair> produceSnRepairListByPs = produceSnRepairList.stream().collect(Collectors.toMap(MesProduceSnRepair::getProductSn, Function.identity(), (x, y) -> y));
if (CollectionUtils.isEmpty(produceSnRepairList)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_EXIT.getCode())
.setErrorDetail("条码无效")
.build();
}
String nowTime = TimeTool.getNowTime(true);
updateProduceSn(produceSnArr, produceSnRepairListByPs, organizeCode, userName, nowTime);
for (MesProduceSnRepair produceSnRepair : produceSnRepairList) {
produceSnRepair.setIsDeleted(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
produceSnRepair.setModifyUser(userName);
produceSnRepair.setModifyDatetime(nowTime);
produceSnRepair.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
}
produceSnRepairRepository.saveAll(produceSnRepairList);
}
@Override
public void deletePackageNoRepair(String workOrderNo, String[] packageNoArr, String organizeCode, String userName) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackArray(packageNoArr, MesExtConstWords.PACKAGENO, packBean);
DdlPreparedPack.getStringEqualPack(workOrderNo, MesExtConstWords.WORK_ORDER_NO, packBean);
List<MesSubassemblyRemadeRecord> subassemblyRemadeRecordList = subassemblyRemadeRecordRepository.findByHqlWhere(packBean);
if (CollectionUtils.isEmpty(subassemblyRemadeRecordList)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_EXIT.getCode())
.setErrorDetail("返工条码[%s]不存在")
.build();
}
for (MesSubassemblyRemadeRecord subassemblyRemadeRecord : subassemblyRemadeRecordList) {
subassemblyRemadeRecord.setIsDeleted(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
ConvertBean.serviceModelUpdate(subassemblyRemadeRecord, userName);
subassemblyRemadeRecord.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
}
subassemblyRemadeRecordRepository.saveAll(subassemblyRemadeRecordList);
}
@Override
public ListPager queryRepairSnByPager(String workOrderNo, String sn, String organizeCode, Pager pager) {
MesWorkCenterExt workCenterExt = getMesWorkCenterExt4WorkOrderNo(workOrderNo);
if (workCenterExt.getLineType().equals(MesExtEnumUtil.LINE_TYPE.ONTOLOGY_LINE.getDescription())) {
// 本体
return queryRepairProduceSnByPager(workOrderNo, sn, organizeCode, pager);
} else {
// 组件
return queryRepairPackageByPager(workOrderNo, sn, organizeCode, pager);
}
}
private MesWorkCenterExt getMesWorkCenterExt4WorkOrderNo(String workOrderNo) {
MesWorkOrderExt workOrderExt = workOrderExtRepository.getByProperty(
new String[]{MesExtConstWords.ORDER_NO, MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID},
new Object[]{workOrderNo, AuthUtil.getOrganize().getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()});
if (workOrderExt == null) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_EXIT.getCode())
.setErrorDetail("工单[%s]不存在", workOrderNo)
.build();
}
if (StringUtils.isEmpty(workOrderExt.getWorkCenterCode())) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_EXIT.getCode())
.setErrorDetail("工单[%s]未维护产线")
.build();
}
MesWorkCenterExt workCenterExt = workCenterExtRepository.getByProperty(
new String[]{MesExtConstWords.WORK_CENTER_CODE, MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID},
new Object[]{workOrderExt.getWorkCenterCode(), AuthUtil.getOrganize().getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()});
if (workCenterExt == null) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_EXIT.getCode())
.setErrorDetail("产线[%s]不存在", workOrderExt.getWorkCenterCode())
.build();
}
return workCenterExt;
}
@Override
public ListPager queryRepairPackageByPager(String workOrderNo, String packageNo, String organizeCode, Pager pager) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workOrderNo, MesExtConstWords.WORK_ORDER_NO, packBean);
DdlPreparedPack.getStringEqualPack(packageNo, MesExtConstWords.PACKAGENO, packBean);
pager = PagerHelper.getPager(pager, subassemblyRemadeRecordRepository.findByHqlWhereCount(packBean));
packBean.setOrderByStr(" order by modifyDatetime desc ");
List<MesSubassemblyRemadeRecord> subassemblyRemadeRecordList = subassemblyRemadeRecordRepository.findByHqlWherePage(packBean, pager);
List<JxReworkSnModel> jxReworkSnModels = new ArrayList<>();
for (MesSubassemblyRemadeRecord subassemblyRemadeRecord : subassemblyRemadeRecordList) {
JxReworkSnModel jxReworkSnModel = new JxReworkSnModel();
jxReworkSnModel.setWorkOrderNo(workOrderNo);
jxReworkSnModel.setSn(subassemblyRemadeRecord.getPackageNo());
jxReworkSnModels.add(jxReworkSnModel);
}
return new ListPager(jxReworkSnModels, pager);
}
@Override
public ListPager queryRepairProduceSnByPager(String workOrderNo, String sn, String organizeCode, Pager pager) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workOrderNo, MesExtConstWords.WORK_ORDER_NO, packBean);
DdlPreparedPack.getStringEqualPack(sn, MesExtConstWords.PRODUCT_SN, packBean);
pager = PagerHelper.getPager(pager, produceSnRepairRepository.findByHqlWhereCount(packBean));
packBean.setOrderByStr(" order by modifyDatetime desc ");
List<MesProduceSnRepair> produceSnRepairList = produceSnRepairRepository.findByHqlWherePage(packBean, pager);
List<JxReworkSnModel> jxReworkSnModels = new ArrayList<>();
for (MesProduceSnRepair produceSnRepair : produceSnRepairList) {
JxReworkSnModel jxReworkSnModel = new JxReworkSnModel();
jxReworkSnModel.setWorkOrderNo(workOrderNo);
jxReworkSnModel.setSn(produceSnRepair.getProductSn());
jxReworkSnModels.add(jxReworkSnModel);
}
return new ListPager(jxReworkSnModels, pager);
}
private void updateProduceSn(String[] productSnArr, Map<String, MesProduceSnRepair> produceSnRepairListByPs,
String organizeCode, String userName, String nowTime) {
DdlPackBean packBean1 = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackArray(productSnArr, MesExtConstWords.PRODUCT_SN, packBean1);
List<MesProduceSnExt> produceSnExtList = produceSnExtRepository.findByHqlWhere(packBean1);
for (MesProduceSnExt produceSnExt : produceSnExtList) {
if (produceSnRepairListByPs.containsKey(produceSnExt.getProductSn())) {
produceSnExt.setLastWorkOrderNo(produceSnRepairListByPs.get(produceSnExt.getProductSn()).getInitWorkOrderNo());
produceSnExt.setModifyUser(userName);
produceSnExt.setModifyUserExt(userName);
produceSnExt.setModifyDatetime(nowTime);
produceSnExt.setModifyUserExt(nowTime);
produceSnExt.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
produceSnExt.setSystemSyncStatusExt(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
} else {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_EXIT.getCode())
.setErrorDetail("返工条码[%s]不存在", produceSnExt.getProductSn())
.build();
}
}
produceSnExtRepository.saveAll(produceSnExtList);
}
}

@ -427,6 +427,13 @@ public class PartExtExcelService implements IExcelImportExtService {
} catch (Exception e) { } catch (Exception e) {
} }
//是否可手动报工
String isManualReport = null;
try {
row.getCell(36).setCellType(CellType.STRING);
isRepairWorkReport = row.getCell(36, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
} catch (Exception e) {
}
boolean isExist = false; boolean isExist = false;
//校验物料代码不重复 //校验物料代码不重复
@ -681,6 +688,14 @@ public class PartExtExcelService implements IExcelImportExtService {
} }
} }
if (!StringUtils.isEmpty(isRepairWorkReport)) {
if (StringUtils.isEmpty(MesExtEnumUtil.IS_REPAIR_WORK_REPORT.valueOfDescription(Integer.parseInt(isRepairWorkReport)))) {
++errorNum;
cellNum = cellNum + "AJ;";
errorInfo = errorInfo + "第AJ列数据无效;";
}
}
if (errorNum == 0) { if (errorNum == 0) {
MesPartExt mesPart; MesPartExt mesPart;
if (isExist) { if (isExist) {
@ -773,6 +788,7 @@ public class PartExtExcelService implements IExcelImportExtService {
mesPart.setSnPackagePrintColumnNumber(StringUtils.isEmpty(snPackagePrintColumnNumber) ? 0 : Integer.parseInt(snPackagePrintColumnNumber)); mesPart.setSnPackagePrintColumnNumber(StringUtils.isEmpty(snPackagePrintColumnNumber) ? 0 : Integer.parseInt(snPackagePrintColumnNumber));
mesPart.setBigPackageMatchType(StringUtils.isEmpty(bigPackageMatchType) ? MesExtEnumUtil.ENCODE_MATCH_TYPE.PART.getValue() : MesExtEnumUtil.ENCODE_MATCH_TYPE.descriptionOfValue(bigPackageMatchType)); mesPart.setBigPackageMatchType(StringUtils.isEmpty(bigPackageMatchType) ? MesExtEnumUtil.ENCODE_MATCH_TYPE.PART.getValue() : MesExtEnumUtil.ENCODE_MATCH_TYPE.descriptionOfValue(bigPackageMatchType));
mesPart.setIsRepairWorkReport(StringUtils.isEmpty(isRepairWorkReport) ? MesExtEnumUtil.IS_REPAIR_WORK_REPORT.YES.getValue() : Integer.parseInt(isRepairWorkReport)); mesPart.setIsRepairWorkReport(StringUtils.isEmpty(isRepairWorkReport) ? MesExtEnumUtil.IS_REPAIR_WORK_REPORT.YES.getValue() : Integer.parseInt(isRepairWorkReport));
mesPart.setIsManualReport(StringUtils.isEmpty(isManualReport) ? MesExtEnumUtil.IS_MANUAL_REPORT.YES.getValue() : Integer.parseInt(isManualReport));
new ConvertBeanExt(mesPart).convertBean(mesPart); new ConvertBeanExt(mesPart).convertBean(mesPart);
partExtList.add(mesPart); partExtList.add(mesPart);

@ -154,7 +154,7 @@ public class ProcessFirstItemExtExcelService implements IExcelImportExtService {
String manageType = null; String manageType = null;
try { try {
row.getCell(2).setCellType(CellType.STRING); row.getCell(2).setCellType(CellType.STRING);
partNo = row.getCell(2, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim(); manageType = row.getCell(2, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
} catch (Exception e) { } catch (Exception e) {
} }
@ -162,7 +162,7 @@ public class ProcessFirstItemExtExcelService implements IExcelImportExtService {
String importanceSafePartNo = null; String importanceSafePartNo = null;
try { try {
row.getCell(3).setCellType(CellType.STRING); row.getCell(3).setCellType(CellType.STRING);
partNo = row.getCell(3, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim(); importanceSafePartNo = row.getCell(3, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
} catch (Exception e) { } catch (Exception e) {
} }
@ -178,7 +178,7 @@ public class ProcessFirstItemExtExcelService implements IExcelImportExtService {
String checkFrequency = null; String checkFrequency = null;
try { try {
row.getCell(5).setCellType(CellType.STRING); row.getCell(5).setCellType(CellType.STRING);
partNo = row.getCell(5, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim(); checkFrequency = row.getCell(5, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
} catch (Exception e) { } catch (Exception e) {
} }
@ -186,7 +186,7 @@ public class ProcessFirstItemExtExcelService implements IExcelImportExtService {
String sampleQty = null; String sampleQty = null;
try { try {
row.getCell(6).setCellType(CellType.STRING); row.getCell(6).setCellType(CellType.STRING);
partNo = row.getCell(6, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim(); sampleQty = row.getCell(6, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
} catch (Exception e) { } catch (Exception e) {
} }
@ -194,31 +194,31 @@ public class ProcessFirstItemExtExcelService implements IExcelImportExtService {
String confirmMethod = null; String confirmMethod = null;
try { try {
row.getCell(7).setCellType(CellType.STRING); row.getCell(7).setCellType(CellType.STRING);
partNo = row.getCell(7, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim(); confirmMethod = row.getCell(7, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
} catch (Exception e) { } catch (Exception e) {
} }
//检测标准 //检测标准
String checkStand = null; String checkStand = null;
try { try {
row.getCell(4).setCellType(CellType.STRING); row.getCell(8).setCellType(CellType.STRING);
checkStand = row.getCell(4, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim(); checkStand = row.getCell(8, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
} catch (Exception e) { } catch (Exception e) {
} }
//上限值 //上限值
String upLimits = null; String upLimits = null;
try { try {
row.getCell(5).setCellType(CellType.STRING); row.getCell(9).setCellType(CellType.STRING);
upLimits = row.getCell(5, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim(); upLimits = row.getCell(9, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
} catch (Exception e) { } catch (Exception e) {
} }
//下限值 //下限值
String downLimits = null; String downLimits = null;
try { try {
row.getCell(5).setCellType(CellType.STRING); row.getCell(10).setCellType(CellType.STRING);
downLimits = row.getCell(5, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim(); downLimits = row.getCell(10, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
} catch (Exception e) { } catch (Exception e) {
} }
@ -254,7 +254,7 @@ public class ProcessFirstItemExtExcelService implements IExcelImportExtService {
if (StringUtils.isEmpty(manageType)) { if (StringUtils.isEmpty(manageType)) {
errorNum++; errorNum++;
cellNum += "C;"; cellNum += "C;";
errorInfo += "第C列数据必填;"; errorInfo += "第C列数据无效;";
} }
} }

@ -1,385 +0,0 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.excel.bu3;
import cn.estsh.i3plus.ext.mes.api.base.IExcelImportExtService;
import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.CommonExtService;
import cn.estsh.i3plus.ext.mes.pojo.bean.*;
import cn.estsh.i3plus.ext.mes.pojo.model.ExcelImportErrorExtModel;
import cn.estsh.i3plus.ext.mes.pojo.model.ExcelImportResultExtModel;
import cn.estsh.i3plus.ext.mes.pojo.repository.*;
import cn.estsh.i3plus.ext.mes.pojo.util.ConvertBeanExt;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtEnumUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-04-23
* @Modify:
**/
@Service
public class SxWorkOrderBindUnbindSnExcelService implements IExcelImportExtService {
@Autowired
private MesProduceSnExtRepository produceSnExtRepository;
@Autowired
private MesWorkOrderExtRepository workOrderExtRepository;
@Autowired
private MesUnbindProduceSnRepository unBindProduceSnRepository;
@Autowired
private MesUnbindProduceSnTravelRepository unBindProduceSnTravelRepository;
@Autowired
private CommonExtService commonExtService;
/**
* SOP
* @param workbook
* @param organizeCode
* @param userName
* @return
*/
@Override
public ExcelImportResultExtModel insertDataByExcel(Workbook workbook, String organizeCode, String userName) {
//读取表格
ExcelImportResultExtModel excelImportResultExtModel = this.sheetExtractUnbindSnBind(workbook.getSheetAt(0), organizeCode, userName);
return excelImportResultExtModel;
}
/**
* SOP-
* @param sheetAt
* @param organizeCode
* @param userName
* @return
*/
private ExcelImportResultExtModel sheetExtractUnbindSnBind(Sheet sheetAt, String organizeCode, String userName) {
//从0行开始读取
int totalNumberOfRows = sheetAt.getLastRowNum() + 1;
Map<String, MesWorkOrderExt> workOrderMapByOrderNo = new HashMap<>();
// 工单待绑定条码数量
Map<String, Double> boundProdSnQtyMapByOrderNo = new HashMap<>();
// 工单已绑定数量
//Map<String, List<MesProduceSnExt>> produceSnMapByOrderNo = new HashMap<>();
Map<String, Integer> existProduceSnMap = new HashMap<>();
List<MesProduceSnExt> produceSnDbList = new ArrayList<>();
List<MesUnbindProduceSn> unBindProduceSnDbList = new ArrayList<>();
List<MesUnbindProduceSnTravel> unBindProduceSnTravelList = new ArrayList<>();
// 根据物料编码分组解绑条码集合
Map<String, Map<String, MesUnbindProduceSn>> unbindProduceSnMapByPartNo = new HashMap<>();
//成功数量
Integer successRowNum = 0;
//失败数量
Integer failRowNum = 0;
//错误的行号
String errorRows = "";
//错误行信息集合
List<ExcelImportErrorExtModel> excelImportErrorExtModels = new ArrayList<>();
String nowTime = TimeTool.getNowTime(MesExtConstWords.DATE_FORMAT_YM);
//从excel表的第5行数据开始导入getFirstRowNum是从0行开始读取
for (int i = (sheetAt.getFirstRowNum() + 4); i < totalNumberOfRows; i++) {
Row row = sheetAt.getRow(i);
//空行跳过
if (null == row) {
continue;
}
//获取总列数
Short lastCellNum = row.getLastCellNum();
if (lastCellNum > 0) {
int rowNum = i + 1; //当前行号
int errorNum = 0; //错误数量
String cellNum = ""; //错误列号
String errorInfo = ""; //错误信息
//工单号
try {
//第一列必须有值,否则跳过
row.getCell(0).setCellType(CellType.STRING);
} catch (Exception e) {
continue;
}
String workOrderNo = row.getCell(0, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
//本体条码
String produceSn = null;
try {
row.getCell(1).setCellType(CellType.STRING);
produceSn = row.getCell(1, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
} catch (Exception e) {
}
MesWorkOrderExt workOrderExt = null;
//校验工单是否为空
if (StringUtils.isEmpty(workOrderNo)) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据必填;";
} else {
//校验工单是否存在,如果不存在则从数据库获取,如果存在则从集合中获取
if (!workOrderMapByOrderNo.containsKey(workOrderNo)) {
workOrderExt = workOrderExtRepository.getByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.ORDER_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workOrderNo});
if (workOrderExt == null) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据不存在;";
} else if (workOrderExt.getWorkOrderStatus() != MesExtEnumUtil.WORK_ORDER_STATUS.CREATE.getValue()) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据当前状态为【"+ MesExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus()) +"】,不为【创建】状态;";
} else if (workOrderExt.getPlanQty() != 0) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据当前存在改造数量;";
} else if (workOrderExt.getWorkOrderType() != MesExtEnumUtil.WORK_ORDER_TYPE.STANDARD_ORDER.getValue()) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据不为正常工单;";
} else {
List<MesProduceSnExt> produceSnExtList = produceSnExtRepository.findByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.WORK_ORDER_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workOrderNo});
Double boundSnQty = MathOperation.sub(MathOperation.sub(workOrderExt.getQty(), workOrderExt.getPlanQty()), produceSnExtList.size());
if (boundSnQty <= 0) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列工单" + workOrderNo + "已绑定足额条码,无需再绑定;";
} else {
workOrderMapByOrderNo.put(workOrderNo, workOrderExt);
boundProdSnQtyMapByOrderNo.put(workOrderNo, boundSnQty);
}
}
} else {
workOrderExt = workOrderMapByOrderNo.get(workOrderNo);
}
}
MesUnbindProduceSn unbindProduceSn = null;
MesProduceSnExt produceSnExt = null;
if (errorNum == 0) {
//校验播放时长
if (StringUtils.isEmpty(produceSn)) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据必填;";
} else if (existProduceSnMap.containsKey(produceSn)) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据与 "+ existProduceSnMap.get(produceSn) +"行B列重复;";
} else {
Map<String, MesUnbindProduceSn> unbindProduceSnMapBySn;
if (unbindProduceSnMapByPartNo.containsKey(workOrderExt.getPartNo())) {
unbindProduceSnMapBySn = unbindProduceSnMapByPartNo.get(workOrderExt.getPartNo());
if (unbindProduceSnMapBySn.containsKey(produceSn)) {
unbindProduceSn = unbindProduceSnMapBySn.get(produceSn);
if (unbindProduceSn.getBindStatus() == MesExtEnumUtil.BIND_STATUS.BINGDING.getValue()) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据已绑定工单"+ unbindProduceSn.getWorkOrderNo() +";";
} else {
Double boundSnQty = boundProdSnQtyMapByOrderNo.get(workOrderNo);
boundSnQty--;
// 判断该行条码是否已超工单计划数量
if (boundSnQty < 0 ) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据已超工单计划数量请重新调整导入;";
} else {
produceSnExt = produceSnExtRepository.getByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.SERIAL_NUMBER},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), produceSn});
if (produceSnExt == null) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据本体条码已不存在;";
}
boundProdSnQtyMapByOrderNo.put(workOrderNo, boundSnQty);
}
}
} else {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据无效;";
}
} else {
List<MesUnbindProduceSn> unbindProduceSnList = getMesUnbindProduceSns(organizeCode, nowTime, workOrderExt);
if (CollectionUtils.isEmpty(unbindProduceSnList)) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据不存在;";
} else {
unbindProduceSnMapBySn = unbindProduceSnList.stream().collect(Collectors.toMap( MesUnbindProduceSn::getSerialNumber, Function.identity(), (x, y) -> y));
if (unbindProduceSnMapBySn.containsKey(produceSn)) {
unbindProduceSnMapByPartNo.put(workOrderExt.getPartNo(), unbindProduceSnMapBySn);
unbindProduceSn = unbindProduceSnMapBySn.get(produceSn);
if (unbindProduceSnMapBySn.containsKey(produceSn)) {
if (unbindProduceSn.getBindStatus() == MesExtEnumUtil.BIND_STATUS.BINGDING.getValue()) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据已绑定工单"+ unbindProduceSn.getWorkOrderNo() +";";
} else {
Double boundSnQty = boundProdSnQtyMapByOrderNo.get(workOrderNo);
boundSnQty--;
if (boundSnQty < 0 ) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据已超工单计划数量请重新调整导入;";
} else {
produceSnExt = produceSnExtRepository.getByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.SERIAL_NUMBER},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), produceSn});
if (produceSnExt == null) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据本体条码已不存在;";
}
boundProdSnQtyMapByOrderNo.put(workOrderNo, boundSnQty);
}
}
} else {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据不存在;";
}
} else {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据不存在;";
}
}
}
}
}
//没有错误的时候封装MesUnbindProduceSn
if (errorNum == 0) {
// 记录已录入条码
existProduceSnMap.put(produceSn, rowNum);
produceSnExt.setWorkOrderNo(workOrderNo);
produceSnExt.setLastWorkOrderNo(workOrderNo);
produceSnExt.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
ConvertBean.serviceModelUpdate(produceSnExt, userName);
new ConvertBeanExt(produceSnExt).convertBean(produceSnExt);
produceSnDbList.add(produceSnExt);
unbindProduceSn.setWorkOrderNo(workOrderNo);
unbindProduceSn.setBindStatus(MesExtEnumUtil.BIND_STATUS.BINGDING.getValue());
unbindProduceSn.setWorkCenterCode(workOrderExt.getWorkCenterCode());
unbindProduceSn.setStartTime(workOrderExt.getStartTime());
unbindProduceSn.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
ConvertBean.serviceModelUpdate(unbindProduceSn, userName);
unBindProduceSnDbList.add(unbindProduceSn);
MesUnbindProduceSnTravel unbindProduceSnTravel = new MesUnbindProduceSnTravel();
BeanUtils.copyProperties(unbindProduceSn, unbindProduceSnTravel, MesExtConstWords.ID, MesExtConstWords.CREATE_USER, MesExtConstWords.CREATE_DATE_TIME, MesExtConstWords.MODIFY_USER, MesExtConstWords.MODIFY_DATE_TIME);
ConvertBean.serviceModelUpdate(unbindProduceSnTravel, userName);
unBindProduceSnTravelList.add(unbindProduceSnTravel);
successRowNum ++;
} else {
//封装错误行信息ExcelImportErrorExtModel
excelImportErrorExtModels = commonExtService.getExcelImportErrorModels(excelImportErrorExtModels, rowNum, errorNum, cellNum, errorInfo);
errorRows += rowNum + ";";
failRowNum ++;
}
}
}
//校验EXCEL数据
commonExtService.checkExcelData(failRowNum, successRowNum, errorRows);
//封装返回结果
ExcelImportResultExtModel excelImportResultExtModel = commonExtService.getExcelImportResultModel(failRowNum, successRowNum, excelImportErrorExtModels, errorRows);
excelImportResultExtModel.setExcelList((failRowNum > 0) ? null : unBindProduceSnDbList);
List<MesWorkOrderExt> workOrderExtList = new ArrayList<>();
for (Map.Entry<String, Double> workBoundProdSnQty : boundProdSnQtyMapByOrderNo.entrySet()) {
if (workBoundProdSnQty.getValue() == 0) {
MesWorkOrderExt workOrderExt = workOrderMapByOrderNo.get(workBoundProdSnQty.getKey());
workOrderExt.setSnCreateStatus(MesExtEnumUtil.WORK_ORDER_SN_CREATE_STATUS.CREATED.getValue());
new ConvertBeanExt(workOrderExt).convertBean(workOrderExt);
workOrderExtList.add(workOrderExt);
}
}
if (failRowNum == 0) {
insertExcelMesUnbindProduce(unBindProduceSnDbList, unBindProduceSnTravelList, produceSnDbList, workOrderExtList);
}
return excelImportResultExtModel;
}
private List<MesUnbindProduceSn> getMesUnbindProduceSns(String organizeCode, String nowTime, MesWorkOrderExt workOrderExt) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringRightLikerPack(nowTime, MesExtConstWords.START_TIME, packBean);
DdlPreparedPack.getStringEqualPack(workOrderExt.getPartNo(), MesExtConstWords.PART_NO, packBean);
return unBindProduceSnRepository.findByHqlWhere(packBean);
}
/**
* -
* @param unbindProduceSns
* @param unbindProduceSnTravels
*/
private void insertExcelMesUnbindProduce(List<MesUnbindProduceSn> unbindProduceSns, List<MesUnbindProduceSnTravel> unbindProduceSnTravels, List<MesProduceSnExt> produceSnExtList, List<MesWorkOrderExt> workOrderExtList) {
//导入数据
if (!CollectionUtils.isEmpty(unbindProduceSns)) unBindProduceSnRepository.saveAll(unbindProduceSns);
if (!CollectionUtils.isEmpty(unbindProduceSnTravels)) unBindProduceSnTravelRepository.saveAll(unbindProduceSnTravels);
if (!CollectionUtils.isEmpty(produceSnExtList)) produceSnExtRepository.saveAll(produceSnExtList);
if (!CollectionUtils.isEmpty(workOrderExtList)) workOrderExtRepository.saveAll(workOrderExtList);
}
}

@ -0,0 +1,356 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.excel.jx;
import cn.estsh.i3plus.ext.mes.api.base.IExcelImportExtService;
import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.CommonExtService;
import cn.estsh.i3plus.ext.mes.pojo.bean.*;
import cn.estsh.i3plus.ext.mes.pojo.model.ExcelImportErrorExtModel;
import cn.estsh.i3plus.ext.mes.pojo.model.ExcelImportResultExtModel;
import cn.estsh.i3plus.ext.mes.pojo.repository.*;
import cn.estsh.i3plus.ext.mes.pojo.util.ConvertBeanExt;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtEnumUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-04-23
* @Modify:
**/
@Service
public class SxReworkOrderBindSnExcelService implements IExcelImportExtService {
@Autowired
private MesProduceSnExtRepository produceSnExtRepository;
@Autowired
private MesProduceSnRepairRepository produceSnRepairRepository;
@Autowired
private MesWorkOrderExtRepository workOrderExtRepository;
@Autowired
private MesReworkOrderBindSnTravelRepository reworkOrderBindSnTravelRepository;
@Autowired
private CommonExtService commonExtService;
/**
* SOP
* @param workbook
* @param organizeCode
* @param userName
* @return
*/
@Override
public ExcelImportResultExtModel insertDataByExcel(Workbook workbook, String organizeCode, String userName) {
//读取表格
ExcelImportResultExtModel excelImportResultExtModel = this.sheetExtractUnbindSnBind(workbook.getSheetAt(0), organizeCode, userName);
return excelImportResultExtModel;
}
/**
* SOP-
* @param sheetAt
* @param organizeCode
* @param userName
* @return
*/
private ExcelImportResultExtModel sheetExtractUnbindSnBind(Sheet sheetAt, String organizeCode, String userName) {
//从0行开始读取
int totalNumberOfRows = sheetAt.getLastRowNum() + 1;
Map<String, MesWorkOrderExt> workOrderMapByOrderNo = new HashMap<>();
Map<String, String> finalWorkOrderNoBySn = new HashMap<>();
// 工单待绑定条码数量
Map<String, Double> boundProdSnQtyMapByOrderNo = new HashMap<>();
// 工单已绑定数量
//Map<String, List<MesProduceSnExt>> produceSnMapByOrderNo = new HashMap<>();
Map<String, Integer> existProduceSnMap = new HashMap<>();
List<MesProduceSnExt> produceSnDbList = new ArrayList<>();
List<MesProduceSnRepair> produceSnRepairList = new ArrayList<>();
List<MesReworkOrderBindSnTravel> reworkOrderBindSnTravelList = new ArrayList<>();
//成功数量
Integer successRowNum = 0;
//失败数量
Integer failRowNum = 0;
//错误的行号
String errorRows = "";
//错误行信息集合
List<ExcelImportErrorExtModel> excelImportErrorExtModels = new ArrayList<>();
//String nowTime = TimeTool.getNowTime(MesExtConstWords.DATE_FORMAT_YM);
//从excel表的第5行数据开始导入getFirstRowNum是从0行开始读取
for (int i = (sheetAt.getFirstRowNum() + 4); i < totalNumberOfRows; i++) {
Row row = sheetAt.getRow(i);
//空行跳过
if (null == row) {
continue;
}
//获取总列数
Short lastCellNum = row.getLastCellNum();
if (lastCellNum > 0) {
int rowNum = i + 1; //当前行号
int errorNum = 0; //错误数量
String cellNum = ""; //错误列号
String errorInfo = ""; //错误信息
//工单号
try {
//第一列必须有值,否则跳过
row.getCell(0).setCellType(CellType.STRING);
} catch (Exception e) {
continue;
}
String workOrderNo = row.getCell(0, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
//本体条码
String produceSn = null;
try {
row.getCell(1).setCellType(CellType.STRING);
produceSn = row.getCell(1, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
} catch (Exception e) {
}
MesWorkOrderExt workOrderExt = null;
//校验工单是否为空
if (StringUtils.isEmpty(workOrderNo)) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据必填;";
} else {
//校验工单是否存在,如果不存在则从数据库获取,如果存在则从集合中获取
workOrderExt = getMesWorkOrderExt(organizeCode, workOrderMapByOrderNo, workOrderNo);
if (workOrderExt == null) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据不存在;";
} else if (workOrderExt.getWorkOrderStatus() != MesExtEnumUtil.WORK_ORDER_STATUS.CREATE.getValue()) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据当前状态为【"+ MesExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus()) +"】,不为【创建】状态;";
} else if (workOrderExt.getPlanQty() != 0) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据当前存在改造数量;";
} else if (workOrderExt.getWorkOrderType() != MesExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue()) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据不为返工工单;";
} else {
Double boundSnQty = getBoundSnQty(organizeCode, boundProdSnQtyMapByOrderNo, workOrderNo);
if (boundSnQty > workOrderExt.getQty()) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列工单" + workOrderNo + "已绑定足额条码,无需再绑定;";
} else {
workOrderMapByOrderNo.put(workOrderNo, workOrderExt);
boundProdSnQtyMapByOrderNo.put(workOrderNo, boundSnQty);
}
}
}
MesProduceSnExt produceSnExt = null;
if (errorNum == 0) {
//校验播放时长
if (StringUtils.isEmpty(produceSn)) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据必填;";
} else if (existProduceSnMap.containsKey(produceSn)) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据与 "+ existProduceSnMap.get(produceSn) +"行B列重复;";
} else {
produceSnExt = produceSnExtRepository.getByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.PRODUCT_SN},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), produceSn});
if (null == produceSnExt) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据条码[" + produceSn + "]不存在;";
} else {
if (MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() != produceSnExt.getSnStatus()) {
if (MesExtEnumUtil.PRODUCE_SN_STATUS.REPAIR.getValue() == produceSnExt.getSnStatus()) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据条码[" + produceSn +"]状态为返工,已绑定返工工单["+ produceSnExt.getLastWorkOrderNo() + "];";
} else {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据条码[" + produceSn + "]状态为["+ MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSnExt.getSnStatus()) + "];";
}
}
if (MesExtEnumUtil.PRODUCE_SN_QC_STATUS.QUALIFIED.getValue() != produceSnExt.getQcStatus()) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据条码[" + produceSn +"]质量状态为["+ MesExtEnumUtil.PRODUCE_SN_QC_STATUS.valueOfDescription(produceSnExt.getQcStatus()) + "];";
}
if (!produceSnExt.getPartNo().equals(workOrderExt.getPartNo())) {
errorNum ++;
cellNum += "B;";
errorInfo += "工单[" + workOrderNo +"]关联的物料编码["+ workOrderExt.getPartNo() +"]与产品条码["+ produceSnExt.getProductSn() +"]关联的物料编码["+ produceSnExt.getPartNo() +"]不一致;";
}
MesProduceSnRepair produceSnRepairBySn = getProduceSnRepairBySn(organizeCode, produceSn);
if (produceSnRepairBySn != null) {
if (produceSnRepairBySn.getWorkOrderNo().equals(workOrderNo)) {
errorNum ++;
cellNum += "B;";
errorInfo += "条码["+ produceSnExt.getProductSn() +"]已经绑定过返工工单["+ produceSnRepairBySn.getWorkOrderNo() +"];";
} else if (StringUtils.isEmpty(produceSnRepairBySn.getOutWorkCenterTime())) {
errorNum ++;
cellNum += "B;";
errorInfo += "条码["+ produceSnExt.getProductSn() +"]已经绑定过其他的返工工单["+ workOrderNo +"]且未下线;";
}
}
}
}
}
//没有错误的时候封装MesUnbindProduceSn
if (errorNum == 0) {
// 记录已录入条码
existProduceSnMap.put(produceSn, rowNum);
MesProduceSnRepair produceSnRepair = new MesProduceSnRepair();
produceSnRepair.setSerialNumber(produceSnExt.getSerialNumber());
produceSnRepair.setProductSn(produceSnExt.getProductSn());
produceSnRepair.setPartNo(produceSnExt.getPartNo());
produceSnRepair.setPartNameRdd(produceSnExt.getPartNameRdd());
produceSnRepair.setWorkCenterCode(workOrderExt.getWorkCenterCode());
produceSnRepair.setWorkOrderNo(workOrderNo);
produceSnRepair.setInitWorkOrderNo(produceSnExt.getLastWorkOrderNo());
produceSnRepair.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.REWORK_SN.getValue());
produceSnRepair.setOrganizeCode(organizeCode);
ConvertBean.serviceModelInitialize(produceSnRepair, userName);
produceSnRepair.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
MesReworkOrderBindSnTravel reworkOrderBindSnTravel = new MesReworkOrderBindSnTravel();
BeanUtils.copyProperties(produceSnRepair, reworkOrderBindSnTravel);
reworkOrderBindSnTravel.setBindStatus(MesExtEnumUtil.BIND_STATUS.BINGDING.getValue());
reworkOrderBindSnTravelList.add(reworkOrderBindSnTravel);
produceSnRepairList.add(produceSnRepair);
finalWorkOrderNoBySn.put(produceSnExt.getProductSn(), workOrderNo);
produceSnDbList.add(produceSnExt);
successRowNum ++;
} else {
//封装错误行信息ExcelImportErrorExtModel
excelImportErrorExtModels = commonExtService.getExcelImportErrorModels(excelImportErrorExtModels, rowNum, errorNum, cellNum, errorInfo);
errorRows += rowNum + ";";
failRowNum ++;
}
}
}
//校验EXCEL数据
commonExtService.checkExcelData(failRowNum, successRowNum, errorRows);
//封装返回结果
ExcelImportResultExtModel excelImportResultExtModel = commonExtService.getExcelImportResultModel(failRowNum, successRowNum, excelImportErrorExtModels, errorRows);
List<MesWorkOrderExt> workOrderExtList = new ArrayList<>();
for (Map.Entry<String, Double> workBoundProdSnQty : boundProdSnQtyMapByOrderNo.entrySet()) {
if (workBoundProdSnQty.getValue() == 0) {
MesWorkOrderExt workOrderExt = workOrderMapByOrderNo.get(workBoundProdSnQty.getKey());
workOrderExt.setSnCreateStatus(MesExtEnumUtil.WORK_ORDER_SN_CREATE_STATUS.NO_CREATE.getValue());
new ConvertBeanExt(workOrderExt).convertBean(workOrderExt);
workOrderExtList.add(workOrderExt);
}
}
if (failRowNum == 0) {
for (MesProduceSnExt produceSnExt : produceSnDbList) {
ConvertBean.serviceModelUpdate(produceSnExt, userName);
new ConvertBeanExt(produceSnExt).convertBean(produceSnExt);
produceSnExt.setLastWorkOrderNo(finalWorkOrderNoBySn.get(produceSnExt.getProductSn()));
produceSnExt.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
}
insertExcel(produceSnDbList, workOrderExtList, produceSnRepairList, reworkOrderBindSnTravelList);
}
return excelImportResultExtModel;
}
private Double getBoundSnQty(String organizeCode, Map<String, Double> boundProdSnQtyMapByOrderNo, String workOrderNo) {
if (boundProdSnQtyMapByOrderNo.containsKey(workOrderNo)) {
return boundProdSnQtyMapByOrderNo.get(workOrderNo);
} else {
List<MesProduceSnRepair> produceSnRepairDbList = produceSnRepairRepository.findByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.WORK_ORDER_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workOrderNo});
return CollectionUtils.isEmpty(produceSnRepairDbList) ? 0.0 : produceSnRepairDbList.size();
}
}
private MesWorkOrderExt getMesWorkOrderExt(String organizeCode, Map<String, MesWorkOrderExt> workOrderMapByOrderNo, String workOrderNo) {
MesWorkOrderExt workOrderExt;
if (!workOrderMapByOrderNo.containsKey(workOrderNo)) {
workOrderExt = workOrderExtRepository.getByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.ORDER_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workOrderNo});
} else {
workOrderExt = workOrderMapByOrderNo.get(workOrderNo);
}
return workOrderExt;
}
/**
* -
* @param produceSnExtList
* @param workOrderExtList
* @param produceSnRepairList
* @param reworkOrderBindSnTravelList
*/
private void insertExcel(List<MesProduceSnExt> produceSnExtList, List<MesWorkOrderExt> workOrderExtList, List<MesProduceSnRepair> produceSnRepairList, List<MesReworkOrderBindSnTravel> reworkOrderBindSnTravelList) {
//导入数据
if (!CollectionUtils.isEmpty(produceSnExtList)) produceSnExtRepository.saveAll(produceSnExtList);
if (!CollectionUtils.isEmpty(workOrderExtList)) workOrderExtRepository.saveAll(workOrderExtList);
if (!CollectionUtils.isEmpty(produceSnRepairList)) produceSnRepairRepository.saveAll(produceSnRepairList);
if (!CollectionUtils.isEmpty(reworkOrderBindSnTravelList)) reworkOrderBindSnTravelRepository.saveAll(reworkOrderBindSnTravelList);
}
private MesProduceSnRepair getProduceSnRepairBySn(String organizeCode, String productSn) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(productSn)) {
return null;
}
List<MesProduceSnRepair> produceSnRepairList = produceSnRepairRepository.findByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.PRODUCT_SN},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn},
" order by createDatetime desc ");
return !CollectionUtils.isEmpty(produceSnRepairList) ? produceSnRepairList.get(0) : null;
}
}

@ -0,0 +1,357 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.excel.jx;
import cn.estsh.i3plus.ext.mes.api.base.IExcelImportExtService;
import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.CommonExtService;
import cn.estsh.i3plus.ext.mes.pojo.bean.*;
import cn.estsh.i3plus.ext.mes.pojo.model.ExcelImportErrorExtModel;
import cn.estsh.i3plus.ext.mes.pojo.model.ExcelImportResultExtModel;
import cn.estsh.i3plus.ext.mes.pojo.repository.*;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtEnumUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesEnumUtil;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-04-23
* @Modify:
**/
@Service
public class SxReworkOrderBindZjSnExcelService implements IExcelImportExtService {
@Autowired
private MesPackageExtRepository packageExtRepository;
@Autowired
private MesSubassemblyRemadeRecordRepository subassemblyRemadeRecordRepository;
@Autowired
private MesPartExtRepository partExtRepository;
@Autowired
private MesWorkOrderExtRepository workOrderExtRepository;
@Autowired
private CommonExtService commonExtService;
/**
* SOP
* @param workbook
* @param organizeCode
* @param userName
* @return
*/
@Override
public ExcelImportResultExtModel insertDataByExcel(Workbook workbook, String organizeCode, String userName) {
//读取表格
ExcelImportResultExtModel excelImportResultExtModel = this.sheetExtractUnbindSnBind(workbook.getSheetAt(0), organizeCode, userName);
return excelImportResultExtModel;
}
/**
* SOP-
* @param sheetAt
* @param organizeCode
* @param userName
* @return
*/
private ExcelImportResultExtModel sheetExtractUnbindSnBind(Sheet sheetAt, String organizeCode, String userName) {
//从0行开始读取
int totalNumberOfRows = sheetAt.getLastRowNum() + 1;
Map<String, MesWorkOrderExt> workOrderMapByOrderNo = new HashMap<>();
Map<String, List<String>> packSnByWorkOrderNo = new HashMap<>();
Map<String, MesPartExt> partMap = new HashMap<>();
// 工单待绑定条码数量
Map<String, Double> boundProdSnQtyMapByOrderNo = new HashMap<>();
// 工单已绑定数量
Map<String, Integer> existPackageSnMap = new HashMap<>();
List<MesSubassemblyRemadeRecord> subassemblyRemadeRecordList = new ArrayList<>();
//成功数量
Integer successRowNum = 0;
//失败数量
Integer failRowNum = 0;
//错误的行号
String errorRows = "";
//错误行信息集合
List<ExcelImportErrorExtModel> excelImportErrorExtModels = new ArrayList<>();
//String nowTime = TimeTool.getNowTime(MesExtConstWords.DATE_FORMAT_YM);
//从excel表的第5行数据开始导入getFirstRowNum是从0行开始读取
for (int i = (sheetAt.getFirstRowNum() + 4); i < totalNumberOfRows; i++) {
Row row = sheetAt.getRow(i);
//空行跳过
if (null == row) {
continue;
}
//获取总列数
Short lastCellNum = row.getLastCellNum();
if (lastCellNum > 0) {
int rowNum = i + 1; //当前行号
int errorNum = 0; //错误数量
String cellNum = ""; //错误列号
String errorInfo = ""; //错误信息
//工单号
try {
//第一列必须有值,否则跳过
row.getCell(0).setCellType(CellType.STRING);
} catch (Exception e) {
continue;
}
String workOrderNo = row.getCell(0, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
//包装条码
String packageNo = null;
try {
row.getCell(1).setCellType(CellType.STRING);
packageNo = row.getCell(1, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue().trim();
} catch (Exception e) {
}
MesWorkOrderExt workOrderExt = null;
//校验工单是否为空
if (StringUtils.isEmpty(workOrderNo)) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据必填;";
} else {
//校验工单是否存在,如果不存在则从数据库获取,如果存在则从集合中获取
workOrderExt = getMesWorkOrderExt(organizeCode, workOrderMapByOrderNo, workOrderNo);
MesPartExt partExt = null;
partExt = getMesPartExt(organizeCode, partMap, workOrderExt, partExt);
if (partExt == null) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据工单[" + workOrderNo + "]关联物料["+ workOrderExt.getPartNo() +"]不存在;";
} else {
partMap.put(workOrderExt.getPartNo(), partExt);
// 组件
if (!StringUtils.isEmpty(partExt.getCategoryCode3()) && partExt.getCategoryCode3().equals("10")) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据工单[" + workOrderNo + "]关联物料["+ workOrderExt.getPartNo() +"]不为组件;";
}
}
Double boundSnQty = 0.0;
if (workOrderExt == null) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据不存在;";
} else if (workOrderExt.getWorkOrderStatus() != MesExtEnumUtil.WORK_ORDER_STATUS.CREATE.getValue()) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据当前状态为【"+ MesExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus()) +"】,不为【创建】状态;";
} else if (workOrderExt.getPlanQty() != 0) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据当前存在改造数量;";
} else if (workOrderExt.getWorkOrderType() != MesExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue()) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列数据不为返工工单;";
} else {
boundSnQty = getBoundSnQty(organizeCode, boundProdSnQtyMapByOrderNo, workOrderNo, packSnByWorkOrderNo);
if (boundSnQty.compareTo(workOrderExt.getQty()) > 0) {
errorNum ++;
cellNum += "A;";
errorInfo += "第A列工单[" + workOrderNo + "]当前绑定数量["+ boundSnQty +"]大于计划数量["+ workOrderExt.getQty() +"],无需再绑定;";
} else {
workOrderMapByOrderNo.put(workOrderNo, workOrderExt);
boundProdSnQtyMapByOrderNo.put(workOrderNo, boundSnQty);
}
}
}
MesPackageExt packageExt = null;
if (errorNum == 0) {
//校验播放时长
if (StringUtils.isEmpty(packageNo)) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据必填;";
} else if (existPackageSnMap.containsKey(packageNo)) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据与 "+ existPackageSnMap.get(packageNo) +"行B列重复;";
} else {
packageExt = packageExtRepository.getByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, "packageNo"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), packageNo});
if (null == packageExt) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据条码[" + packageNo + "]不存在;";
} else {
if (MesEnumUtil.PACKAGE_IS_SEALED.UNSEALED.getValue() != packageExt.getIsSealed()) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据条码[" + packageNo +"]状态为未封箱";
}
if (!packageExt.getPartNo().equals(workOrderExt.getPartNo())) {
errorNum ++;
cellNum += "B;";
errorInfo += "工单[" + workOrderNo +"]关联的物料编码["+ workOrderExt.getPartNo() +"]与条码["+ packageNo +"]关联的物料编码["+ packageExt.getPartNo() +"]不一致;";
}
List<String> packSnList = packSnByWorkOrderNo.get(workOrderNo);
if (!CollectionUtils.isEmpty(packSnList) && packSnList.contains(packageNo)) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据条码[" + packageNo +"]已绑定至工单["+ workOrderNo +"],无需再次绑定";
} else {
if (CollectionUtils.isEmpty(packSnList)) {
packSnList = new ArrayList<>();
}
Double boundQty = boundProdSnQtyMapByOrderNo.containsKey(workOrderNo) ? 0.0 : boundProdSnQtyMapByOrderNo.get(workOrderNo);
Double sumBoundQty = MathOperation.add(boundQty, packageExt.getQty());
if (sumBoundQty.compareTo(workOrderExt.getQty()) > 0) {
errorNum ++;
cellNum += "B;";
errorInfo += "第B列数据条码[" + packageNo +"]与工单["+ workOrderNo +"]绑定数量"+ boundQty +"总和为["+ sumBoundQty +"],大于工单计划数量["+ workOrderExt.getQty() +"]无需再次绑定";
} else {
packSnList.add(packageNo);
packSnByWorkOrderNo.put(workOrderNo, packSnList);
}
boundProdSnQtyMapByOrderNo.put(workOrderNo, sumBoundQty);
}
}
}
}
//没有错误的时候封装MesUnbindProduceSn
if (errorNum == 0) {
// 记录已录入条码
existPackageSnMap.put(packageNo, rowNum);
MesSubassemblyRemadeRecord record = new MesSubassemblyRemadeRecord();
record.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
record.setPackageNo(packageExt.getPackageNo());
record.setLotNo(packageExt.getLotNo());
record.setQty(packageExt.getQty());
record.setInitWorkOrderNo(packageExt.getLastWorkOrderNo());
record.setInitWorkCenterCode(packageExt.getWorkCenterCode());
record.setInitQty(packageExt.getQty());
record.setWorkOrderNo(workOrderNo);
record.setWorkCenterCode(workOrderExt.getWorkCenterCode());
record.setPartNo(workOrderExt.getPartNo());
record.setPartNameRdd(workOrderExt.getPartNameRdd());
record.setOrganizeCode(organizeCode);
ConvertBean.serviceModelInitialize(record, userName);
subassemblyRemadeRecordList.add(record);
successRowNum ++;
} else {
//封装错误行信息ExcelImportErrorExtModel
excelImportErrorExtModels = commonExtService.getExcelImportErrorModels(excelImportErrorExtModels, rowNum, errorNum, cellNum, errorInfo);
errorRows += rowNum + ";";
failRowNum ++;
}
}
}
//校验EXCEL数据
commonExtService.checkExcelData(failRowNum, successRowNum, errorRows);
//封装返回结果
ExcelImportResultExtModel excelImportResultExtModel = commonExtService.getExcelImportResultModel(failRowNum, successRowNum, excelImportErrorExtModels, errorRows);
if (failRowNum == 0) {
insertExcel(subassemblyRemadeRecordList);
}
return excelImportResultExtModel;
}
private double getBoundSnQty(String organizeCode, Map<String, Double> boundProdSnQtyMapByOrderNo, String workOrderNo, Map<String, List<String>> packSnByWorkOrderNo) {
if (!boundProdSnQtyMapByOrderNo.containsKey(workOrderNo)) {
List<MesSubassemblyRemadeRecord> subassemblyRemadeRecordList = subassemblyRemadeRecordRepository.findByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.WORK_ORDER_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workOrderNo});
if (!CollectionUtils.isEmpty(subassemblyRemadeRecordList)) {
List<String> packSnList = subassemblyRemadeRecordList.stream().map(MesSubassemblyRemadeRecord::getPackageNo).collect(Collectors.toList());
packSnByWorkOrderNo.put(workOrderNo, packSnList);
}
return CollectionUtils.isEmpty(subassemblyRemadeRecordList) ? 0 : subassemblyRemadeRecordList.stream().mapToDouble(MesSubassemblyRemadeRecord::getQty).sum();
} else return boundProdSnQtyMapByOrderNo.get(workOrderNo);
}
private MesPartExt getMesPartExt(String organizeCode, Map<String, MesPartExt> partMap, MesWorkOrderExt workOrderExt, MesPartExt partExt) {
if (workOrderExt != null && !partMap.containsKey(workOrderExt.getPartNo())) {
partExt = partExtRepository.getByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.PART_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workOrderExt.getPartNo()});
} else if(workOrderExt != null) {
partExt = partMap.get(workOrderExt.getPartNo());
}
return partExt;
}
private MesWorkOrderExt getMesWorkOrderExt(String organizeCode, Map<String, MesWorkOrderExt> workOrderMapByOrderNo, String workOrderNo) {
MesWorkOrderExt workOrderExt;
if (!workOrderMapByOrderNo.containsKey(workOrderNo)) {
workOrderExt = workOrderExtRepository.getByProperty(
new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.ORDER_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workOrderNo});
} else {
workOrderExt = workOrderMapByOrderNo.get(workOrderNo);
}
return workOrderExt;
}
/**
* -
* @param subassemblyRemadeRecordList
*/
private void insertExcel(List<MesSubassemblyRemadeRecord> subassemblyRemadeRecordList) {
//导入数据
if (!CollectionUtils.isEmpty(subassemblyRemadeRecordList)) subassemblyRemadeRecordRepository.saveAll(subassemblyRemadeRecordList);
}
}

@ -217,7 +217,7 @@ public class MesFirstOrderDetail extends BaseBean implements Serializable {
public MesFirstOrderDetail(Long id, String workOrderNo, String workCenterCode, String serialNumber, String workCellName, String shiftCode, String processCode, String processName, public MesFirstOrderDetail(Long id, String workOrderNo, String workCenterCode, String serialNumber, String workCellName, String shiftCode, String processCode, String processName,
String checkMessage, String checkStand, String checkValue, String checkResult, String spotCheckUser, String spotCheckTime, String checkMessage, String checkStand, String checkValue, String checkResult, String spotCheckUser, String spotCheckTime,
String teamConfirmUser, String teamConfirmTime, String qualityConfirmUser, String qualityConfirmTime, String orderNo, String createDatetime String teamConfirmUser, String teamConfirmTime, String qualityConfirmUser, String qualityConfirmTime, String orderNo, String createDatetime
, Integer isQualityConfirm, Integer isTeamConfirm,String upLimit,String downLimit,String resultValue) { , Integer isQualityConfirm, Integer isTeamConfirm,String upLimit,String downLimit,String resultValue, String importanceSafePartNo, String checkFrequency, String sampleQty, String confirmMethod) {
this.id = id; this.id = id;
this.workOrderNo = workOrderNo; this.workOrderNo = workOrderNo;
@ -244,6 +244,10 @@ public class MesFirstOrderDetail extends BaseBean implements Serializable {
this.upLimit = upLimit; this.upLimit = upLimit;
this.downLimit = downLimit; this.downLimit = downLimit;
this.resultValue = resultValue; this.resultValue = resultValue;
this.importanceSafePartNo = importanceSafePartNo;
this.checkFrequency = checkFrequency;
this.sampleQty = sampleQty;
this.confirmMethod = confirmMethod;
} }
//工单首检趋势分析 //工单首检趋势分析

@ -39,10 +39,14 @@ public class MesUnbindProduceSnTravel extends BaseBean implements Serializable {
private static final long serialVersionUID = 6242884964995452701L; private static final long serialVersionUID = 6242884964995452701L;
@Column(name = "SERIAL_NUMBER", nullable = false) @Column(name = "SERIAL_NUMBER")
@ApiParam("过程条码") @ApiParam("过程条码")
private String serialNumber; private String serialNumber;
@Column(name = "PRODUCT_SN")
@ApiParam("产品条码")
private String productSn;
@Column(name = "PART_NO") @Column(name = "PART_NO")
@ApiParam("物料号") @ApiParam("物料号")
private String partNo; private String partNo;

@ -4,7 +4,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
import lombok.Data; import lombok.Data;
import javax.persistence.Column;
import java.io.Serializable; import java.io.Serializable;
/** /**

@ -0,0 +1,26 @@
package cn.estsh.i3plus.ext.mes.pojo.model.jx;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import java.io.Serializable;
/**
* @author wangjie
* @version 1.0
* @date 2021/1/15 15:32
**/
@Data
@ApiModel("返工条码 展示 model")
public class JxReworkSnModel implements Serializable {
private static final long serialVersionUID = 6923519092290828111L;
@ApiParam("工单")
private String workOrderNo;
@ApiParam("条码")
private String sn;
}
Loading…
Cancel
Save