huang_an 1 год назад
Родитель
Сommit
0183578d49
32 измененных файлов с 2676 добавлено и 1044 удалено
  1. 72 0
      api/warehouseManagement/index.js
  2. 2 2
      components/WarehouseChoose.vue
  3. 32 0
      pages.json
  4. 71 69
      pages/index/index.vue
  5. 2 0
      pages/warehouse/components/requisitionList.vue
  6. 442 0
      pages/warehouse/components/scanCodeList.vue
  7. 10 2
      pages/warehouse/enterHouse/addStock.vue
  8. 10 6
      pages/warehouse/enterHouse/details.vue
  9. 1 0
      pages/warehouse/enterHouse/index.vue
  10. 4 1
      pages/warehouse/inventory/batch/batch.vue
  11. 5 2
      pages/warehouse/inventory/batch/components/PopMessage.vue
  12. 112 117
      pages/warehouse/inventory/batch/components/ReportLoss.vue
  13. 145 93
      pages/warehouse/inventory/batch/components/allot.vue
  14. 13 1
      pages/warehouse/inventoryAllocation/components/AssetsCard.vue
  15. 23 2
      pages/warehouse/inventoryAllocation/components/CargoSpaceInfoDialog.vue
  16. 1 1
      pages/warehouse/inventoryAllocation/components/DetailView.vue
  17. 68 1
      pages/warehouse/inventoryAllocation/edit.vue
  18. 5 0
      pages/warehouse/inventoryAllocation/index.vue
  19. 1 0
      pages/warehouse/outHouse/addStock.vue
  20. 33 17
      pages/warehouse/outHouse/details.vue
  21. 1 0
      pages/warehouse/outHouse/index.vue
  22. 686 0
      pages/warehouse/picking/add.vue
  23. 110 0
      pages/warehouse/picking/components/CardList.vue
  24. 0 0
      pages/warehouse/picking/details.vue
  25. 235 0
      pages/warehouse/picking/index.vue
  26. 93 104
      pages/warehouse/reportLoss/components/CardList.vue
  27. 192 272
      pages/warehouse/reportLoss/detail.vue
  28. 168 223
      pages/warehouse/reportLoss/edit.vue
  29. 1 0
      pages/warehouse/reportLoss/index.vue
  30. 133 128
      pages/warehouse/reportLoss/workorderSelected.vue
  31. 4 2
      pages/warehouse/workOrder/components/KdCard/index.vue
  32. 1 1
      pages/warehouse/workOrder/inventory/inventory.vue

+ 72 - 0
api/warehouseManagement/index.js

@@ -167,6 +167,15 @@ export async function getInboundDetailsById(id) {
 	return Promise.reject(new Error(res.message))
 }
 
+// 获取入库详情(出库单号)
+export async function getInboundDetailsByBizNo(id) {
+	const res = await get(Vue.prototype.apiUrl + `/wms/outintwo/getInfoByBizNo/${id}`)
+	if (res.code == 0) {
+		return res.data
+	}
+	return Promise.reject(new Error(res.message))
+}
+
 // 通过台账id获取出库物品详情
 export async function getHierarchyList(params) {
 	const res = await get(Vue.prototype.apiUrl + `/wms/outintwo/getHierarchyList`, params)
@@ -319,3 +328,66 @@ export async function getPlanProfitLoss(params) {
 	}
 	return Promise.reject(new Error(res.message))
 }
+
+// 报损报溢保存
+export async function saveReportsList(data) {
+	const res = await postJ(Vue.prototype.apiUrl + '/wms/planProfitLoss/save', data)
+	if (res.code == 0) {
+		return res.data
+	}
+	return Promise.reject(new Error(res.message))
+}
+
+// 获取临时盘点计划详情
+export async function getReportPlanDetailById(id) {
+	const res = await get(Vue.prototype.apiUrl + '/wms/planProfitLoss/getById/' + id)
+	if (res.code == 0) {
+		return res.data
+	}
+	return Promise.reject(new Error(res.message))
+}
+
+// 拣货列表
+export async function getPickgoodsList(params) {
+	const res = await get(Vue.prototype.apiUrl + '/wms/pickgoods/page', params)
+	if (res.code == 0) {
+		return res.data
+	}
+	return Promise.reject(new Error(res.message))
+}
+
+// 通过包装编码获取包装详情
+export async function outInGoodsPackingList(data) {
+	const res = await postJ(Vue.prototype.apiUrl + '/wms/outInDetailRecordTwo/outInGoodsPackingList', data)
+	if (res.code == 0) {
+		return res.data
+	}
+	return Promise.reject(new Error(res.message))
+}
+
+// 库存台账调拨
+export async function getAllotDetails(params) {
+	const res = await get(Vue.prototype.apiUrl + `/wms/allotDetail/page`, params)
+	if (res.code == 0) {
+		return res.data
+	}
+	return Promise.reject(new Error(res.message))
+}
+
+// 库存台账盘点
+export async function getPlandetails(params) {
+	const res = await get(Vue.prototype.apiUrl + `/wms/plandetail/page`, params)
+	if (res.code == 0) {
+		return res.data
+	}
+	return Promise.reject(new Error(res.message))
+}
+
+// 保存拣货单
+export async function savePickgoods(data) {
+	const res = await postJ(Vue.prototype.apiUrl + '/wms/pickgoods/save', data)
+	if (res.code == 0) {
+		return res.data
+	}
+	return Promise.reject(new Error(res.message))
+}

+ 2 - 2
components/WarehouseChoose.vue

@@ -3,9 +3,9 @@
 		<uni-popup ref="popup" background-color="#fff" :mask-click="false">
 			<view class="title">
 				选择货位
-				<view class="btn">
+				<!-- <view class="btn">
 					<u-icon name="scan" color="#fff" size="80" @click="handleScan"></u-icon>
-				</view>
+				</view> -->
 			</view>
 			<view class="select-group" :key="forceUpdate">
 				<view class="select-col">

+ 32 - 0
pages.json

@@ -1278,6 +1278,38 @@
 				"navigationBarTextStyle": "white"
 			}
 		},
+		{
+			"path": "pages/warehouse/picking/index",
+			"style": {
+				"navigationBarTitleText": "拣货列表",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "white"
+			}
+		},
+		{
+			"path": "pages/warehouse/picking/add",
+			"style": {
+				"navigationBarTitleText": "新增拣货",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "white"
+			}
+		},
+		{
+			"path": "pages/warehouse/picking/details",
+			"style": {
+				"navigationBarTitleText": "拣货详情",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "white"
+			}
+		},
+		{
+			"path": "pages/warehouse/components/scanCodeList",
+			"style": {
+				"navigationBarTitleText": "扫码列表",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "white"
+			}
+		},
 		//---------------------公共页面--------------------
 		{
 			"path": "pages/common/DocumentSource",

+ 71 - 69
pages/index/index.vue

@@ -46,10 +46,10 @@
 
 			<view class="nav">
 				<view class="nav-content">
-					<view class="nav-item" v-for="(item, index) in warehousingList" @click="toNav(item.link_url)">
-						<span :class="item.class"></span>
+					<view class="nav-item" v-for="(item, index) in warehousingList" @click="toNav(item.path)">
+						<span :class="'iconfont ' + item.icon"></span>
 						<label>{{ item.title }}</label>
-						<label>{{ item.num }}</label>
+						<!-- <label>{{ item.num }}</label> -->
 					</view>
 				</view>
 			</view>
@@ -187,72 +187,72 @@
 				//仓储管理
 
 				warehousingList: [
-					{
-						class: 'iconfont icon-wuliaoruku',
-						title: '库管理',
-						link_url: '/pages/warehouse/enterHouse/index'
-						//"num": 34
-					},
-					{
-						class: 'iconfont icon-shebeichuku',
-						title: '出库管理',
-						link_url: '/pages/warehouse/outHouse/index'
-						// num: 34
-					},
-
-					{
-						class: 'iconfont icon-wuliaoruku',
-						title: '物料入库',
-						link_url: '/pages/warehouse/material/index'
-						//"num": 34
-					},
-
-					{
-						class: 'iconfont icon-shebeiruku',
-						title: '设备入库',
-						link_url: '/pages/warehouse/equipment/index'
-						//"num": 23
-					},
-
-					{
-						class: 'iconfont icon-shebeichuku',
-						title: '设备出库',
-						link_url: '/pages/warehouse/outbound/index'
-						//"num": 23
-					},
-
-					{
-						class: 'iconfont icon-pandiangongdan',
-						title: '盘点工单',
-						link_url: '/pages/warehouse/workOrder/index'
-						// num: 133
-					},
-					{
-						class: 'iconfont icon-shebeiruku',
-						title: '库存调拨',
-						link_url: '/pages/warehouse/inventoryAllocation/index'
-						//"num": 133
-					},
-					{
-						class: 'iconfont icon-shebeikucuntongji',
-						title: '报损报溢',
-						link_url: '/pages/warehouse/reportLoss/index'
-						//"num": 133
-					},
-
-					{
-						class: 'iconfont icon-shebeikucun',
-						title: '库存管理',
-						link_url: '/pages/warehouse/inventory/index'
-						//"num": 1
-					},
-
-					{
-						class: 'iconfont icon-shebeikucuntongji',
-						title: '设备库存统计',
-						link_url: '/pages/warehouse/inventory/stat'
-						//"num": 1
-					}
+					// {
+					// 	class: 'iconfont icon-shebeikucun',
+					// 	title: '库管理',
+					// 	link_url: '/pages/warehouse/inventory/index'
+					// 	//"num": 1
+					// },
+					// {
+					// 	class: 'iconfont icon-wuliaoruku',
+					// 	title: '入库管理',
+					// 	link_url: '/pages/warehouse/enterHouse/index'
+					// 	//"num": 34
+					// },
+					// {
+					// 	class: 'iconfont icon-shebeichuku',
+					// 	title: '出库管理',
+					// 	link_url: '/pages/warehouse/outHouse/index'
+					// 	// num: 34
+					// },
+					// {
+					// 	class: 'iconfont icon-shebeiruku',
+					// 	title: '库存调拨',
+					// 	link_url: '/pages/warehouse/inventoryAllocation/index'
+					// 	//"num": 133
+					// },
+					// {
+					// 	class: 'iconfont icon-wuliaoruku',
+					// 	title: '物料入库',
+					// 	link_url: '/pages/warehouse/material/index'
+					// 	//"num": 34
+					// },
+					// {
+					// 	class: 'iconfont icon-shebeiruku',
+					// 	title: '设备入库',
+					// 	link_url: '/pages/warehouse/equipment/index'
+					// 	//"num": 23
+					// },
+					// {
+					// 	class: 'iconfont icon-shebeichuku',
+					// 	title: '设备出库',
+					// 	link_url: '/pages/warehouse/outbound/index'
+					// 	//"num": 23
+					// },
+					// {
+					// 	class: 'iconfont icon-pandiangongdan',
+					// 	title: '盘点工单',
+					// 	link_url: '/pages/warehouse/workOrder/index'
+					// 	// num: 133
+					// },
+					// {
+					// 	class: 'iconfont icon-shebeikucuntongji',
+					// 	title: '报损报溢',
+					// 	link_url: '/pages/warehouse/reportLoss/index'
+					// 	//"num": 133
+					// },
+					// {
+					// 	class: 'iconfont icon-gongdanguanli',
+					// 	title: '拣货管理',
+					// 	link_url: '/pages/warehouse/picking/index'
+					// 	//"num": 133
+					// }
+					// {
+					// 	class: 'iconfont icon-shebeikucuntongji',
+					// 	title: '设备库存统计',
+					// 	link_url: '/pages/warehouse/inventory/stat'
+					// 	//"num": 1
+					// }
 				],
 
 				//运维类
@@ -404,6 +404,8 @@
 								})
 								this.operationsList = f.children
 							})
+						} else if (f.path == 'warehouseManagement') {
+							this.warehousingList = f.children
 						}
 					})
 				}

+ 2 - 0
pages/warehouse/components/requisitionList.vue

@@ -22,6 +22,8 @@
 										<view class="listBox-name">
 											{{ item.code }}
 										</view>
+									</view>
+									<view class="listBox-top">
 										<view class="listBox-code">
 											{{ item.categoryNames }}
 										</view>

+ 442 - 0
pages/warehouse/components/scanCodeList.vue

@@ -0,0 +1,442 @@
+<template>
+	<view class="mainBox">
+		<view class="main">
+			<uni-nav-bar fixed="true" statusBar="true" left-icon="back" right-icon="scan" title="扫码列表" @clickLeft="backAdd" @clickRight="HandlScanCode"></uni-nav-bar>
+			<view class="wrapper">
+				<u-list class="listContent">
+					<checkbox-group v-for="(item, index) in listData" :key="index" @change.stop="e => selectVal(e, item, index)">
+						<label>
+							<view class="listBox">
+								<view class="listBox-sel">
+									<checkbox :value="item.code" color="#fff" :disabled="item.disabled" :checked="item.checked" />
+								</view>
+								<view class="listBox-con">
+									<view class="listBox-top">
+										<view class="listBox-name">
+											{{ item.categoryName }}
+										</view>
+									</view>
+									<view class="listBox-top">
+										<view class="listBox-code">
+											{{ item.categoryCode }}
+										</view>
+									</view>
+									<view class="listBox-bottom">
+										<view>牌号:{{ item.brandNum }}</view>
+										<view>型号:{{ item.modelType }}</view>
+										<view>规格:{{ item.specification }}</view>
+										<view>批次号:{{ item.batchNo }}</view>
+										<view>计量数量:{{ item.measureQuantity }}({{ item.measureUnit }})</view>
+										<view class="w100">包装编码:{{ item.packageNo }}</view>
+										<view>包装数量:{{ item.packingQuantity }}({{ item.packingUnit }})</view>
+										<view>重量:{{ item.weight }}({{ item.weightUnit }})</view>
+										<view>发货条码:{{ item.barcodes }}</view>
+										<view>物料代号:{{ item.materielDesignation }}</view>
+										<view>客户代号:{{ item.clientCode }}</view>
+										<view>刻码:{{ item.engrave }}</view>
+										<view class="w100">仓库:{{ item.warehouseName }}</view>
+										<view class="w100">区域:{{ getLocation(item) }}</view>
+									</view>
+								</view>
+							</view>
+						</label>
+					</checkbox-group>
+					<u-empty class="noDate" style="margin-top: 20vh" v-if="!listData.length"></u-empty>
+				</u-list>
+			</view>
+
+			<view class="footer">
+				<view class="bottom">
+					<checkbox v-if="!seletedAll" color="#fff" :checked="seletedAll" @tap="_seletedAll">全选</checkbox>
+					<checkbox class="select-all" color="#fff" v-else :checked="seletedAll" @tap="_seletedAll">取消全选</checkbox>
+				</view>
+				<u-button type="success" size="small" class="u-reset-button" :disabled="!checkListLen" @click="jumpAdd">
+					<view class="selBtn">选择( {{ checkListLen }} )</view>
+				</u-button>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { outInGoodsPackingList } from '@/api/warehouseManagement'
+	import { sceneState, outputSceneState } from '../common'
+	export default {
+		data() {
+			return {
+				type: null,
+				statusOpt: ['待处理', '已处理', '已撤销'],
+				curItem: null, //当前选中项
+				page: 1,
+				size: 20,
+				sceneState,
+				seletedAll: false, //全选状态
+				outputSceneState,
+				isEnd: true,
+				searchVal: '',
+				listData: [] //列表数据
+			}
+		},
+		//选择的列表长度
+		computed: {
+			checkListLen() {
+				return this.listData.filter(el => el.checked).length
+			}
+		},
+		onLoad({ type }) {
+			this.type = type
+		},
+		onShow() {
+			// this.getList()
+		},
+		methods: {
+			getLocation(item) {
+				if (item.areaName && item.goodsShelfName && item.goodsAllocationName) {
+					return item.areaName + '/' + item.goodsShelfName + '/' + item.goodsAllocationName
+				} else if (item.areaName && item.goodsShelfName) {
+					return item.areaName + '/' + item.goodsShelfName
+				} else if (item.areaName) {
+					return item.areaName
+				} else {
+					return ''
+				}
+			},
+			// 相机扫码
+			HandlScanCode() {
+				uni.scanCode({
+					success: res => {
+						console.log('res------------------------')
+						let arr = res.result.split('/')
+						let params = { packingNo: [arr[0]] }
+						console.log(params)
+						if (this.listData.find(item => item.packageNo == arr[0])) {
+							uni.showToast({
+								title: '请勿重复扫码!',
+								icon: 'none'
+							})
+							return
+						}
+						outInGoodsPackingList(params).then(res => {
+							console.log(res)
+							this.listData = this.listData.concat(res)
+						})
+					}
+				})
+			},
+			//勾选
+			selectVal(e, val, index) {
+				this.$set(this.listData[index], 'checked', !this.listData[index].checked)
+				this.seletedAll = !this.listData.some(item => !item.checked)
+			},
+			//全选按钮
+			_seletedAll() {
+				if (!this.seletedAll) {
+					this.seletedAll = true
+					this.listData.map(item => {
+						this.$set(item, 'checked', true)
+					})
+				} else {
+					this.seletedAll = false
+					//this.checkListLen = 0;
+					this.listData.map(item => {
+						this.$set(item, 'checked', false)
+					})
+				}
+			},
+			//跳转回添加页面
+			async jumpAdd() {
+				uni.$emit(
+					'setSelectList',
+					this.listData.filter(item => item.checked)
+				)
+				uni.navigateBack()
+			},
+			//返回添加页
+			backAdd() {
+				uni.navigateBack()
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.mainBox {
+		height: 100vh;
+		.main {
+			height: 100%;
+			display: flex;
+			flex-direction: column;
+		}
+		.wrapper {
+			flex: 1;
+			overflow: hidden;
+		}
+		.searchBox {
+			padding: 10rpx 0;
+			box-sizing: border-box;
+			background-color: #dedede;
+			height: 90rpx;
+			width: 100%;
+			line-height: 90rpx;
+			display: flex;
+			justify-content: space-around;
+			align-items: center;
+
+			input {
+				height: 78rpx;
+				width: 65%;
+				background: #f9f9f9 !important;
+				margin: 0 10rpx;
+				padding: 0 10rpx;
+				box-sizing: border-box;
+				border-radius: 5rpx;
+			}
+
+			.searchBtn {
+				height: 80rpx;
+				background: #f9f9f9 !important;
+				color: #676767;
+				font-size: 28rpx;
+				padding: 0 42rpx;
+				box-sizing: border-box;
+				outline: none;
+				border: none;
+				width: 260rpx;
+				.icon-sousuo {
+					font-size: 22px;
+				}
+
+				.text {
+					font-size: 16px;
+					margin-left: 10px;
+				}
+			}
+			.search-icon {
+				display: flex;
+				align-items: center;
+				justify-content: space-around;
+				font-size: 28rpx;
+				white-space: nowrap;
+				margin-left: 10rpx;
+				image {
+					width: 30rpx;
+					height: 30rpx;
+				}
+			}
+		}
+
+		.tab-title {
+			position: fixed;
+			top: 190rpx;
+			z-index: 99;
+			width: 100%;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			height: $tab-height;
+			line-height: $tab-height;
+			background-color: #ffffff;
+			border-bottom: 2rpx solid #f2f2f2;
+			box-sizing: border-box;
+
+			.tab-item {
+				width: 25%;
+				text-align: center;
+				font-size: 32rpx;
+				color: $uni-text-color-grey;
+			}
+
+			.tab-item.active {
+				color: $j-primary-border-green;
+				border-bottom: 1px solid $j-primary-border-green;
+				font-weight: bold;
+			}
+
+			.tab-item.filter {
+				flex: 1;
+				padding: 0px 30rpx;
+
+				.uni-icons {
+					display: flex;
+					padding-top: 5px;
+				}
+			}
+
+			.screenIcon {
+				display: flex;
+				width: 80px;
+				justify-content: center;
+
+				.screenText {
+					font-size: 32rpx;
+					color: $uni-text-color-grey;
+				}
+			}
+		}
+
+		.listContent {
+			height: 100% !important;
+			.listBox {
+				display: flex;
+				// height: 180rpx;
+				padding: 20rpx 0;
+				border-bottom: 2rpx solid #e5e5e5;
+
+				.listBox-sel {
+					height: 90rpx;
+					width: 80rpx;
+					// line-height: 90rpx;
+					text-align: center;
+
+					checkbox {
+						transform: scale(1.2);
+					}
+				}
+
+				.listBox-con {
+					width: 100%;
+					// display: flex;
+					// flex-wrap: wrap;
+					// justify-content: space-between;
+					align-items: center;
+					padding: 0 18rpx 0 0;
+
+					.listBox-top {
+						width: 100%;
+						display: flex;
+						justify-content: space-between;
+						padding-bottom: 10rpx;
+
+						.listBox-name,
+						.listBox-code {
+							display: inline-block;
+							font-size: $uni-font-size-sm;
+							font-weight: bold;
+						}
+					}
+
+					.listBox-bottom {
+						width: 100%;
+						display: flex;
+						justify-content: space-between;
+						font-size: $uni-font-size-sm;
+						flex-wrap: wrap;
+						> view {
+							width: 50%;
+							overflow: hidden;
+							white-space: nowrap;
+							text-overflow: ellipsis;
+						}
+						.input_view {
+							display: flex;
+							align-items: center;
+							justify-content: center;
+							.u-input {
+								height: 36rpx;
+								padding: 0 !important;
+								margin-right: 10rpx;
+								border: 1px solid #ddd;
+							}
+						}
+						.w100 {
+							width: 100%;
+						}
+					}
+				}
+			}
+			.noDate {
+				height: 100%;
+			}
+		}
+
+		//底部按钮
+		.footer {
+			height: 90rpx;
+			position: relative;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			bottom: 0;
+			width: 100%;
+			height: 100rpx;
+			border-top: 1rpx solid #eeecec;
+			background-color: #ffffff;
+			z-index: 999;
+
+			.bottom {
+				margin-left: 10rpx;
+			}
+
+			.u-reset-button {
+				position: absolute;
+				right: 10rpx;
+				top: 20rpx;
+				width: 150rpx;
+			}
+		}
+		.search-container {
+			width: 70vw;
+			padding: 30rpx 36rpx;
+			.footer {
+				position: absolute;
+				bottom: 0;
+				left: 0;
+				width: 100%;
+				display: flex;
+				box-shadow: 0 10rpx 30rpx 0 #000;
+				.btn {
+					width: 50%;
+					height: 80rpx;
+					border-radius: 0 !important;
+					flex: 1;
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					&.reset {
+						color: $j-primary-border-green;
+					}
+				}
+			}
+		}
+		.title {
+			font-weight: bold;
+			font-size: 30rpx;
+		}
+		.status-wrapper {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			view {
+				background-color: rgba(242, 242, 242, 1);
+				height: 60rpx;
+				border-radius: 30rpx;
+				line-height: 60rpx;
+				text-align: center;
+				width: 160rpx;
+				border: 1rpx solid rgba(242, 242, 242, 1);
+				&.active {
+					color: #157a2c;
+					border-color: rgba(21, 122, 44, 1);
+				}
+			}
+		}
+		/deep/.uni-date {
+			.uni-icons {
+				display: none;
+			}
+			.uni-date-x {
+				padding: 0;
+				view {
+					margin: 0 20rpx;
+				}
+			}
+		}
+		/deep/.uni-date__x-input,
+		/deep/.uni-easyinput__content-input {
+			height: 60rpx;
+			border-radius: 30rpx;
+			overflow: hidden;
+			background-color: rgba(242, 242, 242, 1);
+		}
+	}
+</style>

+ 10 - 2
pages/warehouse/enterHouse/addStock.vue

@@ -410,6 +410,7 @@
 			// this.formData.registerId = userInfo.id
 			uni.$on('setSelectList', async data => {
 				if (data?.length) {
+					this.formData.sourceBizNo = ''
 					// 获取批次号
 					const batchNo = await getCode('lot_number_code')
 					// 获取供应商
@@ -600,10 +601,17 @@
 			},
 			// 入库
 			submit() {
+				if (this.productList.length <= 0) {
+					uni.showToast({
+						icon: 'none',
+						title: '请添加产品!'
+					})
+					return
+				}
 				let boolen = this.productList.every(item => item.isSave)
 				if (!boolen) {
 					uni.showToast({
-						icon: 'error',
+						icon: 'none',
 						title: '请先保存所有产品信息!'
 					})
 					return
@@ -770,7 +778,7 @@
 						})
 						.catch(err => {
 							uni.showToast({
-								icon: 'error',
+								icon: 'none',
 								title: '请填入必填项!'
 							})
 						})

+ 10 - 6
pages/warehouse/enterHouse/details.vue

@@ -18,12 +18,7 @@
 			</u-form-item>
 			<u-form-item label="物品类型" borderBottom prop="assetType">
 				<view class="assetType_box">
-					{{
-						goodsLists
-							.filter(item => item.id == formData.extInfo.assetType)
-							.map(ite => ite.name)
-							.join(',')
-					}}
+					{{ getGoodsListsLabel(formData.extInfo.assetType) }}
 				</view>
 			</u-form-item>
 			<u-form-item label="入库场景" prop="bizType" borderBottom>
@@ -383,6 +378,15 @@
 			}
 		},
 		methods: {
+			getGoodsListsLabel(assetType) {
+				let arr = assetType ? assetType.split(',') : []
+				let label = arr.reduce((pre, cur) => {
+					console.log(cur)
+					console.log(pre)
+					return (pre ? pre + '/' : '') + this.goodsLists.find(item => item.id == cur).name
+				}, '')
+				return label
+			},
 			formatter(dataTime) {
 				return dayjs(dataTime).format('YYYY-MM-DD HH:mm:ss')
 			},

+ 1 - 0
pages/warehouse/enterHouse/index.vue

@@ -137,6 +137,7 @@
 					categoryName: '',
 					categoryCode: ''
 				}
+				this.pickTabIndex = 0
 				this.tableList = []
 				this.getFirstList()
 			},

+ 4 - 1
pages/warehouse/inventory/batch/batch.vue

@@ -68,12 +68,14 @@
 			// this.inventoryCode = option.inventoryCode
 			// this.code = option.code
 			// this.getInfo()
-
+			console.log(option)
 			this.dimension = option.dimension
 			this.categoryCode = option.categoryCode
 			this.categoryId = option.categoryId
 			if (option.info) {
+				// option.info.dimension = option.dimension
 				this.info = JSON.parse(decodeURIComponent(option.info))
+				this.info.dimension = this.dimension
 				console.log('this.info', this.info)
 			}
 		},
@@ -192,5 +194,6 @@
 	}
 	.scroll_box {
 		flex: 1;
+		overflow: hidden;
 	}
 </style>

+ 5 - 2
pages/warehouse/inventory/batch/components/PopMessage.vue

@@ -43,13 +43,13 @@
 							{{ info.measureUnit }}
 						</view>
 					</view>
-					<view class="item">
+					<view class="item" v-if="info.dimension == 3">
 						<view class="s1">包装单位</view>
 						<view class="s2">
 							{{ info.packingUnit }}
 						</view>
 					</view>
-					<view class="item">
+					<view class="item" v-if="info.dimension == 3">
 						<view class="s1">存货周期</view>
 						<view class="s2">{{ info.inventoryCycle }}</view>
 					</view>
@@ -265,6 +265,9 @@
 			padding: 10rpx 0;
 			display: flex;
 			justify-content: space-between;
+			.s1 {
+				width: 200rpx;
+			}
 		}
 
 		.item + .item {

+ 112 - 117
pages/warehouse/inventory/batch/components/ReportLoss.vue

@@ -1,99 +1,80 @@
 <template>
 	<!-- 报损报溢 -->
-	<view class="main-wrap" :class="{ info: isInfo }">
-		<uni-search-bar class="uni-search-bar" @confirm="search" v-model="searchValue" @input="search" cancelButton="none" placeholder="关键字"></uni-search-bar>
-
-		<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="lower">
-			<view class="order-list">
-				<u-collapse @change="change" @close="close" @open="open">
-					<u-collapse-item v-for="(item, index) in listData" :key="index" :title="item.onlyCode" name="Docs guide">
-						<template slot="title">
-							<view style="display: flex; justify-content: space-between">
-								{{ item.onlyCode }}
-
-								<text :style="{ color: statusColor[item.status] }">{{ statusOpt[item.status] }}</text>
-							</view>
-						</template>
-
-						<view class="item">
-							<view class="main">
-								<view class="row" v-if="!baseInfo.isUnpack">
-									<view class="row-item">
-										<text class="t1">最小包装单位</text>
-										<text class="t2">{{ item.measurementUnit }}{{ item.unit }} /{{ item.minimumUnit }}</text>
-									</view>
-								</view>
-								<view class="row" v-if="dimension != 2">
-									<view class="row-item">
-										<text class="t1">批次号</text>
-										<text class="t2">{{ item.batch }}</text>
-									</view>
-								</view>
-								<view class="row">
-									<view class="row-item">
-										<text class="t1">单价</text>
-										<text class="t2">
-											<template v-if="item.univalence || item.univalence === 0">
-												{{ item.univalence }}
-												{{ priceList[item.univalenceUnit] }}
-											</template>
-										</text>
-									</view>
+	<view class="main-wrap">
+		<uni-search-bar class="uni-search-bar" @confirm="search" v-model="searchValue" @input="inputChange" cancelButton="none" placeholder="关键字"></uni-search-bar>
+		<view class="scroll_box">
+			<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="lower">
+				<view class="order-list">
+					<u-collapse @change="change" @close="close" @open="open">
+						<u-collapse-item v-for="(item, index) in listData" :key="index" :title="item.onlyCode" name="Docs guide">
+							<template slot="title">
+								<view style="display: flex; justify-content: space-between">
+									{{ item.planProfitLossCode }}
 								</view>
-								<view class="row">
-									<view class="row-item">
-										<text class="t1">盘点工单号</text>
-										<text class="t2">{{ item.workOrderCode }}</text>
+							</template>
+							<view class="item">
+								<view class="main">
+									<view class="row">
+										<view class="row-item">
+											<text class="t1">批次号</text>
+											<text class="t2">{{ item.batchNo }}</text>
+										</view>
 									</view>
-								</view>
-								<view class="row">
-									<view class="row-item">
-										<text class="t1">盘点人</text>
-										<text class="t2">{{ item.executeUserName }}</text>
+									<view class="row">
+										<view class="row-item">
+											<text class="t1">盘点工单号</text>
+											<text class="t2">{{ item.planOrderCode }}</text>
+										</view>
 									</view>
-								</view>
-								<view class="row">
-									<view class="row-item">
-										<text class="t1">报损溢单号</text>
-										<text class="t2">{{ item.breakageOverflowCode }}</text>
+									<view class="row">
+										<view class="row-item">
+											<text class="t1">盘点人</text>
+											<text class="t2">{{ item.planOrderUserName }}</text>
+										</view>
 									</view>
-								</view>
-								<view class="row">
-									<view class="row-item">
-										<text class="t1">操作人</text>
-										<text class="t2">{{ item.reportName }}</text>
+									<view class="row">
+										<view class="row-item">
+											<text class="t1">盈/损/亏</text>
+											<text class="t2">{{ statusOpt[item.status] }}</text>
+										</view>
+										<view class="row-item">
+											<text class="t1">数量</text>
+											<text class="t2">{{ item[countKey[item.status]] }}</text>
+										</view>
 									</view>
-								</view>
-								<view class="row">
-									<view class="row-item">
-										<text class="t1">审核人</text>
-										<text class="t2">{{ item.accraditationUserName }}</text>
+									<view class="row">
+										<view class="row-item">
+											<text class="t1">报损报溢人</text>
+											<text class="t2">{{ item.planProfitLossUserName }}</text>
+										</view>
 									</view>
-								</view>
-								<view class="row">
-									<view class="row-item">
-										<text class="t1">更新库存时间</text>
-										<text class="t2">{{ item.updateInventoryTime }}</text>
+									<view class="row">
+										<view class="row-item">
+											<text class="t1">审核时间</text>
+											<text class="t2">{{ item.auditTime }}</text>
+										</view>
 									</view>
 								</view>
 							</view>
-						</view>
-					</u-collapse-item>
-				</u-collapse>
-			</view>
-			<u-loadmore :status="status" style="margin: 20rpx 0" />
-		</scroll-view>
+						</u-collapse-item>
+					</u-collapse>
+				</view>
+				<u-loadmore :status="status" fontSize="32" iconSize="36" style="margin: 20rpx 0" />
+			</scroll-view>
+		</view>
 	</view>
 </template>
 
 <script>
-	import { post, postJ } from '@/utils/api.js'
-	let [page, size, isEnd] = [1, 20, true]
+	import { getPlandetails } from '@/api/warehouseManagement'
 	import { debounce } from 'lodash'
 	export default {
-		props: ['batchNum', 'baseInfo', 'inventoryCode', 'isInfo', 'dimension'],
+		props: ['categoryCode', 'categoryId', 'dimension'],
 		data() {
 			return {
+				page: 1,
+				size: 10,
+				isEnd: true,
 				listData: [],
 				status: 'loading',
 				searchValue: '',
@@ -103,16 +84,22 @@
 						1: '盘盈+'
 					}
 				},
+				countKey: {
+					2: 'surplusQuantity',
+					3: 'loseQuantity',
+					4: 'wornQuantity'
+				},
 				statusOpt: {
-					1: '盘亏',
-					2: '盘损',
-					3: '盘盈'
+					2: '盘盈',
+					3: '盘亏',
+					4: '盘损'
 				},
 				statusColor: {
-					1: '',
-					2: '#F59A23',
-					3: '#70B603'
-				}
+					2: 'red',
+					3: '#70B603',
+					4: ''
+				},
+				timerId: null
 			}
 		},
 		created() {
@@ -120,43 +107,49 @@
 			this.search = debounce(this.search, 1000)
 		},
 		methods: {
+			inputChange() {
+				// 清除timer对应的延时器
+				clearTimeout(this.timerId)
+				// 重新启动一个延时器,并把timerId赋值给this.timer
+				this.timerId = setTimeout(() => {
+					// 如果500毫秒内,没有触发新的输入事件,则为搜索关键词赋值
+					this.search()
+				}, 500)
+			},
 			// 触底
 			lower() {
-				console.log('触底')
-				if (isEnd) {
+				if (this.isEnd) {
 					return
 				}
 				this.getMoreLists()
 			},
 			getData() {
+				uni.showLoading({
+					title: '加载中'
+				})
 				let par = {
-					batchNum: this.batchNum,
-					informationId: this.baseInfo?.materialId,
-					name: this.searchValue
+					pageNum: this.page,
+					size: this.size,
+					keyWord: this.searchValue,
+					categoryId: this.categoryId
 				}
-				if (this.searchValue !== '') {
-					par.key = this.searchValue
-				}
-				// postJ(
-				//   this.apiUrl +
-				//     `/InventoryBook/select/getBreakageOverflowDetail?size=${size}&page=${page}`,
-				//   par
-				// ).then(res => {
-				//   if (res.success) {
-				//     this.listData = [...this.listData, ...res.data.records]
-				//     let pages = res.data.pages
-
-				//     if (page < pages) {
-				//       isEnd = false
-				//     } else {
-				//       isEnd = true
-				//       this.status = 'nomore'
-				//     }
-				//   }
-				// })
+				getPlandetails(par)
+					.then(res => {
+						this.listData = this.listData.concat(res.list)
+						let length = res.count
+						if (this.listData.length < length) {
+							this.isEnd = false
+						} else {
+							this.isEnd = true
+							this.status = 'nomore'
+						}
+					})
+					.finally(() => {
+						uni.hideLoading()
+					})
 			},
 			getMoreLists() {
-				page++
+				this.page++
 				this.getData()
 			},
 			search() {
@@ -171,15 +164,17 @@
 
 <style lang="scss" scoped>
 	.main-wrap {
-		height: calc(100% - 170rpx);
-		&.info {
-			height: calc(100% - 236rpx);
-		}
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+		overflow: hidden;
+	}
+	.scroll_box {
+		flex: 1;
+		overflow: hidden;
 	}
-
 	.scroll-Y {
-		height: calc(100vh - 112rpx);
-		//height:100%;
+		height: 100%;
 		background-color: #fafafa;
 	}
 

+ 145 - 93
pages/warehouse/inventory/batch/components/allot.vue

@@ -1,131 +1,180 @@
 <template>
 	<!-- 调拨 -->
-	<view class="main-wrap" :class="{ info: isInfo }">
-		<uni-search-bar class="uni-search-bar" @confirm="search" v-model="searchValue" @input="search" cancelButton="none" placeholder="调拨单号"></uni-search-bar>
-
-		<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="lower">
-			<view class="order-list">
-				<view class="item" v-for="(item, index) in listData" :key="index">
-					<view class="title">
-						<view class="s1">
-							{{ getDictValue('物品类型', baseInfo.assetType) }}编码
-							{{ item.onlyCode }}
-						</view>
-						<view class="s2">
-							<!-- {{ dict.bizScene[item.dialType] }} -->
-						</view>
-					</view>
-					<view class="main">
-						<view class="row">
-							<view class="row-item">
-								<text class="t1">调拨单号</text>
-								<text class="t2">{{ item.dialNumber }}</text>
+	<view class="main-wrap">
+		<uni-search-bar class="uni-search-bar" @confirm="search" v-model="searchValue" @input="inputChange" cancelButton="none" placeholder="调拨单号"></uni-search-bar>
+		<view class="scroll_box">
+			<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="lower">
+				<view class="order-list">
+					<view class="item" v-for="(item, index) in listData" :key="index">
+						<view class="title">
+							<view class="s1">
+								{{ item.code }}
 							</view>
-							<view class="row-item">
-								<text class="t1">包装编码</text>
-								<text class="t2">{{ item.num }}</text>
+							<view class="s2">
+								{{ item.name }}
 							</view>
 						</view>
-						<view class="row">
-							<view class="row-item" v-if="!baseInfo.isUnpack">
-								<text class="t1">最小包装单元</text>
-								<text class="t2">{{ `${item.measurementUnit || ''}${item.unit}/${item.minPackUnit}` }}</text>
+						<view class="main">
+							<view class="row">
+								<view class="row-item">
+									<text class="t1">物品名称</text>
+									<text class="t2">{{ item.categoryName }}</text>
+								</view>
+								<view class="row-item">
+									<text class="t1">批次号</text>
+									<text class="t2">{{ item.batchNo }}</text>
+								</view>
 							</view>
-							<view class="row-item" v-if="dimension == 1">
-								<text class="t1">批次号</text>
-								<text class="t2">{{ item.batchNo }}</text>
+							<view class="row">
+								<view class="row-item w100">
+									<text class="t1">包装编码</text>
+									<text class="t2">{{ item.packageNo }}</text>
+								</view>
 							</view>
-						</view>
-						<view class="row">
-							<view class="row-item w100">
-								<text class="t1">调出货位</text>
-								<text class="t2">{{ item.warehouseName }}-{{ item.outWarehouseAreaName }}-{{ item.outWarehouseAreaGoodsCode }}-{{ item.outGoodsAllocationCode }}</text>
+							<view class="row">
+								<view class="row-item">
+									<text class="t1">包装数量</text>
+									<text class="t2">{{ item.packingQuantity }}</text>
+								</view>
+								<view class="row-item">
+									<text class="t1">包装单位</text>
+									<text class="t2">{{ item.packingUnit }}</text>
+								</view>
 							</view>
-						</view>
-						<view class="row">
-							<view class="row-item w100">
-								<text class="t1">调入货位</text>
-								<text class="t2">{{ item.inWarehouseName }}-{{ item.inWarehouseAreaName }}-{{ item.inWarehouseAreaGoodsCode }}-{{ item.inGoodsAllocationCode }}</text>
+							<view class="row">
+								<view class="row-item">
+									<text class="t1">计量数量</text>
+									<text class="t2">{{ item.measureQuantity }}</text>
+								</view>
+								<view class="row-item">
+									<text class="t1">计量单位</text>
+									<text class="t2">{{ item.measureUnit }}</text>
+								</view>
 							</view>
-						</view>
-						<view class="row">
-							<view class="row-item">
-								<text class="t1">审核时间</text>
-								<text class="t2">{{ item.auditorTime }}</text>
+							<view class="row">
+								<view class="row-item">
+									<text class="t1">重量</text>
+									<text class="t2">{{ item.weight }}</text>
+								</view>
+								<view class="row-item">
+									<text class="t1">重量单位</text>
+									<text class="t2">{{ item.weightUnit }}</text>
+								</view>
+							</view>
+							<view class="row">
+								<view class="row-item w100">
+									<text class="t1">调出区域</text>
+									<text class="t2">{{ warehouseLabel(item) }}</text>
+								</view>
+							</view>
+							<view class="row">
+								<view class="row-item w100">
+									<text class="t1">调入区域</text>
+									<text class="t2">{{ targetWarehouseLabel(item) }}</text>
+								</view>
 							</view>
+							<view class="row">
+								<view class="row-item w100">
+									<text class="t1">创建时间</text>
+									<text class="t2">{{ item.createTime }}</text>
+								</view>
+							</view>
+							<!-- <view class="ckmx" @click="goDetails(item)"> 查看明细 </view> -->
 						</view>
-						<!-- <view class="ckmx" @click="goDetails(item)"> 查看明细 </view> -->
 					</view>
 				</view>
-			</view>
 
-			<u-loadmore :status="status" style="margin: 20rpx 0" />
-		</scroll-view>
+				<u-loadmore :status="status" fontSize="32" iconSize="36" style="margin: 20rpx 0" />
+			</scroll-view>
+		</view>
 	</view>
 </template>
 
 <script>
-	import { post } from '@/utils/api.js'
-	let [page, size, isEnd] = [1, 10, true]
-	import dictMixins from '@/mixins/dictMixins'
+	import { getAllotDetails } from '@/api/warehouseManagement'
 	export default {
-		props: ['batchNum', 'inventoryCode', 'isInfo', 'baseInfo', 'dimension'],
-		mixins: [dictMixins],
+		props: ['categoryCode', 'categoryId', 'dimension'],
 		data() {
 			return {
+				page: 1,
+				size: 10,
+				isEnd: true,
 				listData: [],
 				status: 'loading',
-				searchValue: ''
-				// dict: {
-				//   bizScene: {
-				//     1: '库内调拨',
-				//     2: '库外调拨'
-				//   }
-				// }
+				searchValue: '',
+				timerId: null
 			}
 		},
 		created() {
 			this.getData()
 		},
 		methods: {
+			inputChange() {
+				// 清除timer对应的延时器
+				clearTimeout(this.timerId)
+				// 重新启动一个延时器,并把timerId赋值给this.timer
+				this.timerId = setTimeout(() => {
+					// 如果500毫秒内,没有触发新的输入事件,则为搜索关键词赋值
+					this.search()
+				}, 500)
+			},
+			warehouseLabel(row) {
+				if (row.warehouseName && row.areaName && row.goodsShelfName && row.goodsAllocationName) {
+					return row.warehouseName + '/' + row.areaName + '/' + row.goodsShelfName + '/' + row.goodsAllocationName
+				} else if (row.warehouseName && row.areaName && row.goodsShelfName) {
+					return row.warehouseName + '/' + row.areaName + '/' + row.goodsShelfName
+				} else if (row.warehouseName && row.areaName) {
+					return row.warehouseName + '/' + row.areaName
+				} else {
+					return row.warehouseName
+				}
+			},
+			targetWarehouseLabel(row) {
+				if (row.targetWarehouseName && row.targetAreaName && row.targetGoodsShelfName && row.targetGoodsAllocationName) {
+					return row.targetWarehouseName + '/' + row.targetAreaName + '/' + row.targetGoodsShelfName + '/' + row.targetGoodsAllocationName
+				} else if (row.targetWarehouseName && row.targetAreaName && row.targetGoodsShelfName) {
+					return row.targetWarehouseName + '/' + row.targetAreaName + '/' + row.targetGoodsShelfName
+				} else if (row.targetWarehouseName && row.targetAreaName) {
+					return row.targetWarehouseName + '/' + row.targetAreaName
+				} else {
+					return row.targetWarehouseName
+				}
+			},
 			// 触底
 			lower() {
 				console.log('触底')
-				if (isEnd) {
+				if (this.isEnd) {
 					return
 				}
 				this.getMoreLists()
 			},
 			getData() {
+				uni.showLoading({
+					title: '加载中'
+				})
 				let par = {
-					page,
-					size,
-					batchNum: this.batchNum,
-					inventoryCode: this.inventoryCode
-				}
-				if (this.searchValue !== '') {
-					par.key = this.searchValue
+					pageNum: this.page,
+					size: this.size,
+					keyWord: this.searchValue,
+					categoryId: this.categoryId
 				}
-				par = this.URLSearchParams(par)
-				//   post(this.apiUrl + '/InventoryBook/select/getTransferList?' + par).then(
-				// post(this.apiUrl + '/InventoryBook/select/getTransferDetail?' + par).then(
-				//   res => {
-				//     if (res.success) {
-				//       this.listData = [...this.listData, ...res.data.records]
-				//       let pages = res.data.pages
-
-				//       if (page < pages) {
-				//         isEnd = false
-				//       } else {
-				//         isEnd = true
-				//         this.status = 'nomore'
-				//       }
-				//     }
-				//   }
-				// )
+				getAllotDetails(par)
+					.then(res => {
+						this.listData = this.listData.concat(res.list)
+						let length = res.count
+						if (this.listData.length < length) {
+							this.isEnd = false
+						} else {
+							this.isEnd = true
+							this.status = 'nomore'
+						}
+					})
+					.finally(() => {
+						uni.hideLoading()
+					})
 			},
 			getMoreLists() {
-				page++
+				this.page++
 				this.getData()
 			},
 			search() {
@@ -151,15 +200,18 @@
 
 <style lang="scss" scoped>
 	.main-wrap {
-		height: calc(100% - 170rpx);
-		&.info {
-			height: calc(100% - 236rpx);
-		}
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+		overflow: hidden;
+	}
+	.scroll_box {
+		flex: 1;
+		overflow: hidden;
 	}
-
 	.scroll-Y {
 		//height: calc(100% - 112rpx);
-		height: 100vh;
+		height: 100%;
 		background-color: #fafafa;
 	}
 

+ 13 - 1
pages/warehouse/inventoryAllocation/components/AssetsCard.vue

@@ -10,7 +10,7 @@
 				</view>
 			</view>
 			<view class="listBox-top">
-				<view class="listBox-code">
+				<view class="listBox-name">
 					{{ item.categoryCode }}
 				</view>
 			</view>
@@ -28,6 +28,7 @@
 				<view>客户代号:{{ item.clientCode }}</view>
 				<view>刻码:{{ item.engrave }}</view>
 				<view class="w100">仓库:{{ item.warehouseName }}</view>
+				<view class="w100">区域:{{ getLocation(item) }}</view>
 			</view>
 		</view>
 	</view>
@@ -68,6 +69,17 @@
 			// this.requestDict('物品类型')
 		},
 		methods: {
+			getLocation(item) {
+				if (item.areaName && item.goodsShelfName && item.goodsAllocationName) {
+					return item.areaName + '/' + item.goodsShelfName + '/' + item.goodsAllocationName
+				} else if (item.areaName && item.goodsShelfName) {
+					return item.areaName + '/' + item.goodsShelfName
+				} else if (item.areaName) {
+					return item.areaName
+				} else {
+					return ''
+				}
+			},
 			// ...mapActions('dict', ['requestDict']),
 			deleteItem() {
 				this.$emit('deleteItem')

+ 23 - 2
pages/warehouse/inventoryAllocation/components/CargoSpaceInfoDialog.vue

@@ -41,6 +41,7 @@
 											<view>客户代号:{{ item.clientCode }}</view>
 											<view>刻码:{{ item.engrave }}</view>
 											<view class="w100">仓库:{{ item.warehouseName }}</view>
+											<view class="w100">区域:{{ getLocation(item) }}</view>
 										</view>
 									</view>
 								</view>
@@ -130,6 +131,17 @@
 		// 	this.doSearch()
 		// },
 		methods: {
+			getLocation(item) {
+				if (item.areaName && item.goodsShelfName && item.goodsAllocationName) {
+					return item.areaName + '/' + item.goodsShelfName + '/' + item.goodsAllocationName
+				} else if (item.areaName && item.goodsShelfName) {
+					return item.areaName + '/' + item.goodsShelfName
+				} else if (item.areaName) {
+					return item.areaName
+				} else {
+					return ''
+				}
+			},
 			async open(warehouse) {
 				this.warehouse = {}
 				console.log('warehouse---------', warehouse)
@@ -184,10 +196,19 @@
 				res = await getPackingList(params)
 				uni.hideLoading()
 				if (this.page == 1) {
-					this.listData = []
+					this.listData = res.list.map(item => {
+						return {
+							...item,
+							checked: false
+						}
+					})
+				} else {
+					this.listData = this.listData.concat(res.list)
 				}
-				this.listData = this.listData.concat(res.list)
+
+				console.log('this.listData--------------', this.listData)
 				this.isEnd = this.listData.length >= res.count
+				this.$forceUpdate()
 			},
 			doSearch() {
 				this.page = 1

+ 1 - 1
pages/warehouse/inventoryAllocation/components/DetailView.vue

@@ -8,7 +8,7 @@
 		</view>
 		<view v-if="activeName === 1">
 			<CellInfo v-if="type !== 'view'" label="调拨名称" :value="baseInfo.name" />
-			<CellInfo v-if="type !== 'view'" label="调拨单号" :value="baseInfo.id" />
+			<CellInfo v-if="type !== 'view'" label="调拨单号" :value="baseInfo.allotCode" />
 			<CellInfo label="调拨类型" :value="baseInfo.type == 1 ? '库内调拨' : '库外调拨'" />
 			<CellInfo label="调出库" :value="baseInfo.sourceWarehouse" />
 			<CellInfo label="调入库" :value="baseInfo.targetWarehouse" />

+ 68 - 1
pages/warehouse/inventoryAllocation/edit.vue

@@ -37,7 +37,7 @@
 			</view> -->
 			<template v-if="activeName === 'output'">
 				<view class="operations flex-center">
-					<text @click="handleScan">扫码添加</text>
+					<text @click="goScanCode">扫码添加</text>
 					<text @click="handleWarehouseChoose('output')">手动添加</text>
 					<text @click="handleWarehouseChoose('input')">调入货位</text>
 					<!-- <text @click="deleteMaterial">删除选中</text> -->
@@ -179,6 +179,12 @@
 			const code = await getCode('transfer_no')
 			console.log('code---', code)
 			this.formData.code = code
+			uni.$on('setSelectList', async data => {
+				if (data?.length) {
+					console.log('setSelectList--data------------', data)
+					this.assetsList = data
+				}
+			})
 			this.$forceUpdate()
 			console.log(this.formData.code)
 		},
@@ -261,7 +267,40 @@
 				})
 			}
 		},
+		beforeDestroy() {
+			uni.$off('setSelectList')
+		},
 		methods: {
+			goScanCode() {
+				if (!this.formData.warehouseId) {
+					uni.showToast({
+						title: '请设置调拨类型!',
+						icon: 'none'
+					})
+					return
+				}
+				let warehouse = {}
+				warehouse.id = this.formData.warehouseId
+				warehouse.name = this.formData.warehouseName
+				this.$refs.warehouseChooseRef.open({ ...warehouse, type: 'output' }, res => {
+					if (this.formData.dialType === 1) {
+						if (!res.areaId) {
+							uni.showToast({
+								title: '请选择库区',
+								icon: 'none'
+							})
+							return
+						}
+					}
+					this.formData.cargoSpace = this.getLocation(res)
+					this.formData.warehouse = res
+					this.$refs.warehouseChooseRef.cancel()
+					this.$forceUpdate()
+					uni.navigateTo({
+						url: '/pages/warehouse/components/scanCodeList'
+					})
+				})
+			},
 			add() {
 				if (!this.formData.name) {
 					uni.showToast({
@@ -270,6 +309,34 @@
 					})
 					return
 				}
+				console.log('---------this.assetsList---------------')
+				console.log(this.assetsList)
+				console.log(this.formData)
+				let isBoolen = true
+				if (this.formData.warehouse.areaId && this.formData.warehouse.shelfId && this.formData.warehouse.cargoSpaceId) {
+					isBoolen = this.assetsList.every(
+						item =>
+							item.warehouseId == this.formData.warehouseId &&
+							item.areaId == this.formData.warehouse.areaId &&
+							item.goodsShelfId == this.formData.warehouse.shelfId &&
+							item.goodsAllocationId == this.formData.warehouse.cargoSpaceId
+					)
+				} else if (this.formData.warehouse.areaId && this.formData.warehouse.shelfId) {
+					isBoolen = this.assetsList.every(
+						item => item.warehouseId == this.formData.warehouseId && item.areaId == this.formData.warehouse.areaId && item.goodsShelfId == this.formData.warehouse.shelfId
+					)
+				} else if (this.formData.warehouse.areaId) {
+					isBoolen = this.assetsList.every(item => item.warehouseId == this.formData.warehouseId && item.areaId == this.formData.warehouse.areaId)
+				} else {
+					isBoolen = this.assetsList.every(item => item.warehouseId == this.formData.warehouseId)
+				}
+				if (!isBoolen) {
+					uni.showToast({
+						title: '请检查调拨明细!',
+						icon: 'none'
+					})
+					return
+				}
 				if (this.assetsList.length > 0) {
 					if (this.formData.dialType == 1) {
 						// 库内

+ 5 - 0
pages/warehouse/inventoryAllocation/index.vue

@@ -197,6 +197,11 @@
 				this.sourceWarehouseList = [...warehouseList]
 				this.targetWarehouseList = [...warehouseList]
 			},
+			back() {
+				uni.switchTab({
+					url: '/pages/index/index'
+				})
+			},
 			addAllocation() {
 				uni.navigateTo({
 					url: '/pages/warehouse/inventoryAllocation/edit'

+ 1 - 0
pages/warehouse/outHouse/addStock.vue

@@ -360,6 +360,7 @@
 			uni.$on('setSelectList', async data => {
 				if (data?.length) {
 					console.log('data------------', data)
+					this.formData.sourceBizNo = ''
 					this.productList = data.map(item => {
 						return {
 							...item,

+ 33 - 17
pages/warehouse/outHouse/details.vue

@@ -18,12 +18,7 @@
 			</u-form-item>
 			<u-form-item label="物品类型" borderBottom prop="assetType">
 				<view class="assetType_box">
-					{{
-						goodsLists
-							.filter(item => item.id == formData.extInfo.assetType)
-							.map(ite => ite.name)
-							.join(',')
-					}}
+					{{ getGoodsListsLabel(formData.extInfo.assetType) }}
 				</view>
 			</u-form-item>
 			<u-form-item label="出库场景" prop="bizType" borderBottom>
@@ -200,7 +195,7 @@
 
 <script>
 	// import ScanCode from '@/components/ScanCode.vue'
-	import { getInboundDetailsById, getTreeByGroup } from '@/api/warehouseManagement'
+	import { getInboundDetailsById, getTreeByGroup, getInboundDetailsByBizNo } from '@/api/warehouseManagement'
 	import { getByCode } from '@/api/pda/common'
 	import dayjs from 'dayjs'
 	import { outputSceneState } from '../common'
@@ -338,17 +333,29 @@
 		},
 		onLoad(options) {
 			this.getListItems() // 物品类型
-			getInboundDetailsById(options.id).then(res => {
-				console.log(res)
-				this.productList = res.outInDetailList.map(item => {
-					return {
-						...item,
-						packingSpecificationLabel: item.extField.packingSpecification ? item.extField.packingSpecification.split(',') : [],
-						isSave: true
-					}
+			if (options.id) {
+				getInboundDetailsById(options.id).then(res => {
+					this.productList = res.outInDetailList.map(item => {
+						return {
+							...item,
+							packingSpecificationLabel: item.extField.packingSpecification ? item.extField.packingSpecification.split(',') : [],
+							isSave: true
+						}
+					})
+					this.formData = res
 				})
-				this.formData = res
-			})
+			} else {
+				getInboundDetailsByBizNo(options.bizNo).then(res => {
+					this.productList = res.outInDetailList.map(item => {
+						return {
+							...item,
+							packingSpecificationLabel: item.extField.packingSpecification ? item.extField.packingSpecification.split(',') : [],
+							isSave: true
+						}
+					})
+					this.formData = res
+				})
+			}
 		},
 		computed: {
 			listRules() {
@@ -380,6 +387,15 @@
 			}
 		},
 		methods: {
+			getGoodsListsLabel(assetType) {
+				let arr = assetType ? assetType.split(',') : []
+				let label = arr.reduce((pre, cur) => {
+					console.log(cur)
+					console.log(pre)
+					return (pre ? pre + '/' : '') + this.goodsLists.find(item => item.id == cur).name
+				}, '')
+				return label
+			},
 			formatter(dataTime) {
 				return dayjs(dataTime).format('YYYY-MM-DD HH:mm:ss')
 			},

+ 1 - 0
pages/warehouse/outHouse/index.vue

@@ -125,6 +125,7 @@
 					categoryName: '',
 					categoryCode: ''
 				}
+				this.pickTabIndex = 0
 				this.tableList = []
 				this.getFirstList()
 			},

+ 686 - 0
pages/warehouse/picking/add.vue

@@ -0,0 +1,686 @@
+<template>
+	<view class="mainBox">
+		<uni-nav-bar fixed="true" statusBar="true" left-icon="back" title="新增拣货" @clickLeft="back">
+			<template slot="float"></template>
+		</uni-nav-bar>
+
+		<u-form class="baseForm" labelPosition="left" :model="formData" ref="formRef" labelWidth="260" labelAlign="right">
+			<u-form-item label="拣货编码" prop="code" borderBottom>
+				<u-input disableColor="#ffffff" v-model="formData.code" placeholder="请选择" disabled type="text" />
+			</u-form-item>
+			<u-form-item class="required-form" label="拣货名称" prop="name" borderBottom>
+				<u-input disableColor="#ffffff" v-model="formData.name" placeholder="请选择" type="text" />
+			</u-form-item>
+			<u-form-item class="required-form" label="关联领料单" prop="documentSource" borderBottom>
+				<u-input type="text" placeholder="请输入" v-model="formData.sourceBizNo" @click.native="goToRequisition" />
+			</u-form-item>
+		</u-form>
+
+		<view class="tabs-container">
+			<view class="tabs">
+				<view class="tab-item" :class="{ active: activeName === 1 }" @click="activeName = 1">领料产品清单</view>
+				<view class="tab-item" :class="{ active: activeName === 2 }">
+					<text @click="activeName = 2" class="label">拣货清单</text>
+					<u-icon name="scan" size="50" @click="goScanCode"></u-icon>
+				</view>
+			</view>
+		</view>
+		<view class="tableBox" v-if="activeName == 1">
+			<u-list v-if="productList.length > 0" class="scrollList">
+				<u-list-item v-for="(item, index) in productList" :key="index">
+					<view class="listBox">
+						<view class="listBox-con">
+							<view class="listBox-top">
+								<view class="listBox-name">
+									{{ item.categoryName }}
+								</view>
+								<view class="listBox-code">
+									{{ item.categoryCode }}
+								</view>
+							</view>
+							<view class="listBox-bottom">
+								<view>批次号:{{ item.batchNo }}</view>
+								<view>包装数量:{{ item.packingQuantity }}</view>
+								<view>包装单位:{{ item.packingUnit }}</view>
+								<view>计量数量:{{ item.measureQuantity }}</view>
+								<view>计量单位:{{ item.measuringUnit }}</view>
+								<view>重量:{{ item.weight }}</view>
+								<view>重量单位:{{ item.weightUnit }}</view>
+								<view class="w100">仓库:{{ item.warehouseName }}</view>
+							</view>
+						</view>
+					</view>
+				</u-list-item>
+			</u-list>
+			<view v-else class="no_data">暂无数据</view>
+		</view>
+		<view class="tableBox" v-else>
+			<u-list v-if="tableList.length > 0" class="scrollList">
+				<u-list-item v-for="(item, index) in tableList" :key="index">
+					<view class="listBox">
+						<view class="listBox-con">
+							<view class="listBox-top">
+								<view class="listBox-name">
+									{{ item.categoryName }}
+								</view>
+								<view class="listBox-code">
+									{{ item.categoryCode }}
+								</view>
+							</view>
+							<view class="listBox-bottom">
+								<view>批次号:{{ item.batchNo }}</view>
+								<view>包装数量:{{ item.packingQuantity }}</view>
+								<view>包装单位:{{ item.packingUnit }}</view>
+								<view>计量数量:{{ item.measureQuantity }}</view>
+								<view>计量单位:{{ item.measuringUnit }}</view>
+								<view>重量:{{ item.weight }}</view>
+								<view>重量单位:{{ item.weightUnit }}</view>
+								<view class="w100">仓库:{{ item.warehouseName }}</view>
+							</view>
+						</view>
+					</view>
+				</u-list-item>
+			</u-list>
+			<view v-else class="no_data">暂无数据</view>
+		</view>
+		<view class="footBox">
+			<view class="reg" @click="submit">
+				<uni-icons custom-prefix="iconfont" size="20" color="#fff"></uni-icons>
+				提交
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	// import ScanCode from '@/components/ScanCode.vue'
+	import { savePickgoods, getCode } from '@/api/warehouseManagement'
+	export default {
+		data() {
+			return {
+				activeName: 1,
+				formData: {
+					type: 1, // 入库
+					bizType: '1', // 入库场景
+					storageTime: '', // 入库时间
+					extInfo: {}, // 扩展信息
+					sourceBizNo: '', // 来源单据编号
+					fromUser: '', // 送货人
+					remark: '' // 备注
+				},
+				productList: [],
+				tableList: []
+			}
+		},
+		beforeDestroy() {
+			uni.$off('setSelectList')
+			uni.$off('requisitionSelect')
+		},
+		onLoad() {
+			this.getCode()
+			const userInfo = uni.getStorageSync('userInfo')
+			this.formData.createUserName = userInfo.name
+			uni.$on('setSelectList', async data => {
+				if (data?.length) {
+					console.log('setSelectList--data------------', data)
+					this.tableList = this.tableList.concat(data)
+					setTimeout(() => {
+						this.detailOpen = !this.detailOpen
+						this.$refs.collapse && this.$refs.collapse.resize()
+					}, 0)
+				}
+			})
+			uni.$on('requisitionSelect', async (data, query) => {
+				console.log(data)
+				console.log(query)
+				this.formData.sourceBizNo = query.sourceBizNo
+				this.productList = data
+				setTimeout(() => {
+					this.detailOpen = !this.detailOpen
+					this.$refs.collapse && this.$refs.collapse.resize()
+				}, 0)
+			})
+			// 明细信息填写
+			uni.$on('batchNumBack', productList => {
+				if (productList?.length) {
+					this.productList = productList
+				}
+			})
+		},
+		mounted() {
+			// this.getAddDetails();
+		},
+		methods: {
+			goScanCode() {
+				uni.navigateTo({
+					url: '/pages/warehouse/components/scanCodeList'
+				})
+			},
+			async getCode() {
+				const code = await getCode('transfer_no')
+				this.formData.code = code
+				this.$forceUpdate()
+			},
+			goToRequisition() {
+				uni.navigateTo({
+					url: '/pages/warehouse/components/requisitionList?type=' + 2
+				})
+			},
+			async submit() {
+				if (!this.formData.name) {
+					uni.showToast({
+						title: '请输入拣货名称',
+						icon: 'none'
+					})
+					return
+				}
+				if (!this.formData.sourceBizNo) {
+					uni.showToast({
+						title: '请选择关联领料单',
+						icon: 'none'
+					})
+					return
+				}
+				if (this.tableList.length <= 0) {
+					uni.showToast({
+						title: '请扫码录入明细信息',
+						icon: 'none'
+					})
+					return
+				}
+				if (this.tableList.length !== this.productList.length) {
+					uni.showToast({
+						title: '请检查拣货清单',
+						icon: 'none'
+					})
+					return
+				} else {
+					for (let i = 0; i < this.productList.length; i++) {
+						let obj = this.tableList.find(item => item.categoryCode == this.productList[i].categoryCode)
+						if (!!obj) {
+							if (this.productList[i].packingQuantity != obj.packingQuantity || this.productList[i].packingUnit != obj.packingUnit) {
+								uni.showToast({
+									title: '请检查拣货清单',
+									icon: 'none'
+								})
+								return
+							}
+						} else {
+							uni.showToast({
+								title: '请检查拣货清单',
+								icon: 'none'
+							})
+							return
+						}
+					}
+				}
+				uni.showLoading({
+					title: '保存中...'
+				})
+				let params = {
+					code: this.formData.code,
+					name: this.formData.name,
+					sourceNo: this.formData.sourceBizNo,
+					warehouseId: this.tableList[0].warehouseId,
+					warehouseName: this.tableList[0].warehouseName,
+					status: 2, // 出库
+					info: this.tableList
+				}
+				savePickgoods(params)
+					.then(res => {
+						uni.hideLoading()
+						uni.showToast({
+							icon: 'none',
+							title: '提交成功',
+							duration: 2000
+						})
+					})
+					.catch(() => {
+						uni.hideLoading()
+						uni.showToast({
+							icon: 'none',
+							title: '提交失败',
+							duration: 2000
+						})
+					})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.mainBox {
+		height: 100vh;
+		display: flex;
+		flex-direction: column;
+		/deep/.required-form .u-form-item__body__left__content__label::before {
+			content: '*';
+			color: red;
+		}
+	}
+	.required-form-text {
+		/deep/ .u-form-item__body__right {
+			overflow: hidden;
+			.u-form-item__body__right__content {
+				width: 100%;
+				display: inline-block !important;
+				width: 100%;
+			}
+		}
+	}
+
+	.tabs-container {
+		height: 80rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+	.tabs {
+		display: flex;
+		width: 100vw;
+		height: 80rpx;
+		background-color: #fff;
+		display: flex;
+		justify-content: flex-start;
+		align-items: flex-end;
+		margin-bottom: 20rpx;
+		padding: 0 10rpx;
+		box-sizing: border-box;
+		.tab-item {
+			flex: 1;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			padding: 10rpx 0;
+			box-sizing: border-box;
+			.label {
+				margin-right: 10rpx;
+			}
+			&.active {
+				background: linear-gradient(180deg, rgba(75, 121, 2, 1) 0%, rgba(255, 255, 255, 1) 12%);
+				border-right: 1rpx solid #ccc;
+				border-left: 1rpx solid #ccc;
+				border-bottom: 1rpx solid #ccc;
+			}
+		}
+	}
+
+	.picList {
+		display: flex;
+		align-items: center;
+		justify-items: flex-start;
+		flex-wrap: wrap;
+	}
+	/deep/.baseForm {
+		.u-form-item__body {
+			padding: 0px !important;
+		}
+		.assetType_box {
+			padding: 12rpx 18rpx;
+			width: 100%;
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+		}
+	}
+	/deep/.picList .u-image {
+		margin-right: 10rpx;
+		margin-bottom: 10rpx;
+	}
+
+	/deep/.cLine .u-line:nth-child(1) {
+		border-bottom: none !important;
+	}
+
+	.detail-box {
+		position: relative;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+
+		/deep/uni-button {
+			margin: 0 !important;
+			width: 180rpx;
+		}
+		.selectEnterType {
+			margin-left: 10rpx !important;
+		}
+	}
+
+	.footBox {
+		height: 80rpx;
+		width: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+
+		view {
+			width: 100%;
+			height: 100%;
+			text-align: center;
+			color: #fff;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+
+		.reg {
+			background: $u-success-dark;
+		}
+
+		.add {
+			background: $uni-color-primary;
+		}
+
+		.uni-icons {
+			margin-right: 8rpx !important;
+		}
+	}
+	.tableBox {
+		flex: 1;
+		overflow: hidden;
+		display: flex;
+		flex-direction: column;
+		.scrollList {
+			flex: 1;
+			height: 100% !important;
+			.listBox {
+				display: flex;
+				padding: 20rpx;
+				border-bottom: 2rpx solid #e5e5e5;
+				.listBox-con {
+					width: 100%;
+					align-items: center;
+					padding: 0 18rpx 0 0;
+
+					.listBox-top {
+						width: 100%;
+						display: flex;
+						justify-content: space-between;
+						padding-bottom: 10rpx;
+
+						.listBox-name,
+						.listBox-code {
+							display: inline-block;
+							font-size: $uni-font-size-sm;
+							font-weight: bold;
+						}
+					}
+
+					.listBox-bottom {
+						width: 100%;
+						display: flex;
+						justify-content: space-between;
+						font-size: $uni-font-size-sm;
+						flex-wrap: wrap;
+						> view {
+							width: 50%;
+							overflow: hidden;
+							white-space: nowrap;
+							text-overflow: ellipsis;
+						}
+						.input_view {
+							display: flex;
+							align-items: center;
+							justify-content: center;
+							.u-input {
+								height: 36rpx;
+								padding: 0 !important;
+								margin-right: 10rpx;
+								border: 1px solid #ddd;
+							}
+						}
+						.w100 {
+							width: 100%;
+						}
+					}
+				}
+			}
+		}
+		.no_data {
+			flex: 1;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+		.list {
+			padding: 20rpx 10rpx;
+			border-bottom: 1px #f2f2f2 solid;
+			position: relative;
+			&.code {
+				.label {
+					width: 120rpx !important;
+				}
+			}
+			.listTit {
+				width: 100%;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				/deep/uni-button {
+					margin-right: 20rpx;
+					width: 100rpx;
+
+					&.assets {
+						width: 180rpx;
+					}
+				}
+				.name {
+					width: 50%;
+					margin-left: 10px;
+					overflow: hidden;
+					white-space: nowrap;
+					-o-text-overflow: ellipsis;
+					text-overflow: ellipsis;
+					font-size: 30rpx;
+				}
+
+				.btn {
+					display: flex;
+					justify-content: flex-end;
+				}
+
+				.weight {
+					width: 30%;
+					font-size: 30rpx;
+					margin-left: auto;
+					margin-right: 60rpx;
+					position: relative;
+					display: flex;
+
+					input {
+						margin-right: 10rpx;
+						border: 1px solid black;
+						width: 40%;
+						height: 20rpx;
+					}
+				}
+
+				.weight::after {
+					position: absolute;
+					right: -30rpx;
+					top: 50%;
+					content: '';
+					background: #eee;
+					width: 1px;
+					height: 28rpx;
+					margin-top: -14rpx;
+				}
+			}
+			.z_list {
+				max-height: 500rpx;
+				.material {
+					margin-top: 10rpx;
+
+					.left {
+						width: 40rpx;
+					}
+
+					.zdy_check {
+						width: 30rpx;
+						height: 30rpx;
+						border: 2rpx solid #c8c9cc;
+						border-radius: 4rpx;
+					}
+
+					.check_active {
+						background: $theme-color;
+						border: 2rpx solid $theme-color;
+
+						/deep/ .u-icon__icon {
+							color: #fff !important;
+						}
+					}
+
+					.content_table {
+						width: 670rpx;
+						border: 2rpx solid $border-color;
+
+						.item {
+							display: flex;
+							border-bottom: 2rpx solid $border-color;
+
+							.lable {
+								width: 200rpx;
+								text-align: center;
+								background-color: #f7f9fa;
+								font-size: 26rpx;
+								border-right: 2rpx solid $border-color;
+								flex-shrink: 0;
+							}
+
+							.ww80 {
+								width: 80rpx;
+							}
+
+							.content {
+								width: 500rpx;
+								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;
+							}
+							.input_box {
+								padding: 0 !important;
+							}
+
+							.content_num {
+								display: flex;
+								align-items: center;
+								padding: 0 4rpx;
+
+								/deep/ .uni-input-input {
+									width: 200rpx;
+									border: 2rpx solid #f0f8f2;
+									background: #f0f8f2;
+									color: $theme-color;
+								}
+
+								.unit {
+									padding: 0 4rpx;
+									font-size: 24rpx;
+									color: #404446;
+								}
+							}
+
+							.ww400 {
+								/deep/ .uni-input-input {
+									width: 400rpx;
+								}
+							}
+
+							.pd4 {
+								padding: 4rpx 8rpx;
+							}
+
+							&:last-child {
+								border-bottom: none;
+							}
+						}
+
+						.ww55 {
+							width: 55%;
+						}
+
+						.ww45 {
+							width: 45%;
+						}
+
+						.ww50 {
+							width: 50%;
+						}
+
+						.ww30 {
+							width: 30%;
+						}
+
+						.ww70 {
+							width: 70%;
+						}
+
+						.ww80 {
+							width: 80%;
+						}
+
+						.ww20 {
+							width: 20%;
+						}
+
+						.check {
+							width: 30rpx;
+							height: 30rpx;
+						}
+
+						.tag_box {
+							padding: 2rpx 10rpx;
+							margin-right: 12rpx;
+							background: #e6a23c;
+							font-size: 22rpx;
+							color: #fff;
+							border-radius: 4rpx;
+						}
+					}
+				}
+			}
+			.more {
+				position: absolute;
+				bottom: 26rpx;
+				right: 30rpx;
+				font-size: 28rpx;
+				color: #666;
+			}
+		}
+	}
+
+	.selectTime {
+		display: flex;
+		justify-content: flex-end;
+		margin-bottom: 10rpx;
+		.timeBox {
+			display: flex;
+			width: 500rpx;
+			.firstBtn {
+				margin-right: 10rpx;
+			}
+		}
+	}
+	.textBox {
+		border: 1px #f2f2f2 solid;
+		height: 160px;
+		display: block;
+		width: auto !important;
+	}
+
+	.saveBtn {
+		width: 50%;
+		margin: 40rpx auto;
+	}
+	.top-css {
+		border-bottom: 1px solid rgb(207, 204, 204);
+	}
+</style>

+ 110 - 0
pages/warehouse/picking/components/CardList.vue

@@ -0,0 +1,110 @@
+<template>
+	<view class="marginTop">
+		<view v-for="(item, index) in list" class="kd-row" :key="item.id" @click="goDetail(item)" v-show="list.length !== 0">
+			<!-- 进度组件 -->
+			<view class="kd-col">
+				<text class="title">{{ item.code }}</text>
+				<text>名称:{{ item.name }}</text>
+			</view>
+			<view class="kd-col">
+				<text>领料单号:{{ item.sourceNo }}</text>
+			</view>
+			<view class="kd-col">
+				<text>出库单号:{{ item.outInNo }}</text>
+			</view>
+			<view class="kd-col">
+				<text>拣货人:{{ item.createName }}</text>
+			</view>
+			<view class="kd-col">
+				<text class="text-danger">创建时间 {{ item.createTime }}</text>
+				<text class="status" :class="statusList[item.status && item.status] && statusList[item.status && item.status].class">{{ statusList[item.status] && statusList[item.status].label }}</text>
+			</view>
+			<view class="kd-col">
+				<text>仓库:{{ item.warehouseName }}</text>
+			</view>
+		</view>
+		<view v-show="list.length === 0" class="no_data">
+			<u-empty mode="data" textSize="22"></u-empty>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			list: {
+				type: Array,
+				default: () => []
+			}
+		},
+		data() {
+			return {
+				statusList: {
+					0: { class: 'text-danger', label: '拣货中' },
+					1: { class: 'normal', label: '拣货完成' },
+					2: { class: 'text-primary', label: '已出库' }
+				}
+			}
+		},
+		methods: {
+			goDetail({ outInNo }) {
+				uni.navigateTo({
+					url: `/pages/warehouse/outHouse/details?&bizNo=${outInNo}`
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.marginTop {
+		border-top: 20rpx solid $page-bg;
+
+		.kd-row {
+			font-size: 28rpx;
+			padding: 14rpx 12rpx 6rpx;
+			border-bottom: 1rpx solid $page-bg;
+			.kd-col {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 2rpx;
+				color: #aaaaaa;
+
+				.status {
+					display: inline-block;
+					padding: 4rpx 10rpx;
+					border-radius: 18rpx;
+
+					&.normal {
+						background-color: $page-bg;
+					}
+					&.text-danger {
+						background-color: rgba($color: $uni-color-order-error, $alpha: 0.1);
+					}
+					&.text-primary {
+						background-color: rgba($color: $j-primary-green, $alpha: 0.1);
+					}
+				}
+			}
+			.title {
+				font-weight: bold;
+				color: #333333;
+			}
+		}
+
+		.center {
+			text-align: center;
+			margin-bottom: 10rpx;
+			color: #999;
+		}
+		.no_data {
+			position: fixed;
+			top: 50%;
+			left: 50%;
+			transform: translate(-50%, -50%);
+			color: #999;
+			font-size: 28rpx;
+		}
+	}
+</style>

+ 0 - 0
pages/warehouse/picking/details.vue


+ 235 - 0
pages/warehouse/picking/index.vue

@@ -0,0 +1,235 @@
+<template>
+	<view class="mainBox">
+		<uni-nav-bar fixed="true" statusBar="true" left-icon="back" title="拣货列表" @clickLeft="back"></uni-nav-bar>
+		<CardList :list="tableData" />
+
+		<view class="footBox">
+			<view class="reg" @click="addStock">
+				<uni-icons custom-prefix="iconfont" type="icon-shixiangxinzeng" size="20" color="#fff"></uni-icons>
+				新增拣货
+			</view>
+		</view>
+		<!-- 搜索组件 -->
+		<u-popup :show="searchVisible" mode="right" @close="searchVisible = false">
+			<view class="search-container">
+				<view class="title">筛选</view>
+				<uni-forms ref="customForm" :modelValue="popupInfo" label-position="top" label-width="200">
+					<uni-forms-item label="编码" name="code">
+						<uni-easyinput v-model="popupInfo.code" :inputBorder="false" placeholder="请输入" />
+					</uni-forms-item>
+					<uni-forms-item label="名称" name="name">
+						<uni-easyinput v-model="popupInfo.name" :inputBorder="false" placeholder="请输入" />
+					</uni-forms-item>
+					<uni-forms-item label="仓库" name="reportName">
+						<uni-data-select v-model="popupInfo.warehouseId" :localdata="warehouseListOption"></uni-data-select>
+					</uni-forms-item>
+				</uni-forms>
+				<view class="footer">
+					<view class="btn reset" @click="handleReset">重置</view>
+					<view class="btn search" @click="handleSearch">搜索</view>
+				</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	import { getPickgoodsList, getWarehouseList } from '@/api/warehouseManagement'
+	import CardList from './components/CardList.vue'
+	import baTreePicker from '@/components/ba-tree-picker/ba-tree-picker.vue'
+
+	export default {
+		components: {
+			CardList,
+			baTreePicker
+		},
+		data() {
+			return {
+				listData: [],
+				page: 1,
+				size: 10,
+				isEnd: true,
+				searchVisible: false,
+				popupInfo: {
+					code: '',
+					name: '',
+					warehouseId: ''
+				}, //筛选数据
+				warehouseListOption: [],
+				tableData: []
+			}
+		},
+		onLoad() {
+			this.getFirstList()
+			this.getwarehouseList()
+		},
+		//触底加载
+		onReachBottom: function () {
+			if (this.isEnd) {
+				return
+			}
+			this.getMoreLists()
+		},
+		methods: {
+			//获取仓库
+			async getwarehouseList() {
+				let res = await getWarehouseList()
+				this.warehouseListOption = res.data.map(item => {
+					return {
+						text: item.name,
+						value: item.id
+					}
+				})
+			},
+			handleSearch() {
+				this.getFirstList()
+			},
+			getFirstList() {
+				this.searchVisible = false
+				this.page = 1
+				this.isEnd = true
+				this.getList()
+			},
+			getMoreLists() {
+				//获取更多数据
+				page++
+				this.getList()
+			},
+			//获取列表信息
+			getList() {
+				uni.showLoading({
+					title: '加载中'
+				})
+				let data = {
+					pageNum: this.page,
+					size: this.size
+				}
+				getPickgoodsList(data)
+					.then(res => {
+						if (this.page === 1) {
+							this.tableData = res.list
+						} else {
+							this.tableData = this.tableData.concat(res.list)
+						}
+						this.isEnd = this.tableData.length >= res.count
+					})
+					.finally(() => {
+						uni.hideLoading()
+					})
+			},
+
+			confirm(data, name) {
+				this.popupInfo.reportDeptName = name
+				this.popupInfo.reportDeptId = data[0]
+				this.popupInfo.reportName = ''
+				this.popupInfo.reportId = ''
+				this.getUser(data[0])
+			},
+			//筛选
+			handleTabSearch() {
+				this.searchVisible = true
+			},
+			handleReset() {
+				this.popupInfo = {
+					code: '',
+					name: '',
+					warehouseId: ''
+				}
+				this.getFirstList()
+			},
+			//新增
+			addStock() {
+				uni.navigateTo({
+					url: '/pages/warehouse/picking/add'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.mainBox {
+		padding-bottom: 120rpx;
+	}
+
+	.tab-wrapper {
+		position: fixed;
+		z-index: 99;
+		width: 100%;
+	}
+
+	.footBox {
+		position: fixed;
+		left: 0px;
+		bottom: 0px;
+		height: 100rpx;
+		width: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		view {
+			width: 100%;
+			height: 100%;
+			text-align: center;
+			color: #fff;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+
+		.add {
+			background: $uni-color-primary;
+		}
+
+		.reg {
+			background: $u-success-dark;
+		}
+
+		.uni-icons {
+			margin-right: 8rpx !important;
+			font-weight: bold;
+		}
+	}
+
+	.search-container {
+		width: 70vw;
+		padding: 30rpx 36rpx;
+		.footer {
+			position: absolute;
+			bottom: 0;
+			left: 0;
+			width: 100%;
+			display: flex;
+			box-shadow: 0 10rpx 30rpx 0 #000;
+			.btn {
+				width: 50%;
+				height: 80rpx;
+				border-radius: 0 !important;
+				flex: 1;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				&.reset {
+					color: $j-primary-border-green;
+				}
+				&.search {
+					color: #fff;
+					background-color: $j-primary-border-green;
+				}
+			}
+		}
+		.title {
+			font-weight: bold;
+			font-size: 30rpx;
+			margin-bottom: 20rpx;
+		}
+		/deep/.uni-date__x-input,
+		/deep/.uni-easyinput__content,
+		/deep/.uni-easyinput__content-input {
+			height: 60rpx;
+			border-radius: 30rpx;
+			overflow: hidden;
+			background-color: rgba(242, 242, 242, 1);
+		}
+	}
+</style>

+ 93 - 104
pages/warehouse/reportLoss/components/CardList.vue

@@ -1,116 +1,105 @@
 <template>
-  <view class="marginTop">
-    <view
-      v-for="(item, index) in list"
-      class="kd-row"
-      :key="item.id"
-      @click="goDetail(item)"
-      v-show="list.length !== 0"
-    >
-      <!-- 进度组件 -->
-      <view class="kd-col">
-        <text class="title">{{ item.code }}</text>
-        <text>名称:{{ item.name }}</text>
-      </view>
-      <view class="kd-col">
-        <text>报损报溢部门:{{ item.reportDeptName }}</text>
-        <text>审核人:{{ item.auditName }}</text>
-      </view>
-      <view class="kd-col">
-        <text
-          class="status"
-          :class="
-            statusList[item.status && item.status] &&
-            statusList[item.status && item.status].class
-          "
-          >{{ statusList[item.status] && statusList[item.status].label }}</text
-        >
-        <text class="text-danger">创建时间 {{ item.createTime }}</text>
-      </view>
-    </view>
-    <view v-show="list.length === 0" class="no_data">
-      <u-empty mode="data" textSize="22"></u-empty>
-    </view>
-  </view>
+	<view class="marginTop">
+		<view v-for="(item, index) in list" class="kd-row" :key="item.id" @click="goDetail(item)" v-show="list.length !== 0">
+			<!-- 进度组件 -->
+			<view class="kd-col">
+				<text class="title">{{ item.code }}</text>
+				<text>名称:{{ item.name }}</text>
+			</view>
+			<view class="kd-col">
+				<text>报损报溢部门:{{ item.executeGroupName }}</text>
+				<text>报损报溢人:{{ item.executorName }}</text>
+			</view>
+			<view class="kd-col">
+				<text class="status" :class="statusList[item.status && item.status] && statusList[item.status && item.status].class">{{ statusList[item.status] && statusList[item.status].label }}</text>
+				<text class="text-danger">报损报溢时间 {{ item.createTime }}</text>
+			</view>
+			<view class="kd-col">
+				<text>仓库:{{ item.warehouseName }}</text>
+			</view>
+		</view>
+		<view v-show="list.length === 0" class="no_data">
+			<u-empty mode="data" textSize="22"></u-empty>
+		</view>
+	</view>
 </template>
 
 <script>
-export default {
-  props: {
-    list: {
-      type: Array,
-      default: () => []
-    }
-  },
-  data () {
-    return {
-      statusList: {
-        1: { class: 'normal', label: '待审核' },
-        0: { class: 'text-danger', label: '驳回' },
-        3: { class: 'normal', label: '草稿' },
-        2: { class: 'text-primary', label: '通过' }
-      }
-    }
-  },
-  methods: {
-    goDetail ({ id }) {
-      uni.navigateTo({
-        url: `/pages/warehouse/reportLoss/detail?&id=${id}`
-      })
-    }
-  }
-}
+	export default {
+		props: {
+			list: {
+				type: Array,
+				default: () => []
+			}
+		},
+		data() {
+			return {
+				statusList: {
+					0: { class: 'text-danger', label: '待审核' },
+					1: { class: 'normal', label: '审核中' },
+					2: { class: 'text-primary', label: '已审核' }
+				}
+			}
+		},
+		methods: {
+			goDetail({ id }) {
+				uni.navigateTo({
+					url: `/pages/warehouse/reportLoss/detail?&id=${id}`
+				})
+			}
+		}
+	}
 </script>
 
 <style lang="scss" scoped>
-.marginTop {
-  border-top: 20rpx solid $page-bg;
+	.marginTop {
+		border-top: 20rpx solid $page-bg;
 
-  .kd-row {
-    font-size: 28rpx;
-    padding: 14rpx 12rpx 6rpx;
-    border-bottom: 1rpx solid $page-bg;
-    .kd-col {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      padding: 2rpx;
-      color: #aaaaaa;
+		.kd-row {
+			font-size: 28rpx;
+			padding: 14rpx 12rpx 6rpx;
+			border-bottom: 1rpx solid $page-bg;
+			.kd-col {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 2rpx;
+				color: #aaaaaa;
 
-      .status {
-        display: inline-block;
-        padding: 4rpx 10rpx;
-        border-radius: 18rpx;
+				.status {
+					display: inline-block;
+					padding: 4rpx 10rpx;
+					border-radius: 18rpx;
 
-        &.normal {
-          background-color: $page-bg;
-        }
-        &.text-danger {
-          background-color: rgba($color: $uni-color-order-error, $alpha: 0.1);
-        }
-        &.text-primary {
-          background-color: rgba($color: $j-primary-green, $alpha: 0.1);
-        }
-      }
-    }
-    .title {
-      font-weight: bold;
-      color: #333333;
-    }
-  }
+					&.normal {
+						background-color: $page-bg;
+					}
+					&.text-danger {
+						background-color: rgba($color: $uni-color-order-error, $alpha: 0.1);
+					}
+					&.text-primary {
+						background-color: rgba($color: $j-primary-green, $alpha: 0.1);
+					}
+				}
+			}
+			.title {
+				font-weight: bold;
+				color: #333333;
+			}
+		}
 
-  .center {
-    text-align: center;
-    margin-bottom: 10rpx;
-    color: #999;
-  }
-  .no_data {
-    position: fixed;
-    top: 50%;
-    left: 50%;
-    transform: translate(-50%, -50%);
-    color: #999;
-    font-size: 28rpx;
-  }
-}
+		.center {
+			text-align: center;
+			margin-bottom: 10rpx;
+			color: #999;
+		}
+		.no_data {
+			position: fixed;
+			top: 50%;
+			left: 50%;
+			transform: translate(-50%, -50%);
+			color: #999;
+			font-size: 28rpx;
+		}
+	}
 </style>

+ 192 - 272
pages/warehouse/reportLoss/detail.vue

@@ -1,285 +1,205 @@
 <template>
-  <view class="mainBox">
-    <uni-nav-bar
-      fixed="true"
-      statusBar="true"
-      left-icon="back"
-      title="报损报溢详情"
-      @clickLeft="back"
-    >
-    </uni-nav-bar>
+	<view class="mainBox">
+		<uni-nav-bar fixed="true" statusBar="true" left-icon="back" title="报损报溢详情" @clickLeft="back"></uni-nav-bar>
 
-    <view>
-      <CellInfo label="报损报溢编码" :value="infoData.code"></CellInfo>
-      <CellInfo label="名称" :value="infoData.name"></CellInfo>
-      <CellInfo
-        label="报损报溢部门"
-        :value="infoData.reportDeptName"
-      ></CellInfo>
-      <CellInfo label="报损报溢人" :value="infoData.reportName"></CellInfo>
-      <CellInfo label="审核人部门" :value="infoData.auditDeptName"></CellInfo>
-      <CellInfo label="审核人" :value="infoData.auditName"></CellInfo>
-      <CellInfo label="备注" :value="infoData.remark"></CellInfo>
-    </view>
-    <uni-section title="报损报溢明细" type="line">
-      <view class="order-box">盘点工单{{ infoData.workOrderCode }}</view>
-      <view
-        v-for="(item, index) in infoData.list"
-        :key="index"
-        class="list-card"
-      >
-        <view class="status" :style="{ color: _getStatus(item.status).color }">
-          <text>{{ _getStatus(item.status).name }}</text>
-          <text
-            >数量:{{
-              (([1, 2].includes(item.status) ? '-' : '+') || '') + item.amount
-            }}</text
-          >
-        </view>
-        <view class="row first">
-          <view class="col">
-            <text class="main">{{ item.name }}</text>
-            {{ item.code }}
-          </view>
-        </view>
-        <view class="row">
-          <view class="col" style="width: 100%">
-            <text class="main">货位:</text>
-            {{ item.warehouseName }}-{{ item.reservoirName }}-{{
-              item.goodsShelfName
-            }}-{{ item.goodsAllocationName }}
-          </view>
-        </view>
-        <view class="row">
-          <view class="col">
-            <text class="label">批次号:</text>
-            {{ item.batch }}
-          </view>
-          <view class="col">
-            <text class="label">类型:</text>
-            {{ getDictValue('物品类型', item.productType) }}
-          </view>
-          <view class="col" v-for="(itm, index) in tableHeader" :key="index">
-            <text class="label">{{ itm.label }}:</text>
-            {{ item[itm.prop] }}
-          </view>
-          <view class="col" v-if="!item.isUnpack">
-            <text class="label">最小单元:</text>
-            {{ item.unit }}/{{ item.minPackUnit }}
-          </view>
-        </view>
-      </view>
-    </uni-section>
-  </view>
+		<view>
+			<CellInfo label="报损报溢编码" :value="infoData.code"></CellInfo>
+			<CellInfo label="名称" :value="infoData.name"></CellInfo>
+			<CellInfo label="报损报溢部门" :value="infoData.executeGroupName"></CellInfo>
+			<CellInfo label="报损报溢人" :value="infoData.executorName"></CellInfo>
+			<!-- <CellInfo label="审核人部门" :value="infoData.auditDeptName"></CellInfo>
+			<CellInfo label="审核人" :value="infoData.auditName"></CellInfo> -->
+			<CellInfo label="备注" :value="infoData.remark"></CellInfo>
+		</view>
+		<uni-section title="报损报溢明细" type="line">
+			<view class="order-box">盘点工单{{ formData.workOrderCode }}</view>
+			<view v-for="(item, index) in formData.list" :key="index" class="list-card">
+				<view class="status" :style="{ color: colorInfo[item.status] }">
+					<text>{{ statusInfo[item.status] }}</text>
+					<text>数量:{{ item[countInfo[item.status]] }}</text>
+				</view>
+				<view class="row first">
+					<view class="col" style="width: 100%">
+						<text class="main">{{ item.categoryName }}</text>
+						{{ item.categoryCode }}
+					</view>
+					<view class="col" style="width: 100%">
+						<text class="main">包装编码:</text>
+						{{ item.packageNo }}
+					</view>
+					<view class="col" style="width: 100%">
+						<text class="main">仓库:</text>
+						{{ item.info.warehouseName }}
+					</view>
+				</view>
+				<view class="row">
+					<view class="col">
+						<text class="label">包装数量:</text>
+						{{ item.info.packingCountBase }}
+					</view>
+					<view class="col">
+						<text class="label">包装单位:</text>
+						{{ item.info.packingUnit }}
+					</view>
+					<view class="col">
+						<text class="label">重量:</text>
+						{{ item.info.weight }}
+					</view>
+					<view class="col">
+						<text class="label">重量单位:</text>
+						{{ item.info.weightUnit }}
+					</view>
+					<view class="col">
+						<text class="label">批次号:</text>
+						{{ item.batchNo }}
+					</view>
+				</view>
+			</view>
+		</uni-section>
+	</view>
 </template>
 
 <script>
-import { post, postJ, get, getJ } from '@/utils/api.js'
-import { getDict, wh_equStatus } from '../enum.js'
-import CellInfo from '@/components/CellInfo.vue'
-import dictMxins from '@/mixins/dictMixins'
-export default {
-  components: { CellInfo },
-  mixins: [dictMxins],
-  data () {
-    return {
-      pickerIndex: 0,
-      deptList: [],
-      userList: [],
-      infoData: {
-        auditId: '',
-        auditName: '',
-        verifyDeptCode: '',
-        verifyDeptName: '',
-        workOrderCode: '',
-        list: []
-      }
-    }
-  },
-  computed: {
-    tableHeader () {
-      if (this.infoData.list?.length) {
-        return this.getTableHeader(this.infoData.list[0].productType)
-      }
-      return []
-    }
-  },
-  onLoad ({ id }) {
-    this.getDetail(id)
-    this.requestDict('物品类型')
-  },
-
-  methods: {
-    getTableHeader (selectEquiType) {
-      switch (+selectEquiType) {
-        case 3:
-          return [{ label: '牌号', prop: 'assetBrand' }]
-        case 8:
-          return [
-            // { label: '型号', prop: 'assetSku' },
-			{ label: '型号', prop: 'modelType' },
-            { label: '规格', prop: 'specification' }
-          ]
-        case 4:
-          return [
-            { label: '牌号', prop: 'assetBrand' },
-			{ label: '型号', prop: 'modelType' },
-            // { label: '型号', prop: 'assetSku' }
-          ]
-        case 5: //'周转车'
-          return [
-            { label: '规格', prop: 'specification' },
-            {
-              label: '材质',
-              prop: 'texture',
-              formatter (row) {
-                if (!row?.extendField) return ''
-                const extendField = JSON.parse(row.extendField)
-                return extendField.texture
-              }
-            },
-            {
-              label: '长宽高',
-              prop: '',
-              formatter (row) {
-                if (!row?.extendField) return ''
-                const extendField = JSON.parse(row.extendField)
-                return `${extendField.length || '-'}*${
-                  extendField.width || '-'
-                }*${extendField.high || '-'}`
-              }
-            }
-          ]
-        case 2: //'舟皿'
-          return [
-            { label: '规格', prop: 'specification' },
-			{ label: '型号', prop: 'modelType' },
-            // { label: '型号', prop: 'assetSku' },
-            {
-              label: '长宽高',
-              prop: '',
-              formatter (row) {
-                if (!row?.extendField) return ''
-                const extendField = JSON.parse(row.extendField)
-                return `${extendField.length || '-'}*${
-                  extendField.width || '-'
-                }*${extendField.high || '-'}`
-              }
-            }
-          ]
-        case 1: //'设备'
-          return [
-            // { label: '型号', prop: 'assetSku' },
-			{ label: '型号', prop: 'modelType' },
-            { label: '规格', prop: 'specification' }
-          ]
-        case 6: //'模具'
-          return [
-            { label: '牌号', prop: 'assetBrand' },
-			{ label: '型号', prop: 'modelType' },
-            // { label: '型号', prop: 'assetSku' },
-            {
-              label: '收缩系数',
-              prop: '',
-              formatter (row) {
-                if (!row?.extendField) return ''
-                const extendField = JSON.parse(row.extendField)
-                return extendField.shrinkageCoefficient
-              }
-            }
-          ]
-        case 7: //'备品备件'
-          return [
-            { label: '规格', prop: 'specification' },
-			{ label: '型号', prop: 'modelType' },
-            // { label: '型号', prop: 'assetSku' }
-          ]
-      }
-
-      return []
-    },
-    _getStatus: getDict(wh_equStatus),
-    async getDetail (id) {
-      const res = await get(this.apiUrl + `/breakag/info/${id}`)
-      if (res?.success) {
-        this.infoData = res.data
-      }
-    }
-  }
-}
+	import { getReportPlanDetailById } from '@/api/warehouseManagement'
+	import CellInfo from '@/components/CellInfo.vue'
+	export default {
+		components: { CellInfo },
+		data() {
+			return {
+				pickerIndex: 0,
+				statusInfo: {
+					2: '盘盈',
+					3: '丢失',
+					4: '破损'
+				},
+				countInfo: {
+					2: 'surplusQuantity',
+					3: 'loseQuantity',
+					4: 'wornQuantity'
+				},
+				colorInfo: {
+					2: 'red',
+					3: 'green',
+					4: 'black'
+				},
+				statusOption: [
+					{
+						label: '盘盈',
+						value: '2',
+						numKey: 'surplusQuantity'
+					},
+					{
+						label: '丢失',
+						value: '3',
+						numKey: 'loseQuantity'
+					},
+					{
+						label: '破损',
+						value: '4',
+						numKey: 'wornQuantity'
+					}
+				],
+				deptList: [],
+				userList: [],
+				infoData: {
+					auditId: '',
+					auditName: '',
+					verifyDeptCode: '',
+					verifyDeptName: '',
+					workOrderCode: '',
+					list: []
+				},
+				formData: {}
+			}
+		},
+		onLoad({ id }) {
+			this.getDetail(id)
+		},
+		methods: {
+			async getDetail(id) {
+				getReportPlanDetailById(id).then(res => {
+					this.infoData = res
+					this.formData.workOrderCode = res.info[0].code
+					this.formData.list = res.info[0].planDetailVOList
+				})
+			}
+		}
+	}
 </script>
 
 <style lang="scss" scoped>
-.footBox {
-  position: fixed;
-  bottom: 0;
-  left: 0;
-  right: 0;
-}
-
-.mainBox {
-  padding-bottom: 90rpx;
+	.footBox {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		right: 0;
+	}
 
-  .order-box {
-    color: #7f7f7f;
-    background-color: rgba(215, 215, 215, 0.729411764705882);
-    line-height: 44rpx;
-    border-radius: 44rpx;
-    text-align: center;
-    font-size: 28rpx;
-    margin: 0 20rpx;
-  }
+	.mainBox {
+		padding-bottom: 90rpx;
+		/deep/ .list-cell {
+			padding: 10rpx 0;
+		}
+		.order-box {
+			color: #7f7f7f;
+			background-color: rgba(215, 215, 215, 0.729411764705882);
+			line-height: 44rpx;
+			border-radius: 44rpx;
+			text-align: center;
+			font-size: 28rpx;
+			margin: 0 20rpx;
+		}
 
-  .list-card {
-    border-bottom: 6rpx solid #f2f2f2;
-    position: relative;
-    .status {
-      padding: 6rpx 20rpx;
-      font-weight: bold;
-      font-size: 28rpx;
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      border-bottom: 1rpx solid #f2f2f2;
-    }
-    .del {
-      position: absolute;
-      color: $uni-color-order-error !important;
-      bottom: 5rpx;
-      right: 10rpx;
-      font-size: 50rpx !important;
-    }
-    .row {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      font-size: 28rpx;
-      flex-wrap: wrap;
-      padding: 10rpx 20rpx;
-      color: #7d7d7d;
+		.list-card {
+			border-bottom: 6rpx solid #f2f2f2;
+			position: relative;
+			.status {
+				padding: 6rpx 20rpx;
+				font-weight: bold;
+				font-size: 28rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				border-bottom: 1rpx solid #f2f2f2;
+			}
+			.del {
+				position: absolute;
+				color: $uni-color-order-error !important;
+				bottom: 5rpx;
+				right: 10rpx;
+				font-size: 50rpx !important;
+			}
+			.row {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				font-size: 28rpx;
+				flex-wrap: wrap;
+				padding: 10rpx 20rpx;
+				color: #7d7d7d;
 
-      &.first {
-        color: #000;
-        font-size: 28rpx;
-        border-bottom: 1rpx solid #f2f2f2;
-        .col {
-          width: 100%;
-        }
-      }
+				&.first {
+					color: #000;
+					font-size: 28rpx;
+					border-bottom: 1rpx solid #f2f2f2;
+					.col {
+						width: 100%;
+					}
+				}
 
-      .col {
-        width: 50%;
-      }
-      .label {
-        margin-right: 10rpx;
-        display: inline-block;
-        width: 180rpx;
-        text-align: right;
-      }
-      .main {
-        margin-right: 10rpx;
-      }
-    }
-  }
-}
+				.col {
+					width: 50%;
+				}
+				.label {
+					margin-right: 10rpx;
+					display: inline-block;
+					width: 180rpx;
+					text-align: right;
+				}
+				.main {
+					margin-right: 10rpx;
+				}
+			}
+		}
+	}
 </style>

+ 168 - 223
pages/warehouse/reportLoss/edit.vue

@@ -10,23 +10,14 @@
 				<u-input v-model="formData.name" placeholder="请输入" type="text" />
 			</u-form-item>
 			<u-form-item label="报损报溢部门" class="required-form" prop="bizScene" borderBottom>
-				<u-input v-model="formData.reportDeptName" disableColor="#ffffff" placeholder="请选择" disabled type="select" />
+				<u-input v-model="formData.executeGroupName" disableColor="#ffffff" @click.native="$refs.treePicker._show()" placeholder="请选择" type="select" />
 			</u-form-item>
 			<u-form-item label="报损报溢人" class="required-form" prop="reportName" borderBottom>
-				<u-input :value="formData.reportName" disableColor="#ffffff" placeholder="请选择" disabled type="select" />
-			</u-form-item>
-			<u-form-item label="审核人部门" prop="verifyDeptName" borderBottom>
-				<u-input :value="formData.verifyDeptName" disableColor="#ffffff" placeholder="请选择" disabled type="select" @click.native="$refs.treePicker._show()" />
-				<u-icon slot="right" name="arrow-right"></u-icon>
-			</u-form-item>
-			<u-form-item label="审核人" prop="auditId" borderBottom>
-				<picker @change="e => handlePicker(e, userList, 'auditId', 'auditName')" :value="pickerIndex" :range="userList" range-key="name">
-					<u-input :value="formData.auditName" disableColor="#ffffff" placeholder="请选择" disabled type="select" />
-				</picker>
-				<u-icon slot="right" name="arrow-right"></u-icon>
+				<!-- <u-input :value="formData.reportName" disableColor="#ffffff" placeholder="请选择" disabled type="select" /> -->
+				<view class="select_user"><uni-data-select v-model="formData.executorId" @change="userChange" :localdata="userList" :clear="false"></uni-data-select></view>
 			</u-form-item>
 			<u-form-item label="备注" prop="remark" borderBottom>
-				<u-textarea confirmType="done" :maxlength="-1" height="80" v-model="formData.remark" placeholder="请输入"></u-textarea>
+				<u-input v-model="formData.remark" placeholder="请输入" type="text" />
 			</u-form-item>
 		</u-form>
 
@@ -36,39 +27,46 @@
 			</template>
 			<view class="order-box">盘点工单{{ formData.workOrderCode }}</view>
 			<view v-for="(item, index) in formData.list" :key="index" class="list-card">
-				<view class="status" :style="{ color: _getStatus(item.status).color }">
-					<text>{{ _getStatus(item.status).name }}</text>
-					<text>数量:{{ [1, 2].includes(item.status) ? '-1' : `+${item.checkNum || 0}` }}</text>
+				<view class="status" :style="{ color: colorInfo[item.status] }">
+					<text>{{ statusInfo[item.status] }}</text>
+					<text>数量:{{ item[countInfo[item.status]] }}</text>
 				</view>
 				<view class="row first">
 					<view class="col" style="width: 100%">
-						<text class="main">{{ item.name }}</text>
-						{{ item.code }}
+						<text class="main">{{ item.categoryName }}</text>
+						{{ item.categoryCode }}
+					</view>
+					<view class="col" style="width: 100%">
+						<text class="main">包装编码:</text>
+						{{ item.packageNo }}
 					</view>
 					<view class="col" style="width: 100%">
-						<text class="main">货位:</text>
-						{{ item.warehouseName }}-{{ item.reservoirName }}-{{ item.goodsShelfName }}-{{ item.goodsAllocationName }}
+						<text class="main">仓库:</text>
+						{{ item.info.warehouseName }}
 					</view>
 				</view>
 				<view class="row">
 					<view class="col">
-						<text class="label">批次号:</text>
-						{{ item.batchNo }}
+						<text class="label">包装数量:</text>
+						{{ item.info.packingCountBase }}
+					</view>
+					<view class="col">
+						<text class="label">包装单位:</text>
+						{{ item.info.packingUnit }}
 					</view>
 					<view class="col">
-						<text class="label">类型:</text>
-						{{ getDictValue('物品类型', item.productType) }}
+						<text class="label">重量:</text>
+						{{ item.info.weight }}
 					</view>
-					<view class="col" v-for="(itm, index) in tableHeader" :key="index">
-						<text class="label">{{ itm.label }}:</text>
-						{{ item[itm.prop] }}
+					<view class="col">
+						<text class="label">重量单位:</text>
+						{{ item.info.weightUnit }}
 					</view>
-					<view class="col" v-if="!item.isUnpack">
-						<text class="label">最小单元:</text>
-						{{ item.unit }}/{{ item.minPackUnit }}
+					<view class="col">
+						<text class="label">批次号:</text>
+						{{ item.batchNo }}
 					</view>
 				</view>
-				<uni-icons type="trash" size="30" class="del" @click="delRow(index)"></uni-icons>
 			</view>
 		</uni-section>
 
@@ -76,13 +74,13 @@
 			<u-button type="success" @click="handleSubmit">提交</u-button>
 		</view>
 
-		<ba-tree-picker ref="treePicker" :multiple="false" @select-change="deptConfirm" key="dept" title="选择部门" :localdata="deptList" valueKey="code" textKey="name" childrenKey="children" />
+		<ba-tree-picker ref="treePicker" :multiple="false" @select-change="deptConfirm" title="选择部门" :localdata="listData" valueKey="id" textKey="name" childrenKey="children" />
 	</view>
 </template>
 
 <script>
-	import { post, postJ, get, getJ } from '@/utils/api.js'
-	import { getDict, wh_equStatus, getDictName, warehousingType } from '../enum.js'
+	import { getCode, saveReportsList } from '@/api/warehouseManagement'
+	import { listOrganizations, getUserPage } from '@/api/myTicket/index.js'
 	import baTreePicker from '@/components/ba-tree-picker/ba-tree-picker.vue'
 	import { getRuleNo } from '@/utils/utils.js'
 	// import dictMxins from '@/mixins/dictMixins'
@@ -91,17 +89,50 @@
 		// mixins: [dictMxins],
 		data() {
 			return {
-				warehousingType,
-				getDictName,
+				userList: [],
+				listData: [],
+				statusInfo: {
+					2: '盘盈',
+					3: '丢失',
+					4: '破损'
+				},
+				countInfo: {
+					2: 'surplusQuantity',
+					3: 'loseQuantity',
+					4: 'wornQuantity'
+				},
+				colorInfo: {
+					2: 'red',
+					3: 'green',
+					4: 'black'
+				},
+				statusOption: [
+					{
+						label: '盘盈',
+						value: '2',
+						numKey: 'surplusQuantity'
+					},
+					{
+						label: '丢失',
+						value: '3',
+						numKey: 'loseQuantity'
+					},
+					{
+						label: '破损',
+						value: '4',
+						numKey: 'wornQuantity'
+					}
+				],
 				pickerIndex: 0,
 				deptList: [],
 				userList: [],
 				formData: {
-					code: getRuleNo('BS'),
-					auditId: '',
-					auditName: '',
-					verifyDeptCode: '',
-					verifyDeptName: '',
+					code: '',
+					name: '',
+					executeGroupName: '',
+					executeGroupId: '',
+					executorName: '',
+					executorId: '',
 					workOrderCode: '',
 					list: []
 				},
@@ -117,162 +148,62 @@
 			}
 		},
 		onLoad({ id }) {
-			this.requestDict('物品类型')
+			// this.requestDict('物品类型')
 			if (id) {
 				this.getDetail(id)
 			} else {
 				const userInfo = uni.getStorageSync('userInfo')
-
-				this.formData.reportName = userInfo.name
-				this.formData.reportId = userInfo.id
-				this.formData.reportDeptName = userInfo.dept.name
-				this.formData.reportDeptId = userInfo.dept.code
+				console.log(userInfo)
 			}
-
 			this.getDept()
+			this.getOrderCode()
 			uni.$off('getWorkorder')
 			uni.$on('getWorkorder', data => {
+				console.log(data)
 				if (data?.id) {
-					this.formData.workOrderCode = data.workOrderCode
-					this.isMaterial = data.assetDict?.code === 3
-					this._getAbnormaldetailList(data.id)
+					this.formData.workOrderCode = data.code
+					this.formData.list = data.planDetailVOList
+					this.formData.tableList = [data]
 				}
 			})
 		},
-		computed: {
-			tableHeader() {
-				if (this.formData.list?.length) {
-					return this.getTableHeader(this.formData.list[0].assetTypeDict)
-				}
-				return []
-			}
-		},
 		methods: {
-			getTableHeader(selectEquiType) {
-				switch (+selectEquiType) {
-					case 3:
-						return [{ label: '牌号', prop: 'assetBrand' }]
-					case 8:
-						return [
-							{ label: '型号', prop: 'assetSku' },
-							{ label: '规格', prop: 'specification' }
-						]
-					case 4:
-						return [
-							{ label: '牌号', prop: 'assetBrand' },
-							{ label: '型号', prop: 'assetSku' }
-						]
-					case 5: //'周转车'
-						return [
-							{ label: '规格', prop: 'specification' },
-							{
-								label: '材质',
-								prop: 'texture',
-								formatter(row) {
-									if (!row?.extendField) return ''
-									const extendField = JSON.parse(row.extendField)
-									return extendField.texture
-								}
-							},
-							{
-								label: '长宽高',
-								prop: '',
-								formatter(row) {
-									if (!row?.extendField) return ''
-									const extendField = JSON.parse(row.extendField)
-									return `${extendField.length || '-'}*${extendField.width || '-'}*${extendField.high || '-'}`
-								}
-							}
-						]
-					case 2: //'舟皿'
-						return [
-							{ label: '规格', prop: 'specification' },
-							{ label: '型号', prop: 'assetSku' },
-							{
-								label: '长宽高',
-								prop: '',
-								formatter(row) {
-									if (!row?.extendField) return ''
-									const extendField = JSON.parse(row.extendField)
-									return `${extendField.length || '-'}*${extendField.width || '-'}*${extendField.high || '-'}`
-								}
-							}
-						]
-					case 1: //'设备'
-						return [
-							{ label: '型号', prop: 'assetSku' },
-							{ label: '规格', prop: 'specification' }
-						]
-					case 6: //'模具'
-						return [
-							{ label: '牌号', prop: 'assetBrand' },
-							{ label: '型号', prop: 'assetSku' },
-							{
-								label: '收缩系数',
-								prop: '',
-								formatter(row) {
-									if (!row?.extendField) return ''
-									const extendField = JSON.parse(row.extendField)
-									return extendField.shrinkageCoefficient
-								}
-							}
-						]
-					case 7: //'备品备件'
-						return [
-							{ label: '规格', prop: 'specification' },
-							{ label: '型号', prop: 'assetSku' }
-						]
-				}
-
-				return []
+			userChange(value) {
+				this.formData.executorId = value
+				this.formData.executorName = this.userList.find(item => item.value == value).text
+			},
+			async getOrderCode() {
+				const code = await getCode('plan_profit_loss')
+				this.formData.code = code
 			},
-			_getStatus: getDict(wh_equStatus),
 			workorderSelect() {
 				uni.navigateTo({
 					url: '/pages/warehouse/reportLoss/workorderSelected'
 				})
 			},
-			async getDetail(id) {
-				// const res = await get(this.apiUrl + `/breakag/info/${id}`);
-				// if (res?.success) {
-				//   this.formData = res.data;
-				// }
-			},
-			// 工单详情
-			async _getAbnormaldetailList(workOrderId) {
-				// const res = await postJ(
-				//   this.apiUrl +
-				//     `/repertoryCheck/getAbnormaldetailList?workOrderId=${workOrderId}`
-				// );
-				// if (res?.success) {
-				//   this.formData.list = (res.data || []).map((itm) => {
-				//     delete itm.id;
-				//     if ([1, 2].includes(itm.equStatus)) {
-				//       itm.checkNum = 1;
-				//     }
-				//     return {
-				//       ...itm,
-				//       amount: itm.checkNum,
-				//       model: itm.assetSku,
-				//       name: itm.assetName,
-				//       productType: itm.assetTypeDict,
-				//       code: itm.assetCode,
-				//       batch: itm.batchNo,
-				//       num: itm.bucketNum,
-				//       bizTypeId: itm.bizTypeId,
-				//       bizTypeName: itm.bizTypeName,
-				//       status: itm.equStatus,
-				//       unitPrice: itm.univalence,
-				//       minimumUnit: itm.minPackUnit,
-				//     };
-				//   });
-				// }
-			},
-			delRow(index) {
-				this.formData.list.splice(index, 1)
-			},
+			async getDetail(id) {},
 			async handleSubmit() {
-				// this.$refs.formRef.validate().then(async () => {
+				if (!this.formData.name) {
+					uni.showToast({
+						title: '请输入名称!',
+						icon: 'none'
+					})
+					return
+				}
+				if (!this.formData.executeGroupId) {
+					uni.showToast({
+						title: '请选择部门!',
+						icon: 'none'
+					})
+					return
+				}
+				if (!this.formData.executorId) {
+					uni.showToast({
+						title: '请选择人员!',
+						icon: 'none'
+					})
+					return
+				}
 				if (!this.formData.list?.length) {
 					uni.showToast({
 						title: '请选择工单!',
@@ -280,61 +211,59 @@
 					})
 					return
 				}
-				// const res = await postJ(this.apiUrl + `/breakag/save`, this.formData);
-				// if (res?.success) {
-				//   uni.showToast({
-				//     title: "提交成功!",
-				//     icon: "success",
-				//   });
-
-				//   uni.navigateBack({
-				//     delta: 1,
-				//   });
-				// }
-				// })
-			},
-			// 抬头下拉信息保存
-			handlePicker(e, list, idKey, nameKey) {
-				if (idKey) {
-					this.formData[idKey] = list[e.detail.value].id
-				}
-				if (nameKey) {
-					this.formData[nameKey] = list[e.detail.value].name
+				let params = {
+					...this.formData,
+					info: this.formData.tableList,
+					status: 1
 				}
+				uni.showLoading({
+					title: '加载中'
+				})
+				saveReportsList(params)
+					.then(() => {
+						uni.hideLoading()
+						uni.showToast({
+							title: '提交成功!',
+							icon: 'success'
+						})
+						uni.navigateTo({
+							url: `/pages/warehouse/reportLoss/index`
+						})
+					})
+					.catch(() => {
+						uni.hideLoading()
+					})
 			},
 			// 部门确认
 			deptConfirm(data, name) {
-				this.formData.verifyDeptCode = data[0]
-				this.formData.verifyDeptName = name
-				this.formData.auditId = ''
-				this.formData.auditName = ''
-
+				this.formData.executeGroupId = data[0]
+				this.formData.executeGroupName = name
+				this.formData.executorId = ''
+				this.formData.executorName = ''
 				this.getUser(data[0])
 			},
 			// 获取部门
 			getDept() {
-				// get(this.apiUrl + '/main/org/dept/effectiveTree').then(res => {
-				// 	if (res?.success) {
-				// 		this.deptList = res.data
-				// 	}
-				// })
+				listOrganizations(1).then(data => {
+					this.listData = data
+				})
 			},
-
 			// 获取人员
 			getUser(deptCode) {
-				// post(this.apiUrl + "/main/user/list", {
-				//   deptCode,
-				//   page: 1,
-				//   size: 9999,
-				// }).then((res) => {
-				//   if (res?.success) {
-				//     this.userList = res.data.items.map((item) => {
-				//       item.name = item.trueName;
-				//       item.id = item.userId;
-				//       return item;
-				//     });
-				//   }
-				// });
+				uni.showLoading({
+					title: '加载中'
+				})
+				getUserPage({ pageNum: 1, size: -1, groupId: deptCode })
+					.then(data => {
+						this.userList = data.list.map(item => {
+							item.text = item.name
+							item.value = item.id
+							return item
+						})
+					})
+					.finally(() => {
+						uni.hideLoading()
+					})
 			}
 		}
 	}
@@ -349,8 +278,24 @@
 	}
 
 	.mainBox {
+		/deep/.baseForm {
+			.u-form-item__body {
+				padding: 0rpx;
+			}
+		}
 		padding-bottom: 90rpx;
-
+		/deep/.required-form .u-form-item__body__left__content__label::before {
+			content: '*';
+			color: red;
+		}
+		.select_user {
+			width: 100%;
+			padding: 12rpx 20rpx;
+			box-sizing: border-box;
+			/deep/ .uni-select {
+				height: 48rpx;
+			}
+		}
 		.order-box {
 			color: #7f7f7f;
 			background-color: rgba(215, 215, 215, 0.729411764705882);
@@ -362,7 +307,7 @@
 		}
 
 		.list-card {
-			border-bottom: 6rpx solid #f2f2f2;
+			border-bottom: 20rpx solid #f2f2f2;
 			position: relative;
 			.status {
 				padding: 6rpx 20rpx;

+ 1 - 0
pages/warehouse/reportLoss/index.vue

@@ -97,6 +97,7 @@
 				})
 			},
 			getUser(deptCode) {
+				// 显示加载中的提示
 				uni.showLoading({
 					title: '加载中'
 				})

+ 133 - 128
pages/warehouse/reportLoss/workorderSelected.vue

@@ -1,137 +1,142 @@
 <template>
-  <view class="workorder-selected">
-    <uni-nav-bar
-      fixed="true"
-      statusBar="true"
-      left-icon="back"
-      title="选择盘点工单"
-      @clickLeft="back"
-    >
-    </uni-nav-bar>
-    <view class="search-box">
-      <u-input
-        type="text"
-        placeholder="搜索工单号或名称"
-        clearable
-        prefixIcon="search"
-        prefixIconStyle="font-size: 22px;color: #909399"
-      ></u-input>
-    </view>
-    <view class="list-wrapper">
-      <view
-        class="card"
-        v-for="(item, index) in tableList"
-        :key="index"
-        @click="selected = item"
-        :class="{ selected: selected.id === item.id }"
-      >
-        <view class="title">{{ item.workOrderCode }}</view>
-        <view><text class="label">盘点名称</text>{{ item.planName }}</view>
-        <view
-          ><text class="label">资产类型</text
-          >{{ getDictName(warehousingType, item.assetDict) }}</view
-        >
-        <view><text class="label">盘点仓库</text>{{ item.bizTypeName }}</view>
-        <view><text class="label">审核时间</text></view>
-        <view class="card-footer">
-          <text>盘盈&nbsp;{{ item.inventoryProfitNum || 0 }}</text>
-          <text>盘亏&nbsp;{{ item.inventoryLossesNum || 0 }}</text>
-          <text>破损&nbsp;{{ item.damagedNum || 0 }}</text>
-        </view>
-      </view>
-    </view>
-    <u-button class="footer" type="success" @click="confirm">确定选中</u-button>
-  </view>
+	<view class="workorder-selected">
+		<uni-nav-bar fixed="true" statusBar="true" left-icon="back" title="选择盘点工单" @clickLeft="back"></uni-nav-bar>
+		<view class="search-box">
+			<u-input type="text" placeholder="搜索工单号或名称" clearable prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399" v-model="keyWord"></u-input>
+		</view>
+		<view class="list-wrapper">
+			<view class="card" v-for="(item, index) in tableList" :key="index" @click="selected = item" :class="{ selected: selected.id === item.id }">
+				<view class="title">{{ item.code }}</view>
+				<view>
+					<text class="label">计划名称</text>
+					{{ item.planName }}
+				</view>
+				<view>
+					<text class="label">产品分类</text>
+					{{ item.categoryLevelId }}
+				</view>
+				<view>
+					<text class="label">盘点仓库</text>
+					{{ item.warehouseName }}
+				</view>
+				<view>
+					<text class="label">盘点部门</text>
+					{{ item.executeGroupName }}
+				</view>
+				<view>
+					<text class="label">盘点人员</text>
+					{{ item.executorName }}
+				</view>
+				<view>
+					<text class="label">审核时间</text>
+					{{ item.createTime }}
+				</view>
+				<view class="card-footer">
+					<text>盘盈&nbsp;{{ item.surplusQuantity || 0 }}</text>
+					<text>盘亏&nbsp;{{ item.wornQuantity || 0 }}</text>
+					<text>破损&nbsp;{{ item.loseQuantity || 0 }}</text>
+				</view>
+			</view>
+		</view>
+		<u-button class="footer" type="success" @click="confirm">确定选中</u-button>
+	</view>
 </template>
 
 <script>
-import { postJ } from '@/utils/api.js'
-import { getDictName, warehousingType } from '../enum'
-export default {
-  data () {
-    return {
-      tableList: [],
-      selected: {},
-      getDictName,
-      warehousingType
-    }
-  },
-  onLoad () {
-    this._getCheckAbnormalList()
-  },
-  methods: {
-    async _getCheckAbnormalList () {
-      const res = await postJ(this.apiUrl + '/workOrder/getCheckAbnormalList', {
-        size: 999999
-      })
-
-      if (res?.success) {
-        this.tableList = res.data.records
-      }
-    },
-    confirm () {
-      if (!this.selected?.id) {
-        uni.showToast({
-          icon: 'none',
-          title: '请选择工单!'
-        })
-        return
-      }
-      uni.$emit('getWorkorder', this.selected)
-      uni.navigateBack({
-        delta: 1
-      })
-    }
-  }
-}
+	import { getPlanOrderList } from '@/api/warehouseManagement'
+	export default {
+		data() {
+			return {
+				keyWord: '',
+				tableList: [],
+				selected: {}
+			}
+		},
+		onLoad() {
+			this._getCheckAbnormalList()
+		},
+		methods: {
+			async _getCheckAbnormalList() {
+				uni.showLoading({
+					title: '加载中'
+				})
+				getPlanOrderList({
+					pageNum: 1,
+					pageSize: 999999,
+					keyWord: this.keyWord,
+					type: 1
+				})
+					.then(res => {
+						this.tableList = res.list
+						console.log(this.tableList)
+					})
+					.finally(() => {
+						uni.hideLoading()
+					})
+			},
+			confirm() {
+				if (!this.selected?.id) {
+					uni.showToast({
+						icon: 'none',
+						title: '请选择工单!'
+					})
+					return
+				}
+				uni.$emit('getWorkorder', this.selected)
+				uni.navigateBack({
+					delta: 1
+				})
+			}
+		}
+	}
 </script>
 
 <style lang="scss" scoped>
-.search-box {
-  position: fixed;
-  left: 0;
-  right: 0;
-  padding: 10rpx;
-  background-color: #fff;
-  .u-input {
-    border: 1rpx solid #dadbde;
-  }
-}
-.list-wrapper {
-  padding: 100rpx 0 80rpx;
-  font-size: 28rpx;
-  color: #555;
-  .card {
-    padding: 0 10rpx;
-    border-bottom: 8rpx solid #f2f2f2;
-    &.selected {
-      background-color: rgba(202, 249, 130, 0.380392156862745);
-    }
-    .title {
-      color: #333333;
-      font-weight: bold;
-      border-bottom: 1rpx solid #f2f2f2;
-      font-size: 30rpx;
-      padding: 8rpx 0;
-    }
-    .card-footer {
-      border-top: 1rpx solid #f2f2f2;
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      padding: 0 15rpx;
-    }
+	.search-box {
+		position: fixed;
+		left: 0;
+		right: 0;
+		padding: 10rpx;
+		background-color: #fff;
+		.u-input {
+			border: 1rpx solid #dadbde;
+		}
+	}
+	.list-wrapper {
+		padding: 100rpx 0 80rpx;
+		font-size: 28rpx;
+		color: #555;
+		.card {
+			padding: 0 10rpx;
+			border-bottom: 8rpx solid #f2f2f2;
+			&.selected {
+				background-color: rgba(202, 249, 130, 0.380392156862745);
+			}
+			.title {
+				color: #333333;
+				font-weight: bold;
+				border-bottom: 1rpx solid #f2f2f2;
+				font-size: 30rpx;
+				padding: 8rpx 0;
+			}
+			.card-footer {
+				border-top: 1rpx solid #f2f2f2;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 0 15rpx;
+			}
 
-    .label {
-      color: #aaaaaa;
-      margin-right: 20rpx;
-    }
-  }
-}
-.footer {
-  position: fixed;
-  bottom: 0;
-  left: 0;
-  right: 0;
-}
+			.label {
+				color: #aaaaaa;
+				margin-right: 20rpx;
+			}
+		}
+	}
+	.footer {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		right: 0;
+	}
 </style>

+ 4 - 2
pages/warehouse/workOrder/components/KdCard/index.vue

@@ -40,7 +40,7 @@
 					<text class="content">{{ item.endTime }}</text>
 				</view>
 			</view>
-			<view v-if="item.status == 0" class="card-footer" @click="goInventory">
+			<view v-if="item.status == 0" class="card-footer borer-bottom" @click="goInventory">
 				报工
 				<u-icon name="arrow-right"></u-icon>
 			</view>
@@ -182,7 +182,9 @@
 			justify-content: space-between;
 			padding: 12rpx 16rpx;
 		}
-
+		.borer-bottom {
+			border-bottom: 1px solid #f2f2f2;
+		}
 		.card-body {
 			padding: 0 28rpx;
 			border-top: 1rpx solid #f2f2f2;

+ 1 - 1
pages/warehouse/workOrder/inventory/inventory.vue

@@ -111,7 +111,7 @@
 		</view>
 		<view class="fixed-bottom" v-if="status == 0">
 			<view class="smpd" @click="handlStart">盘点报工</view>
-			<view class="ycdj">扫码盘点</view>
+			<!-- <view class="ycdj">扫码盘点</view> -->
 		</view>
 		<!-- <view class="fixed-bottom" v-if="isExecute && (infoData.status === 1 || infoData.status == 6)">
 			<view class="ycdj" @click="handlYc">溢出登记</view>