Merge remote-tracking branch 'origin/master'

master
夜笙歌 2 years ago
commit e5bbeb7ac4

@ -28,6 +28,10 @@ public class MesConstants {
* :
*/
public static final String MES_BARCODE_TYPE_BACKPLATE = "4";
/**
* :
*/
public static final String MES_BARCODE_TYPE_DOOR = "5";
/**
* :
*/

@ -240,18 +240,4 @@ public class MesApiController extends BaseController {
}
/**
*
*/
@Log(title = "领料", businessType = BusinessType.COMPLETE)
@PostMapping(("/completeCollectMaterials"))
public AjaxResult completeCollectMaterials() {
//todo
/*http://IP:5001/wcs/RecieveRcs/agvComplete 装配区背负式Agv通知任务完成
{
"endStationCode": "string",//工位
}*/
return null;
}
}

@ -197,6 +197,34 @@ public class MesProductOrder extends BaseEntity {
@Excel(name = "单位时间")
private Long productionTime;
/**
* ID
*/
@Excel(name = "前置生产工单ID")
private Long preOrderId;
/**
*
*/
@Excel(name = "前置生产工单编号")
private String preOrderCode;
public String getPreOrderCode() {
return preOrderCode;
}
public void setPreOrderCode(String preOrderCode) {
this.preOrderCode = preOrderCode;
}
public Long getPreOrderId() {
return preOrderId;
}
public void setPreOrderId(Long preOrderId) {
this.preOrderId = preOrderId;
}
public Long getProductionTime() {
return productionTime;
}

@ -123,6 +123,10 @@ public class MesBaseBarcodeInfoServiceImpl implements IMesBaseBarcodeInfoService
generateProductBarcode(mesBaseBarcodeInfo);
}
else{//生成背板条码或者门板条码
generateBackOrDoorBarcode(mesBaseBarcodeInfo);
}
return 1;
}
@ -250,22 +254,22 @@ public class MesBaseBarcodeInfoServiceImpl implements IMesBaseBarcodeInfoService
List<MesBaseBarcodeInfo> mesBaseBarcodeInfos = mesBaseBarcodeInfoMapper.selectMesBaseBarcodeInfoList(queryBarcodeInfo);
if (mesBaseBarcodeInfos != null && !mesBaseBarcodeInfos.isEmpty()) {
throw new ServiceException("此计划明细已经生成条码,不能重复生成");
throw new ServiceException("此生产明细已经生成条码,不能重复生成");
}
MesProductPlanDetail mesProductPlanDetail = mesProductPlanDetailMapper.selectMesProductPlanDetailByPlanDetailCode(planDetailCode);
if (mesProductPlanDetail == null) {
throw new ServiceException("此生产任务明细不存在");
throw new ServiceException("此生产明细不存在");
}
if (!mesProductPlanDetail.getPlanDetailStatus().equals(MesConstants.MES_PRODUCT_PLAN_DETAIL_STATUS_FINISH) &&
!mesProductPlanDetail.getPlanDetailStatus().equals(MesConstants.MES_PRODUCT_PLAN_DETAIL_STATUS_ABNORMAL_FINISH)) {
throw new ServiceException("此生产任务明细还未完成,不能打印条码");
throw new ServiceException("此生产明细还未完成,不能打印条码");
}
MesProductPlan productPlan = mesProductPlanMapper.selectOnlyMesProductPlanByPlanCode(planCode);
if (productPlan == null) {
throw new ServiceException("此生产任务不存在");
throw new ServiceException("此生产派工不存在");
}
@ -290,6 +294,69 @@ public class MesBaseBarcodeInfoServiceImpl implements IMesBaseBarcodeInfoService
}
/**
*
* @param mesBaseBarcodeInfo
*/
public void generateBackOrDoorBarcode(MesBaseBarcodeInfo mesBaseBarcodeInfo) {
String planCode = mesBaseBarcodeInfo.getPlanCode();
String planDetailCode = mesBaseBarcodeInfo.getPlanDetailCode();
MesBaseBarcodeInfo queryBarcodeInfo = new MesBaseBarcodeInfo();
queryBarcodeInfo.setPlanDetailCode(planDetailCode);
queryBarcodeInfo.setBarcodeType(mesBaseBarcodeInfo.getBarcodeType());
List<MesBaseBarcodeInfo> mesBaseBarcodeInfos = mesBaseBarcodeInfoMapper.selectMesBaseBarcodeInfoList(queryBarcodeInfo);
if (mesBaseBarcodeInfos != null && !mesBaseBarcodeInfos.isEmpty()) {
throw new ServiceException("此生产明细已经生成条码,不能重复生成");
}
MesProductPlanDetail mesProductPlanDetail = mesProductPlanDetailMapper.selectMesProductPlanDetailByPlanDetailCode(planDetailCode);
if (mesProductPlanDetail == null) {
throw new ServiceException("此生产明细不存在");
}
MesProductPlan productPlan = mesProductPlanMapper.selectOnlyMesProductPlanByPlanCode(planCode);
if (productPlan == null) {
throw new ServiceException("此生产派工不存在");
}
MesBaseBarcodeInfo bindBarcodeInfo = mesBaseBarcodeInfoMapper.selectMesBaseBarcodeInfoByBarcodeInfo(mesBaseBarcodeInfo.getBindBarcode());
if(bindBarcodeInfo==null){
throw new ServiceException("绑定的柜体码不存在");
}
String userName = SecurityUtils.getUsername();
Date currentDate = new Date();
//将之前的原材料码设置计划编码和明细编码,在入半成品库时是按照此码入库,后续生成成品码也需要根据此码生成
bindBarcodeInfo.setPlanCode(mesBaseBarcodeInfo.getPlanCode());
bindBarcodeInfo.setPlanDetailCode(mesBaseBarcodeInfo.getPlanDetailCode());
bindBarcodeInfo.setUpdateBy(userName);
bindBarcodeInfo.setUpdateTime(currentDate);
String barcode = Seq.getId(Seq.mesCompBarcodeSeqType, Seq.mesCompBarcodeCode);
mesBaseBarcodeInfo.setBatchCode(barcode);// 成品的批次代码 == 条码内容
mesBaseBarcodeInfo.setBarcodeInfo(barcode);
mesBaseBarcodeInfo.setAmount(new BigDecimal(1));
mesBaseBarcodeInfo.setBatchFlag(MesConstants.NOT_IS_BATCH);
mesBaseBarcodeInfo.setSafeFlag(MesConstants.MES_ORDER_BIND_SAFE_FLAG_YES);
mesBaseBarcodeInfo.setMaterialId(productPlan.getMaterialId());
mesBaseBarcodeInfo.setPrintFlag(MesConstants.MES_BARCODE_PRINT_FLAG_NO);
mesBaseBarcodeInfo.setSaleOrderId(productPlan.getSaleOrderId());
mesBaseBarcodeInfo.setSaleorderCode(productPlan.getSaleorderCode());
mesBaseBarcodeInfo.setCreateTime(currentDate);
mesBaseBarcodeInfo.setCreateBy(userName);
mesBaseBarcodeInfoMapper.updateMesBaseBarcodeInfo(bindBarcodeInfo);
mesBaseBarcodeInfoMapper.insertMesBaseBarcodeInfo(mesBaseBarcodeInfo);
}
public MesBaseBarcodeInfo getInsertedBarcodeInfo(MesBaseBarcodeInfo mesBaseBarcodeInfo, String batchCode, String userName, Date currentDate) {
MesBaseBarcodeInfo toInsertedBarcodeInfo = new MesBaseBarcodeInfo();
//同一批次的批次代码相同

@ -75,6 +75,7 @@
mpo.create_time,
mpo.update_by,
mpo.update_time,
mpo.pre_order_id,
mbr.production_time
from mes_product_order mpo
left join (select a.route_id,
@ -115,6 +116,7 @@
<if test="orderStatus != null and orderStatus != ''">and mpo.order_status = #{orderStatus}</if>
<if test="stockLockFlag != null and stockLockFlag != ''">and mpo.stock_lock_flag = #{stockLockFlag}</if>
<if test="saleOrderFlag != null and saleOrderFlag != ''">and mpo.sale_order_flag = #{saleOrderFlag}</if>
<if test="preOrderId != null and preOrderId != ''">and mpo.pre_order_id = #{preOrderId}</if>
<if test="createBy != null and createBy != ''">and mpo.create_by = #{createBy}</if>
<if test="createTime != null ">and mpo.create_time = #{createTime}</if>
<if test="updateBy != null and updateBy != ''">and mpo.update_by = #{updateBy}</if>
@ -160,6 +162,7 @@
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="planDeliveryDate != null">plan_delivery_date,</if>
<if test="preOrderId != null">pre_order_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="orderCode != null and orderCode != ''">#{orderCode},</if>
@ -190,6 +193,7 @@
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="planDeliveryDate != null">#{planDeliveryDate},</if>
<if test="preOrderId != null">#{preOrderId},</if>
</trim>
</insert>
@ -224,6 +228,7 @@
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="planDeliveryDate != null">plan_delivery_date = #{planDeliveryDate},</if>
<if test="preOrderId != null">pre_order_id = #{preOrderId},</if>
</trim>
where product_order_id = #{productOrderId}
</update>

@ -12,8 +12,7 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration
@ConfigurationProperties(prefix = "wms")
public class WmsConfig
{
public class WmsConfig {
/**
*
*/
@ -44,6 +43,11 @@ public class WmsConfig
*/
private Long fourthFloorPartsWarehouseId;
/**
* WCS-agv
*/
private String wcsAgvCompleteUrl;
public String getFifthAssembleStationCode() {
return fifthAssembleStationCode;
@ -92,4 +96,12 @@ public class WmsConfig
public void setFourthFloorPartsWarehouseId(Long fourthFloorPartsWarehouseId) {
this.fourthFloorPartsWarehouseId = fourthFloorPartsWarehouseId;
}
public String getWcsAgvCompleteUrl() {
return wcsAgvCompleteUrl;
}
public void setWcsAgvCompleteUrl(String wcsAgvCompleteUrl) {
this.wcsAgvCompleteUrl = wcsAgvCompleteUrl;
}
}

@ -153,4 +153,29 @@ public class WmsApiController extends BaseController {
}
/**
*
*/
@Log(title = "领料", businessType = BusinessType.COMPLETE)
@PostMapping(("/completeCollectMaterials"))
public AjaxResult completeCollectMaterials(@RequestBody WmsCmpleteCollectMaterialsVo wmsCmpleteCollectMaterialsVo) {
return toAjax(wmsRawOutstockService.completeCollectMaterials(wmsCmpleteCollectMaterialsVo));
}
/**
* 退
*/
@Log(title = "退料", businessType = BusinessType.COMPLETE)
@PostMapping(("/completeReturnMaterials"))
public AjaxResult completeReturnMaterials(@RequestBody WmsCmpleteCollectMaterialsVo wmsCmpleteCollectMaterialsVo) {
return toAjax(wmsRawOutstockService.completeCollectMaterials(wmsCmpleteCollectMaterialsVo));
}
/**
*
*/
@GetMapping(("/getNewestOutstockCabinet"))
public AjaxResult getNewestOutstockCabinet(WmsRawOutstock wmsRawOutstock) {
return success(wmsRawOutstockService.getNewestOutstockCabinet(wmsRawOutstock));
}
}

@ -0,0 +1,11 @@
package com.hw.wms.domain.vo;
import lombok.Data;
@Data
public class WcsReturnMsgVo {
private Integer code;
private String message;
}

@ -0,0 +1,9 @@
package com.hw.wms.domain.vo;
import lombok.Data;
@Data
public class WmsCmpleteCollectMaterialsVo {
private String endStationCode;
}

@ -139,4 +139,11 @@ public interface WmsRawOutstockMapper
*/
public WmsRawOutstock selectWmsRawOutstockJoinMaterialById(Long rawOutstockId);
/**
*
*
* @param wmsRawOutstock
* @return
*/
public WmsRawOutstock selectNewestWmsRawOutstock(WmsRawOutstock wmsRawOutstock);
}

@ -140,4 +140,19 @@ public interface IWmsRawOutstockService
* @return
*/
public int directRawOutstock(WmsRawOutstock wmsRawOutstock);
/**
* wcswcsagv
* @param wmsCmpleteCollectMaterialsVo
*/
public int completeCollectMaterials(WmsCmpleteCollectMaterialsVo wmsCmpleteCollectMaterialsVo);
/**
* (使)
* @param wmsRawOutstock
* @return
*/
public WmsRawOutstock getNewestOutstockCabinet(WmsRawOutstock wmsRawOutstock);
}

@ -1,28 +1,23 @@
package com.hw.wms.service.impl;
import java.util.HashMap;
import java.util.List;
import com.hw.common.core.constant.SecurityConstants;
import com.hw.common.core.constant.WmsConstants;
import com.hw.common.core.enums.WmsLocationStatus;
import com.hw.common.core.exception.ServiceException;
import com.hw.common.core.utils.DateUtils;
import com.hw.common.core.utils.StringUtils;
import com.hw.common.security.utils.SecurityUtils;
import com.hw.mes.api.RemoteMesService;
import com.hw.mes.api.domain.MesBaseBarcodeInfo;
import com.hw.printer.api.RemotePrinterService;
import com.hw.printer.api.domain.vo.PrintContentVo;
import com.hw.wms.domain.WmsBaseLocation;
import com.hw.wms.domain.WmsBaseWarehouse;
import com.hw.wms.mapper.WmsBaseLocationMapper;
import com.hw.wms.mapper.WmsBaseWarehouseMapper;
import com.hw.wms.service.IWmsBaseLocationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hw.wms.mapper.WmsBaseLocationMapper;
import com.hw.wms.domain.WmsBaseLocation;
import com.hw.wms.service.IWmsBaseLocationService;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
/**
* Service

@ -358,10 +358,10 @@ public class WmsProductInstockServiceImpl implements IWmsProductInstockService {
throw new ServiceException("物料条码有误");
}
if (baseBarcodeInfo.getBarcodeType().equals(WmsConstants.RWA_STOCK_STOCK_TYPE_RAW)) {
throw new ServiceException("此物料条码为原材料,非成品条码");
}
// if (baseBarcodeInfo.getBarcodeType().equals(WmsConstants.RWA_STOCK_STOCK_TYPE_RAW)) {
// throw new ServiceException("此物料条码为原材料,非成品条码");
// }
//按原材料入库的柜体原料码进行入库
if (baseBarcodeInfo.getPrintFlag().equals(MesConstants.MES_BARCODE_PRINT_FLAG_NO)) {
throw new ServiceException("此条码还未打印");
}

@ -19,8 +19,13 @@ import com.hw.wms.domain.vo.*;
import com.hw.wms.mapper.*;
import com.hw.wms.service.IWmsRawOutstockService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import java.math.BigDecimal;
import java.util.*;
@ -924,7 +929,7 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
*/
@Override
public int assembleOutstock(WmsAssembleOutstockVo wmsAssembleOutstockVo) {
/**1todowcs
/**1wcs
* 2
* 3WCS
* *
@ -932,11 +937,11 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
String materialBarcode = wmsAssembleOutstockVo.getMaterialBarcode();
R<MesBaseBarcodeInfo> baseBarcodeInfoR = remoteMesService.getBarcode(materialBarcode, SecurityConstants.INNER);
if (baseBarcodeInfoR == null) {
throw new ServiceException("物料码有误");
throw new ServiceException("物料码有误");
}
MesBaseBarcodeInfo baseBarcodeInfo = baseBarcodeInfoR.getData();
if (baseBarcodeInfo == null) {
throw new ServiceException("物料码有误");
throw new ServiceException("物料码有误");
}
/**todo需要最终确认一下。在申请领柜体后wcs会调度agv将对应库位的柜体运输到柜体拆分区然后更新rawoutstock的materialbatch为其物料条码*/
@ -959,7 +964,7 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
throw new ServiceException("没找到库存信息");
}
WmsRawStock wmsRawStock = wmsRawStocks.get(0); //todo待agv出库后wcs更新库存信息需要删除库存由于是1个
WmsRawStock wmsRawStock = wmsRawStocks.get(0); //待agv出库后wcs更新库存信息需要删除库存由于是1个
WmsRawOutstock wmsRawOutstock = new WmsRawOutstock();
wmsRawOutstock.setTaskCode(Seq.getId(Seq.rawOutstockSeqType, Seq.rawOutstockSeqCode));
@ -973,7 +978,7 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
wmsRawOutstock.setPalletInfoCode(baseBarcodeInfo.getPalletInfoCode());//在绑定时需要在条码信息中记录托盘码
wmsRawOutstock.setOutstockAmount(BigDecimal.ONE);
wmsRawOutstock.setEndStationCode(wmsConfig.getFifthAssembleStationCode());//目标位置,五楼组装区域 todo 读配置文件获取
wmsRawOutstock.setEndStationCode(wmsConfig.getFifthAssembleStationCode());//目标位置,五楼组装区域
wmsRawOutstock.setOperationType(WmsConstants.WMS_OPERATION_TYPE_AUTO);
wmsRawOutstock.setTaskType(WmsConstants.WMS_RAW_OUTSTOCK_TASK_TYPE_PRODUCTION_INSTALL);
wmsRawOutstock.setApplyBy(SecurityUtils.getUsername());
@ -1165,4 +1170,49 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
}
}
/**
* wcswcsagv
*
* @param wmsCmpleteCollectMaterialsVo
*/
@Override
public int completeCollectMaterials(WmsCmpleteCollectMaterialsVo wmsCmpleteCollectMaterialsVo) {
try {
String wcsAgvCompleteUrl = wmsConfig.getWcsAgvCompleteUrl();
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
// headers.add(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_JSON_VALUE);
// String params = "{\"endStationCode\":\""+stationCode+"\"}";
HttpEntity<WmsCmpleteCollectMaterialsVo> entity = new HttpEntity<>(wmsCmpleteCollectMaterialsVo, headers);
ResponseEntity<WcsReturnMsgVo> response = restTemplate.postForEntity(
wcsAgvCompleteUrl, entity, WcsReturnMsgVo.class);
WcsReturnMsgVo wcsReturnMsgVo = response.getBody();
// System.out.println("Response Status: " + response.getStatusCode());
// System.out.println("Response Status: " + wcsReturnMsgVo);
if (response.getStatusCodeValue() != 200) {
throw new ServiceException("调度异常,请重试");
}
} catch (Exception e) {
throw new ServiceException("调度异常,请重试");
}
return 1;
}
/**
* (使)
*
* @param wmsRawOutstock
* @return
*/
@Override
public WmsRawOutstock getNewestOutstockCabinet(WmsRawOutstock wmsRawOutstock) {
wmsRawOutstock.setExecuteStatus(WmsConstants.WMS_EXECUTE_STATUS_FINISH);
return wmsRawOutstockMapper.selectNewestWmsRawOutstock(wmsRawOutstock);
}
}

@ -328,4 +328,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectNewestWmsRawOutstock" parameterType="WmsRawOutstock" resultMap="WmsRawOutstockResult">
select wro.raw_outstock_id,wrod.material_barcode as material_batch from wms_raw_outstock wro left join wms_raw_outstock_detail wrod on wro.raw_outstock_id = wrod.raw_outstock_id
<where>
<if test="planCode != null "> and wro.plan_code = #{planCode}</if>
<if test="planDetailCode != null "> and wro.plan_detail_code = #{planDetailCode}</if>
<if test="executeStatus != null and executeStatus != ''"> and wro.execute_status = #{executeStatus}</if>
</where>
order by wro.raw_outstock_id desc limit 1
</select>
</mapper>

@ -250,3 +250,43 @@ export function selectMaterialInstallationCircumstance(query) {
params: query
})
}
// 查询当前登录工位
export function getLoginStationInfo() {
return request({
url: '/mes/api/getLoginStationInfo',
method: 'get',
})
}
export function getNewestOutstockCabinet(query) {
return request({
url: '/wms/api/getNewestOutstockCabinet',
method: 'get',
params: query
})
}
/**
* 完成领料拿料
*/
export function completeCollectMaterials(data) {
return request({
url: '/wms/api/completeCollectMaterials',
method: 'post',
data: data
})
}
/**
* 完成退料放料
*/
export function completeReturnMaterials(data) {
return request({
url: '/wms/api/completeReturnMaterials',
method: 'post',
data: data
})
}

@ -25,20 +25,44 @@
</el-form-item>
</el-form>
<div style="text-align: center">
<el-button type="success" v-if="(!$route.query || $route.query.id==='2')" :disabled="form.planDetailStatus === '已完成' || !form.planDetailCode" @click="getMaterials('0')">
<el-button type="success" v-if="(!$route.query || $route.query.id==='2')"
:disabled="form.planDetailStatus === '已完成' || !form.planDetailCode"
@click="getMaterials('0')">领料
</el-button>
<el-button type="warning" v-if="(!$route.query || $route.query.id==='2')" :disabled="form.planDetailStatus === '已完成' || !form.planDetailCode" @click="handleMaterialConfirmForm()">
<el-button type="info" v-if="(!$route.query || $route.query.id==='2')"
:disabled="form.planDetailStatus === '已完成' || !form.planDetailCode"
@click="completeCollectMaterials()">完成领料
</el-button>
<el-button type="danger" @click="returnMaterial()" v-if="(!$route.query || $route.query.id==='2')" :disabled="!form.planDetailCode">退
<el-button type="warning" v-if="(!$route.query || $route.query.id==='2')"
:disabled="form.planDetailStatus === '已完成' || !form.planDetailCode"
@click="handleMaterialConfirmForm()">扫描
</el-button>
<el-button type="primary" v-if="($route.query && $route.query.id) !== '2'" :disabled="form.planDetailStatus === '已完成' || !form.planDetailCode" @click="getMaterials('1')">
<el-button type="danger" @click="returnMaterial()" v-if="(!$route.query || $route.query.id==='2')"
:disabled="!form.planDetailCode">退料
</el-button>
<el-button type="info" @click="completeReturnMaterials()" v-if="(!$route.query || $route.query.id==='2')"
:disabled="!form.planDetailCode">完成退料
</el-button>
<el-button type="primary" v-if="($route.query && $route.query.id) !== '2'"
:disabled="form.planDetailStatus === '已完成' || !form.planDetailCode"
@click="getMaterials('1')">
领柜体
</el-button>
<el-button v-if="($route.query && $route.query.id) !== '2'" type="info" :disabled="form.planDetailStatus === '已完成' || !form.planDetailCode" @click="handleBindBarcode">
<el-button type="danger" v-if="($route.query && $route.query.id) !== '2'"
:disabled="form.planDetailStatus === '已完成' || !form.planDetailCode"
@click="print()">
条码
</el-button>
<el-button v-if="($route.query && $route.query.id) !== '2'" type="warning" :disabled="form.planDetailStatus === '已完成' || !form.planDetailCode" @click="handleRawBack">
<!--el-button v-if="($route.query && $route.query.id) !== '2'" type="info"
:disabled="form.planDetailStatus === '已完成' || !form.planDetailCode"
@click="handleBindBarcode">绑定
</el-button-->
<el-button v-if="($route.query && $route.query.id) !== '2'" type="warning"
:disabled="form.planDetailStatus === '已完成' || !form.planDetailCode" @click="handleRawBack">返库
</el-button>
<el-button :disabled="form.planDetailStatus === '已完成' || !form.planDetailCode" type="success"
@click="finish">完成
</el-button>
<el-button :disabled="form.planDetailStatus === '已完成' || !form.planDetailCode" type="primary" @click="finish"></el-button>
<el-popover
v-if="($route.query && $route.query.id) !== '2'"
v-model="assignModel"
@ -61,11 +85,12 @@
<div style="float:right;margin-top: 8px">
<el-button type="primary" :loading="submitAssignLoading" @click="completeStation"> </el-button>
</div>
<el-button slot="reference" type="success" :disabled="form.planDetailStatus === '已完成' || !form.planDetailCode">下发
</el-button>
<!--el-button slot="reference" type="success" :disabled="form.planDetailStatus === '已完成' || !form.planDetailCode">下发
</el-button-->
</el-popover>
</div>
</div>
</div>
@ -160,15 +185,6 @@
>
SOP预览
</el-button>
<el-button
v-if="($route.query && $route.query.id) !== '2'"
size="small"
style="margin-right: 12px"
type="text"
@click="print(scope.row)"
>
条码打印
</el-button>
<!-- <el-button-->
<!-- size="small"-->
<!-- type="text"-->
@ -200,7 +216,7 @@
trigger="click">
<div>
<div style="margin: 15px 0;">
<el-input placeholder="请扫描或输入物料条码" v-model="input1" class="input-with-select">
<el-input placeholder="请扫描或输入背板条码" v-model="input1" class="input-with-select">
<el-button slot="append" icon="el-icon-full-screen"></el-button>
</el-input>
</div>
@ -353,7 +369,7 @@
title="柜体绑定"
width="40%">
<el-form ref="bindBarcodeForm" :model="bindBarcodeForm" :rules="bindBarcodeRules" label-width="80px">
<el-form-item label="成品条码" prop="productBarcode">
<el-form-item label="背板条码" prop="productBarcode">
<el-input v-model="bindBarcodeForm.productBarcode"></el-input>
</el-form-item>
<el-form-item label="物料条码" prop="materialBarcode">
@ -369,16 +385,16 @@
<el-dialog
:visible.sync="rawBackVisible"
title="柜体返库"
width="40%">
width="500px">
<el-form ref="rawBackForm" :model="rawBackForm" :rules="rawBackRules" label-width="80px">
<el-form-item label="返库仓库" prop="warehouseId">
<el-select v-model="rawBackForm.warehouseId" placeholder="请选择返库仓库">
<el-select v-model="rawBackForm.warehouseId" placeholder="请选择返库仓库" style="width:380px">
<el-option v-for="item in warehouseList" :key="item.warehouseId" :label="item.warehouseName"
:value="item.warehouseId"></el-option>
</el-select>
</el-form-item>
<el-form-item label="物料条码" prop="materialBarcode">
<el-input v-model="rawBackForm.materialBarcode"></el-input>
<el-form-item label="柜体条码" prop="materialBarcode">
<el-input v-model="rawBackForm.materialBarcode" suffix-icon="el-icon-full-screen" style="width:380px"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
@ -423,12 +439,14 @@
<el-input v-model="returnModelForm.materialName" autocomplete="off" disabled></el-input>
</el-form-item>
<el-form-item label="物料条码">
<el-input placeholder="请输入内容" v-model="returnModelForm.materialBarcode" class="input-with-select" @blur="setReturnModelForm">
<el-input placeholder="请输入内容" v-model="returnModelForm.materialBarcode" class="input-with-select"
@blur="setReturnModelForm">
<el-button slot="append" icon="el-icon-search"></el-button>
</el-input>
</el-form-item>
<el-form-item label="仓库">
<el-select v-model="returnModelForm.warehouseId" placeholder="请选择仓库" :disabled="!returnModelForm.materialBarcode">
<el-select v-model="returnModelForm.warehouseId" placeholder="请选择仓库"
:disabled="!returnModelForm.materialBarcode">
<el-option :label="i.label" :key="i.value" :value="i.value" v-for="i in WarehousesList"></el-option>
</el-select>
</el-form-item>
@ -437,7 +455,8 @@
</el-form-item>
<el-form-item label="退库类型" prop="taskType">
<el-select v-model="returnModelForm.taskType" placeholder="请选择退库类型">
<el-option :label="i.label" :key="i.value" :value="i.value" v-for="i in dict.type.wms_raw_return_task_type"></el-option>
<el-option :label="i.label" :key="i.value" :value="i.value"
v-for="i in dict.type.wms_raw_return_task_type"></el-option>
</el-select>
</el-form-item>
<el-form-item label="申请原因">
@ -549,6 +568,7 @@ import PrintPage from '@/views/mes/barcode/endProductIndex'
import Chart from '@/components/board/Chart'
import * as echarts from 'echarts'
import {
getLoginStationInfo,
completeProductPlanDetail,
getNewestProductPlanDetail,
getProductPlans,
@ -559,7 +579,8 @@ import {
getWarehouses,
bindBarcode,
applyRawBack,
assignTask, scanMaterial2Confirm, applyRawReturn
assignTask, scanMaterial2Confirm, applyRawReturn,
getNewestOutstockCabinet,completeCollectMaterials,completeReturnMaterials
} from "@/api/board";
const setState = (e) => {
@ -636,6 +657,7 @@ export default {
tableData: [],
nowStation: null,
loginStationInfo: {},
stationData: [
{
stationName: '五楼装配工位1',
@ -701,19 +723,34 @@ export default {
}
},
async mounted() {
setInterval(() => {
this.$notify.info({
title: '通知',
message: '通知公告',
position: 'bottom-right',
duration: 0
// setInterval(() => {
// this.$notify.info({
// title: '',
// message: '',
// position: 'bottom-right',
// duration: 0
// });
// }, 60 * 1000)
getLoginStationInfo().then(e => {
this.loginStationInfo = e.data;
this.getProductPlans();
this.getChartData();
});
}, 60 * 1000)
},
methods: {
getProductPlans() {
getProductPlans({pageNum: this.nowNum1, pageSize: 5}).then(e => {
this.tableData = e.rows
this.totalNum1 = Math.ceil(e.total / 5)
this.tableClick(e.rows[0])
})
},
getChartData() {
this.$refs.chart2.setData({
tooltip: {
trigger: 'axis',
@ -877,7 +914,6 @@ export default {
]
})
},
methods: {
async logout() {
this.$confirm('确定退出系统吗?', '提示', {
@ -1373,6 +1409,8 @@ export default {
saleOrderId: this.form?.saleOrderId,
applyReason: '',
taskType: '1',
stationId :this.loginStationInfo.stationId,
endStationCode: this.loginStationInfo.stationCode,
wmsRawOutstockDetailList: []
}
//
@ -1430,9 +1468,17 @@ export default {
})
},
print(val) {
this.PrintData = val
print() {
getNewestOutstockCabinet({planDetailCode:this.form.planDetailCode}).then(response => {
if(!response.data){
this.$modal.msgWarning("请先领取柜体");
return;
}
this.PrintData = this.form
this.PrintData.bindBarcode = response.data.materialBatch;
this.PrintData.barcodeType = '4';//
this.printModel = true
});
},
assignClick() {
this.assignModel = true
@ -1516,7 +1562,6 @@ export default {
},
//
resetMaterialConfirm() {
this.materialConfirmForm = {
@ -1661,6 +1706,18 @@ export default {
return ['png', 'jpg', 'jpeg'].includes(name.toLowerCase())
},
completeCollectMaterials() {
completeCollectMaterials({endStationCode:this.loginStationInfo.stationCode}).then(v => {
this.$modal.msgSuccess("操作成功");
})
},
completeReturnMaterials() {
completeReturnMaterials({endStationCode:this.loginStationInfo.stationCode}).then(v => {
this.$modal.msgSuccess("操作成功");
})
},
}
}
</script>

@ -409,7 +409,7 @@
width="40%">
<el-form ref="productInstockForm" :model="productInstockForm" :rules="productInstockRules" label-width="80px">
<el-form-item label="成品条码" prop="materialBarcode">
<el-input v-model="productInstockForm.materialBarcode" suffix-icon="el-icon-camera"></el-input>
<el-input v-model="productInstockForm.materialBarcode" suffix-icon="el-icon-full-screen"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
@ -434,7 +434,7 @@
<el-input v-model="materialConfirmForm.planDetailCode" disabled></el-input>
</el-form-item>
<el-form-item label="物料条码" prop="materialBarcode">
<el-input v-model="materialConfirmForm.materialBarcode" suffix-icon="el-icon-camera"></el-input>
<el-input v-model="materialConfirmForm.materialBarcode" suffix-icon="el-icon-full-screen"></el-input>
</el-form-item>
<el-form-item label="数量" prop="checkAmount">
<el-input v-model="materialConfirmForm.checkAmount" disabled></el-input>
@ -458,7 +458,7 @@
<el-input v-model="returnModelForm.materialName" autocomplete="off" disabled></el-input>
</el-form-item-->
<el-form-item label="物料条码">
<el-input placeholder="请扫描或输入物料条码" v-model="returnModelForm.materialBarcode" suffix-icon="el-icon-camera">
<el-input placeholder="请扫描或输入物料条码" v-model="returnModelForm.materialBarcode" suffix-icon="el-icon-full-screen">
</el-input>
</el-form-item>
<el-form-item label="仓库">

@ -325,7 +325,7 @@
width="40%">
<el-form ref="productInstockForm" :model="productInstockForm" :rules="productInstockRules" label-width="80px">
<el-form-item label="成品条码" prop="materialBarcode">
<el-input v-model="productInstockForm.materialBarcode" suffix-icon="el-icon-camera"></el-input>
<el-input v-model="productInstockForm.materialBarcode" suffix-icon="el-icon-full-screen"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
@ -370,7 +370,7 @@
<el-input v-model="returnModelForm.materialName" autocomplete="off" disabled></el-input>
</el-form-item-->
<el-form-item label="物料条码">
<el-input placeholder="请扫描或输入物料条码" v-model="returnModelForm.materialBarcode" suffix-icon="el-icon-camera">
<el-input placeholder="请扫描或输入物料条码" v-model="returnModelForm.materialBarcode" suffix-icon="el-icon-full-screen">
</el-input>
</el-form-item>
<el-form-item label="仓库">

@ -197,11 +197,11 @@
<el-form ref="wmsForm" :model="wmsForm" :rules="wmsRules" label-width="80px">
<el-form-item label="库位编码" prop="locationCode">
<el-input v-model="wmsForm.locationCode" ref="locationCodeRef" autocomplete="off" placeholder="请扫描或输入库位编码"
@focus="handleLocationCodeFocus" @blur="handleLocationCodeBlur" suffix-icon="el-icon-camera"></el-input>
@focus="handleLocationCodeFocus" @blur="handleLocationCodeBlur" suffix-icon="el-icon-full-screen"></el-input>
</el-form-item>
<el-form-item label="物料条码" prop="materialBarcode">
<el-input v-model="wmsForm.materialBarcode" ref="materialBarcodeRef" autocomplete="off" placeholder="请扫描或输入物料条码"
@focus="handleMaterialBarcodeFocus" @blur="handleMaterialBarcodeBlur" suffix-icon="el-icon-camera"></el-input>
@focus="handleMaterialBarcodeFocus" @blur="handleMaterialBarcodeBlur" suffix-icon="el-icon-full-screen"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">

@ -27,7 +27,20 @@
type="primary"
@click="handleAdd"
v-if="addBarcodeBtnVisible"
>新增条码
>{{addBtnTitle}}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-hasPermi="['mes:barcode:add']"
icon="el-icon-plus"
plain
size="mini"
type="primary"
@click="handleDoorPlaneAdd"
v-if="addDoorBarcodeBtnVisible"
>新增门板条码
</el-button>
</el-col>
@ -72,7 +85,8 @@
<span>{{ parseTime(scope.row.productionDate, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column v-if="columns[16].visible" align="center" label="最晚出库日期" prop="lastOutstockDate" width="180">
<el-table-column v-if="columns[16].visible" align="center" label="最晚出库日期" prop="lastOutstockDate"
width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.lastOutstockDate, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
@ -154,10 +168,24 @@
<!-- <el-form-item label="供应商ID" prop="manufacturerId">-->
<!-- <el-input v-model="form.manufacturerId" placeholder="请输入供应商ID" />-->
<!-- </el-form-item>-->
<!--el-form-item label="条码类型" prop="barcodeType">
<el-checkbox-group v-model="form.barcodeType">
<el-checkbox
v-for="dict in dict.type.active_flag"
:key="dict.value"
:label="dict.value">{{ dict.label }}</el-checkbox>
</el-checkbox-group>
</el-form-item-->
<el-form-item label="数量" prop="amount">
<el-input-number v-model="form.amount" :min="0" placeholder="请输入数量" :disabled="true"/>
</el-form-item>
<el-form-item label="绑定柜体码" prop="bindBarcode">
<el-input v-model="form.bindBarcode" :disabled="true" v-if="this.form.barcodeType === this.BARCODE_TYPE.BACK_PLANE || this.form.barcodeType === this.BARCODE_TYPE.DOOR">
</el-input>
</el-form-item>
<el-form-item label="生产日期" prop="productionDate">
<el-date-picker v-model="form.productionDate"
clearable
@ -224,7 +252,14 @@
</template>
<script>
import {listProductBarcode, getBarcode, delBarcode, addProductBarcode, printProductBarcodes,regenerateProductBarcode} from "@/api/mes/barcode";
import {
listProductBarcode,
getBarcode,
delBarcode,
addProductBarcode,
printProductBarcodes,
regenerateProductBarcode
} from "@/api/mes/barcode";
import addProductPlan from '@//views/mes/productplan/addProductPlan.vue';
export default {
@ -256,6 +291,7 @@ export default {
title: "",
//
open: false,
addBtnTitle:'新增条码',
//
queryParams: {
pageNum: 1,
@ -301,6 +337,9 @@ export default {
barcodeType: [
{required: true, message: "条码类型不能为空", trigger: "change"}
],
bindBarcode: [
{required: true, message: "请先领取柜体", trigger: "change"}
],
materialId: [
{required: true, message: "物料ID不能为空", trigger: "blur"}
],
@ -338,7 +377,16 @@ export default {
],
addBarcodeBtnVisible: false,
addDoorBarcodeBtnVisible:false,
batchPrintBtnDisabled: false,
BARCODE_TYPE: {
PRODUCT: '3',//
BACK_PLANE: '4',//
DOOR :'5'//
}
};
},
mounted() {
@ -365,15 +413,26 @@ export default {
// },
methods: {
getData() {
let barcodeType = this.defineData.barcodeType ? this.defineData.barcodeType : this.BARCODE_TYPE.PRODUCT;
let bindBarcode = this.defineData.bindBarcode ? this.defineData.bindBarcode : '';
if(barcodeType === this.BARCODE_TYPE.BACK_PLANE){
this.addBtnTitle = "新增背板条码";
}
this.form = {
planId: this.defineData.planId,
planCode: this.defineData.planCode,
planDetailCode: this.defineData.planDetailCode,
batchFlag: '0',
barcodeType:'3',
bindBarcode: bindBarcode,
barcodeType: barcodeType,
amount: 1,
}
this.queryParams.planDetailCode = this.defineData.planDetailCode;
if(barcodeType !==this.BARCODE_TYPE.PRODUCT){
this.queryParams.barcodeType = null;
this.queryParams.barcodeTypeStr = this.BARCODE_TYPE.DOOR+","+this.BARCODE_TYPE.BACK_PLANE;
}
},
/** 查询条码信息列表 */
@ -383,9 +442,22 @@ export default {
this.barcodeList = response.rows;
this.total = response.total;
if (this.total && this.total > 0) {
if(this.queryParams.barcodeTypeStr){
this.addBarcodeBtnVisible = true;
this.addDoorBarcodeBtnVisible = true;
this.barcodeList.forEach(e =>{
if(e.barcodeType === this.BARCODE_TYPE.BACK_PLANE){
this.addBarcodeBtnVisible = false;
}else if(e.barcodeType === this.BARCODE_TYPE.DOOR){
this.addDoorBarcodeBtnVisible = false;
}
})
}else{
this.addBarcodeBtnVisible = false;
}
} else {
this.addBarcodeBtnVisible = true;
this.addDoorBarcodeBtnVisible = true;
this.handleAdd();
}
this.loading = false;
@ -472,7 +544,18 @@ export default {
this.getData()
}
this.open = true;
this.title = "添加成品条码信息";
this.title = "添加条码信息";
},
/** 新增门板按钮操作 */
handleDoorPlaneAdd() {
this.reset();
if (this.defineData?.planCode) {
this.getData()
this.form.barcodeType = this.BARCODE_TYPE.DOOR;
}
this.open = true;
this.title = "添加条码信息";
},
/** 打印条码按钮操作 */
@ -550,7 +633,11 @@ export default {
const barcodeType = row.barcodeType;
this.$modal.confirm('重新生成后之前的条码将会作废,是否确认重新生成条码内容为"' + barcodeInfo + '"的数据项?').then(function () {
return regenerateProductBarcode({"barcodeId": barcodeId, "barcodeInfo": barcodeInfo, "barcodeType": barcodeType});
return regenerateProductBarcode({
"barcodeId": barcodeId,
"barcodeInfo": barcodeInfo,
"barcodeType": barcodeType
});
}).then(() => {
this.getList();
this.$modal.msgSuccess("重新生成成功");

@ -27,6 +27,16 @@
/>
</el-select>
</el-form-item>
<el-form-item label="工艺路线" prop="dispatchId">
<el-select v-model="form.dispatchId" filterable placeholder="请选择工艺路线" clearable>
<el-option
v-for="item in routeList"
:key="item.routeId"
:label="item.routeName"
:value="item.routeId"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
@ -130,12 +140,8 @@
<script>
import {
listProductOrder,
getProductOrder,
delProductOrder,
addProductOrder,
updateProductOrder,
getOrderCode, productOrderLockInventory, productOrderPublish, productOrderRecall
} from "@/api/mes/productOrder";
import {findRouteList} from "@/api/mes/baseRoute";
export default {
name: "ProductOrder",

@ -338,6 +338,11 @@
placeholder="请选择计划交货日期">
</el-date-picker>
</el-form-item>
<el-form-item label="前置生产工单" prop="preOrderCode">
<el-input v-model="form.preOrderCode" placeholder="请点击右侧检索生产工单" :disabled="productOrderDisabled" readonly>
<el-button slot="append" icon="el-icon-search" @click="handleProductOrderAdd"></el-button>
</el-input>
</el-form-item>
<el-form-item label="计划开始时间" prop="planBeginTime">
<el-date-picker clearable
v-model="form.planBeginTime"
@ -416,6 +421,11 @@
placeholder="请选择计划交货日期">
</el-date-picker>
</el-form-item>
<el-form-item label="前置生产工单" prop="preOrderCode">
<el-input v-model="form.preOrderCode" placeholder="请点击右侧检索生产工单" :disabled="productOrderDisabled" readonly>
<el-button slot="append" icon="el-icon-search" @click="handleProductOrderAdd"></el-button>
</el-input>
</el-form-item>
<el-form-item label="计划开始时间" prop="planBeginTime">
<el-date-picker clearable
v-model="form.planBeginTime"
@ -460,6 +470,15 @@
</div>
</el-dialog>
<!-- 添加生产工单信息对话框 -->
<el-dialog title="选择生产工单信息" :visible.sync="productOrderOpen" width="1000px" append-to-body>
<add-product-order @selection="handleSelection" ref="productOrderRef"></add-product-order>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitProductOrderForm"> </el-button>
<el-button @click="productOrderOpen = false"> </el-button>
</div>
</el-dialog>
</div>
</template>
@ -476,14 +495,17 @@ import addSaleOrder from '@//views/mes/productOrder/addSaleOrder.vue';
import {getMaterialVisionList} from "@//api/mes/materialBom";
import {findRouteList} from "@//api/mes/baseRoute";
import addBom from '@//views/mes/materialBom/addBom.vue';
import add_ProductOrder from '@//views/mes/productOrder/addProductOrder.vue';
import router from "@//router";
import {parseTime} from "@/utils/ruoyi";
export default {
name: "ProductOrder",
dicts: ['active_flag', 'plan_status', 'dispatch_type', 'mes_sale_type'],
components: {
'add-SaleOrder': addSaleOrder,
'add-bom': addBom
'add-bom': addBom,
'add-product-order': add_ProductOrder,
},
data() {
return {
@ -513,6 +535,8 @@ export default {
noOrderOpen: false,
//
materialOpen: false,
//
productOrderOpen: false,
//
queryParams: {
pageNum: 1,
@ -630,9 +654,9 @@ export default {
materialBomList: [],
//线
routeList: [],
saleOrderDisabled: true,
materialDisabled: true,
productOrderDisabled: true,
//
MES_SALE_TYPE: {
MES_SALE_TYPE_EXTERNAL: '1',//
@ -783,6 +807,19 @@ export default {
this.saleOrderOpen = false;
},
/** 提交生产工单信息按钮 */
submitProductOrderForm() {
let selectedRow = this.$refs.productOrderRef.selectedRow;
this.form.preOrderId = selectedRow.saleOrderId;
this.form.preOrderCode = selectedRow.orderCode;
if (selectedRow.planBeginTime != null && this.form.planBeginTime == null){
const date = new Date(selectedRow.planBeginTime);
date.setDate(date.getDate() + 1)
this.form.planBeginTime = parseTime(date, '{y}-{m}-{d} {h}:{i}:{s}');
}
this.productOrderOpen = false;
},
changeSaleType(value) {
this.form.saleOrderId = null;
this.form.saleorderCode = null;
@ -837,6 +874,11 @@ export default {
}
},
/** 新增按钮操作 */
handleProductOrderAdd() {
this.productOrderOpen = true;
},
/** 无订单新增按钮操作 */
handleNoOrderAdd() {
this.materialDisabled = false;

Loading…
Cancel
Save