喻忠伟 2 years ago
commit 90d1e2ec42
  1. 4
      ant-design-vue-jeecg/src/config/router.config.js
  2. 156
      ant-design-vue-jeecg/src/views/shopping/components/billDetail.vue
  3. 394
      ant-design-vue-jeecg/src/views/shopping/components/billTitle.vue
  4. 36
      ant-design-vue-jeecg/src/views/shopping/pages/gerenzhongxin.vue
  5. 32
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/productplan/controller/ZyProductPlanAutoController.java
  6. 4
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/productplan/service/IZyProductPlanAutoService.java
  7. 21
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/productplan/service/impl/IZyProductPlanAutoServiceImpl.java

@ -668,4 +668,8 @@ export const constantRouterMap = [
path: '/shopping/placeOrder',//这里是你需要设置新窗口打开的页面的路径s
component: () => import('@/views/shopping/pages/placeOrder'),
},
{
path: '/shopping/billDetail',//这里是你需要设置新窗口打开的页面的路径s
component: () => import('@/views/shopping/components/billDetail'),
},
]

@ -0,0 +1,156 @@
<template>
<div style="background: #F6F6F6;">
<div class="bg">
<Header></Header>
<h1 class="c_fff">发票详情</h1>
</div>
<div class="billDetail">
<div class="table" cellspacing="0" cellpadding="0">
<tr>
<td class="title">订单编号</td>
<td class="cont">257677098401</td>
<td class="title">发票状态</td>
<td class="cont">已开票</td>
</tr>
<tr>
<td class="title">下单时间</td>
<td class="cont">2022-12-06 18:19:44</td>
<td class="title">发票内容</td>
<td class="cont">商品明细</td>
</tr>
<tr>
<td class="title">发票类型</td>
<td class="cont">电子普通发票</td>
<td class="title">发票抬头</td>
<td class="cont">个人</td>
</tr>
</div>
<div class="table table1" cellspacing="0" cellpadding="0">
<tr class="title">
<th>发票代码</th>
<th>发票号码</th>
<th>微信扫码获取电子普通发票</th>
<th>下载电子增值税普通发票</th>
</tr>
<tr>
<td>041002200111</td>
<td>40821456</td>
<td class="erweima">
<img src="../assets/erweima.png" />
</td>
<td><span class="download" @click="downLoad"><i class="el-icon-download"></i>查看发票</span></td>
</tr>
</div>
<div class="btnList d-flex">
<div class="btn" @click="handleBack">返回</div>
<div class="btn">发送邮箱</div>
<div class="btn">申请换开</div>
</div>
</div>
<Footer></Footer>
</div>
</template>
<script>
import Header from "./Header/HeaderView";
import Footer from "./Footer/FooterView"
export default {
name: "billDetail",
components: { Header,Footer },
data() {
return {
};
},
methods: {
downLoad(){
},
handleBack(){
this.$router.go(-1)
},
},
};
</script>
<style lang="less" scoped>
@import '../assets/common.css';
.bg{
background-image: url("../assets/bg06.png");
height: 352px;
line-height: 400px;
text-align: center;
h1{
font-size: 40px;
}
}
.table tr th, .table tr td { border:1px solid #F2F2F2;padding: 10px;}
.table { border-collapse: collapse;}
.billDetail{
width: 1120px;
height: 500px;
margin: 30px auto;
background: #FFFFFF;
padding: 100px 150px;
.table{
width: 820px;
tr{
width: 820px;
th{
font-size: 12px;
}
td{
i{
margin-right: 2px;
}
}
}
.title{
width: 150px;
text-align: center;
}
.cont{
width: 260px;
}
margin-bottom: 40px;
}
.table1{
.title{
background: #EEE6D9;
}
td{
width: 205px;
text-align: center;
}
.erweima{
img{
width: 70px;
height: 70px;
}
}
.download{
cursor: pointer;
}
}
.btnList{
justify-content: center;
.btn{
margin-right: 33px;
width: 150px;
height: 42px;
border-radius: 3px 3px 3px 3px;
opacity: 1;
border: 1px solid #E4393C;
text-align: center;
font-size: 14px;
color: #E4393C;
line-height: 42px;
transition: all 0.2s;
cursor: pointer;
&:hover{
background-color: #E4393C;
color: #fff;
}
}
}
}
</style>

@ -0,0 +1,394 @@
<template>
<div class="billTitle">
<div class="weizhuce d-flex" v-if="billTitle.length == 0">
<p class="c_1B f_30"> 您还没有抬头</p>
</div>
<div class="d-flex btnDiv">
<div type="primary" class="dialogButton primary f_12" @click="addAddr">创建新抬头</div>
</div>
<div class="addrList" v-if="billTitle.length != 0">
<div class="item" v-for="(item,index) in billTitle" :key="index">
<p class="default" v-if="item.flag"><span class="f_12">默认抬头</span></p>
<div class="d-flex">
<div><span v-if="item.type == 1">专用发票抬头</span><span v-if="item.type == 2">普通发票抬头</span></div>
<div class="btnDiv">
<span class="btn" @click="handleEdit(item)">编辑</span>
<a-popconfirm
title="确定删除吗?"
ok-text="Yes"
cancel-text="No"
@confirm="confirm1(item.id)"
@cancel="cancel"
><span class="btn">删除</span></a-popconfirm>
<a-popconfirm
title="确定将其设置为默认抬头吗?"
ok-text="Yes"
cancel-text="No"
@confirm="confirm2(item.id)"
@cancel="cancel"
v-if="!item.flag"
><span class="btn">将其设置为默认抬头</span></a-popconfirm>
<!-- <span class="btn" v-if="!item.flag" @click="handleDefault(item.id)">将其设置为默认抬头</span>-->
</div>
</div>
<p>
{{item.name}}
</p>
<p>{{item.dutyNum}}</p>
</div>
</div>
<a-modal
title="发票抬头操作"
:visible="visible"
:width="800"
>
<template slot="footer">
<a-button key="back" @click="handleCancel">
取消
</a-button>
<a-button key="submit" type="primary" @click="handleOk">
确定
</a-button>
</template>
<template>
<a-form-model
ref="ruleForm"
:model="form"
:rules="rules"
:label-col="labelCol" :wrapper-col="wrapperCol"
class="modelForm"
>
<a-form-model-item label="发票类型" >
<a-select v-model="form.type" placeholder="请选择发票类型">
<a-select-option value="1">
专用发票
</a-select-option>
<a-select-option value="2">
普通发票
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item
label="发票抬头"
prop="name"
>
<a-input placeholder="请输入发票抬头" v-model="form.name" />
</a-form-model-item>
<a-form-model-item
label="税号"
prop="dutyNum"
>
<a-input placeholder="请输入税号" v-model="form.dutyNum" />
</a-form-model-item>
<a-form-model-item
label="公司注册电话"
prop="phone"
>
<a-input placeholder="请输入公司注册电话" v-model="form.phone">
<template slot="addonBefore">
<span>+86 中国大陆地区</span>
</template>
</a-input>
</a-form-model-item>
<a-form-model-item
label="银行账户"
prop="card"
>
<a-input placeholder="请输入银行账户" v-model="form.card">
</a-input>
</a-form-model-item>
<a-form-model-item label="公司注册地址" prop="detailed">
<a-input v-model="form.detailed" type="textarea" />
</a-form-model-item>
<a-form-model-item>
<a-checkbox @change="onChange" :checked="form.flag">
设置为默认抬头
</a-checkbox>
</a-form-model-item>
</a-form-model>
</template>
</a-modal>
</div>
</template>
<script>
export default {
name: "billTitle",
components: { },
data() {
return {
visible: false,
flag:'',//addedit
copyItem:{},//
labelCol: { span: 5 },
wrapperCol: { span: 19 },
billTitle:[
{
id:1,
type:'1',//12
name:'易创网络科技有限公司',
flag:true,//
dutyNum:'6974980492840298590',//
phone:'17888889999',//
account:'6212261717000030000',//
addr:'河南省驻马店市驿城区黄淮学院北区'
},
{
id:2,
type:'1',//12
name:'易创网络科技有限公司',
flag:false,//
dutyNum:'6974980492840298590',//
phone:'17888889999',//
account:'6212261717000030000',//
addr:'河南省驻马店市驿城区黄淮学院北区'
},
{
id:3,
type:'1',//12
name:'易创网络科技有限公司',
flag:false,//
dutyNum:'6974980492840298590',//
phone:'17888889999',//
account:'6212261717000030000',//
addr:'河南省驻马店市驿城区黄淮学院北区'
}
],//
addrList:[
{
id:1,
name:'吴一',
sex:'1',
phone:'17777777777',
addr:'210521',
detailed:'黄淮学院北区',
flag:true,//
},//
{
id:2,
name:'吴二',
sex:'2',
phone:'17777777777',
addr:'210521',
detailed:'黄淮学院北区',
flag:false,//
},//
{
id:3,
name:'吴三',
sex:'1',
phone:'17777777777',
addr:'210521',
detailed:'黄淮学院北区',
flag:false,//
},//
],//
addr1:'210521',
//
form: {
id:'',
type: undefined,
name: '',
addr: '',
dutyNum: '',
account: '',
phone: '',
flag:false//
},
rules: {
name: [{ required: true, message: '请输入发票抬头', trigger: 'blur' },],
dutyNum: [{ required: true, message: '请输入税号', trigger: 'blur' },],
visit: [
{ required: true, message: '请选择您的配送方式', trigger: 'change' },
],
addr: [{ required: true, message: '请选择地址', trigger: 'blur' }],
detailed: [{ required: true, message: '请输入公司注册地址', trigger: 'blur' }],
phone: [{ required: true, message: '请输入手机号码', trigger: 'blur' },],
card: [{ required: true, message: '请输入银行账户', trigger: 'blur' },],
},
};
},
methods: {
addAddr(){
this.visible = true
this.flag = 'add'
},
changeDefault(){
this.billTitle.forEach(obj =>{
if(obj.flag){
obj.flag = !obj.flag
}
})
},
clearForm(){
this.form = {
id:'',
type: undefined,
name: '',
addr: '',
dutyNum: '',
account: '',
phone: '',
flag:false//
}
},
handleOk(e) {
//
let that = this
this.$refs.ruleForm.validate(valid => {
if (valid) {//
if(this.flag == 'add') {//
if(this.form.flag){//
this.changeDefault()
this.billTitle.unshift(this.form)
}else{//
this.billTitle.push(this.form)
}
}else if(this.flag == 'edit'){//
//
let itemIndex3 = this.billTitle.findIndex(item =>item.id == this.form.id)
if(this.form.flag){//
this.changeDefault()
this.form.flag = true
this.billTitle[itemIndex3] = this.form
console.log("this.billTitle")
console.log(this.billTitle)
}else{
this.billTitle[itemIndex3] = this.form
}
}
//
this.clearForm()
this.flag = ''
this.visible = false;
} else {}
});
},
handleCancel() {
this.visible = false;
if(this.flag == 'edit'){
let itemIndex4 = this.billTitle.findIndex(item =>item.id == this.form.id)
this.billTitle[itemIndex4] = this.copyItem
}
this.flag = ''
this.$refs['ruleForm'].resetFields()
},
onChange(e) {
this.form.flag = e.target.checked
},
handleEdit(item){
this.copyItem = JSON.parse(JSON.stringify(item));
this.visible = true
this.flag = 'edit'
this.form = item
},
confirm1(id) {
let itemIndex = this.billTitle.findIndex(item =>item.id == id)
this.billTitle.splice(itemIndex,1)
},
confirm2(id) {
this.changeDefault()
let itemIndex2 = this.billTitle.findIndex(item =>item.id == id)
this.billTitle[itemIndex2].flag = true
},
cancel(e) {
this.$message.warning('已取消');
},
},
};
</script>
<style lang="less" scoped>
@import '../assets/common.css';
.modelForm{
padding:20px 100px;
}
.addrList .j-area-linkage /deep/ .area-select{
background-color: #fff;
border: none;
span{
padding-left: 0;
font-size: 12px;
color:#313131;
cursor:auto;
font-weight: 500;
}
i{
display: none;
}
}
.btnDiv{
justify-content: center;
.dialogButton {
width: 300px;
height: 42px;
text-align: center;
line-height: 42px;
transition: all 0.2s;
}
.primary {
background: #1b1b1b;
border: 2px solid #1b1b1b;
color: #e5dfd9;
&:hover {
opacity: 0.8;
}
}
}
.billTitle{
width: 1114px;
margin:0 auto;
padding-top: 50px;
.weizhuce{
text-align: center;
flex-direction: column;
justify-content: center;
align-items: center;
p{
width: 300px;
}
}
.addrList{
width: 800px;
margin: 0 auto;
.item{
padding-top: 40px;
border-bottom: 1px solid #DADADA;
color: #1A1919;
p{
font-size: 12px;
}
.default{
span{
display: inline-block;
padding: 4px 12px;
box-sizing: content-box;
background: #F8F8F8;
width: 72px;
height: 21px;
text-align: center;
line-height: 21px;
}
}
.d-flex{
justify-content: space-between;
font-size: 14px;
.btnDiv{
.btn{
cursor: pointer;
}
}
.btn{
text-decoration: underline;
margin-right: 20px;
}
div:first-child{
margin-bottom: 12px;
}
}
}
}
}
</style>

@ -126,7 +126,7 @@
<AddrView v-if="current[0] == 'addr'"></AddrView>
<div class="invoiceList">
<!-- 发票管理-->
<div class="invoice" v-for="(item,index) in invoiceList" :key="index">
<div class="invoice" v-if="current[0] == 'invoice1'||'invoice2'||'invoice3'" v-for="(item,index) in invoiceList" :key="index">
<div class="d-flex title">
<span class="c_333 f_16">{{item.date}}</span>
<span class="font_01" v-if="item.billing">已开票</span>
@ -144,13 +144,14 @@
<div class="font_02">开票金额{{item.price}}</div>
</div>
<div class="btnDiv d-flex">
<div class="dialogButton primary">申请换开</div>
<div class="dialogButton default">查看详情</div>
<div class="dialogButton primary" v-if="!item.billing">申请开票</div>
<div class="dialogButton primary" v-if="item.billing">申请换开</div>
<div class="dialogButton default" v-if="item.billing" @click="toBillDetail(item.id)">查看详情</div>
</div>
</div>
</div>
<!-- 发票抬头管理-->
<div class="invoice"></div>
<!-- 发票抬头管理-->
<BillTitle v-if="current[0] == 'invoice4'"></BillTitle>
</div>
<div class="orderList" >
@ -201,15 +202,16 @@
import PasswordModal from '../../system/modules/PasswordModal'
import Collection from "../components/collection";
import AddrView from "../components/addrView"
import BillTitle from "../components/billTitle"
export default {
name: "gerenzhongxin",
components: { Header,Footer,PasswordModal ,Collection,AddrView},
components: { Header,Footer,PasswordModal ,Collection,AddrView,BillTitle},
data() {
return {
model:{
username1: ""
},
current: ['invoice1'],//
current: ['allorders'],//
key:'',//
allOrders2:[],
allOrders1:[
@ -293,7 +295,7 @@
price:2456,//
},
],//
billTitle:[],//
url: {
list: "/starehouse/starehouse/list",
getusername: "/sys/user/getusername",
@ -364,6 +366,14 @@
}
},
methods: {
toBillDetail(id){
this.$router.push({
path: "/shopping/billDetail",
query: {
id: id,
},
});
},
passwordModalOk() {
//TODO datasource
},
@ -471,26 +481,36 @@
if(key.key == 'allorders'){
/* this.allOrders = this.allOrders1*/
this.allOrders = this.allOrders2
this.invoiceList=[]
}
else if(key.key == 'daizhifu'){
/* this.allOrders = this.allOrders1.filter(item=>item.pay == false)*/
this.allOrders = this.allOrders2.filter(item=>item.pay == false)
this.invoiceList=[]
}
else if(key.key == 'daishouhuo'){
/*this.allOrders = this.allOrders1.filter(item=>item.receipt == false && item.pay == true)*/
this.allOrders = this.allOrders2.filter(item=>item.receipt == false && item.pay == true)
this.invoiceList=[]
}
else if(key.key == 'yiwancheng'){
/*this.allOrders = this.allOrders1.filter(item=>item.receipt == true)*/
this.allOrders = this.allOrders2.filter(item=>item.receipt == true)
this.invoiceList=[]
}else if(key.key == 'invoice1'){//
this.invoiceList = this.invoiceList1
this.allOrders=[]
}
else if(key.key == 'invoice2'){//
this.invoiceList = this.invoiceList1.filter(item=>item.billing == true)
this.allOrders=[]
}
else if(key.key == 'invoice3'){//
this.invoiceList = this.invoiceList1.filter(item=>item.billing == false)
this.allOrders=[]
}else{
this.allOrders=[]
this.invoiceList=[]
}
// else{
// this.allOrders=[]

@ -1,36 +1,22 @@
package org.jeecg.modules.productplan.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.productplan.entity.ZyPlanProcess;
import org.jeecg.modules.productplan.entity.ZyProductPlan;
import org.jeecg.modules.productplan.entity.vo.PaiWeiTuVo;
import org.jeecg.modules.productplan.service.IZyProductPlanAutoService;
import org.jeecg.modules.productplan.service.IZyProductPlanService;
import org.jeecg.modules.system.entity.SysDepart;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysDepartService;
import org.jeecg.modules.system.service.ISysUserService;
import org.jeecg.modules.workproduct.entity.ZyProduct;
import org.jeecg.modules.workproduct.service.IZyProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @Description: 生产计划自动化
@ -50,15 +36,15 @@ public class ZyProductPlanAutoController extends JeecgController<ZyProductPlan,
@ApiOperation(value = "生产计划自动化-模拟测试", notes = "生产计划自动化-模拟测试")
@GetMapping(value = "/productPlanAuto4Mock")
public Result<?> productPlanAuto4Mock(List<String> workOrderIds) {
iZyProductPlanAutoService.doAuto(workOrderIds);
return Result.OK();
List<Map<String, List<ZyPlanProcess>>> list = iZyProductPlanAutoService.doAuto(workOrderIds);
return Result.OK(list);
}
@ApiOperation(value = "生产计划自动化", notes = "生产计划自动化")
@GetMapping(value = "/productPlanAuto")
public Result<?> productPlanAuto() {
iZyProductPlanAutoService.doAuto(null);
return Result.OK();
List<Map<String, List<ZyPlanProcess>>> list = iZyProductPlanAutoService.doAuto(null);
return Result.OK(list);
}
}

@ -1,12 +1,14 @@
package org.jeecg.modules.productplan.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.productplan.entity.ZyPlanProcess;
import org.jeecg.modules.productplan.entity.ZyProductPlan;
import org.jeecg.modules.productplan.entity.vo.PaiWeiTuVo;
import org.jeecg.modules.workorder.entity.WorkOrder;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
/**
* @Description: 生产计划
@ -16,7 +18,7 @@ import java.util.List;
*/
public interface IZyProductPlanAutoService extends IService<ZyProductPlan> {
void doAuto(List<String> workOrderList);
List<Map<String, List<ZyPlanProcess>>> doAuto(List<String> workOrderList);
boolean filling4Auto(String planId);
}

@ -13,13 +13,8 @@ import org.jeecg.modules.productplan.entity.ZyPlanProcessAccessories;
import org.jeecg.modules.productplan.entity.ZyPlanProcessFabric;
import org.jeecg.modules.productplan.entity.ZyProductPlan;
import org.jeecg.modules.productplan.enums.ProductPlanStatusEnum;
import org.jeecg.modules.productplan.mapper.ZyPlanProcessAccessoriesMapper;
import org.jeecg.modules.productplan.mapper.ZyPlanProcessFabricMapper;
import org.jeecg.modules.productplan.mapper.ZyProductPlanMapper;
import org.jeecg.modules.productplan.service.*;
import org.jeecg.modules.productprocessaccessories.service.IProductProcessAccessoriesService;
import org.jeecg.modules.productprocessfabric.entity.ProductProcessFabric;
import org.jeecg.modules.productprocessfabric.service.IProductProcessFabricService;
import org.jeecg.modules.system.entity.SysDepart;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysDepartService;
@ -36,8 +31,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
@ -259,7 +252,7 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp
@Override
@Transactional(rollbackFor = Exception.class, readOnly = false)
public void doAuto(List<String> workOrderList4Mock) {
public List<Map<String, List<ZyPlanProcess>>> doAuto(List<String> workOrderList4Mock) {
//1,获取未排产工单
List<WorkOrder> workOrderList;
@ -274,12 +267,12 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp
// List<WorkOrder> workOrderList = iWorkOrderService.list(new LambdaQueryWrapper<WorkOrder>()
// .eq(WorkOrder::getWorkOrderStatus, WorkOrderStatusEnum.UNAUDITED.getCode()));
if (ObjectUtils.isEmpty(workOrderList)) return;
if (ObjectUtils.isEmpty(workOrderList)) return Collections.EMPTY_LIST;
//2,保存生产计划
// List<ZyProductPlan> productPlanList = this.saveProductPlan(workOrderList);
List<ZyProductPlan> productPlanList = this.saveProductPlan4Mock(workOrderList);
if (ObjectUtils.isEmpty(productPlanList)) return;
if (ObjectUtils.isEmpty(productPlanList)) return Collections.EMPTY_LIST;
//3,同步计划生产工序、同步生产计划工序面料、同步生产计划辅料
productPlanList.stream().forEach(f -> {
@ -291,6 +284,7 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp
//4,自动排位(匹配工序设备、工序工具、工人)
// 匹配工序设备、工序工具有一个工序失败,则工单作为异常处理,删除生产计划及相关子表
//只有一个生产计划的设备、工具都匹配成功才进行一下操作(生成物料单、发送到仓库)
List<Map<String, List<ZyPlanProcess>>> returnList = new LinkedList<>();
productPlanList.stream().forEach(k -> {
//TODO 数据不完整,测试时注释
// boolean b = this.filling4Auto(k.getId());
@ -304,14 +298,19 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp
});
// }
Map<String, List<ZyPlanProcess>> map = new HashMap<>();
map.put(k.getProductCode(), planProcessList);
//测试需要返回生产计划工序
returnList.add(map);
});
return returnList;
}
/**
* 匹配设备&工具&工人
* <p>
* 匹配车间工位设备与工序设备工位设备包含工序设备即匹配成功匹配失败做异常处理
* 匹配车间工位工具与工序设备工位设备包含工序设备即匹配成功匹配失败做异常处理
* 匹配车间工位工具与工序工具工位设备包含工序设备即匹配成功匹配失败做异常处理
*
* @param planId
*/

Loading…
Cancel
Save