695593266@qq.com 7 mesi fa
parent
commit
a69ab837c7

+ 14 - 0
api/pda/byProductRecovery.js

@@ -0,0 +1,14 @@
+import { postJ, post, get } from "@/utils/request";
+import Vue from "vue";
+
+export async function getPage(params) {
+  const data = await get(
+    Vue.prototype.apiUrl + `/mes/disposeorder/page`,
+    params,
+    true
+  );
+  if (data.code == 0) {
+    return data.data;
+  }
+  return Promise.reject(data.message);
+}

+ 14 - 1
api/pda/feeding.js

@@ -42,7 +42,7 @@ export async function getInventoryDetails(params) {
 
 //拆批
 export async function splitBatch(params) {
-  const data = await await postJ(
+  const data = await postJ(
     Vue.prototype.apiUrl + `pda/mes/feed/splitBatch`,
     params,
     true
@@ -52,3 +52,16 @@ export async function splitBatch(params) {
   }
   return Promise.reject(data.message);
 }
+
+//检查是否重复投料
+export async function checkRepeatFeed(params) {
+  const data = await postJ(
+    Vue.prototype.apiUrl + `/mes/workorder/feedCheck`,
+    params,
+    true
+  );
+  if (data.code == 0) {
+    return data.data;
+  }
+  return Promise.reject(new Error(data.message));
+}

+ 12 - 0
api/pda/jobBooking.js

@@ -86,3 +86,15 @@ export async function createInProductBatch(params) {
   }
   return Promise.reject(data.message);
 }
+
+//查询已报工的数量
+export async function checkReportNumber(params) {
+  const data = await postJ(
+    Vue.prototype.apiUrl + `/pda/mes/workreport/reportCheck`,
+    params
+  );
+  if (data.code == 0) {
+    return data.data;
+  }
+  return Promise.reject(data.message);
+}

+ 17 - 0
api/pda/material.js

@@ -0,0 +1,17 @@
+import { postJ, post, get } from "@/utils/request";
+import Vue from "vue";
+
+/**
+ * 退料列表
+ */
+export async function returnPage(params) {
+  let par = new URLSearchParams(params);
+  const data = await get(
+    Vue.prototype.apiUrl + `/mes/returnmaterials/page?` + par,
+    {}
+  );
+  if (data.code == 0) {
+    return data.data;
+  }
+  return Promise.reject(data.message);
+}

+ 14 - 0
api/pda/nonconforming.js

@@ -0,0 +1,14 @@
+import { postJ, post, get } from "@/utils/request";
+import Vue from "vue";
+
+export async function getList(params) {
+  let par = new URLSearchParams(params);
+  const data = await get(
+    Vue.prototype.apiUrl + `/qms/unqualifiedproducts/page?` + par,
+    {}
+  );
+  if (data.code == 0) {
+    return data.data;
+  }
+  return Promise.reject(data.message);
+}

+ 23 - 13
pages/pda/by_product_recovery/index/index.vue

@@ -1,9 +1,15 @@
 <template>
 	<view class="content-box">
 
-		<uni-nav-bar fixed="true" statusBar="true" left-icon="back" title="搜索" @clickLeft="back">
-
-		</uni-nav-bar>
+    <uni-nav-bar
+      fixed="true"
+      statusBar="true"
+      left-icon="back"
+      title="副产品回收"
+      background-color="#157A2C"
+      color="#fff"
+      @clickLeft="back"
+    ></uni-nav-bar>
 
 
 		<view class="top-wrapper">
@@ -203,6 +209,8 @@
 		disposeorder
 	} from '@/api/pda/workOrder.js'
 
+	import { getPage  } from '@/api/pda/byProductRecovery.js'
+
 	import {
 		producetaskList
 	} from '@/api/common.js'
@@ -263,12 +271,11 @@
 		},
 
 		onLoad(option) {
-
-
-
 			this.getProducetask()
 
 			this.getWarehouseFn()
+
+				this.getList()
 		},
 
 		onUnload() {
@@ -321,18 +328,21 @@
 				this.getList()
 			},
 
-			getList() {
+			async getList() {
 				let param = {
 					pageNum: this.page,
 					size: 10,
 					taskId: this.formData.taskId,
-
 				}
 
-				listWorkOrderByTaskId(param).then(res => {
+				await getPage(param).then(res => {
 					this.list = res.list
 				})
 
+				// listWorkOrderByTaskId(param).then(res => {
+				// 	this.list = res.list
+				// })
+
 
 			},
 
@@ -402,14 +412,14 @@
 			},
 
 
-			getProducetask() {
-				producetaskList().then(res => {
+			async getProducetask() {
+			 await	producetaskList().then(res => {
 					this.taskList = res
 				})
 			},
 
-			getWarehouseFn() {
-				getWarehouseList().then(res => {
+		async	getWarehouseFn() {
+			await	getWarehouseList().then(res => {
 					this.warehouseList = res
 				})
 			},

+ 49 - 1
pages/pda/feeding/details.vue

@@ -168,6 +168,20 @@
       <view class="btn_box" @click="save(1)">缓存</view>
       <view class="btn_box" @click="save(2)">一键投料</view>
     </view>
+
+    <view>
+      <uni-popup ref="alertDialog" type="dialog">
+        <uni-popup-dialog
+          type="warning"
+          cancelText="取消"
+          confirmText="确定"
+          title="提示"
+          :content="titleText"
+          @confirm="dialogConfirm"
+          @close="dialogClose"
+        ></uni-popup-dialog>
+      </uni-popup>
+    </view>
   </view>
 </template>
 
@@ -197,7 +211,7 @@ import {
   removeCache,
 } from "@/api/pda/workOrder.js";
 
-import { batchSave } from "@/api/pda/feeding.js";
+import { batchSave, checkRepeatFeed } from "@/api/pda/feeding.js";
 
 export default {
   components: {
@@ -227,6 +241,7 @@ export default {
       cloneListNum: "",
       feedNeedEquipment: null, ////投料是否要添加生产设备1是0否
       taskType: "",
+      titleText: "",
     };
   },
   onLoad(options) {
@@ -445,6 +460,39 @@ export default {
         }
       }
 
+      let newList = [];
+      for (let item of this.List) {
+        newList.push({
+          currentTaskDiagram: item.currentTaskDiagram,
+          workOrderId: item.workOrderId,
+        });
+      }
+
+      await checkRepeatFeed(newList).then((res) => {
+        if (res.length != 0) {
+          this.checkFeed(res);
+        }
+      });
+    },
+
+    checkFeed(list) {
+      for (let item of list) {
+        if (item.feedFormed != "0") {
+          this.titleText = `工单号${item.workOrderCode}已有投料,是否继续重复投料?`;
+          this.$refs.alertDialog.open();
+        } else {
+          this.feedReport();
+        }
+      }
+    },
+
+    dialogClose() {},
+
+    dialogConfirm() {
+      this.feedReport();
+    },
+
+    feedReport() {
       batchSave(this.List).then((res) => {
         // 江南环境
         if (this.clientEnvironmentId == 9) {

+ 9 - 0
pages/pda/jobBooking/components/batchProductJobBom.vue

@@ -113,6 +113,15 @@
           </view>
         </view>
 
+        <view class="item rx-sc">
+          <view class="rx">
+            <view class="lable lable150 rx-cc">规格</view>
+            <view class="content rx-sc">
+              <view>{{ it.specification }}</view>
+            </view>
+          </view>
+        </view>
+
         <view class="item rx-sc">
           <view class="rx ww50">
             <view class="lable lable150 rx-cc">批次号</view>

+ 17 - 3
pages/pda/jobBooking/components/newPackingBomDetails.vue

@@ -10,8 +10,13 @@
         >
 
         <text
-          style="color: green; font-size: 12px; margin-left: 15px"
-          v-if="objData.packInfo.isNewUnpack == '1'"
+          v-else-if="objData.packInfo.isNewUnpack == 1"
+          style="
+            color: green;
+            font-size: 14px;
+            font-weight: 700;
+            margin-left: 15px;
+          "
           >手动拆包</text
         >
 
@@ -473,7 +478,6 @@ export default {
 
   created() {
     // this.formedNumLast = this.objData.product[0].feedQuantity;
-    console.log(this.objData, "我是阿打啥啊电话");
     // this.byCode();
     // this.packageDispositionFn();
     if (this.objData.packInfo) {
@@ -520,6 +524,16 @@ export default {
       //   },
       //   0
       // );
+    } else {
+      if (this.objData.packInfo.isUnpack == "1") {
+        this.DispositionList.push({
+          titel: "最小包装",
+          splitList: this.objData.product,
+          // packageCell: this.objData.packInfo.minimumPackageCell,
+          // packageUnit: this.objData.packInfo.minimumPackageUnit,
+          // conversionUnit: this.objData.packInfo.minimumConversionUnit
+        });
+      }
     }
 
     if (this.objData.product && this.objData.product.length != 0) {

+ 112 - 36
pages/pda/jobBooking/components/packingBom.vue

@@ -4,7 +4,17 @@
       <view class="col userInp" style="display: flex; align-items: center">
         <text class="label lable150 rx-cc">是否拆包</text>
         <text
-          v-if="objData.isUnpack == '1' || isNewUnpack == 1"
+          v-if="objData.isUnpack == '1' && objData.singleReport == '1'"
+          style="
+            color: green;
+            font-size: 14px;
+            font-weight: 700;
+            margin-left: 15px;
+          "
+          >是</text
+        >
+        <text
+          v-else-if="isNewUnpack == '1' && objData.singleReport == '0'"
           style="
             color: green;
             font-size: 14px;
@@ -30,13 +40,19 @@
           type="primary"
           style="margin-left: 40px; width: 80px"
           @click="checkUnpack"
-          v-if="objData.isUnpack != '1'"
+          v-if="objData.singleReport == '0'"
           >手动拆包</u-button
         >
       </view>
     </view>
 
-    <view v-if="objData.isUnpack == '1' && (isNewUnpack == 0 || !isNewUnpack)">
+    <view
+      v-if="
+        objData.isUnpack == '1' &&
+        (isNewUnpack == 0 || !isNewUnpack) &&
+        objData.singleReport == '1'
+      "
+    >
       <view class="col userInp" style="display: flex; align-items: center">
         <text class="label lable150 rx-cc">规格选择:</text>
         <!-- multiple -->
@@ -446,18 +462,22 @@ export default {
         {
           text: "按计量",
           value: 1,
+          textValue: "按计量",
         },
         {
           text: "最小包装",
           value: 2,
+          textValue: "",
         },
         {
           text: "内包装",
           value: 3,
+          textValue: "",
         },
         {
           text: "外包装",
           value: 4,
+          textValue: "",
         },
       ],
       isNewUnpack: 0,
@@ -525,7 +545,7 @@ export default {
           this.formedNumLast = 0;
         }
 
-        if (newVal.isUnpack == "1") {
+        if (newVal.isUnpack == "1" && this.objData.singleReport == "1") {
           this.packageDispositionFn();
         }
 
@@ -620,11 +640,37 @@ export default {
         }
         this.selectList = res;
 
+        this.warehouseSpecTypeList.forEach((item) => {
+          if (item.value == 2) {
+            item.textValue = item.text + `(${this.selectPackInfo(res[0])})`;
+          }
+
+          if (item.value == 3) {
+            item.textValue = item.text + `(${this.selectPackInfo(res[1])})`;
+          }
+
+          if (item.value == 4) {
+            item.textValue = item.text + `(${this.selectPackInfo(res[2])})`;
+          }
+        });
+
         this.initFn(this.localdataList[0].arr);
         // this.listFn(this.localdataList[0].arr);
       }
     },
 
+    selectPackInfo(data) {
+      const num = data.packageCell ? data.packageCell : "";
+      const packageUnit = data.packageUnit ? data.packageUnit : "";
+      const conversionUnit = data.conversionUnit ? data.conversionUnit : "";
+      let packInfo = "";
+      if (num) {
+        packInfo = num + "/" + packageUnit + "/" + conversionUnit;
+      }
+
+      return packInfo;
+    },
+
     initFn(v) {
       if (v.length) {
         this.withinQuantity = v[1].packageCell; //内包装数量
@@ -959,40 +1005,70 @@ export default {
         }
       } else {
         if (this.warehouseId == 2) {
-          packInfo = {
-            // this.DispositionList[0]
-
-            specText: this.text,
-            specValue: this.value,
-            minimumPackage: this.minimumPackage, // 最小包装
-            tier: this.warehouseId,
-            minimumPackageCell: this.DispositionList[0].packageCell, // 最小包装
-            minimumPackageUnit: this.DispositionList[0].packageUnit, // 最小包装单位
-            minimumConversionUnit: this.DispositionList[0].conversionUnit, // 最小包装单位
-            minimumFormedNumLast: this.DispositionList[0].formedNumLast, // 总包装数量
-          };
+          if (this.DispositionList && this.DispositionList.length != 0) {
+            packInfo = {
+              // this.DispositionList[0]
+
+              specText: this.text,
+              specValue: this.value,
+              minimumPackage: this.minimumPackage, // 最小包装
+              tier: this.warehouseId,
+              isUnpack: this.objData.isUnpack,
+              packUnitInfo: this.warehouseSpecTypeList[1].textValue,
+              minimumPackageCell: this.DispositionList[0].packageCell, // 最小包装
+              minimumPackageUnit: this.DispositionList[0].packageUnit, // 最小包装单位
+              minimumConversionUnit: this.DispositionList[0].conversionUnit, // 最小包装单位
+              minimumFormedNumLast: this.DispositionList[0].formedNumLast, // 总包装数量
+              isNewUnpack: this.isNewUnpack,
+            };
+          } else {
+            packInfo = {
+              tier: 1,
+              isUnpack: this.objData.isUnpack,
+            };
+          }
         } else if (this.warehouseId == 3) {
-          packInfo = {
-            specText: this.text,
-            specValue: this.value,
-            withinPackage: this.withinPackage, // 内包装
-            tier: this.warehouseId,
-            withinPackageCell: this.DispositionList[1].packageCell, // 最小包装名称
-            withinPackageUnit: this.DispositionList[1].packageUnit, // 最小包装单位
-            withinConversionUnit: this.DispositionList[1].conversionUnit, // 最小包装单位
-            withinFormedNumLast: this.DispositionList[1].formedNumLast,
-          }; // 总包装数量
+          if (this.DispositionList && this.DispositionList.length != 0) {
+            packInfo = {
+              specText: this.text,
+              specValue: this.value,
+              withinPackage: this.withinPackage, // 内包装
+              tier: this.warehouseId,
+              isUnpack: this.objData.isUnpack,
+              packUnitInfo: this.warehouseSpecTypeList[2].textValue,
+              withinPackageCell: this.DispositionList[1].packageCell, // 最小包装名称
+              withinPackageUnit: this.DispositionList[1].packageUnit, // 最小包装单位
+              withinConversionUnit: this.DispositionList[1].conversionUnit, // 最小包装单位
+              withinFormedNumLast: this.DispositionList[1].formedNumLast,
+              isNewUnpack: this.isNewUnpack,
+            }; // 总包装数量
+          } else {
+            packInfo = {
+              tier: 3,
+              isUnpack: this.objData.isUnpack,
+            };
+          }
         } else if (this.warehouseId == 4) {
-          packInfo = {
-            specText: this.text,
-            specValue: this.value,
-            outsidePackage: this.outsidePackage, //外包装
-            tier: this.warehouseId,
-            outsidePackageCell: this.DispositionList[2].packageCell, // 最小包装名称
-            outsidePackageUnit: this.DispositionList[2].packageUnit, // 最小包装单位
-            outsideConversionUnit: this.DispositionList[2].conversionUnit, // 最小包装单位
-            outsideFormedNumLast: this.DispositionList[2].formedNumLast,
-          }; // 总包装数量
+          if (this.DispositionList && this.DispositionList.length != 0) {
+            packInfo = {
+              specText: this.text,
+              specValue: this.value,
+              outsidePackage: this.outsidePackage, //外包装
+              tier: this.warehouseId,
+              isUnpack: this.objData.isUnpack,
+              packUnitInfo: this.warehouseSpecTypeList[3].textValue,
+              outsidePackageCell: this.DispositionList[2].packageCell, // 最小包装名称
+              outsidePackageUnit: this.DispositionList[2].packageUnit, // 最小包装单位
+              outsideConversionUnit: this.DispositionList[2].conversionUnit, // 最小包装单位
+              outsideFormedNumLast: this.DispositionList[2].formedNumLast,
+              isNewUnpack: this.isNewUnpack,
+            }; // 总包装数量
+          } else {
+            packInfo = {
+              tier: 4,
+              isUnpack: this.objData.isUnpack,
+            };
+          }
         }
       }
 

+ 9 - 0
pages/pda/jobBooking/components/singleProductJobBom.vue

@@ -102,6 +102,15 @@
           </view>
         </view>
 
+        <view class="item rx-sc">
+          <view class="rx">
+            <view class="lable lable150 rx-cc">规格</view>
+            <view class="content rx-sc">
+              <view>{{ it.specification }}</view>
+            </view>
+          </view>
+        </view>
+
         <view class="item rx-sc">
           <view class="rx ww50">
             <view class="lable lable150 rx-cc">批次号</view>

+ 53 - 4
pages/pda/jobBooking/index/index.vue

@@ -126,7 +126,7 @@
 					</oneJobBom> -->
           <!--  -->
           <!-- 报工信息 列表 -->
-          <view v-if="clientEnvironmentId != 3 && objData.singleReport == 1">
+          <!-- <view v-if="clientEnvironmentId != 3 && objData.singleReport == 1">
             <semiProductJobBom
               v-if="
                 objData.semiProductList &&
@@ -141,7 +141,7 @@
               @weightEmit="weightEmit"
             >
             </semiProductJobBom>
-          </view>
+          </view> -->
 
           <!-- 	<view v-if="this.objData.singleReport">
 						
@@ -412,6 +412,20 @@
         </view>
       </template>
     </SearchPopup>
+
+    <view>
+      <uni-popup ref="alertDialog" type="dialog">
+        <uni-popup-dialog
+          type="warning"
+          cancelText="取消"
+          confirmText="确定"
+          title="提示"
+          :content="titleText"
+          @confirm="dialogConfirm"
+          @close="dialogClose"
+        ></uni-popup-dialog>
+      </uni-popup>
+    </view>
   </view>
 </template>
 
@@ -421,6 +435,7 @@ import {
   outSourceGetByIdReport,
   getByCodeReport,
   jobSave,
+  checkReportNumber,
 } from "@/api/pda/jobBooking.js";
 
 import {
@@ -518,6 +533,7 @@ export default {
 
       operateBtn: true,
       isOutsource: 0,
+      titleText: "",
     };
   },
   onLoad(options) {
@@ -1191,9 +1207,9 @@ export default {
           }
         });
       }
-      console.log(this.objData, "this.objData");
+      // console.log(this.objData, "this.objData");
 
-      console.log(this.objData.equipmentList);
+      // console.log(this.objData.equipmentList);
 
       if (
         this.objData.product.length != 0 &&
@@ -1210,6 +1226,39 @@ export default {
         });
       }
 
+      // console.log(this.objData, "savesavesaveobjDataobjDataobjData");
+
+      let newList = [];
+      newList.push({
+        currentTaskDiagram: this.objData.currentTaskDiagram,
+        workOrderId: this.objData.workOrderId,
+      });
+
+      await checkReportNumber(newList).then((res) => {
+        if (res.length != 0) {
+          this.checkJobBook(res);
+        }
+      });
+    },
+
+    checkJobBook(list) {
+      for (let item of list) {
+        if (item.reportFormed != "0") {
+          this.titleText = `工单号${item.workOrderCode}已有报工,是否继续重复报工?`;
+          this.$refs.alertDialog.open();
+        } else {
+          this.jobBookReport();
+        }
+      }
+    },
+
+    dialogClose() {},
+
+    dialogConfirm() {
+      this.jobBookReport();
+    },
+
+    jobBookReport() {
       jobSave(this.objData)
         .then((res) => {
           uni.hideLoading();

+ 158 - 0
pages/pda/material_return/components/materialReturnCard.vue

@@ -0,0 +1,158 @@
+<template>
+  <view class="card_box" @click="handleDetail">
+    <view class="item_box rx-bc">
+      <view class="item_one perce100 rx-sc">
+        <view class="lable">退料单编号:</view>
+        <view>{{ item.code }}</view>
+      </view>
+    </view>
+
+    <view class="item_box rx-bc">
+      <view class="item_one perce100 rx-sc">
+        <view class="lable">退料单名称:</view>
+        <view>{{ item.name }}</view>
+      </view>
+    </view>
+
+    <view class="item_box rx-bc">
+      <view class="item_one perce50 rx-sc">
+        <view class="lable">退料人:</view>
+        <view>{{ item.executorName }}</view>
+      </view>
+
+      <view class="item_one perce50 rx-sc">
+        <view class="lable">退料场景:</view>
+        <view> {{ sceneListFn(item.scene) }}</view>
+      </view>
+    </view>
+
+    <view class="item_box rx-bc">
+      <view class="item_one perce100 rx-sc">
+        <view class="lable">退料时间:</view>
+        <view> {{ item.executorTime }}</view>
+      </view>
+    </view>
+
+    <view class="item_box rx-bc">
+      <view class="item_one perce100 rx-sc">
+        <view class="lable">退料描述:</view>
+        <view> {{ item.remark }}</view>
+      </view>
+    </view>
+
+    <view class="item_box rx-bc">
+      <view class="item_one perce100 rx-sc">
+        <view class="lable">审核人:</view>
+        <view v-if="item.storageInfo">
+          {{ item.storageInfo.approvalUserName }}</view
+        >
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { getByCode } from "@/api/pda/common.js";
+export default {
+  props: {
+    item: {
+      type: Object,
+      default: () => ({}),
+    },
+  },
+
+  data() {
+    return {
+      sceneList: [],
+    };
+  },
+
+  created() {
+    this.getByCodeFn();
+  },
+
+  methods: {
+    async getByCodeFn() {
+      getByCode("returnScenario").then((res) => {
+        let _arr = [];
+        res.map((item) => {
+          const key = Object.keys(item)[0];
+          const value = item[key];
+          _arr.push({ label: value, value: key });
+        });
+
+        this.sceneList = _arr;
+      });
+    },
+
+    sceneListFn(val) {
+      let _arr = this.sceneList;
+      for (const item of _arr) {
+        if (item.value == val) {
+          return item.label;
+        }
+      }
+    },
+
+    handleDetail() {},
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.card_box {
+  width: 750rpx;
+  padding: 16rpx 32rpx;
+  box-sizing: border-box;
+  border-bottom: 2rpx solid #e1e1e1;
+
+  .item_box {
+    margin-top: 10rpx;
+
+    .round {
+      width: 40rpx;
+      height: 40rpx;
+      line-height: 40rpx;
+      border-radius: 50%;
+      background: $theme-color;
+      color: #fff;
+      text-align: center;
+      font-size: 20rpx;
+    }
+
+    .orderId {
+      color: #000;
+      font-family: PingFang HK;
+      font-size: 28rpx;
+      font-style: normal;
+      font-weight: 600;
+      margin-left: 16rpx;
+    }
+
+    .item_one {
+      width: 100%;
+      font-size: 26rpx;
+      font-style: normal;
+      font-weight: 400;
+      line-height: 38rpx;
+      word-wrap: break-word;
+    }
+
+    .item-right {
+      flex: 1;
+    }
+
+    .gylx {
+      color: $theme-color;
+    }
+
+    .perce50 {
+      width: 50%;
+    }
+
+    .perce100 {
+      width: 100%;
+    }
+  }
+}
+</style>

+ 295 - 14
pages/pda/material_return/index/index.vue

@@ -1,22 +1,303 @@
 <template>
-	<view>
-		
-	</view>
+  <view class="content-box">
+    <uni-nav-bar
+      fixed="true"
+      statusBar="true"
+      left-icon="back"
+      title="退料单"
+      background-color="#157A2C"
+      color="#fff"
+      @clickLeft="back"
+    ></uni-nav-bar>
+
+    <view class="top-wrapper">
+      <uni-section>
+        <uni-easyinput
+          prefixIcon="search"
+          style="width: 430rpx"
+          v-model="searchFrom.keyWord"
+          placeholder="请输入"
+        >
+        </uni-easyinput>
+      </uni-section>
+
+      <button class="search_btn" @click="doSearch">搜索</button>
+
+      <!-- <button class="search_btn" @click="addMaterial">新增</button> -->
+    </view>
+
+    <view class="list_box">
+      <u-list
+        @scrolltolower="scrolltolower"
+        key="list"
+        :preLoadScreen="page * 10"
+      >
+        <u-list-item v-for="(item, index) in dataList" :key="index">
+          <view class="card_box" @click="handleDetail">
+            <view class="item_box rx-bc">
+              <view class="item_one perce100 rx-sc">
+                <view class="lable">退料单编号:</view>
+                <view>{{ item.code }}</view>
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce100 rx-sc">
+                <view class="lable">退料单名称:</view>
+                <view>{{ item.name }}</view>
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce50 rx-sc">
+                <view class="lable">退料人:</view>
+                <view>{{ item.executorName }}</view>
+              </view>
+
+              <view class="item_one perce50 rx-sc">
+                <view class="lable">退料场景:</view>
+                <view> {{ sceneListFn(item.scene) }}</view>
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce100 rx-sc">
+                <view class="lable">退料时间:</view>
+                <view> {{ item.executorTime }}</view>
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce100 rx-sc">
+                <view class="lable">退料描述:</view>
+                <view> {{ item.remark }}</view>
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce100 rx-sc">
+                <view class="lable">审核人:</view>
+                <view v-if="item.storageInfo">
+                  {{ item.storageInfo.approvalUserName }}</view
+                >
+              </view>
+            </view>
+          </view>
+        </u-list-item>
+
+        <u-list-item v-if="dataList.length === 0">
+          <view style="margin-top: 20vh">
+            <u-empty iconSize="150" textSize="32" text="暂无退料单"> </u-empty>
+          </view>
+        </u-list-item>
+      </u-list>
+    </view>
+  </view>
 </template>
 
 <script>
-	export default {
-		data() {
-			return {
-				
-			}
-		},
-		methods: {
-			
-		}
-	}
+import { returnPage } from "@/api/pda/material.js";
+import { getByCode } from "@/api/pda/common.js";
+
+let [isEnd] = [false];
+export default {
+  components: {},
+
+  data() {
+    return {
+      searchFrom: {
+        keyWord: "",
+      },
+      page: 1,
+      size: 10,
+      dataList: [],
+      sceneList: [],
+    };
+  },
+
+  onLoad(option) {
+    this.produceFn();
+  },
+
+  onShow() {
+    this.getByCodeFn();
+    this.getList();
+  },
+
+  created() {
+    // this.getByCodeFn();
+  },
+
+  methods: {
+    async getList() {
+      let params = {
+        pageNum: this.page,
+        size: this.size,
+        ...this.searchFrom,
+      };
+
+      isEnd = false;
+      const res = await returnPage(params);
+
+      if (params.pageNum === 1) {
+        this.dataList = [];
+      }
+
+      this.dataList.push(...res.list);
+      isEnd = this.dataList.length >= res.count;
+    },
+
+    async getByCodeFn() {
+      getByCode("returnScenario").then((res) => {
+        let _arr = [];
+        res.map((item) => {
+          const key = Object.keys(item)[0];
+          const value = item[key];
+          _arr.push({ label: value, value: key });
+        });
+
+        this.sceneList = _arr;
+      });
+    },
+
+    produceFn() {
+      // this.getList();
+    },
+
+    scrolltolower() {
+      if (isEnd) return;
+      this.page++;
+      this.getList();
+    },
+
+    doSearch() {
+      this.getList();
+    },
+
+    sceneListFn(val) {
+      let _arr = this.sceneList;
+      for (const item of _arr) {
+        if (item.value == val) {
+          return item.label;
+        }
+      }
+    },
+
+    handleDetail() {},
+
+    addMaterial() {},
+  },
+};
 </script>
 
-<style>
+<style lang="scss" scoped>
+.content-box {
+  height: 100vh;
+  overflow: hidden;
+  display: flex;
+  flex-direction: column;
+  background-color: $page-bg;
+}
+
+.top-wrapper {
+  background-color: #fff;
+  display: flex;
+  width: 750rpx;
+  height: 88rpx;
+  padding: 16rpx 32rpx;
+  align-items: center;
+  gap: 16rpx;
+
+  /deep/.uni-section {
+    margin-top: 0px;
+  }
+
+  /deep/.uni-section-header {
+    padding: 0px;
+  }
+
+  .search_btn {
+    width: 110rpx;
+    height: 60rpx;
+    line-height: 60rpx;
+    padding: 0 10rpx;
+    background: $theme-color;
+    font-size: 24rpx;
+    color: #fff;
+    margin: 0;
+    margin-left: 16rpx;
+  }
+
+  .menu_icon {
+    width: 44rpx;
+    height: 44rpx;
+    margin-left: 14rpx;
+  }
+}
+
+.list_box {
+  flex: 1;
+  overflow: hidden;
+  padding: 16rpx 0;
+
+  .u-list {
+    height: 100% !important;
+  }
+
+  .card_box {
+    width: 750rpx;
+    padding: 16rpx 32rpx;
+    box-sizing: border-box;
+    border-bottom: 2rpx solid #e1e1e1;
+
+    .item_box {
+      margin-top: 10rpx;
+
+      .round {
+        width: 40rpx;
+        height: 40rpx;
+        line-height: 40rpx;
+        border-radius: 50%;
+        background: $theme-color;
+        color: #fff;
+        text-align: center;
+        font-size: 20rpx;
+      }
+
+      .orderId {
+        color: #000;
+        font-family: PingFang HK;
+        font-size: 28rpx;
+        font-style: normal;
+        font-weight: 600;
+        margin-left: 16rpx;
+      }
+
+      .item_one {
+        width: 100%;
+        font-size: 26rpx;
+        font-style: normal;
+        font-weight: 400;
+        line-height: 38rpx;
+        word-wrap: break-word;
+      }
+
+      .item-right {
+        flex: 1;
+      }
+
+      .gylx {
+        color: $theme-color;
+      }
+
+      .perce50 {
+        width: 50%;
+      }
 
+      .perce100 {
+        width: 100%;
+      }
+    }
+  }
+}
 </style>

+ 138 - 0
pages/pda/nonconforming/components/itemCard.vue

@@ -0,0 +1,138 @@
+<template>
+  <view class="card_box" @click="handleDetail">
+    <view class="item_box rx-bc">
+      <view class="item_one perce100 rx-sc">
+        <view class="lable">编码:</view>
+        <view>{{ item.unqualifiedProductsCode }}</view>
+      </view>
+    </view>
+
+    <view class="item_box rx-bc">
+      <view class="item_one perce100 rx-sc">
+        <view class="lable">来源编码:</view>
+        <view>{{ item.sourceCode }}</view>
+      </view>
+    </view>
+
+    <view class="item_box rx-bc">
+      <view class="item_one perce100 rx-sc">
+        <view class="lable">物品编码:</view>
+        <view>{{ item.categoryCode }}</view>
+      </view>
+    </view>
+
+    <view class="item_box rx-bc">
+      <view class="item_one perce100 rx-sc">
+        <view class="lable">物品名称:</view>
+        <view>{{ item.categoryName }}</view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { getByCode } from "@/api/pda/common.js";
+export default {
+  props: {
+    item: {
+      type: Object,
+      default: () => ({}),
+    },
+  },
+
+  data() {
+    return {
+      qualityList: [],
+      disposeList: [],
+    };
+  },
+
+  created() {
+    this.getDisposeList("dispose_status");
+    this.getQualityList("inspection_plan_type");
+  },
+
+  methods: {
+    handleDetail() {},
+
+    async getDisposeList(code) {
+      let res = await getByCode(code);
+      if (res?.code == 0) {
+        let list = res.data.map((item) => {
+          let key = Object.keys(item)[0];
+          return { value: Number(key), label: item[key] };
+        });
+        this.disposeList = list;
+      }
+    },
+    async getQualityList(code) {
+      let res = await getByCode(code);
+      if (res?.code == 0) {
+        let list = res.data.map((item) => {
+          let key = Object.keys(item)[0];
+          return { value: Number(key), label: item[key] };
+        });
+        this.qualityList = list;
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.card_box {
+  width: 750rpx;
+  padding: 16rpx 32rpx;
+  box-sizing: border-box;
+  border-bottom: 2rpx solid #e1e1e1;
+
+  .item_box {
+    margin-top: 10rpx;
+
+    .round {
+      width: 40rpx;
+      height: 40rpx;
+      line-height: 40rpx;
+      border-radius: 50%;
+      background: $theme-color;
+      color: #fff;
+      text-align: center;
+      font-size: 20rpx;
+    }
+
+    .orderId {
+      color: #000;
+      font-family: PingFang HK;
+      font-size: 28rpx;
+      font-style: normal;
+      font-weight: 600;
+      margin-left: 16rpx;
+    }
+
+    .item_one {
+      width: 100%;
+      font-size: 26rpx;
+      font-style: normal;
+      font-weight: 400;
+      line-height: 38rpx;
+      word-wrap: break-word;
+    }
+
+    .item-right {
+      flex: 1;
+    }
+
+    .gylx {
+      color: $theme-color;
+    }
+
+    .perce50 {
+      width: 50%;
+    }
+
+    .perce100 {
+      width: 100%;
+    }
+  }
+}
+</style>

+ 354 - 14
pages/pda/nonconforming/index/index.vue

@@ -1,22 +1,362 @@
 <template>
-	<view>
-		
-	</view>
+  <view class="content-box">
+    <uni-nav-bar
+      fixed="true"
+      statusBar="true"
+      left-icon="back"
+      title="不合格品处置"
+      background-color="#157A2C"
+      color="#fff"
+      @clickLeft="back"
+    ></uni-nav-bar>
+
+    <view class="top-wrapper">
+      <uni-section>
+        <uni-easyinput
+          prefixIcon="search"
+          style="width: 430rpx"
+          v-model="searchFrom.keyWord"
+          placeholder="请输入"
+        >
+        </uni-easyinput>
+      </uni-section>
+
+      <button class="search_btn" @click="doSearch">搜索</button>
+
+      <!-- <button class="search_btn" @click="addMaterial">新增</button> -->
+    </view>
+
+    <view class="list_box">
+      <u-list
+        @scrolltolower="scrolltolower"
+        key="list"
+        :preLoadScreen="page * 10"
+      >
+        <u-list-item v-for="(item, index) in dataList" :key="index">
+          <!-- <itemCard :item="item"></itemCard> -->
+          <view class="card_box" @click="handleDetail">
+            <view class="item_box rx-bc">
+              <view class="item_one perce100 rx-sc">
+                <view class="lable">编码:</view>
+                <view>{{ item.unqualifiedProductsCode }}</view>
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce100 rx-sc">
+                <view class="lable">工单编号:</view>
+                <view>{{ item.workOrderCode }}</view>
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce100 rx-sc">
+                <view class="lable">批次号:</view>
+                <view>{{ item.batchNo }}</view>
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce100 rx-sc">
+                <view class="lable">来源编码:</view>
+                <view>{{ item.sourceCode }}</view>
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce100 rx-sc">
+                <view class="lable">物品编码:</view>
+                <view>{{ item.categoryCode }}</view>
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce100 rx-sc">
+                <view class="lable">物品名称:</view>
+                <view>{{ item.categoryName }}</view>
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce50 rx-sc">
+                <view class="lable">型号:</view>
+                <view>{{ item.modelType }}</view>
+              </view>
+
+              <view class="item_one perce50 rx-sc">
+                <view class="lable">规格:</view>
+                <view> {{ item.specification }}</view>
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce50 rx-sc">
+                <view class="lable">牌号:</view>
+                <view>{{ item.brandNum }}</view>
+              </view>
+
+              <view class="item_one perce50 rx-sc">
+                <view class="lable">数量:</view>
+                <view class="text">
+                  {{ item.quantity }}{{ item.measureUnit }}</view
+                >
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce50 rx-sc">
+                <view class="lable">质检类型:</view>
+                <view class="text">{{ getQuality(item) }}</view>
+              </view>
+
+              <view class="item_one perce50 rx-sc">
+                <view class="lable">状态:</view>
+                <view> {{ getDispose(item) }}</view>
+              </view>
+            </view>
+
+            <view class="item_box rx-bc">
+              <view class="item_one perce100 rx-sc">
+                <view class="lable">处置时间:</view>
+                <view>{{ item.disposeTime }}</view>
+              </view>
+            </view>
+          </view>
+        </u-list-item>
+
+        <u-list-item v-if="dataList.length === 0">
+          <view style="margin-top: 20vh">
+            <u-empty iconSize="150" textSize="32" text="暂无不良品"> </u-empty>
+          </view>
+        </u-list-item>
+      </u-list>
+    </view>
+  </view>
 </template>
 
 <script>
-	export default {
-		data() {
-			return {
-				
-			}
-		},
-		methods: {
-			
-		}
-	}
+import { getList } from "@/api/pda/nonconforming.js";
+import { getByCode } from "@/api/pda/common.js";
+import itemCard from "../components/itemCard.vue";
+
+let [isEnd] = [false];
+export default {
+  components: {
+    itemCard,
+  },
+
+  data() {
+    return {
+      searchFrom: {
+        keyWord: "",
+      },
+      page: 1,
+      size: 10,
+      dataList: [],
+      qualityList: [],
+      disposeList: [],
+    };
+  },
+
+  onLoad(option) {
+    // this.produceFn();
+  },
+
+  onShow() {
+    this.getDisposeList("dispose_status");
+    this.getQualityList("inspection_plan_type");
+    this.getList();
+  },
+
+  created() {
+    // this.getByCodeFn();
+  },
+
+  methods: {
+    async getList() {
+      let params = {
+        pageNum: this.page,
+        size: this.size,
+        ...this.searchFrom,
+      };
+
+      isEnd = false;
+      const res = await getList(params);
+
+      if (params.pageNum === 1) {
+        this.dataList = [];
+      }
+
+      this.dataList.push(...res.list);
+
+      isEnd = this.dataList.length >= res.count;
+    },
+
+    produceFn() {
+      this.getList();
+    },
+
+    scrolltolower() {
+      if (isEnd) return;
+      this.page++;
+      this.getList();
+    },
+
+    doSearch() {
+      this.getList();
+    },
+
+    addMaterial() {},
+
+    handleDetail() {},
+
+    async getDisposeList(code) {
+      let res = await getByCode(code);
+      if (res.length != 0) {
+        let list = res.map((item) => {
+          let key = Object.keys(item)[0];
+          return { value: Number(key), label: item[key] };
+        });
+        this.disposeList = list;
+      }
+    },
+    async getQualityList(code) {
+      let res = await getByCode(code);
+      if (res.length != 0) {
+        let list = res.map((item) => {
+          let key = Object.keys(item)[0];
+          return { value: Number(key), label: item[key] };
+        });
+        this.qualityList = list;
+      }
+    },
+
+    getDispose(item) {
+      const data = this.disposeList.find((it) => it.value == item.status);
+
+      return data ? data.label : "";
+    },
+
+    getQuality(item) {
+      const data = this.qualityList.find((it) => it.value == item.qualityType);
+      return data ? data.label : "";
+    },
+  },
+};
 </script>
 
-<style>
+<style lang="scss" scoped>
+.content-box {
+  height: 100vh;
+  overflow: hidden;
+  display: flex;
+  flex-direction: column;
+  background-color: $page-bg;
+}
+
+.top-wrapper {
+  background-color: #fff;
+  display: flex;
+  width: 750rpx;
+  height: 88rpx;
+  padding: 16rpx 32rpx;
+  align-items: center;
+  gap: 16rpx;
+
+  /deep/.uni-section {
+    margin-top: 0px;
+  }
+
+  /deep/.uni-section-header {
+    padding: 0px;
+  }
+
+  .search_btn {
+    width: 110rpx;
+    height: 60rpx;
+    line-height: 60rpx;
+    padding: 0 10rpx;
+    background: $theme-color;
+    font-size: 24rpx;
+    color: #fff;
+    margin: 0;
+    margin-left: 16rpx;
+  }
+
+  .menu_icon {
+    width: 44rpx;
+    height: 44rpx;
+    margin-left: 14rpx;
+  }
+}
+
+.list_box {
+  flex: 1;
+  overflow: hidden;
+  padding: 16rpx 0;
+
+  .u-list {
+    height: 100% !important;
+  }
+
+  .card_box {
+    width: 750rpx;
+    padding: 16rpx 32rpx;
+    box-sizing: border-box;
+    border-bottom: 2rpx solid #e1e1e1;
+
+    .item_box {
+      margin-top: 10rpx;
+
+      .round {
+        width: 40rpx;
+        height: 40rpx;
+        line-height: 40rpx;
+        border-radius: 50%;
+        background: $theme-color;
+        color: #fff;
+        text-align: center;
+        font-size: 20rpx;
+      }
+
+      .orderId {
+        color: #000;
+        font-family: PingFang HK;
+        font-size: 28rpx;
+        font-style: normal;
+        font-weight: 600;
+        margin-left: 16rpx;
+      }
+
+      .item_one {
+        width: 100%;
+        font-size: 26rpx;
+        font-style: normal;
+        font-weight: 400;
+        line-height: 38rpx;
+        word-wrap: break-word;
+
+        .text {
+          color: #157a2c;
+        }
+      }
+
+      .item-right {
+        flex: 1;
+      }
+
+      .gylx {
+        color: $theme-color;
+      }
+
+      .perce50 {
+        width: 50%;
+      }
 
+      .perce100 {
+        width: 100%;
+      }
+    }
+  }
+}
 </style>