ysy 2 yıl önce
ebeveyn
işleme
95d1f252d4

+ 22 - 0
api/pda/common.js

@@ -0,0 +1,22 @@
+import {
+	postJ,
+	post,
+	get
+} from "@/utils/request";
+import Vue from "vue";
+
+
+// 工单列表
+export async function getByCode(code) {
+	const data = await get(
+		Vue.prototype.apiUrl + `/system/dict/getByCode/${code}`,
+	);
+  if (data.code == 0) {
+    return data.data;
+  }
+  return Promise.reject(data.message);
+}
+
+
+
+

+ 52 - 0
api/pda/workOrder.js

@@ -247,3 +247,55 @@ export async function listWorkReport(params) {
 }
 
 
+// pda 内包装
+
+export async function packingReport(params) {
+	const data = await postJ(
+		Vue.prototype.apiUrl + `/pda/mes/workreport/packingReport`, params, true,
+	);
+
+	if (data.code == 0) {
+		return data.data;
+	}
+	return Promise.reject(data.message);
+}
+// pda包装 内查询
+
+export async function getPackingReport(params) {
+	const data = await postJ(
+		Vue.prototype.apiUrl + `/pda/mes/workreport/getPackingReport`, params, true,
+	);
+
+	if (data.code == 0) {
+		return data.data;
+	}
+	return Promise.reject(data.message);
+}
+
+// pda 外包装
+export async function packingReportRepeat(params) {
+	const data = await postJ(
+		Vue.prototype.apiUrl + `/pda/mes/workreport/packingReportRepeat`, params, true,
+	);
+
+	if (data.code == 0) {
+		return data.data;
+	}
+	return Promise.reject(data.message);
+}
+
+
+export async function getPackingReportRepeat(params) {
+	const data = await postJ(
+		Vue.prototype.apiUrl + `/pda/mes/workreport/getPackingReportRepeat`, params, true,
+	);
+
+	if (data.code == 0) {
+		return data.data;
+	}
+	return Promise.reject(data.message);
+}
+
+
+
+

+ 6 - 2
pages/pda/feeding/bill/index.vue

@@ -16,13 +16,15 @@
 					<view v-for="(it,idx) in item.orderInfoList" :key="idx">
 						<workOrderBom :item='it' :isDetails='true'></workOrderBom>
 
-						<deviceBom v-if='it.equipmentList.length != 0'   :list='it.equipmentList'></deviceBom>
+						<deviceBom v-if='it.equipmentList.length != 0' :list='it.equipmentList'></deviceBom>
 
 						<modelBom v-if='it.equipmentList.length != 0' :list='it.modelList'>
 						</modelBom>
 
 						<instanceBom v-if='it.instanceList.length != 0' :list='it.instanceList'></instanceBom>
 
+						<packingBom v-if='it.packingList.length != 0' :list='it.packingList'>></packingBom>
+
 					</view>
 
 
@@ -41,6 +43,7 @@
 	import deviceBom from '../components/deviceBom.vue'
 	import modelBom from '../components/modelBom.vue'
 	import instanceBom from '../components/instanceBom.vue'
+	import packingBom from '../components/packingBom.vue'
 	import {
 		feedByOrderIds
 	} from '@/api/pda/feeding.js'
@@ -49,7 +52,8 @@
 			workOrderBom,
 			deviceBom,
 			modelBom,
-			instanceBom
+			instanceBom,
+			packingBom
 		},
 		data() {
 			return {

+ 668 - 0
pages/pda/jobBooking/components/packingBom.vue

@@ -0,0 +1,668 @@
+<template>
+
+	<view>
+		<view class="title_box rx-bc">
+			<view class="name">内包装</view>
+		</view>
+
+		<view class="material ">
+
+			<view class="content_table">
+				<view class="item">
+					<view class="lable rx-cc">包装总数</view>
+					<view class="content content_num">
+						<input class="uni-input" v-model="formedNumLast" type='digit'></input>
+						<view class="unit">{{objData.unit}}</view>
+					</view>
+				</view>
+
+				<view class="item rx-sc">
+					<view class="rx ww55 ">
+						<view class="lable lable150 rx-cc ">内包装单元</view>
+						<view class="content content_num">
+							<input class="uni-input" v-model="quantity"></input>
+
+						</view>
+					</view>
+
+					<view class="rx ww45">
+						<view class="rx-cc ww80">
+							<view style="max-width: 100rpx; font-size: 24rpx;">{{objData.unit}}</view>/
+						</view>
+						<view class="content rx-sc">
+							<zxz-uni-data-select :localdata="unitList" v-model="unit" dataValue='Key' format='{Value}'
+								dataKey="Key" filterable :clear='false'></zxz-uni-data-select>
+
+							<view class="penalize" @click="handleSplit">确认</view>
+						</view>
+					</view>
+
+				</view>
+
+			</view>
+
+
+
+
+			<view class="content_table2" v-if='splitList.length'>
+				<view class="head row rx-sc">
+					<view class="item ww10">序号</view>
+					<view class="item ww30">数量</view>
+					<view class="item ww50">条码</view>
+					<view class="item ww10"></view>
+				</view>
+
+				<view class="table">
+					<u-list @scrolltolower="scrolltolower" class="z_list">
+						<view class="tr row rx-sc" v-for="(it, idx) in splitList" :key='idx'>
+							<view class="item ww10 rx-cc ">{{ idx + 1 }}</view>
+							<view class="item ww30 content_num rx-sc">
+								<input class="uni-input" v-model="it.quantity" type="digit"></input>
+								<view style="width: 260rpx; font-size: 22rpx;"> {{objData.unit}}/ {{it.unit}}</view>
+							</view>
+							<view class="item ww50">
+								{{ it.code }}
+							</view>
+							<view class="item ww10 rx-cc" v-if="!it.parentId" @click="handleCheck( idx, it)">
+								<image class="check" v-if='it.check' src='@/static/check.png'>
+								</image>
+								<image class="check" v-if=' !it.check' src='@/static/check_no.png'>
+								</image>
+							</view>
+
+
+						</view>
+
+
+
+					</u-list>
+
+
+
+
+				</view>
+
+
+			</view>
+
+
+
+		</view>
+
+
+		<view class="material ">
+
+			<view class="title_box rx-bc">
+				<view class="name">外包装</view>
+			</view>
+
+
+			<!-- 外包装  列表-->
+			<view class="content_table2" v-if='packTwoList.length > 0'>
+				<view class="head row rx-sc">
+					<view class="item ww10">序号</view>
+					<view class="item ww30">数量</view>
+
+					<view class="item ww50">条码</view>
+					<view class="item ww10"></view>
+
+				</view>
+
+				<view class="table">
+
+					<view class="tr row rx-sc " v-for="(it, idx) in packTwoList" :key='idx'>
+						<view class="item ww10 rx-cc ">{{ idx + 1 }}</view>
+						<view class="item ww30 content_num rx-sc">
+							{{ it.quantity}} {{ objData.unit }} / {{it.unit}}
+						</view>
+
+
+
+						<view class="item ww50">
+							{{ it.code }}
+						</view>
+						<view class="item ww10 rx-cc">
+
+						</view>
+
+
+					</view>
+
+
+				</view>
+
+			</view>
+
+
+
+
+
+
+
+
+			<view class="content_table2" v-if='temporaryList.length'>
+				<view class="head row rx-sc">
+					<view class="item ww10">序号</view>
+					<view class="item ww30">数量</view>
+					<view class="item ww50">条码</view>
+					<view class="item ww10"></view>
+				</view>
+
+				<view class="table">
+					<u-list @scrolltolower="scrolltolower" class="z_list">
+						<view class="tr row rx-sc" v-for="(it, idx) in temporaryList" :key='idx'>
+							<view class="item ww10 rx-cc ">{{ idx + 1 }}</view>
+							<view class="item ww30 content_num rx-sc">
+								<input class="uni-input" v-model="it.quantity" disabled type="digit"></input>
+								<view style="width: 260rpx; font-size: 22rpx;"> {{objData.unit}}/ {{it.unit}}</view>
+							</view>
+							<view class="item ww50">
+								{{ it.code }}
+							</view>
+							<view class="item ww10 rx-cc">
+								<uni-icons custom-prefix="iconfont" type="icon-shanchu" size="20"
+									color="#fa3534"></uni-icons>
+							</view>
+
+
+						</view>
+
+						<view class="tr row rx-sc">
+							<view class="item ww10 rx-cc ">合并</view>
+							<view class="item ww90  rx-sc">
+								总共{{temporaryCount}} {{objData.unit}} / {{this.temporaryNum}} {{unit}}
+								--打包成 1
+								<zxz-uni-data-select :localdata="unitList" v-model="packUnit" dataValue='Key'
+									format='{Value}' dataKey="Key" filterable :clear='false'></zxz-uni-data-select>
+
+								<view class="penalize" @click="handlePack">打包</view>
+
+							</view>
+
+
+						</view>
+
+					</u-list>
+
+
+
+
+
+
+				</view>
+
+
+			</view>
+
+		</view>
+
+
+
+
+
+	</view>
+</template>
+
+<script>
+	import {
+		getByCode
+	} from '@/api/pda/common.js'
+	import {
+		packingReport,
+		getPackingReport,
+
+		packingReportRepeat,
+		getPackingReportRepeat
+	} from '@/api/pda/workOrder.js'
+	export default {
+		props: {
+			objData: {
+				type: Object,
+				default: () => {}
+			},
+
+			taskId: {
+				type: String,
+				default: ''
+			},
+
+			workOrderId: {
+				type: String,
+				default: ''
+			}
+		},
+		data() {
+			return {
+				formedNumLast: 0,
+
+				quantity: '',
+				unit: '',
+
+				unitList: [],
+
+				splitList: [],
+
+
+
+				packUnit: null,
+				temporaryNum: 0,
+				temporaryCount: 0,
+				temporaryList: [],
+				packTwoList: []
+
+
+
+
+
+			}
+		},
+
+		created() {
+			this.formedNumLast = this.objData.formedNumLast
+			this.byCode(),
+
+				this.getPackingDetails()
+			this.getPackingDetailsTwo()
+		},
+
+		methods: {
+			byCode() {
+				getByCode('packing_unit').then(res => {
+
+					this.unitList = []
+
+					res.forEach((obj, index) => {
+						for (let key in obj) {
+							if (obj.hasOwnProperty(key)) { // 确保key是对象自身的属性
+
+								this.unitList.push({
+									Key: `${key}`,
+									Value: ` ${obj[key]}`
+								})
+
+
+							}
+						}
+					});
+
+				})
+			},
+
+
+			getPackingDetails() {
+				let param = {
+					workOrderId: this.workOrderId,
+					taskId: this.taskId,
+					tier: 1
+				}
+
+				getPackingReport(param).then(res => {
+
+					this.splitList = res.detailList
+					this.formedNumLast = res.totalQuantity
+					this.quantity = res.quantity
+					this.unit = res.unit
+
+
+				})
+			},
+
+
+
+			handleSplit() {
+
+
+				if (!this.formedNumLast) {
+					uni.showToast({
+						title: '包装总数数量不能为空',
+						icon: 'none'
+					})
+					return false
+				}
+
+				if (!this.quantity) {
+					uni.showToast({
+						title: '内包装单元数量不能为空',
+						icon: 'none'
+					})
+					return false
+				}
+
+				if (!this.unit) {
+					uni.showToast({
+						title: '请选择包装单位',
+						icon: 'none'
+					})
+					return false
+				}
+
+				let param = {
+					totalQuantity: this.objData.formedNumLast,
+					quantity: this.quantity,
+					unit: this.unit,
+					workOrderId: this.workOrderId,
+					taskId: this.taskId,
+					tier: 1
+				}
+				packingReport(param).then(res => {
+					this.splitList = res.map(m => {
+
+						return {
+							check: false,
+							...m
+						}
+					})
+
+					this.getPackingDetails()
+				})
+
+
+			},
+
+			handleCheck(idx, it) {
+
+
+
+				if (it.quantity <= 0) {
+					uni.showToast({
+						icon: 'none',
+						title: '数量为空不能勾选'
+					})
+
+					return false
+				}
+				this.$set(this.splitList[idx], 'check', !it.check)
+
+				this.temporaryList = []
+
+
+				this.temporaryList = this.splitList.filter(e => {
+					return e.check
+				})
+				this.temporaryNum = 0
+				this.temporaryCount = 0
+				if (this.temporaryList.length > 0) {
+					this.temporaryList.forEach(e => {
+						this.temporaryNum = this.temporaryNum + 1
+						this.temporaryCount = this.temporaryCount + Number(e.quantity)
+					})
+				}
+
+
+			},
+
+			getPackingDetailsTwo() {
+				let param = {
+					totalQuantity: this.objData.formedNumLast,
+					quantity: this.quantity,
+					unit: this.unit,
+					workOrderId: this.workOrderId,
+					taskId: this.taskId,
+					tier: 2,
+
+				}
+				getPackingReportRepeat(param).then(res => {
+					this.packTwoList = res.detailList
+				})
+			},
+
+			handlePack() {
+				let param = {
+					detailList: this.temporaryList,
+					quantity: this.temporaryCount,
+					totalQuantity: this.formedNumLast,
+					unit: this.packUnit,
+					taskId: this.taskId,
+					workOrderId: this.workOrderId,
+					tier: 2
+				}
+
+				packingReportRepeat(param).then(res => {
+					this.temporaryList = []
+					this.getPackingDetails()
+					this.getPackingDetailsTwo()
+				})
+			},
+
+
+			scrolltolower() {
+
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.title_box {
+		margin-top: 20rpx;
+
+		.name {
+			font-size: 28rpx;
+			font-style: normal;
+			font-weight: 400;
+			color: $theme-color;
+			padding-left: 20rpx;
+
+			position: relative;
+
+			&:before {
+				position: absolute;
+				content: '';
+				left: 0rpx;
+				top: 0rpx;
+				bottom: 0rpx;
+				width: 4rpx;
+				height: 28rpx;
+				background: $theme-color;
+				margin: auto;
+			}
+		}
+	}
+
+
+	.material {
+		margin-top: 10rpx;
+
+
+
+		.content_table {
+			width: 100%;
+			border: 2rpx solid $border-color;
+
+			.item {
+				display: flex;
+				border-bottom: 2rpx solid $border-color;
+
+
+				.lable {
+					width: 132rpx;
+					text-align: center;
+					background-color: #F7F9FA;
+					font-size: 26rpx;
+					border-right: 2rpx solid $border-color;
+					flex-shrink: 0;
+				}
+
+				.lable220 {
+					width: 220rpx !important;
+					font-size: 24rpx;
+				}
+
+				.lable150 {
+					width: 156rpx !important;
+					font-size: 24rpx;
+				}
+
+				.ww80 {
+					width: 80rpx;
+				}
+
+				.content {
+					width: 518rpx;
+					min-height: 64rpx;
+					font-size: 28rpx;
+					line-height: 28rpx;
+					font-style: normal;
+					font-weight: 400;
+					// padding: 18rpx 8rpx;
+					box-sizing: border-box;
+					word-wrap: break-word;
+					flex-grow: 1 !important;
+
+
+					.unit {
+						padding: 0 4rpx;
+						font-size: 24rpx;
+						color: #404446;
+					}
+
+
+
+				}
+
+
+
+				&:last-child {
+					border-bottom: none;
+				}
+			}
+
+
+
+			.ww55 {
+				width: 55%;
+			}
+
+			.ww45 {
+				width: 45%;
+			}
+
+
+		}
+	}
+
+
+
+
+	.content_table2 {
+		width: 100%;
+		margin-top: 16rpx;
+
+		.row {
+			width: 100%;
+
+
+			.item {
+
+				color: #404446;
+				font-size: 28rpx;
+				padding-left: 12rpx;
+
+			}
+
+			.color157 {
+				color: $theme-color;
+			}
+
+			.ww30 {
+				width: 30%;
+			}
+
+			.ww50 {
+				width: 50%;
+
+			}
+
+			.ww90 {
+				width: 90%;
+			}
+
+			.ww15 {
+				width: 15%;
+			}
+
+			.ww10 {
+				width: 10%;
+			}
+
+			.ww30 {
+				width: 30%;
+			}
+
+		}
+
+		.head {
+			height: 64rpx;
+			background: #F7F9FA;
+			border-top: 2rpx solid #E3E5E5;
+			border-left: 2rpx solid #E3E5E5;
+
+			.item {
+				height: 64rpx;
+				line-height: 64rpx;
+				border-right: 2rpx solid #E3E5E5;
+				box-sizing: border-box;
+			}
+		}
+
+
+
+		.tr {
+			border-top: 2rpx solid #E3E5E5;
+			border-left: 2rpx solid #E3E5E5;
+
+
+			.item {
+				font-size: 24rpx;
+				min-height: 64rpx;
+				display: flex;
+				align-items: center;
+				border-right: 2rpx solid #E3E5E5;
+				box-sizing: border-box;
+				white-space: normal;
+				word-break: break-all;
+
+			}
+
+			&:last-child {
+				border-bottom: 2rpx solid #E3E5E5;
+
+			}
+		}
+	}
+
+
+
+
+	.content_num {
+		display: flex;
+		align-items: center;
+		padding: 0 4rpx;
+
+		/deep/ .uni-input-input {
+			border: 2rpx solid #F0F8F2;
+			background: #F0F8F2;
+			color: $theme-color;
+		}
+
+
+	}
+
+	.penalize {
+		width: 86rpx;
+		line-height: 60rpx;
+		background: $theme-color;
+		font-size: 24rpx;
+		text-align: center;
+		color: #fff;
+	}
+
+	.check {
+		width: 30rpx;
+		height: 30rpx;
+	}
+
+	.z_list {
+		max-height: 500rpx;
+	}
+</style>

+ 10 - 6
pages/pda/jobBooking/index/index.vue

@@ -40,6 +40,8 @@
 					<aridRegion v-if='objData.aridRegionList.length != 0' :list='objData.aridRegionList'
 						:remainingTime='remainingTime' @handleScan='handleScan' :isType='true'></aridRegion>
 
+					<packingBom :taskId='taskId' :workOrderId='id' :objData='objData' v-if='objData'></packingBom>
+
 					<view class="operate_box rx-sc">
 						<u-button size="small" class="u-reset-button" type="success" @click="handAdd">手动添加</u-button>
 					</view>
@@ -116,6 +118,7 @@
 	import turnoverBom from '../components/turnoverBom.vue'
 	import aridRegion from '../../feeding/components/aridRegion.vue'
 	import paramBom from '../../feeding/components/paramBom.vue'
+	import packingBom from '../components/packingBom.vue'
 	import SearchPopup from '../../components/searchPopup.vue'
 
 
@@ -131,6 +134,7 @@
 			turnoverBom,
 			aridRegion,
 			paramBom,
+			packingBom,
 			SearchPopup
 		},
 		data() {
@@ -470,9 +474,9 @@
 
 
 			save() {
-			     uni.showLoading({
-			     	title: '加载中'
-			     });
+				uni.showLoading({
+					title: '加载中'
+				});
 				if (!this.objData.workReportInfo['formedNum'] && this.objData.workReportInfo['formedNum'] != 0) {
 					uni.showToast({
 						title: '请输入合格品数量',
@@ -540,10 +544,10 @@
 				jobSave(this.objData).then(res => {
 					uni.hideLoading();
 					uni.navigateBack()
-					
+
 				}).finally(() => {
-					
-					setTimeout(function () {
+
+					setTimeout(function() {
 						uni.hideLoading();
 					}, 3000);
 				})

+ 12 - 7
pages/pda/sample/index/jobBooking.vue

@@ -96,17 +96,22 @@
 
 
 
-			
+
 
 					if (this.objData.quality && this.objData.quality.sampleList.length > 0) {
-						let _count = 0
-						
+
+						let jianCount = 0
+
 						this.objData.quality.sampleList.forEach(e => {
-							_count  = _count + Number(e.num)
+
+							if (e.selectType == 2) {
+								jianCount = jianCount + Number(e.num)
+							}
+
 						})
-						
-						this.objData.workReportInfo.formedNum =   res.formedNumLast - _count
-						
+
+						this.objData.workReportInfo.formedNum = res.formedNumLast - jianCount
+
 					}