You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
549 lines
19 KiB
549 lines
19 KiB
<template>
|
|
<div class="page-box" v-loading="Loading.appMainLoading">
|
|
<tablePagination
|
|
:currenButtonData="currenButtonData"
|
|
:tableData="tableData"
|
|
:tableLoading="Loading.tableLoading"
|
|
:tableColumns="tableColumns"
|
|
@rowDrop="rowDrop"
|
|
:totalCount="totalCount"
|
|
:multipleSelection="multipleSelection"
|
|
:MaxResultCount="PageListParams.MaxResultCount"
|
|
@topbutton="topbutton"
|
|
@inlineDialog="inlineDialog"
|
|
@sortChange="sortChange"
|
|
@alertoldSkipCount="alertoldSkipCount"
|
|
@alterResultCount="alterResultCount"
|
|
@handleSelectionChange="handleSelectionChange"
|
|
:currentPageProps="oldSkipCount"
|
|
:quicklySearchOption="quicklySearchOption"
|
|
@quicklySearchClick="quicklySearchClick"
|
|
@quicklySearchClear="quicklySearchClear"
|
|
:primarySearchOption="primarySearchOption"
|
|
@overallSearchFormClick="overallSearchFormClick"
|
|
:httpOverallSearchData="httpOverallSearchData"
|
|
>
|
|
</tablePagination>
|
|
<!-- 执行 -->
|
|
<handelFrom
|
|
:formTitle="formTitle"
|
|
:displayDialog.sync="displayDialog.handleFromDialog"
|
|
:CreateFormData="handleFormData"
|
|
:CreateForm="handleForm"
|
|
:Rules="editRules.handleRule"
|
|
:Options="editOptions"
|
|
:detailsTableColumns="handleDetailsTableColumns"
|
|
:isShowIndex="true"
|
|
:selectionTable="true"
|
|
@handleSelectionChange="handleSelectionChange"
|
|
@FormSubmit="handleFormSubmit"
|
|
></handelFrom>
|
|
<curren-Drawer
|
|
:title="tableColumns"
|
|
:DrawerLoading="Loading.DrawerLoading"
|
|
:drawer="displayDialog.detailsDialog"
|
|
:propsData="propsData"
|
|
:tabsDesTions="tabsDesTions"
|
|
:Butttondata="DrawerButtonData"
|
|
@drawerShut="(val) => (displayDialog.detailsDialog = val)"
|
|
@drawerbutton="drawerbutton"
|
|
@close-value="closeValue"
|
|
:currenButtonData="currenButtonData"
|
|
:tableColumns="detailsTableColumns"
|
|
:totalCount="totalCountDetails"
|
|
:MaxResultCount="MaxResultCountDetails"
|
|
@alterResultCountDetails="alterResultCountDetails"
|
|
@alertoldSkipCountDetails="alertoldSkipCountDetails"
|
|
></curren-Drawer>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import { getPageList, createAndHandle } from "@/api/wms-api"
|
|
import { materialRequestByType, handle} from "@/api/wms-job"
|
|
import { tableMixins } from "@/mixins/TableMixins"
|
|
import { LoadingMixins } from "@/mixins/LoadingMixins"
|
|
import { drawerMixins } from "@/mixins/drawerMixins"
|
|
import { TableHeaderMixins } from "@/mixins/TableHeaderMixins"
|
|
import { mixins } from "@/mixins/mixins"
|
|
import { newAndEdiDialogMixins } from "@/mixins/newAndEdiDialogMixins"
|
|
import store from '@/store'
|
|
import { initPrintAllData } from "@/mixins/printMixin"
|
|
export default {
|
|
name: "IssueJob",
|
|
mixins: [
|
|
tableMixins,
|
|
LoadingMixins,
|
|
drawerMixins,
|
|
TableHeaderMixins,
|
|
mixins,
|
|
newAndEdiDialogMixins
|
|
],
|
|
computed: {
|
|
editDialog: {
|
|
get: function () {
|
|
return this.displayDialog.newDialog || this.displayDialog.editDialog;
|
|
},
|
|
},
|
|
// hideButton: function () {
|
|
// return function (val) {
|
|
// let data = true
|
|
// val.forEach(key => {
|
|
// if (this.propsData.jobStatus == key) {
|
|
// data = false
|
|
// }
|
|
// })
|
|
// return data
|
|
// }
|
|
// },
|
|
},
|
|
data () {
|
|
return {
|
|
URL: 'wms/job/issue-job',
|
|
tableLoading: false,
|
|
handleMultipleSelection: [],
|
|
//常用按钮数据
|
|
currenButtonData: [
|
|
this.defaultFieldSettingBtn(),//字段设置
|
|
this.defaultFreshBtn(),//刷新
|
|
this.defaultFilterBtn(),//筛选
|
|
],
|
|
DrawerButtonData: [
|
|
{
|
|
type: 'info',
|
|
icon: 'el-icon-printer',
|
|
label: '打印',
|
|
hide: false,
|
|
name: "print",
|
|
size: 'mini'
|
|
},
|
|
],
|
|
handleDetailsTableColumns: [
|
|
{ label: "物品代码", prop: "itemCode", },
|
|
{ label: "物品名称", prop: "itemName" },
|
|
{ label: "实际库位", prop: "handledLocationCode", },
|
|
{ label: "推荐库位", prop: "recommendLocationCode", },
|
|
{ label: "实际箱标签", prop: "handledPackingCode", },
|
|
{ label: "推荐箱标签", prop: "recommendPackingCode", },
|
|
{ label: "实际批次", prop: "handledLot", },
|
|
{ label: "推荐批次", prop: "recommendLot", },
|
|
{ type: "object", label: "实际数量", prop: "handledQty", showProp: "qty", },
|
|
{ type: "object", label: "实际单位", prop: "handledQty", showProp: "uom", },
|
|
{ type: "object", label: "推荐数量", prop: "recommendQty", showProp: "qty", },
|
|
{ type: "object", label: "推荐单位", prop: "recommendQty", showProp: "uom", },
|
|
],
|
|
editOptions: {
|
|
|
|
},
|
|
handleFormData: {
|
|
id: null,
|
|
creationTime: null,
|
|
IssueNoteNumber: "123",
|
|
lastModificationTime: null,
|
|
remark: null,
|
|
concurrencyStamp: null,
|
|
company: null,
|
|
number: null,
|
|
upStreamJobNumber: null,
|
|
materialRequestNumber: null,
|
|
jobType: 1,
|
|
jobStatus: 1,
|
|
priority: 0,
|
|
priorityIncrement: 0,
|
|
wlgCode: "123",
|
|
isAutoComplete: true,
|
|
details: [],
|
|
acceptTime: null,
|
|
completeTime: null,
|
|
prodLine: null,
|
|
toLocationCode: null,
|
|
},
|
|
childTableData: [
|
|
{
|
|
"id": null,
|
|
"creationTime": null,
|
|
// "creatorId": null,
|
|
"lastModificationTime": null,
|
|
// "lastModifierId": null,
|
|
"remark": null,
|
|
"concurrencyStamp": null,
|
|
"masterID": null,
|
|
"packingCode": null,
|
|
"containerCode": null,
|
|
"item": {
|
|
"id": null,
|
|
"name": null,
|
|
"desc1": null,
|
|
"desc2": null
|
|
},
|
|
"itemCode": null,
|
|
"stdPack": {
|
|
"packUom": null,
|
|
"packQty": 0
|
|
},
|
|
"recommendBatch": {
|
|
"supplierBatch": null,
|
|
"produceDate": null
|
|
},
|
|
"recommendLot": "",
|
|
"recommendLocationCode": "",
|
|
"recomendQty": {
|
|
"uom": null,
|
|
"qty": 0
|
|
},
|
|
"handledBatch": {
|
|
"supplierBatch": null,
|
|
"produceDate": null
|
|
},
|
|
"handledLot": "",
|
|
"handledLocationCode": "",
|
|
"handledQty": {
|
|
"uom": null,
|
|
"qty": 0
|
|
},
|
|
"fromLocation": "",
|
|
"toLocation": "",
|
|
"workshop": null,
|
|
"prodLine": null,
|
|
"workCenter": null,
|
|
}
|
|
],
|
|
handleForm: [
|
|
{ type: "input", label: "任务编号", prop: "number", colSpan: 12, disabled: "true" },
|
|
{ type: "input", label: "到货编号", prop: "arriveNumber", colSpan: 12, disabled: "true" },
|
|
{ type: "select", label: "任务类型", prop: "jobType", options: "taskType", colSpan: 12, disabled: "true" },
|
|
{ type: "select", label: "任务状态", prop: "jobStatus", options: "jobStatus", colSpan: 12, disabled: "true" },
|
|
{ type: "input", label: "优先级", prop: "priority", colSpan: 12, disabled: "true" },
|
|
{ type: "input", label: "工作组", prop: "wlgCode", colSpan: 12, disabled: "true" },
|
|
{ type: "dateTime", label: "接收时间", prop: "acceptTime", colSpan: 12, },
|
|
{ type: "input", label: "备注", prop: "remark", colSpan: 12, },
|
|
{ type: "input", label: "生产线", prop: "prodLine", disabled: "true", colSpan: 12, },
|
|
// { type: "autocomplete", label: "目标库位", prop: "toLocationCode", optionsLabel: "itemCode", optionsValue: "locationCode", focus: (val) => { return this.getSelectList(val, "wms/inventory/Inventory-Balance") }, click: (val) => { this.filterTable(val, 'wms/inventory/Inventory-Balance', 'InventoryBalance-PullForm', '库位选择') }, colSpan: 12 },
|
|
{ type: "autocomplete", label: "目标库位", prop: "toLocationCode", optionsLabel: "name", optionsValue: "code", focus: (val) => { return this.getSelectList(val, "basedata/Location") }, click: (val) => { this.filterTable(val, 'basedata/Location', 'InventoryBalance-PullForm', '库位选择') }, colSpan: 12 },
|
|
],
|
|
editRules: {
|
|
handleRule: {
|
|
number: [
|
|
{ required: true, trigger: "blur", message: "不可为空" },
|
|
],
|
|
jobType: [{ required: true, trigger: "blur", message: "不可为空" }],
|
|
jobStatus: [{ required: true, trigger: "blur", message: "不可为空" }],
|
|
priority: [{ required: true, trigger: "blur", message: "不可为空" }],
|
|
wlgCode: [{ required: true, trigger: "blur", message: "不可为空" }],
|
|
},
|
|
cerateRule: {
|
|
itemCode: [{ required: true, trigger: "blur", message: "不可为空" }],
|
|
toLocationCode: [{ required: false, trigger: "blur", message: "不可为空" }],
|
|
numberInput: [{ required: true, trigger: "blur", message: "不可为空" }],
|
|
}
|
|
},
|
|
};
|
|
},
|
|
mounted () {
|
|
this.paging();
|
|
},
|
|
methods: {
|
|
//渲染数据
|
|
paging() {
|
|
this.Loading.tableLoading = true;
|
|
this.PageListParams.SkipCount = (this.oldSkipCount - 1) * this.PageListParams.MaxResultCount
|
|
// 叫料请求类型: 人工拉动:Issue_Manual; 线边拉动:Issue_WIP; 直接发料:Direct_Issue
|
|
let params = {
|
|
type: 'Issue_Manual'
|
|
}
|
|
materialRequestByType(this.PageListParams, this.URL + '/by-type', params)
|
|
.then(res => {
|
|
this.tableData = res.items
|
|
this.totalCount = res.totalCount
|
|
this.getSupplierByCodesHandle_table()
|
|
}).catch(err => {
|
|
this.Loading.tableLoading = false
|
|
})
|
|
},
|
|
handleFormSubmit (val) {
|
|
let that = this
|
|
return new Promise((resolve, reject) => {
|
|
if (that.handleMultipleSelection.length == 0) {
|
|
that.$errorMsg('请先择提交的数据!')
|
|
reject()
|
|
} else {
|
|
if (that.handleMultipleSelection[0].requestLocationCode != that.handleFormData.toLocationCode) {
|
|
that.$confirm('目标库位与需求库位不一致,是否要将所有物品发到目标库位?', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
that.checkHandleSubmit(resolve, reject)
|
|
}).catch(() => {
|
|
reject()
|
|
})
|
|
} else {
|
|
that.$confirm('是否要将物品发到目标库位:[' + that.handleFormData.toLocationCode + ']', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
that.checkHandleSubmit(resolve, reject)
|
|
}).catch(() => {
|
|
reject()
|
|
})
|
|
}
|
|
}
|
|
})
|
|
},
|
|
checkHandleSubmit(resolve, reject) {
|
|
let that = this
|
|
|
|
let items = that.handleMultipleSelection.filter(r => {
|
|
return (r.handledPackingCode === null || r.handledPackingCode === '')
|
|
})
|
|
|
|
if (items.length > 0) {
|
|
let packingCodes = '';
|
|
items.forEach(r => {
|
|
packingCodes += r.recommendPackingCode + ','
|
|
})
|
|
that.$confirm('以下箱码对应的实际箱码为空,是否要继续发料?:[' + packingCodes + ']', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
that.finshIssueJobHandle(resolve, reject)
|
|
}).catch(() => {
|
|
return reject()
|
|
})
|
|
} else {
|
|
that.finshIssueJobHandle(resolve, reject)
|
|
}
|
|
},
|
|
finshIssueJobHandle(resolve, reject) {
|
|
let that = this
|
|
let data = {
|
|
id: that.propsData.id
|
|
}
|
|
that.handleMultipleSelection.forEach(item => {
|
|
item.toLocationCode = that.handleFormData.toLocationCode
|
|
item.handledContainerCode = item.recommendContainerCode;
|
|
item.handledPackingCode = item.recommendPackingCode;
|
|
item.handledBatch = item.recommendBatch;
|
|
item.handledLot = item.recommendLot;
|
|
item.handledLocationCode = item.recommendLocationCode;
|
|
})
|
|
let params = JSON.parse(JSON.stringify(that.handleFormData))
|
|
delete params.details
|
|
params.details = that.handleMultipleSelection
|
|
handle(params, data, that.URL).then(res => {
|
|
that.displayDialog.handleFromDialog = false;
|
|
that.$successMsg('已生成发料记录!')
|
|
that.paging()
|
|
return resolve()
|
|
}).catch(err => {
|
|
return reject();
|
|
})
|
|
},
|
|
// 输入框 变更
|
|
changeInput(prop, val) {
|
|
let that = this
|
|
if (prop == 'numberInput' ) {
|
|
this.$confirm('是否要将以下所有零件的需求数量更改为[' + val + ']', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
that.CreateFormData.details.forEach(item => {
|
|
item.numberDetails = parseInt(val)
|
|
})
|
|
}).catch(() => {
|
|
})
|
|
}
|
|
},
|
|
//新增——删除table
|
|
deleteRow(index, rows) {
|
|
rows.splice(index, 1);
|
|
},
|
|
//新增-按钮
|
|
FormClick(val) {
|
|
let that = this
|
|
if (val[0] == 0) {
|
|
} else if (val[0] == 1) {
|
|
// 查询
|
|
this.editRules.cerateRule.toLocationCode[0].required = false
|
|
val[1].validate((valid) => {
|
|
if (valid) {
|
|
this.tableLoading = true
|
|
let params = {
|
|
condition: {
|
|
filters: [
|
|
{
|
|
logic: "And",
|
|
column: "code",
|
|
action: "==",
|
|
value: that.CreateFormData.itemCode
|
|
}
|
|
]
|
|
},
|
|
Sorting: "",
|
|
SkipCount: 0,
|
|
MaxResultCount: 100
|
|
}
|
|
getPageList(params, 'basedata/item-basic').then(res => {
|
|
if (res.items.length == 0) {
|
|
this.$errorMsg('未查询到该物品信息!')
|
|
} else {
|
|
let findRs = that.CreateFormData.details.find(item => (
|
|
item.code == that.CreateFormData.itemCode
|
|
))
|
|
if (!findRs) {
|
|
res.items.forEach(item => {
|
|
item.numberDetails = 0
|
|
that.CreateFormData.details.push(item)
|
|
})
|
|
}
|
|
}
|
|
this.tableLoading = false
|
|
}).catch(err => {
|
|
console.log(err)
|
|
this.tableLoading = false
|
|
})
|
|
} else {
|
|
this.$errorMsg('请检查表单')
|
|
}
|
|
})
|
|
} else {
|
|
this.editRules.cerateRule.toLocationCode[0].required = true
|
|
val[1].validate((valid) => {
|
|
if (valid) {
|
|
if (this.CreateFormData.details.length > 0) {
|
|
let params = {
|
|
worker: store.getters.name.userName,
|
|
company: localStorage.getItem("company"),
|
|
details: [],
|
|
}
|
|
for (var i = 0; i < this.CreateFormData.details.length; i++) {
|
|
if (this.CreateFormData.details[i].numberDetails <= 0) {
|
|
this.$errorMsg('物品[' + this.CreateFormData.details[i].code + ']的数量应该大于0')
|
|
return
|
|
} else {
|
|
params.details.push({
|
|
itemCode: this.CreateFormData.details[i].code,
|
|
item: {
|
|
id: this.CreateFormData.details[i].id,
|
|
name: this.CreateFormData.details[i].name,
|
|
desc1: this.CreateFormData.details[i].desc1,
|
|
desc2: this.CreateFormData.details[i].desc2,
|
|
},
|
|
qty: {
|
|
uom: this.CreateFormData.details[i].basicUom,
|
|
qty: this.CreateFormData.details[i].numberDetails
|
|
},
|
|
prodLine: '',
|
|
status: this.CreateFormData.details[i].status,
|
|
toLocationCode: this.CreateFormData.toLocationCode,
|
|
worker: store.getters.name.userName,
|
|
})
|
|
}
|
|
}
|
|
this.Loading.newAndEdiLoading = true
|
|
createAndHandle(params).then( res => {
|
|
this.displayDialog.newDialog = false
|
|
this.Loading.newAndEdiLoading = false
|
|
this.$successMsg("发料任务创建成功!")
|
|
this.paging()
|
|
}).catch(err => {
|
|
console.log(err)
|
|
this.Loading.newAndEdiLoading = false
|
|
})
|
|
} else {
|
|
this.$errorMsg('无数据可提交!')
|
|
}
|
|
} else {
|
|
this.$errorMsg('请检查表单')
|
|
}
|
|
})
|
|
}
|
|
},
|
|
drawerbutton (val) {
|
|
// 打印
|
|
if(val == 'print'){
|
|
let _propsData = JSON.parse(JSON.stringify(this.propsData))
|
|
_propsData.title = "线边仓领料单"
|
|
_propsData.details.forEach(item=>{
|
|
item.recommendLot = item.recommendLot + " "
|
|
})
|
|
let _option = {
|
|
details:{
|
|
fromLocationCode:"recommendLocationCode",
|
|
qty:"recommendQty",
|
|
uom:"recommendUom",
|
|
fromLot:"recommendLot",
|
|
toLocationErpCode:"locationErpCode",
|
|
fromLocationErpCode:"recommendLocationErpCode",
|
|
}
|
|
}
|
|
let data = initPrintAllData(_propsData,'xbcll.rdlx',false,_option);
|
|
this.Print(data)
|
|
} else {
|
|
drawerMixins.methods.drawerbutton(val, this)
|
|
}
|
|
},
|
|
// drawerbutton(val) {
|
|
// if (val == 'handleJob') {
|
|
// this.Loading.appMainLoading = true
|
|
// let propsData = JSON.parse(JSON.stringify(this.propsData));
|
|
// this.$listAssign(this.handleFormData, propsData)
|
|
// this.handleFormData.toLocationCode = this.handleFormData.details[0].toLocationCode
|
|
// this.handleMultipleSelection = []
|
|
// this.Loading.appMainLoading = false
|
|
// this.formTitle = "执行" + this.$route.meta.title;
|
|
// this.displayDialog.handleFromDialog = true
|
|
// } else {
|
|
// drawerMixins.methods.drawerbutton(val, this)
|
|
// }
|
|
// },
|
|
handleSelectionChange(val) {
|
|
this.handleMultipleSelection = val
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
@import "../../../styles/mainbasicData.scss";
|
|
::v-deep .newAndEdiDialog {
|
|
display: flex;
|
|
flex-direction: column;
|
|
width: 100%;
|
|
height: 100%;
|
|
.el-form {
|
|
flex: 1;
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
align-content: flex-start;
|
|
flex-wrap: wrap;
|
|
overflow: hidden;
|
|
overflow-y: auto;
|
|
}
|
|
.screen-push {
|
|
color: rgb(64, 158, 255);
|
|
span {
|
|
cursor: pointer;
|
|
&:hover {
|
|
color: blue;
|
|
}
|
|
}
|
|
}
|
|
.formButton {
|
|
padding: 20px 20px 20px 0;
|
|
}
|
|
.formTable-box {
|
|
height: 70% !important;
|
|
|
|
.el-form-item__content {
|
|
width: 100%;
|
|
height: 100%;
|
|
display: flex;
|
|
flex-direction: column;
|
|
overflow: hidden;
|
|
margin: 0 !important;
|
|
}
|
|
}
|
|
}
|
|
</style>
|