<html>
<head>
<meta charset="utf-8">
<title>Bin Stock Query</title>
<!--<link href="index.css" rel="stylesheet">
<script src="index.js"></script>-->
<link href="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/element-ui/2.15.7/theme-chalk/index.min.css" type="text/css" rel="stylesheet">
<script src="https://unpkg.com/vue@2.6.14/dist/vue.min.js"></script>
<script src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/axios/0.26.0/axios.min.js" type="application/javascript"></script>
<!-- <link href="./index.css" rel="stylesheet">
<script src="./index.js"></script> -->
<link href="/WebResources/gs_/styles/common/index.css" rel="stylesheet">
<script src="/WebResources/gs_/scripts/common/index.js"></script>
<style>
html {
overflow-x: hidden;
}
.el-table .cell {
font-size: 13px
}
dot {
display: inline-block;
height: 1em;
line-height: 1;
text-align: left;
vertical-align: -.25em;
overflow: hidden;
}
dot::before {
display: block;
content: '...\A..\A.';
white-space: pre-wrap;
animation: dot 3s infinite step-start both;
}
@keyframes dot {
33% {
transform: translateY(-2em);
}
}
.el-dialog__headerbtn {
display: none;
}
#main {
margin: auto;
width: 100%;
}
.el-textarea__inner {
height: 100px;
}
.dialog-footer {
display: flex;
justify-content: space-around;
padding-bottom: 20px;
position: fixed;
bottom: 0;
right: 8px;
z-index: 1;
background-color: #fff;
}
.el-message-box__headerbtn {
display: none;
}
.el-table td,
.el-table th {
padding: 9px 0;
}
.mycustom {
margin: 0 !important;
min-height: 100vh;
}
.tabletitle {
height: 30px;
background-color: aliceblue;
line-height: 30px;
padding-left: 15px;
font-size: 14px;
color: #606266;
border: 1px solid #EBEEF5;
border-bottom: 0
}
.querydiv {
font-size: 12px;
text-align: center;
margin-top: 75px;
}
.el-input-number__decrease,
.el-input-number__increase {
/* height: 100% !important; */
bottom: 1px !important;
display: flex;
align-items: center;
justify-content: center;
}
.next-page,
.prev-page {
border-color: transparent;
font-size: 12px;
line-height: 22px;
height: 22px;
min-width: 22px;
background: center center no-repeat #FFF;
background-size: 16px;
padding-right: 12px;
cursor: pointer;
margin: 0;
color: #303133;
}
.next-page:disabled,
.prev-page:disabled {
color: #C0C4CC;
cursor: not-allowed;
}
</style>
<meta>
<meta>
<meta>
<meta>
</head>
<body style="overflow-wrap: break-word;" onfocusout="parent.setEmailRange();">
<div id="app" style="font-family: undefined;">
<div id="main">
<div style="padding-bottom: 100px;" v-loading="showwait">
<el-form>
<el-row :gutter="40">
<el-col :span="8">
<el-form-item label="Plant">
<el-select v-model="Plant" style="width: 100%;" filterable="" placeholder="Please select plant" @change="plantChange">
<el-option v-for="(item, index) in plantOptions" :key="index" :label="item.gs_plantcode" :value="item.gs_plantcode">
</el-option>
</el-select>
<!-- <el-input v-model="Plant" placeholder="Please input plant" /> -->
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="Storage Location">
<el-select v-model="Storage" style="width: 100%;" placeholder="Please select storage location" filterable="" @change="storageChange">
<el-option v-for="(item, index) in storageOptions" :key="index" :label="item.gs_sloc_mrp" :value="item.gs_sloc_mrp">
</el-option>
</el-select>
<!-- <el-input v-model="Storage" placeholder="Please input storage location" /> -->
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="Bin">
<el-select v-loading="binLoading" style="width: 100%;" filterable="" v-model="Bin" placeholder="Please select bin">
<el-option v-for="(item, index) in binOptions" :key="index" :label="item.gs_name" :value="item.gs_name">
</el-option>
</el-select>
<!-- <el-input v-model="Bin" placeholder="Please input bin" /> -->
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="40">
<el-col :span="8">
<el-form-item label="Material">
<el-input v-model="Material" placeholder="Please input material" readonly="true">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8" style="height: 1px;">
<el-form-item label="Serial Number">
<el-input v-model="SN" placeholder="Please input Serial Number">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8" style="height: 102px; display: flex; align-items: flex-end; justify-content:flex-end;">
<el-button style="margin-bottom: 22px;" type="primary" @click="getList('setTotal')">Search</el-button>
</el-col>
</el-row>
</el-form>
<div class="tabletitle">Bin List</div>
<el-table :data="lastList" style="width: 100%;" ref="multipleTable" border="" @select="handleSelection" @select-all="handleAllSelection">
<el-table-column type="selection" width="55" align="center"></el-table-column>
<el-table-column prop="gs_materialnumber" label="Material" align="center"> </el-table-column>
<el-table-column prop="gs_plant" label="Plant" width="130" align="center"> </el-table-column>
<el-table-column prop="gs_storagelocation" label="Storage Location" align="center"></el-table-column>
<el-table-column prop="gs_batch" label="Bin" align="center"> </el-table-column>
<el-table-column prop="gs_stockavailablequantity" label="Stock Quantity" width="150" align="center"> </el-table-column>
<el-table-column prop="gs_binstock" label="Bin Stock" width="150" align="center"> </el-table-column>
<el-table-column label="Last Movement Date" align="center">
<template slot-scope="scope">
{{scope.row["gs_changedate@OData.Community.Display.V1.FormattedValue"]}}
</template>
</el-table-column>
<el-table-column prop="gs_cus_serialnumber" label="Serial Number" align="center"> </el-table-column>
</el-table>
<!-- <el-pagination v-if="total > pagesize" small @current-change="handleCurrentChange"
layout="prev,slot,next" :total="total" style="float: right; display: flex; padding: 10px;">
<div class="nowPage">{{page}}</div>
</el-pagination> -->
<el-pagination ref="pagination" v-if="total > pagesize" small="" @current-change="handleCurrentChange" :total="total" :current-page.sync="page" layout="slot" style="float: right; display: flex; padding: 10px;">
<div style="display: flex;align-items: center;">
<button @click="prev" :disabled="page===1" class="prev-page"><i class="el-icon el-icon-arrow-left"></i></button>
<div class="nowPage">{{page}}</div>
<button @click="next" :disabled="!moreData" class="next-page"><i class="el-icon el-icon-arrow-right"></i></button>
</div>
</el-pagination>
<div slot="footer" class="dialog-footer">
<el-button type="default" @click="CancelForm">Cancel</el-button>
<el-button type="danger" @click="clear">Clear Select</el-button>
<el-badge :value="chooseNumber" style="margin-left: 10px;margin-right: 10px;">
<el-button type="primary" @click="openDialog">Next</el-button>
</el-badge>
</div>
</div>
</div>
<el-dialog title="Outbound Picking Slip" width="100%" custom-class="mycustom" :modal="false" :close-on-press-escape="false" :visible.sync="dialogTableVisible">
<el-form :rules="rules" :model="rulesform" ref="rulesform">
<el-row :gutter="40">
<!-- <el-col :span="8">
<el-form-item label="To Bin" prop="TargetBin">
<el-select v-loading="targetbinLoading" style="width: 100%;" filterable
v-model="rulesform.TargetBin" placeholder="Please select bin">
<el-option v-for="(item, index) in targetbinOptions" :key="index" :label="item.gs_name"
:value="item.gs_name">
</el-option>
</el-select>
</el-form-item>
</el-col> -->
<el-col :span="8">
<el-form-item label="Order Quantity">
<el-input v-model="OrderQuantity" readonly=""></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="Remain To Pick">
<el-input v-model="RemainQuantity" readonly=""></el-input>
</el-form-item>
</el-col>
<el-col :span="8" style="height: 1px;"></el-col>
</el-row>
</el-form>
<el-table :data="chooseList" style="width: 100%;" border="">
<el-table-column prop="gs_materialnumber" label="Material" align="center"> </el-table-column>
<el-table-column prop="gs_plant" label="Plant" align="center"> </el-table-column>
<el-table-column prop="gs_storagelocation" label="Storage Location" align="center"></el-table-column>
<el-table-column prop="gs_batch" label="Bin" align="center"> </el-table-column>
<el-table-column prop="gs_stockavailablequantity" label="Stock Quantity" align="center"></el-table-column>
<!-- <el-table-column prop="gs_binstock" label="Bin Stock" align="center"></el-table-column>-->
<el-table-column label="Quantity To Pick" width="180" align="center">
<template slot-scope="scope">
<div>
<el-input-number size="small" v-model="scope.row.moveqty" :min="0" :max="scope.row.gs_stockavailablequantity" label="Please set move quantity"></el-input-number>
</div>
</template>
</el-table-column>
<el-table-column prop="gs_cus_serialnumber" label="Serial Number" align="center"> </el-table-column>
</el-table>
<div slot="footer">
<el-button @click="dialogTableVisible = false">Prev</el-button>
<el-button type="primary" @click="SubmitForm">Submit</el-button>
</div>
</el-dialog>
</div>
<script>
new Vue({
el: '#app',
data() {
var validateTargetBin = (rule, value, callback) => {
if (value === '--Select--' || value === '') {
callback(new Error('Please select bin'));
} else {
callback();
}
};
return {
moreData: true,
dialogTableVisible: false,
page: 1,
showwait: false,
pagesize: 15,
total: 0,
Plant: "Code",
plantOptions: [],
Storage: "",
storageOptions: [],
Bin: "",
binOptions: [],
binLoading: false,
SN: "",
Material: "",
sn_profile: "",
OrderQuantity: 0,
list: [],
lastList: [],
chooseList: [],
rulesform: {
// TargetStorage: "",
TargetBin: ""
},
rules: {
// TargetStorage: [
// { required: true, message: 'Please select target storage location', trigger: 'blur' },
// ],
TargetBin: [
{ validator: validateTargetBin, trigger: ['blur', 'change'] }
// { required: true, message: 'Please select target bin', trigger: 'blur' }
]
},
// targetstorageOptions: [],
targetbinOptions: [],
targetbinLoading: false
}
},
created() {
debugger;
var that = this
this.showwait = true
this.getPlantList().then(res => {
// var data = that.getQueryString("data");
that.Plant = that.findDefaultPlantByUserRegion();
that.setStorage();
that.getBinList().then(() => {
that.getList('setTotal');
})
var data = this.getQueryString("data");
// this.Plant = this.getString(data, "plant");
// this.Storage = this.getString(data, "storagelocation");
this.Material = this.getString(data, "material");
that.OrderQuantity = Number(this.getString(data, "quantity"));
this.sn_profile = this.getString(data, "snprofile");
// this.ChosedNumber = Number(this.getString(data, "chosednumber"));
// that.Plant = that.getString(data, "plant");
// that.Storage = that.getString(data, "storagelocation");
// that.Material = that.getString(data, "material");
// that.getList('setTotal');
})
},
computed: {
chooseNumber() {
return this.chooseList.length
},
RemainQuantity() {
var OrderQuantity = this.OrderQuantity, chooseList = this.chooseList
var chosedNumber = chooseList.reduce((acc, item) => acc + item.moveqty, 0);
return OrderQuantity - chosedNumber
}
},
methods: {
getPlantList() {
var that = this
return new Promise((resolve, reject) => {
var url = "msdyn_warehouses?$filter=statecode eq 0"
this.fetchRecord(url).then(res => {
console.log(res)
var values = res.data.value
// var arr1 = values.filter((item) => { return item.statecode === 0 })
this.optionstore = JSON.parse(JSON.stringify(values))
var arr = this.uniqueArray(values, "gs_plantcode")
this.plantOptions = arr
resolve()
}).catch((res) => {
reject(res)
})
})
},
setStorage() {
var Plant = this.Plant, optionstore = this.optionstore
var arr = optionstore.filter(item => { return item.gs_plantcode === Plant });
var arr1 = this.uniqueArray(arr, "gs_sloc_mrp")
arr1.unshift({ gs_sloc_mrp: "--Select--" })
this.storageOptions = arr1
this.Storage = arr1[0].gs_sloc_mrp
// this.targetstorageOptions = arr1
// this.$set(this.rulesform, "TargetStorage", arr1[0].gs_sloc_mrp)
},
plantChange($event, item) {
this.setStorage()
this.$nextTick(() => {
this.getBinList()
})
},
storageChange() {
this.$nextTick(() => {
this.getBinList()
})
},
getBinList() {
var that = this
return new Promise((resolve, reject) => {
that.binLoading = true
that.Bin = ""
that.$set(that.rulesform, "TargetBin", "")
var Plant = that.Plant, Storage = that.Storage, url = ""
if (Storage === "--Select--") {
url = `gs_warehousebins?$filter=gs_plant eq '${Plant}' and statecode eq 0`
} else {
url = `gs_warehousebins?$filter=gs_plant eq '${Plant}' and gs_storagelocation eq '${Storage}' and statecode eq 0`
}
that.fetchRecord(url).then(res => {
var values = res.data.value
values.unshift({ gs_name: "--Select--" })
that.binOptions = values
that.binLoading = false
that.Bin = values[0].gs_name
that.targetbinOptions = values
resolve()
}).catch(res => {
reject(res)
})
})
},
getList(setTotal) {
if (setTotal) {
this.page = 1
this.total = 0
this.moreData = false
this.lastList = []
}
const that = this
var url = this.fetchXml()
debugger;
this.showwait = true
this.fetchRecord(url).then(res => {
that.showwait = false
var values = res.data.value
for (let i = 0; i < values.length; i++) {
const item = values[i];
item.$id = item.gs_materialnumber + "&&" + item.gs_stockavailablequantity + "&&" + item.gs_batch + "&&" + item.gs_storagelocation + "&&" + item.gs_plant + "&&" + item.gs_cus_serialnumber;
item.gs_stockavailablequantity = Number(item.gs_stockavailablequantity)
// item.moveqty = Number(item.gs_stockavailablequantity)
item.moveqty = 0
}
that.lastList = values
if (that.chooseList.length > 0) {
that.$nextTick(() => {
that.resetList(that.lastList)
})
}
that.moreData = res.data["@Microsoft.Dynamics.CRM.morerecords"] ? true : false
that.total = 5000;// Modified by Jeff.lai on 20231128 // res.data["@Microsoft.Dynamics.CRM.totalrecordcount"]
}).catch(res => {
this.showwait = false
})
},
prev() {
this.$refs.pagination.prev()
},
next() {
this.$refs.pagination.next()
},
resetList(list) {
let chooseList = this.chooseList, arr = []
for (let i = 0; i < list.length; i++) {
const item = list[i];
for (let j = 0; j < chooseList.length; j++) {
const element = chooseList[j];
if (item.$id === element.$id) {
this.$refs.multipleTable.toggleRowSelection(item);
}
}
}
},
fetchXml() {
var Plant = this.Plant, Storage = this.Storage, Bin = this.Bin, Material = this.Material, SN = this.SN, pagesize = this.pagesize, page = this.page;
var empty = !this.isEmpty(Plant) || !this.isEmpty(Storage) || !this.isEmpty(Bin) || !this.isEmpty(Material) || !this.isEmpty(SN)
var emptyStartStr = empty ? '<filter type="and">' : ''
var emptyEndStr = empty ? '</filter>' : ''
var plantStr = !this.isEmpty(Plant) ? '<condition attribute="gs_plant" operator="eq" value="' + Plant + '" />' : ''
var storageStr = "", binStr = ""
if (Storage != "--Select--" && !this.isEmpty(Storage)) {
storageStr = '<condition attribute="gs_storagelocation" operator="eq" value="' + Storage + '" />'
}
if (Bin != "--Select--" && !this.isEmpty(Bin)) {
binStr = '<condition attribute="gs_batch" operator="eq" value="' + Bin + '" />'
}
var materialStr = !this.isEmpty(Material) ? '<condition attribute="gs_materialnumber" operator="eq" value="' + Material + '" />' : ''
var snStr = !this.isEmpty(SN) ? '<condition attribute="gs_cus_serialnumber" operator="eq" value="' + SN + '" />' : ''
var fetchxml = 'gs_stockdatas?fetchXml='; fetchxml = fetchxml + encodeURIComponent('<fetch version="1.0" mapping="logical" returntotalrecordcount="true" page="' + page + '" count="' + pagesize + '" no-lock="false">' +
'<entity name="gs_stockdata">' +
'<attribute name="gs_cus_serialnumber" />' +
'<attribute name="gs_storagelocation" />' +
'<attribute name="gs_stockavailablequantity" />' +
'<attribute name="gs_binstock" />' +
'<attribute name="gs_plant" />' +
'<attribute name="gs_materialnumber"/>' +
'<attribute name="gs_changedate"/>' +
'<attribute name="gs_batch"/>' +
'<attribute name="gs_stockdataid"/>' +
emptyStartStr + plantStr + storageStr + binStr + materialStr + snStr + emptyEndStr +
'</entity>' +
'</fetch>');
return fetchxml;
},
getWebAPIPath() {
return window.top.Xrm.Utility.getGlobalContext().getClientUrl() + "/api/data/v9.2/";
},
fetchRecord(url) {
const options = {
method: 'GET',
headers: {
Accept: "application/json",
"OData-MaxVersion": "4.0",
"OData-Version": "4.0",
Prefer: 'odata.include-annotations="*"'
// Prefer: 'odata.include-annotations="OData.Community.Display.V1.FormattedValue",odata.maxpagesize=' + this.pagesize
},
url: this.getWebAPIPath() + url,
};
return axios(options)
},
isEmpty(str) {
return (!str || 0 === str.length);
},
handleSelection(selection, row) {
debugger;
let chooseList = this.chooseList
const isIdInArray = selection.some(item => item.$id === row.$id);
if (isIdInArray) {
// 选中
chooseList.push(row)
}
else {
// 取消选中
chooseList = chooseList.filter(item => item.$id !== row.$id);
//added by jeff.lai on 20231009 -- begin
var checkHasSNLine = selection.filter(se => se.gs_plant == row.gs_plant && se.gs_storagelocation == row.gs_storagelocation && se.gs_materialnumber == row.gs_materialnumber && se.gs_batch == row.gs_batch && se.gs_cus_serialnumber);
if (checkHasSNLine.length <= 0) {
var removeId = (row.gs_materialnumber + "&&" + row.gs_binstock + "&&" + row.gs_batch + "&&" + row.gs_storagelocation + "&&" + row.gs_plant);
if (!this.isEmpty(removeId)) {
chooseList = chooseList.filter(item => item.$id !== removeId);
}
}
else {
var updateId = (row.gs_materialnumber + "&&" + row.gs_binstock + "&&" + row.gs_batch + "&&" + row.gs_storagelocation + "&&" + row.gs_plant);
var patchList = chooseList.filter(f => f.$id === updateId);
var updateQty = checkHasSNLine.length;
var currentBinQty = patchList[0].gs_stockavailablequantity;
var midQty = currentBinQty + updateQty;
if (midQty <= 0) {
chooseList = chooseList.filter(item => item.$id !== updateId);
}
else {
var UpdateList = chooseList.filter(f => f.$id == updateId);
UpdateList[0].gs_stockavailablequantity = midQty;
chooseList = chooseList.filter(item => item.$id !== updateId);
chooseList.push(UpdateList[0]);
}
}
}
var orgChooseList = row;
if (this.sn_profile.toLowerCase() == "zdps" && !this.isEmpty(row.gs_cus_serialnumber)) {
this.$refs.multipleTable.clearSelection();
this.$refs.multipleTable.toggleRowSelection(row);
this.$set(row, "moveqty", 1);
this.chooseList = [];
this.chooseList.push(row);
}
else if (isIdInArray && orgChooseList.gs_cus_serialnumber !== "undefined"
&& !this.isEmpty(orgChooseList.gs_cus_serialnumber)
&& (this.sn_profile.toLowerCase() == "zint" && !this.isEmpty(this.sn_profile))) {
debugger;
if (this.OrderQuantity == 1) {
this.$refs.multipleTable.clearSelection();
this.$refs.multipleTable.toggleRowSelection(row);
this.$set(row, "moveqty", 1);
this.chooseList = [];
this.chooseList.push(row);
}
if (orgChooseList.gs_binstock > orgChooseList.gs_stockavailablequantity && (this.OrderQuantity > 1)) {
//this.$refs.multipleTable.clearSelection();
// this.$refs.multipleTable.toggleRowSelection(row);
this.$set(row, "moveqty", 1);
// chooseList.push(row);
// this.chooseList = [];
// this.chooseList.push(row);
const hasValue = chooseList.some(item => item.$id === row.$id);
if (hasValue == false) {
chooseList.push(row);
}
var newrow = {
"$id": (orgChooseList.gs_materialnumber + "&&" + orgChooseList.gs_binstock + "&&" + orgChooseList.gs_batch + "&&" + orgChooseList.gs_storagelocation + "&&" + orgChooseList.gs_plant),
"gs_batch": orgChooseList.gs_batch,
"gs_binstock": orgChooseList.gs_binstock,
"gs_binstock@OData.Community.Display.V1.FormattedValue": orgChooseList.gs_binstock,
"gs_block_qty": 0,
"gs_block_qty@OData.Community.Display.V1.FormattedValue": 0,
"gs_changedate": orgChooseList.gs_changedate,
"gs_changedate@OData.Community.Display.V1.FormattedValue": orgChooseList.gs_changedate,
"gs_cus_serialnumber": "",
"gs_materialnumber": orgChooseList.gs_materialnumber,
"gs_plant": orgChooseList.gs_plant,
"gs_serialnumber": orgChooseList.gs_serialnumber,
"gs_stockavailablequantity": orgChooseList.gs_binstock - 1,
"gs_stockavailablequantity@OData.Community.Display.V1.FormattedValue": orgChooseList.gs_binstock - 1,
"gs_stockdataid": orgChooseList.gs_stockdataid,
"gs_storagelocation": orgChooseList.gs_storagelocation,
"moveqty": 0
};
const hasRec = chooseList.some(item => item.$id == newrow.$id);
if (hasRec == false) {
chooseList.push(newrow);
}
else {
var updateList = chooseList.filter(e => e.$id == newrow.$id);
if (updateList.length == 1) {
updateList[0].gs_stockavailablequantity = (updateList[0].gs_stockavailablequantity - 1);
}
chooseList = chooseList.filter(eitem => eitem.$id != newrow.$id);
if (updateList[0].gs_stockavailablequantity > 0) {
chooseList.push(updateList[0]);
}
}
this.chooseList = chooseList;
}
//added by jeff.lai on 20231009 -- end
}
else {
this.chooseList = chooseList
}
console.log(chooseList)
},
handleAllSelection(selection) {
debugger;
console.log(selection)
let chooseList = this.chooseList
if (selection.length > 0) {
for (let i = 0; i < selection.length; i++) {
const element = selection[i];
chooseList.push(element)
}
chooseList = this.uniqueArray(chooseList, "$id")
} else {
let lastList = this.lastList;
chooseList = chooseList.filter((item1) => {
return !lastList.some((item2) => item1.$id === item2.$id);
})
}
var orgChooseList = chooseList;
if (chooseList.length > 0 && (chooseList[0].gs_cus_serialnumber !== "undefined" && !this.isEmpty(chooseList[0].gs_cus_serialnumber))) {
debugger;
this.$refs.multipleTable.clearSelection();
this.$refs.multipleTable.toggleRowSelection(chooseList[0]);
this.$set(chooseList[0], "moveqty", 1);
this.chooseList = [];
this.chooseList.push(chooseList[0]);
}
else {
this.chooseList = chooseList
}
},
clear() {
this.chooseList = []
this.$refs.multipleTable.clearSelection();
},
uniqueArray(array, key) {
var result = [array[0]];
for (var i = 1; i < array.length; i++) {
var item = array[i];
var repeat = false;
for (var j = 0; j < result.length; j++) {
if (item[key] == result[j][key]) {
repeat = true;
break;
}
}
if (!repeat) {
result.push(item);
}
}
return result;
},
handleCurrentChange(val) {
this.page = val;
this.getList()
},
openDialog() {
if (this.chooseList.length <= 0) {
return window.top.Xrm.Utility.alertDialog("please select.");
}
this.dialogTableVisible = true
},
SubmitForm() {
const that = this
let { chooseList, RemainQuantity, rulesform } = this
if (RemainQuantity !== 0) {
// Quantity To Pick
return window.top.Xrm.Utility.alertDialog("Total Quantity to Pick is not equal to Order Quantity, kindly check before submit.");
}
this.$refs.rulesform.validate((valid) => {
if (valid) {
var selectedProducts = []
for (let i = 0; i < chooseList.length; i++) {
const item = chooseList[i];
if (item.moveqty > 0) {
// 因为上一版本,使用的是默认计算剩余来给后端赋对应的数量,所以为了版本一致,将gs_stockavailablequantity字段的值赋值为需要pick的数量
item.gs_stockavailablequantity = item.moveqty
selectedProducts.push(item)
}
}
sessionStorage.setItem('wop_bin_info', JSON.stringify(selectedProducts));
setTimeout(() => {
window.close();
}, 0)
}
})
},
CancelForm() {
window.close();
},
CancelForm() {
window.close();
},
getQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var url = decodeURI(window.location.search)
var r = url.substr(1).match(reg);
if (r != null)
return unescape(r[2]);
return null;
},
getString(url, name) {
if (url == null) {
return;
}
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = url.match(reg);
if (r != null)
return unescape(r[2]);
return "";
},
findDefaultPlantByUserRegion() {
var userSettings = window.top.Xrm.Utility.getGlobalContext().userSettings;
var defaultPlantCode = "Code";
var currentuserid = userSettings.userId;
var username = userSettings.userName;
var regionId;
if (currentuserid != null && currentuserid != "" && currentuserid != undefined) {
this.retrieveRecordSyncQuery("systemusers", `?$select=fullname,_gs_region_value&$filter=systemuserid eq '${currentuserid}'`,
function (result) {
if (null != result) {
regionId = result.value[0]["_gs_region_value"];
}
},
function (error) {
return window.top.Xrm.Utility.alertDialog(error.message);
});
if (regionId != null && regionId != undefined && regionId != "") {
this.retrieveRecordSyncQuery("gs_parametersettings", `?$select=gs_defaultplant&$filter=_gs_region_value eq '${regionId}'`,
function (result) {
if (null != result) {
var code = result.value[0]["gs_defaultplant"]
if (code != "null" && code != null && code != undefined && code != "") {
defaultPlantCode = code
}
}
},
function (error) {
return window.top.Xrm.Utility.alertDialog(error.message);
});
}
}
return defaultPlantCode;
},
retrieveRecordSyncQuery(entitySetName, para, successCallback, errorCallback) {
var req = new XMLHttpRequest();
req.open("GET", this.getWebAPIPath() + entitySetName + para, false);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Prefer", "odata.include-annotations=\"OData.Community.Display.V1.FormattedValue\"");
req.onreadystatechange = function () {
if (this.readyState == 4) {
req.onreadystatechange = null;
if (this.status == 200) {
successCallback(JSON.parse(req.responseText));
}
else {
errorCallback(req);
}
}
};
req.send();
}
}
})
</script>
</body>
</html>
JS中调用Vue.html
function openPickFromBinPage(plant, storagelocation, material, quantity, wopdetails, btnType, primaryControl, SelectedControl) {
var pageInput = {
pageType: "webresource",
webresourceName: "gs_SearchBinPage.html",
data: `plant=${plant}&storagelocation=${storagelocation}&material=${material}&quantity=${quantity}&snprofile=${wopdetails.gs_sn_profile}`,
};
var navigationOptions = {
target: 2,
width: 1400,
height: 800,
position: 1,
title: 'Stock Bin Query and Select'
};
console.log(pageInput);
Xrm.Utility.closeProgressIndicator()
Xrm.Navigation.navigateTo(pageInput, navigationOptions).then(function success(result) {
var wop_bin_info = sessionStorage.getItem("wop_bin_info");
if (wop_bin_info) {
var datas = JSON.parse(wop_bin_info)
// debugger;
var wop_line_status = wopdetails.msdyn_linestatus;
var movement_doc = wopdetails.gs_materialdocument;
if (wop_line_status == 40 && isEmpty(movement_doc) == false) {
var txt = "Line Number【" + wopdetails.msdyn_lineorder + "】 is already picked , Are you sure to re-pick the stock ?, If yes, you'd better perform bin-to-bin move to put the previous unit back to stock. ";
var confirmStrings = { text: txt, title: "Confirmation Dialog" };
var confirmOptions = { height: 300, width: 450 };
Xrm.Navigation.openConfirmDialog(confirmStrings, confirmOptions).then(
function (success) {
if (success.confirmed) {
Xrm.Utility.showProgressIndicator("Loading...")
var removeMvtDoc = { "gs_materialdocument": "" };
var up_wop_id = wopdetails.msdyn_workorderproductid;
update_WebApi("msdyn_workorderproduct", up_wop_id, removeMvtDoc).then(
function ok(ok) {
sendBinByAjax(datas, primaryControl, wopdetails, btnType, SelectedControl);
console.log(ok);
},
function ko(ko) {
Xrm.Utility.closeProgressIndicator();
return Xrm.Navigation.openAlertDialog(ko.message);
}
);
}
else {
console.log("Dialog closed using Cancel button or X.");
Xrm.Utility.closeProgressIndicator();
}
},
function error(error) {
console.log(error);
return Xrm.Navigation.openAlertDialog(error.message);
}
);
}
else {
Xrm.Utility.showProgressIndicator("Loading...")
sendBinByAjax(datas, primaryControl, wopdetails, btnType, SelectedControl);
}
}
sessionStorage.removeItem("wop_bin_info");
},
function error() {
// Handle errors
}
);
}