diff --git a/.env.development b/.env.development index 6bffb490..358cde95 100644 --- a/.env.development +++ b/.env.development @@ -1,7 +1,7 @@ -#VITE_BASE_URL=http://dev.ccwin-in.com:25300/api/admin-api -#VITE_BASE_URL_IMAGE=http://dev.ccwin-in.com:25300/api/admin-api +VITE_BASE_URL=http://dev.ccwin-in.com:25300/api/admin-api +VITE_BASE_URL_IMAGE=http://dev.ccwin-in.com:25300/api/admin-api -VITE_BASE_URL=http://172.21.32.13:81/api/admin-api VITE_BASE_URL_IMAGE=http://172.21.32.13:81/admin-api +#VITE_BASE_URL=http://172.21.32.13:81/api/admin-api #VITE_BASE_URL_IMAGE=http://172.21.32.13:81/admin-api # 租户配置 VITE_TENANT='[{"text":"长春","value":1},{"text":"成都","value":2}]' # 是否是测试环境 diff --git a/src/mycomponents/package/packageRecordCard.vue b/src/mycomponents/package/packageRecordCard.vue index cd166b2e..7c7a4c8f 100644 --- a/src/mycomponents/package/packageRecordCard.vue +++ b/src/mycomponents/package/packageRecordCard.vue @@ -64,6 +64,11 @@ type: Object, default: {} }, + isShowStdPack:{ + type: Boolean, + default: true + }, + isShowContainer: { type: Boolean, default: true diff --git a/src/mycomponents/scan/winScanLocation.vue b/src/mycomponents/scan/winScanLocation.vue index 24f8dfc8..24515c2e 100644 --- a/src/mycomponents/scan/winScanLocation.vue +++ b/src/mycomponents/scan/winScanLocation.vue @@ -12,7 +12,7 @@ </view> <view class=""> <view class=""> - <win-com-scan ref="scan" @getResult="getScanResult" :placeholder='title' :clearResult="false" + <win-com-scan ref="scan" @getResult="getScanResult" :placeholder='title' :clearResult="true" :boxFocus="true" :isShowHistory="isShowHistory" headerType=""> </win-com-scan> </view> diff --git a/src/pages.json b/src/pages.json index 9900c2ab..4915d014 100644 --- a/src/pages.json +++ b/src/pages.json @@ -646,6 +646,16 @@ } } }, + { + "path": "pages/repleinsh/record/directRepleinshRecord", + "style": { + "navigationBarTitleText": "直接补料", + "enablePullDownRefresh": true, + "titleNView": { + "autoBackButton": "true" + } + } + }, { "path": "pages/productionReturn/request/returnRequestCreate", "style": { diff --git a/src/pages/index/index.vue b/src/pages/index/index.vue index 867d449d..10bc33c0 100644 --- a/src/pages/index/index.vue +++ b/src/pages/index/index.vue @@ -366,7 +366,7 @@ console.log("包装规格获取失败", res) }) - var switchCode="FgPutawayLocationCodeValidate,SemiPutawayLocationCodeValidate,PurchasePutawayToLocationCodeValidate,IssueToLocationCodeValidate"; + var switchCode="FgPutawayLocationCodeValidate,SemiPutawayLocationCodeValidate,PurchasePutawayToLocationCodeValidate,IssueToLocationCodeValidate,fgProductReceipCommitValidate"; getSwitchByCode(switchCode).then(res=>{ uni.setStorageSync("switch", res.data) diff --git a/src/pages/issue/record/directIssue.vue b/src/pages/issue/record/directIssue.vue index d006d931..4d552454 100644 --- a/src/pages/issue/record/directIssue.vue +++ b/src/pages/issue/record/directIssue.vue @@ -388,7 +388,7 @@ issueRecordSubmit(params).then(res => { uni.hideLoading() if (res.data) { - this.showCommitSuccessMessage("提交成功<br>生成采购上架记录<br>" + res.data) + this.showCommitSuccessMessage("提交成功<br>生成直接发料记录<br>" + res.data) } else { this.showErrorMessage("提交失败[" + res.msg + "]") } diff --git a/src/pages/productReceipt/job/fgProductReceiptDetail.vue b/src/pages/productReceipt/job/fgProductReceiptDetail.vue index 104d5ae4..962054c7 100644 --- a/src/pages/productReceipt/job/fgProductReceiptDetail.vue +++ b/src/pages/productReceipt/job/fgProductReceiptDetail.vue @@ -84,6 +84,7 @@ goHome, navigateBack, getPackingNumberAndBatch, + getSwitchInfoByCode } from '@/common/basic.js'; import { @@ -219,7 +220,7 @@ that.jobContent = res.data; that.subList = res.data.subList; that.jobStatus = res.data.status - that.jobToLocationCode = that.subList[0].toLocationCode + that.jobToLocationCode = that.subList[0].toLocationCode if(that.jobContent.allowModifyLocation=='FALSE'){ that.toLocationCode = that.subList[0].toLocationCode } @@ -429,21 +430,27 @@ if (!this.checkLocation()) { return } + var valiDate =getSwitchInfoByCode("fgProductReceipCommitValidate") this.detailSource.forEach(item => { item.subList.forEach(subitem => { - if (subitem.handleQty == undefined) { - this.showMessage("还没扫码成品不能提交") - } else { - if (subitem.handleQty != subitem.packQty) { - this.showQuestionMessage('制品数量不等于包装数量,是否继续提交?', res => { - if (res) { - this.submitJob(); - } - }); + if(valiDate){ + if (subitem.handleQty == undefined) { + this.showMessage("还没扫码成品不能提交") } else { - this.submitJob(); + if (subitem.handleQty != subitem.packQty) { + this.showQuestionMessage('制品数量不等于包装数量,是否继续提交?', res => { + if (res) { + this.submitJob(); + } + }); + } else { + this.submitJob(); + } } + }else { + this.submitJob(); } + }) }) }, diff --git a/src/pages/productReceipt/job/productReceiptJob.vue b/src/pages/productReceipt/job/productReceiptJob.vue index 381b406b..40aa4911 100644 --- a/src/pages/productReceipt/job/productReceiptJob.vue +++ b/src/pages/productReceipt/job/productReceiptJob.vue @@ -21,7 +21,7 @@ <uni-load-more :status="loadingType" v-if="jobList.length>0" /> <win-scan-button @goScan='openScanPopup' v-if="jobList.length>0"></win-scan-button> - <winScanPackJob ref="scanPopup" @getResult='getScanResult' :allowNullBalance="true"></winScanPackJob> + <winScanPackJob ref="scanPopup" @getResult='getScanResult' ></winScanPackJob> <jobList ref="jobList" @selectItem="selectItem"></jobList> <comMessage ref="comMessage"></comMessage> </view> diff --git a/src/pages/repleinsh/record/directRepleinshRecord.vue b/src/pages/repleinsh/record/directRepleinshRecord.vue new file mode 100644 index 00000000..a18eec6b --- /dev/null +++ b/src/pages/repleinsh/record/directRepleinshRecord.vue @@ -0,0 +1,551 @@ +<template> + <view class="page-wraper"> + <view class=""> + <com-blank-view @goScan='showFromLocationPopup' v-if="detailSource.length==0"></com-blank-view> + </view> + <view class="page-wraper" v-if="detailSource.length>0"> + <view class="page-header"> + <view class="header_item"> + 来源库位 : {{fromLocationCode}} + </view> + <view class='split_line'></view> + </view> + <view class="page-main"> + <scroll-view scroll-y="true" class="page-main-scroll"> + <view class="detail-list" v-for="(item, index) in detailSource" :key="item.id"> + <view class=""> + <recordDetailCard :dataContent="item" :index="index" :settingParam="dataContent" + :isShowFromLocation="false" @removeItem="removeItem(index,item)" + @updateData="updateData" @removePack="removePack"> + </recordDetailCard> + </view> + </view> + </scroll-view> + </view> + <view class="page-footer"> + <view class="uni-flex u-col-center space-between padding_10" + style="background-color:ghostwhite; width: 100%; "> + <view class="uni-row uni-flex"> + <text>生产线:</text> + <view class="uni-flex u-col-center uni-row" @click="showSelect"> + <view class="" style="margin-left: 20rpx;"> + {{positionInfo}} + </view> + <u-select v-model="show" mode="mutil-column-auto" :list="positionList" + @confirm="confirmSelect"></u-select> + </view> + </view> + <view class=" uni-flex uni-row"> + <button class="btn_single_commit" hover-class="btn_commit_after" @click="commit">提交</button> + </view> + </view> + </view> + <win-scan-button @goScan='openScanPopup'></win-scan-button> + </view> + <win-scan-pack-and-location ref="scanPopup" @getResult='getScanResult' :allowModifyLocation='false'> + </win-scan-pack-and-location> + <comMessage ref="comMessage"></comMessage> + <win-scan-location ref="scanLocationCode" title="来源库位" @getLocation='getLocation' + :locationAreaTypeList="fromLocationAreaTypeList"></win-scan-location> + </view> +</template> + +<script> + import { + repleinshRecordSubmit, + getWorkShopLineStation, + } from '@/api/request2.js'; + + import { + goHome, + getPackingNumberAndBatchByList, + deepCopyData + } from '@/common/basic.js'; + + import { + calc + } from '@/common/calc.js'; + + import { + getInventoryStatusDesc, + getDirectoryItemArray + } from '@/common/directory.js'; + + import { + getBusinessType, + createItemInfo, + createDetailInfo, + calcTreeHandleQty + } from '@/common/record.js'; + + import { + getManagementPrecisions, + getPrecisionStrategyList, + getPrecisionStrategyParams + } from '@/common/balance.js'; + + import winScanButton from '@/mycomponents/scan/winScanButton.vue' + import winScanPack from '@/mycomponents/scan/winScanPack.vue' + import requiredLocation from '@/mycomponents/location/requiredLocation.vue' + import comBlankView from '@/mycomponents/common/comBlankView.vue' + import winScanLocation from "@/mycomponents/scan/winScanLocation.vue" + import winScanPackAndLocation from "@/mycomponents/scan/winScanPackAndLocation.vue" + import recordComDetailCard from '@/mycomponents/record/recordComDetailCard.vue' + import recordDetailCard from '@/mycomponents/record/recordDetailCard.vue' + + export default { + components: { + winScanButton, + winScanPack, + requiredLocation, + comBlankView, + winScanLocation, + winScanPackAndLocation, + recordComDetailCard, + recordDetailCard + }, + data() { + return { + id: '', + dataContent: {}, //内容 + detailSource: [], //绑定在页面上的数据源 + fromLocationInfo: {}, + fromLocationCode: "", + fromLocationAreaTypeList: [], + toLocationAreaTypeList: [], + inInventoryStatus: "", //目标入库库存状态 + outInventoryStatus: "", //来源出库库存状态 + businessType: {}, + showToLoaction: true, + recommendLocationList: [], //推荐库位列表 + fromWarehouseCode: '', //来源仓库 + businessTypeCode: "Repleinment", + positionList: [], + show: false, + positionInfo: "请选择生产线" + }; + }, + onLoad(option) { + this.clearData(); + getBusinessType(this.businessTypeCode, res => { + if (res.success) { + this.businessType = res.businessType; + this.fromLocationAreaTypeList = res.fromLocationAreaTypeList; + this.toLocationAreaTypeList = res.toLocationAreaTypeList; + this.showFromLocationPopup(); + } else { + this.showErrorMessage(res.message) + } + }); + + // if (this.positionList.length == 0) { + getWorkShopLineStation().then(res => { + if (res.data != null && res.data.length > 0) { + this.positionList = res.data + } else { + this.showErrorMessage('未查找到位置信息'); + } + + }).catch(error => { + this.showErrorMessage(error); + }) + // } + + }, + //返回首页 + onNavigationBarButtonTap(e) { + if (e.index === 0) { + goHome(); + } + }, + //拦截返回按钮事件 + onBackPress(e) {}, + + onPullDownRefresh() {}, + + mounted() {}, + + methods: { + getScanResult(result) { + let balance = result.balance; + let label = result.label; + let pack = result.package; + var item = this.detailSource.find(res => { + if (res.itemCode == balance.itemCode) { + return res + } + }) + if (this.fromWarehouseCode == '') { + this.fromWarehouseCode = balance.warehouseCode; + } + if (item == undefined) { + // 获取推荐库位 + // this.getRecommendLocation(balance, pack, toLocation => { + var itemp = createItemInfo(balance, pack); + let newDetail = createDetailInfo(balance, pack); // + // newDetail.toLocationCode = toLocation.code; + // newDetail.toWarehouseCode = toLocation.warehouseCode; + itemp.subList.push(newDetail); + var dataList = pack.subList + this.detailSource.push(itemp) + this.detailSource.forEach(res => { + res.subList.forEach(pack => { + pack.packList = dataList.filter(c => c.parentNumber == pack + .packingNumber) + pack.packList.forEach(pac => { + pac.parentPackingNumber = pac.parentNumber; + pac.packingNumber = pac.number; + pac.inventoryStatus = "OK"; + pac.scaned = true; + }) + }) + }) + // }) + + } else { + var itemDetail = item.subList.find(r => r.packingNumber == balance.packingNumber && r.batch == + balance.batch); + if (itemDetail != undefined) { + this.showErrorMessage("箱码[" + balance.packingNumber + "批次[" + balance.batch + "]已经在列表中") + } + } + // calcTreeHandleQty(this.detailSource); + }, + + //获取推荐库位 + getRecommendLocation(balance, pack, callback) { + uni.showLoading({ + title: '扫描中...', + mask: true + }) + let recommend = this.recommendLocationList.find(r => r.itemCode == balance.itemCode); + if (recommend == undefined) { + let param = { + itemCode: balance.itemCode, + batch: balance.batch, + inventoryStatus: balance.inventoryStatus, + supplierCode: pack.supplierCode, + businessCode: this.businessTypeCode + }; + console.log(JSON.stringify(param)) + getPutawayRecommendLocation(param).then(res => { + this.recommendLocationList.push({ + itemCode: balance.itemCode, + locationCode: res.data.code + }) + callback(res.data); + uni.hideLoading(); + }).catch(error => { + uni.hideLoading() + this.showErrorMessage(error); + uni.hideLoading(); + }) + + } else { + callback(recommend); + } + }, + + showErrorMessage(message) { + this.$refs.comMessage.showErrorMessage(message, res => { + if (res) {} + }); + }, + + calcTreeHandleQty() { + for (let item of this.detailSource) { + item.qty = 0; + for (let detail of item.subList) { + if (detail != undefined) { + item.qty = calc.add(item.qty, detail.qty) + } + } + } + this.$forceUpdate(); + }, + + showSelect() { + // if (this.editPosition) { + this.show = true + // } + }, + + confirmSelect(e) { + this.positionInfo = e[0].label + "-" + e[1].label + "-" + e[2].label + console.log("位置", this.positionInfo) + this.workshopCode = e[0].value + this.productionLineCode = e[1].value + this.workStationCode = e[2].value + this.workShopName = e[0].label + this.productionLineName = e[1].label + this.workStationName = e[2].label + + let shop = this.positionList.find(shop => shop.value == this.workshopCode); + if (shop != undefined && shop.children != undefined) { + let prodLine = shop.children.find(line => line.value == this.productionLineCode); + if (prodLine != undefined && prodLine.children != undefined) { + let station = prodLine.children.find(r => r.value == this.workStationCode); + if (station.rawLocationCode == '' && station.rawLocationCode == null) { + this.showErrorMessage(this.workStationName + "的原材料库位为空,请重新选择") + return; + } else { + this.rawLocationCode = station.rawLocationCode; + this.fgLocationCode = station.fgLocationCode; + } + } else { + this.showErrorMessage("生产线-工位基础信息维护错误") + } + } else { + this.showErrorMessage("车间-生产线基础信息维护错误") + } + + //赋值到库位代码 + let toLocationCode = '' + this.positionList.forEach(item=>{ + if(this.workshopCode == item.value){ // 车间 + item.children.find(child=>{ + if(this.productionLineCode==child.value){ + toLocationCode = child.children.find(subChild=>this.workStationCode==subChild.value).rawLocationCode; + } + }) + } + }) + this.detailSource.forEach(item=>{ + item.subList.forEach(detail => { + detail.toLocationCode = toLocationCode + }) + }) + + }, + + + + updateData() { + this.calcTreeHandleQty(); + }, + + removeItem(index, item) { + this.detailSource.splice(index, 1) + }, + + removePack() { + for (var i = 0; i < this.detailSource.length; i++) { + var item = this.detailSource[i]; + if (item.subList.length == 0) { + this.detailSource.splice(i, 1) + } + } + this.updateData(); + }, + + openScanPopup() { + if (this.fromLocationCode == "") { + this.showFromLocationPopup(); + return + } + this.$refs.scanPopup.openScanPopupForType(this.fromLocationCode, this.businessType); + }, + + showFromLocationPopup() { + this.$nextTick(() => { + this.$refs.scanLocationCode.openScanPopup(); + }) + }, + + closeScanPopup() { + if (this.$refs.scanPopup != undefined) { + this.$refs.scanPopup.closeScanPopup(); + } + }, + + scanPopupGetFocus() { + if (this.$refs.scanPopup != undefined) { + this.$refs.scanPopup.getfocus(); + } + }, + + commit() { + uni.showLoading({ + title: "提交中....", + mask: true + }); + + //记录有目标库位,需要查询管理模式 + let precisionStrategyParams = getPrecisionStrategyParams(this.detailSource); + //2:获取管理模式,封装参数 + getPrecisionStrategyList(precisionStrategyParams, res => { + if (res.success) { + this.managementList = res.list; + var params = {...this.setRecordParams()} + console.log("提交参数", JSON.stringify(params)); + + repleinshRecordSubmit(params).then(res => { + uni.hideLoading() + if (res.data) { + this.showCommitSuccessMessage("提交成功<br>生成直接补料记录<br>" + res.data) + } else { + this.showErrorMessage("提交失败[" + res.msg + "]") + } + }).catch(error => { + uni.hideLoading() + this.showErrorMessage(error) + }) + } else { + uni.hideLoading(); + this.showErrorMessage(res.message); + } + }); + }, + + + getItemAndLocationRelations() { + var itemList = [] + this.detailSource.forEach(item => { + item.subList.forEach(detail => { + if (detail.scaned) { + detail.toLocationCode = this.toLocationCode; + var filterResult = itemList.filter(res => { + if (res.itemCode == item.itemCode && + res.locationCode == detail.toLocationCode && + res.batch == detail.batch && + res.inventoryStatus == detail.inventoryStatus) { + return res + } + }) + //去掉重复元素 + if (filterResult.length == 0) { + var result = { + itemCode: item.itemCode, + locationCode: detail.toLocationCode, + batch: detail.batch, + inventoryStatus: detail.inventoryStatus, + } + itemList.push(result) + } + + } + }) + }) + return itemList; + }, + + setRecordParams() { + var subList = [] + var creator = this.$store.state.user.id + this.detailSource.forEach(item => { + item.subList.forEach(detail => { + if (detail.scaned) { + var info = getPackingNumberAndBatchByList(this.managementList, detail.itemCode, + detail.packingNumber, detail.toLocationCode, detail.batch); + var submitItem = deepCopyData(detail) + submitItem.toPackingNumber = info.packingNumber; + submitItem.toBatch = info.batch; + submitItem.toContainerNumber = detail.containerNumber; + + submitItem.fromPackingNumber = info.packingNumber; + submitItem.fromBatch = info.batch; + submitItem.fromContainerNumber = detail.containerNumber; + + submitItem.fromLocationCode = detail.locationCode; + submitItem.toLocationCode = detail.toLocationCode; + + // detail.toInventoryStatus = detail.inventoryStatus + // detail.toLocationCode = detail.toLocationCode + submitItem.qty = detail.handleQty; + submitItem.package = ""; + submitItem.recordList = [{ + toInventoryStatus:detail.inventoryStatus, + fromPackingNumber:info.packingNumber, + fromBatch:info.batch, + toPackingNumber:info.packingNumber, + toBatch:info.batch, + fromLocationCode:detail.locationCode, + toLocationCode:detail.toLocationCode, + handleQty:detail.handleQty + } + ] + subList.push(submitItem) + } + }) + }) + if (subList.length > 0) { + this.dataContent.toWarehouseCode = subList[0].toWarehouseCode; + } + this.dataContent.subList = subList + this.dataContent.creator = creator; + this.dataContent.fromWarehouseCode = this.fromWarehouseCode; + return this.dataContent; + }, + + showMessage(message) { + this.$refs.comMessage.showMessage(message, res => { + if (res) {} + }); + }, + showErrorMessage(message) { + this.$refs.comMessage.showErrorMessage(message, res => { + if (res) { + + } + }); + }, + + showScanMessage(message) { + this.$refs.comMessage.showScanMessage(message); + }, + + afterCloseMessage() { + this.scanPopupGetFocus(); + }, + + closeScanMessage() { + this.scanPopupGetFocus(); + }, + getLocation(location, code) { + this.getFromLocationCode(location, code) + }, + getFromLocationCode(location, code) { + this.fromLocationInfo = location; + this.fromLocationCode = code; + this.openScanPopup(); + }, + getToLocationCode(location, code) { + if (this.fromLocationCode == code) { + uni.showToast({ + title: "来源库位[" + this.fromLocationCode + "]不能与目标库位[" + code + "]一致", + duration: 2000 + }) + return + } + this.toLocationCode = code; + }, + + showCommitSuccessMessage(hint) { + this.$refs.comMessage.showSuccessMessage(hint, res => { + this.clearData(); + }) + }, + + updateData() { + // this.calcTreeHandleQty(); + for (var i = 0; i < this.detailSource.length; i++) { + let item = this.detailSource[i]; + if (item.qty == 0) { + this.detailSource.splice(i, 1) + } + } + }, + + clearData() { + this.fromLocationInfo = {}; + this.fromLocationCode = ''; + this.fromWarehouseCode = ''; + this.toWarehouseCode = ''; + this.detailSource = []; + } + } + } +</script> + +<style scoped lang="scss"> +</style> \ No newline at end of file