Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	src/views/business/returnReceipt/form.vue
guoyujia 7 months ago
parent
commit
b52365a6b0

+ 1 - 1
.drone.yml

@@ -22,7 +22,7 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行
       - cp run.sh /home/nginx/html/dms-supplier/run.sh
       - cp nginx.conf /home/nginx/html/dms-supplier/nginx.conf
   - name: build-start
-    image: appleboy/drone-ssh #SSH工具镜像
+    image: appleboy/drone-ssh:1.0.0 #SSH工具镜像
     settings:
       host: 120.46.159.163 # 远程连接地址
       username:

+ 1 - 1
Dockerfile

@@ -1,5 +1,5 @@
 # 基础镜像
-FROM nginx:1.22
+FROM nginx:1.23
 
 # 复制 nginx  配置文件
 COPY ./nginx.conf /etc/nginx/nginx.conf

+ 146 - 0
src/api/business/carrier.js

@@ -0,0 +1,146 @@
+import request from '@/utils/request'
+
+const baseUrl = import.meta.env.VITE_APP_BASE_API
+
+// 载具类别列表
+export function listCategory(query) {
+  return request({
+    url: baseUrl + '/business/carrierCategory/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 通过搜索查询类别列表
+export function listCategoryInfo(query) {
+  return request({
+    url: baseUrl + '/business/carrierCategory/listInfo',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询载具类别
+export function getCategory(id) {
+  return request({
+    url: baseUrl + '/business/carrierCategory/getInfo/' + id,
+    method: 'get'
+  })
+}
+
+// 保存载具类别
+export function saveCategory(data) {
+  return request({
+    url: baseUrl + '/business/carrierCategory/save',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除载具类别
+export function delCategory(id) {
+  return request({
+    url: baseUrl + '/business/carrierCategory/remove/' + id,
+    method: 'delete'
+  })
+}
+
+/* ************************** 载具相关接口 *************************** */
+
+// 查询载具管理列表
+export function listCarrier(query) {
+  return request({
+    url: baseUrl + '/business/carrier/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询载具管理详细
+export function getCarrier(id) {
+  return request({
+    url: baseUrl + '/business/carrier/getInfo/' + id,
+    method: 'get'
+  })
+}
+
+// 新增载具管理
+export function saveCarrier(data) {
+  return request({
+    url: baseUrl + '/business/carrier/save',
+    method: 'post',
+    data: data
+  })
+}
+
+// 批量新增载具管理
+export function saveMulyipleCategory(data) {
+  return request({
+    url: baseUrl + '/business/carrier/saveCarrier',
+    method: 'post',
+    data: data
+  })
+}
+
+
+
+export function updateCarrier(data) {
+  return request({
+    url: baseUrl + '/business/carrier/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除载具管理
+export function delCarrier(id) {
+  return request({
+    url: baseUrl + '/business/carrier/remove/' + id,
+    method: 'delete'
+  })
+}
+//新增废弃载具信息
+export function saveCarrierReject(data) {
+  return request({
+    url: baseUrl + '/business/carrierReject/save',
+    method: 'post',
+    data: data
+  })
+}
+
+// 取消废弃
+export function unAbandoned(id) {
+  return request({
+    url: baseUrl + '/business/carrier/unAbandoned/' + id,
+    method: 'get'
+  })
+}
+
+export function downloadQcImgs(query) {
+  return request({
+    url: baseUrl + '/business/carrier/downloadQcImgs',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询载具管理列表
+export function download(data) {
+  return request({
+    url: baseUrl + '/business/carrier/download',
+    method: 'post',
+    data: data
+  })
+}
+
+export function printQrcodePdf(data) {
+  return request({
+    url: baseUrl + '/business/carrier/printQrcodePdf',
+    method: 'post',
+    responseType: 'blob',
+    data: data,
+    headers: {
+      'Content-Type': 'application/json; application/octet-stream'
+    }
+  })
+}

+ 18 - 0
src/api/business/outsourcedOrder.js

@@ -18,3 +18,21 @@ export function getOrder(id) {
 		method: 'get'
 	})
 }
+
+export function carrierForOutsource(query) {
+	return request({
+		url: baseUrl + '/business/outsource/carrierForOutsource',
+		method: 'get',
+		params: query
+	})
+}
+
+export function saveCarriers(data) {
+	return request({
+		url: baseUrl + '/business/outsource/saveCarriers',
+		method: 'post',
+		data: data
+	})
+	// return request({
+	// })
+}

+ 22 - 14
src/api/business/returnReceipt.js

@@ -1,5 +1,5 @@
 import request from '@/utils/request'
-import { download,downloadPdf } from '@/utils/request'
+import { download, downloadPdf } from '@/utils/request'
 
 const baseUrl = import.meta.env.VITE_APP_BASE_API
 
@@ -22,24 +22,24 @@ export function getReceipt(id) {
 
 //打印
 export function printReturnReceipt(data) {
-  downloadPdf(
-    baseUrl+"/business/returnReceipt/printDetailPdf",
-    {
-      ...data,
-    },
-    `外协收回单_${new Date().getTime()}.pdf`
-  )
+	downloadPdf(
+		baseUrl + "/business/returnReceipt/printDetailPdf",
+		{
+			...data,
+		},
+		`外协收回单_${new Date().getTime()}.pdf`
+	)
 }
 // 导出
 export function exportReturn(data) {
 	download(
-	  baseUrl+"/business/returnReceipt/export",
-	  {
-		...data,
-	  },
-	  `外协收回单_${new Date().getTime()}.xlsx`
+		baseUrl + "/business/returnReceipt/export",
+		{
+			...data,
+		},
+		`外协收回单_${new Date().getTime()}.xlsx`
 	)
-  }
+}
 
 
 
@@ -76,3 +76,11 @@ export function delReceipt(id) {
 		method: 'delete'
 	})
 }
+
+export function checkFurnace(data) {
+	return request({
+		url: baseUrl + '/business/returnReceipt/checkFurnace',
+		method: 'post',
+		data: data
+	})
+}

+ 148 - 0
src/views/business/dialog/CarrierChoiceDialog.vue

@@ -0,0 +1,148 @@
+<template>
+  <el-dialog title="选择箱号表单" v-model="visible" width="400px" append-to-body draggable>
+    <div class="form-container">
+      <el-form ref="categoryRef" v-loading="loading" class="master-container" :model="form" :rules="rules"
+        label-width="100px">
+        <el-form-item label="外协单号:" prop="formCode" :rules="rules">
+          {{ form.formCode }}
+        </el-form-item>
+        <el-form-item label="外协日期:" prop="formDate" :rules="rules">
+          {{ form.formDate }}
+        </el-form-item>
+        <el-form-item label="批次号:" prop="lotCode" :rules="rules">
+          {{ form.lotCode }}
+        </el-form-item>
+        <el-form-item label="产品描述:" prop="productDescription" :rules="rules">
+          {{ form.productDescription }}
+        </el-form-item>
+        <el-form-item label="箱号:" prop="carrierIds">
+          <el-select v-model="form.carrierIds" multiple filterable remote reserve-keyword placeholder="请选择箱号"
+            :remote-method="(arg) => remoteCarriers(arg, form.newCarriers, form)" :loading="loadingCarrier"
+            @change="(arg) => handleCarrierChange(arg, form)">
+            <el-option v-for=" item in form.carriers " :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <template #footer>
+      <el-button type="primary" icon="Check" @click="handleSave">确 定</el-button>
+      <el-button icon="Close" @click="handleCancel">取 消</el-button>
+    </template>
+  </el-dialog>
+</template>
+<script setup>
+import {
+  carrierForOutsource,
+  saveCarriers,
+} from "@/api/business/outsourcedOrder";
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(["handleSaveSuccess"]);
+/** 字典数组区 */
+const { is_allow_more } = proxy.useDict("is_allow_more");
+/** 父类别 */
+const parentCategories = ref([]);
+const loading = ref(false);
+const loadingCarrier = ref(false)
+const visible = ref(false);
+const carriers = ref([])
+const data = reactive({
+  form: {},
+  rules: {
+  }
+});
+const { form, rules } = toRefs(data);
+
+/***********************  方法区  ****************************/
+/** 打开抽屉 */
+function open(row) {
+  reset();
+  visible.value = true;
+  form.value = { ...row, carriers: row.carriers.map(v => ({ label: v.code, value: v.id })) }
+}
+
+/** 取消按钮 */
+function handleCancel() {
+  visible.value = false;
+  reset();
+}
+
+/** 表单重置 */
+function reset() {
+  form.value = {
+    id: null
+  };
+  proxy.resetForm("categoryRef");
+}
+
+function carrierValidator(rules, value) {
+  console.log(rules)
+  console.log(value)
+}
+
+/** 提交按钮 */
+function handleSave() {
+  if (form.value.carrierIds == null || form.value.carrierIds.length === 0) {
+    proxy.$modal.msgError("箱号不能为空");
+    return
+  }
+  proxy.$refs["categoryRef"].validate((valid) => {
+    if (valid) {
+      saveCarriers(form.value).then((res) => {
+        if (res.code === 200) {
+          proxy.$modal.msgSuccess("操作成功");
+          emit("handleSaveSuccess");
+        }
+        visible.value = false;
+      });
+    }
+  });
+}
+
+function remoteCarriers(code, newCarrier, row) {
+  loadingCarrier.value = true;
+  // console.log("row", row);
+  let categoryId;
+  // if (form.value.packagingMethod == 1) {
+  categoryId = "1783783697558847489";
+  // } else {
+  //   categoryId = "2";
+  // }
+  if (code == "") {
+    return;
+  }
+  carrierForOutsource({
+    code: code,
+    dayworkId: row.dayworkId
+  }).then((res) => {
+    if (res.code === 200) {
+      carriers.value = res.rows.map((v) => ({ value: v.id, label: v.code }));
+      row.carriers = res.rows.map((v) => ({ value: v.id, label: v.code }));
+      if (Array.isArray(newCarrier)) {
+        // 安全地更新 carriers
+        row.carriers.push(
+          ...newCarrier
+            .filter((v) => !row.carriers.map((e) => e.value).includes(v.id))
+            .map((v) => ({ value: v.id, label: v.code }))
+        );
+      }
+    } else {
+      row.carriers = [];
+      row.carriers.push(...newCarrier);
+    }
+    loadingCarrier.value = false;
+  });
+}
+
+function handleCarrierChange(arg, item) {
+  item.newCarriers = item.carriers
+    .filter((v) => arg.includes(v.value))
+    .map((v) => ({ id: v.value, code: v.label }));
+  // console.log(item.newCarriers);
+  item.carrierNum = item.newCarriers.length;
+}
+
+/** 暴露给父组件的方法 */
+defineExpose({
+  open,
+})
+</script>

+ 14 - 37
src/views/business/outsourcedOrder/form.vue

@@ -3,7 +3,9 @@
 		<div class="form-container column-container">
 			<div class="form-btns-container">
 				<span class="title-label">
-					<el-icon><Document /></el-icon>
+					<el-icon>
+						<Document />
+					</el-icon>
 					<span>外协单信息</span>
 				</span>
 				<div class="close-btn" @click="cancel">
@@ -20,38 +22,21 @@
 					</el-col>
 					<el-col :span="6">
 						<el-form-item label="表单日期" prop="formDate">
-							<el-date-picker
-								readonly
-								v-model="form.formDate"
-								type="date"
-								value-format="YYYY-MM-DD"
-								style="width: 100%"
-							>
+							<el-date-picker readonly v-model="form.formDate" type="date" value-format="YYYY-MM-DD"
+								style="width: 100%">
 							</el-date-picker>
 						</el-form-item>
 					</el-col>
 					<el-col :span="6" v-if="false">
 						<el-form-item label="运费单价" prop="freightPrice">
-							<el-input-number
-								v-model="form.freightPrice"
-								:min="0"
-								:precision="2"
-								controls-position="right"
-								readonly
-								:controls="false"
-							/>
+							<el-input-number v-model="form.freightPrice" :min="0" :precision="2" controls-position="right" readonly
+								:controls="false" />
 						</el-form-item>
 					</el-col>
 					<el-col v-if="false" :span="6">
 						<el-form-item label="运费总价" prop="freightAmount">
-							<el-input-number
-								v-model="form.freightAmount"
-								:min="0"
-								:precision="2"
-								controls-position="right"
-								readonly
-								:controls="false"
-							/>
+							<el-input-number v-model="form.freightAmount" :min="0" :precision="2" controls-position="right" readonly
+								:controls="false" />
 						</el-form-item>
 					</el-col>
 					<el-col :span="6">
@@ -82,20 +67,12 @@
 					<el-table v-loading="loading" :data="form.details" size="small" border height="100%">
 						<el-table-column label="行号" type="index" align="center" width="48" />
 						<el-table-column label="批次号" align="center" prop="lotCode" width="104" />
+						<el-table-column label="炉号" align="center" prop="furnaceNumber" width="104" />
 						<el-table-column label="产品描述" align="center" prop="productDescription" width="320" />
-						<el-table-column
-							:label="form.packagingMethod === '0' ? '箱号' : '原箱号'"
-							align="center"
-							prop="originalCarrier"
-							width="320"
-						/>
-						<el-table-column
-							v-if="form.packagingMethod === '1'"
-							label="新箱号"
-							align="center"
-							prop="newCarrier"
-							width="320"
-						/>
+						<el-table-column :label="form.packagingMethod === '0' ? '箱号' : '原箱号'" align="center" prop="originalCarrier"
+							width="320" />
+						<el-table-column v-if="form.packagingMethod === '1'" label="新箱号" align="center" prop="newCarrier"
+							width="320" />
 						<el-table-column label="外协工序" align="center" prop="processNames" width="320" />
 						<el-table-column label="备注" align="center" prop="remark" />
 					</el-table>

+ 173 - 207
src/views/business/outsourcedOrderDetails/index.vue

@@ -6,127 +6,84 @@
 				<el-input v-model="queryParams.formCode" placeholder="请输入单据号" style="width: 144px" clearable />
 			</el-form-item>
 			<el-form-item label="表单日期:" prop="startTime">
-				<el-date-picker
-					v-model="queryParams.startTime"
-					type="date"
-					style="width: 144px"
-					value-format="YYYY-MM-DD"
-					placeholder="选择起始日期"
-					clearable
-				/>
+				<el-date-picker v-model="queryParams.startTime" type="date" style="width: 144px" value-format="YYYY-MM-DD"
+					placeholder="选择起始日期" clearable />
 				<span style="margin: 0 4px">~</span>
-				<el-date-picker
-					v-model="queryParams.endTime"
-					type="date"
-					style="width: 144px"
-					value-format="YYYY-MM-DD"
-					placeholder="选择结束日期"
-					clearable
-				/>
+				<el-date-picker v-model="queryParams.endTime" type="date" style="width: 144px" value-format="YYYY-MM-DD"
+					placeholder="选择结束日期" clearable />
 			</el-form-item>
 			<el-form-item label="批次号:">
-				<el-input
-					placeholder="请输入关键字"
-					v-model.trim="queryParams.lotCode"
-					@keydown.enter.prevent
-					clearable
-					style="width: 130px"
-				/>
+				<el-input placeholder="请输入关键字" v-model.trim="queryParams.lotCode" @keydown.enter.prevent clearable
+					style="width: 130px" />
 			</el-form-item>
 			<el-form-item label="产品描述:">
-				<el-input
-					placeholder="请输入关键字"
-					v-model.trim="queryParams.productDescription"
-					@keydown.enter.prevent
-					clearable
-					style="width: 130px"
-				/>
+				<el-input placeholder="请输入关键字" v-model.trim="queryParams.productDescription" @keydown.enter.prevent clearable
+					style="width: 130px" />
 			</el-form-item>
 			<el-form-item label="箱号:">
-				<el-input
-					placeholder="请输入箱号"
-					v-model.trim="queryParams.newCarrierName"
-					@keydown.enter.prevent
-					clearable
-					style="width: 130px"
-				/>
+				<el-input placeholder="请输入箱号" v-model.trim="queryParams.newCarrierName" @keydown.enter.prevent clearable
+					style="width: 130px" />
 			</el-form-item>
 			<el-form-item label="报工状态:" prop="status">
-					<el-select v-model="queryParams.status" clearable placeholder="请选择报工状态" style="width: 145px">
-						<el-option v-for="dict in is_report" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
-					</el-select>
-				</el-form-item>
-				<el-form-item label="收回状态:" prop="returnStatus">
-					<el-select v-model="queryParams.returnStatus" clearable placeholder="请选择收回状态" style="width: 145px">
-						<el-option v-for="dict in is_return" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
-					</el-select>
-				</el-form-item>
+				<el-select v-model="queryParams.status" clearable placeholder="请选择报工状态" style="width: 145px">
+					<el-option v-for="dict in is_report" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+				</el-select>
+			</el-form-item>
+			<el-form-item label="收回状态:" prop="returnStatus">
+				<el-select v-model="queryParams.returnStatus" clearable placeholder="请选择收回状态" style="width: 145px">
+					<el-option v-for="dict in is_return" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+				</el-select>
+			</el-form-item>
 			<el-form-item style="margin-left: 0">
 				<el-button type="info" icon="Search" @click="getList">搜索 </el-button>
 			</el-form-item>
 		</el-form>
 		<div class="el-table-container">
 			<div class="el-table-inner-container">
-				<el-table
-					ref="dataTable"
-					:data="dataList"
-					:span-method="rowSpanMethod"
-					v-loading="loading"
-					highlight-current-row
-					border
-					height="100%"
-				>
+				<el-table ref="dataTable" :data="dataList" :span-method="rowSpanMethod" v-loading="loading"
+					highlight-current-row border height="100%">
 					<el-table-column label="外协单号" align="center" prop="formCode" width="120" />
 					<el-table-column label="外协日期" align="center" prop="formDate" width="120" />
 					<el-table-column label="批次号" align="center" prop="lotCode" width="120" />
 					<el-table-column label="产品描述" align="center" prop="productDescription" />
-					<el-table-column label="箱号" align="center" prop="newCarrierName" />
-					<el-table-column label="收回状态" align="center" prop="returnStatus" width="80" >
+					<el-table-column label="箱号" align="center" prop="newCarrierName">
+						<template #default="scope">
+							<div v-if="scope.row.isFirstProcess === 0">{{ scope.row.newCarrierName }}</div>
+							<el-button v-else link type="primary" @click="handleChoiceCarrier(scope.row)">{{ scope.row.newCarrierName
+			== '' ? '请选择载具' : scope.row.newCarrierName }}</el-button>
+						</template>
+					</el-table-column>
+					<el-table-column label="收回状态" align="center" prop="returnStatus" width="80">
 						<template #default="scope">
 							<dict-tag :options="is_return" :value="scope.row.returnStatus" />
 						</template>
 					</el-table-column>
 					<el-table-column label="外协数量" align="center" prop="productNum" width="80" />
 					<el-table-column label="工序名称" align="center" prop="processAlias" width="80" />
-					<el-table-column label="报工状态" align="center" prop="status" width="80" >
+					<el-table-column label="报工状态" align="center" prop="status" width="80">
 						<template #default="scope">
 							<dict-tag :options="is_report" :value="scope.row.status" />
 						</template>
 					</el-table-column>
 					<el-table-column label="投产数" align="center" prop="productionNum" width="120">
 						<template #default="scope">
-							<el-input-number
-								v-if="scope.row.editStatus"
-								v-model="scope.row.productionNum"
-								:min="1"
-								controls-position="right"
-								style="width: 100%"
-							/>
+							<el-input-number v-if="scope.row.editStatus" v-model="scope.row.productionNum" :min="1"
+								controls-position="right" style="width: 100%" />
 							<span v-else>{{ scope.row.productionNum }}</span>
 						</template>
 					</el-table-column>
 					<el-table-column label="合格数" align="center" prop="qualifiedNum" width="120">
 						<template #default="scope">
-							<el-input-number
-								v-if="scope.row.editStatus"
-								v-model="scope.row.qualifiedNum"
-								:min="0"
-								controls-position="right"
-								style="width: 100%"
-								@change="handleChangeloss(scope.row)"
-							/>
+							<el-input-number v-if="scope.row.editStatus" v-model="scope.row.qualifiedNum" :min="0"
+								controls-position="right" style="width: 100%" @change="handleChangeloss(scope.row)" />
 							<span v-else>{{ scope.row.qualifiedNum }}</span>
 						</template>
 					</el-table-column>
 					<el-table-column label="料损率(%)" align="center" prop="loss" width="120">
 						<template #default="scope">
-							<el-tooltip
-								effect="dark"
-								content="超出料损上限后文字变红"
-								placement="top-start"
-							>
-							<span v-if="scope.row.loss > scope.row.lossLimit" style="color: red">{{ scope.row.loss }}</span>
-							<span v-else>{{ scope.row.loss }}</span>
+							<el-tooltip effect="dark" content="超出料损上限后文字变红" placement="top-start">
+								<span v-if="scope.row.loss > scope.row.lossLimit" style="color: red">{{ scope.row.loss }}</span>
+								<span v-else>{{ scope.row.loss }}</span>
 							</el-tooltip>
 						</template>
 					</el-table-column>
@@ -136,25 +93,23 @@
 								<el-button type="success" icon="Finished" circle @click="handleSaveRow(scope.row)" />
 								<el-button type="danger" icon="Close" circle @click="handleCancelRow(scope.row)" />
 							</template>
-							<el-button v-else type="primary" :disabled="scope.row.returnReceiptDetails.length > 0"   icon="Bell" @click="handleStartReport(scope.row)">报工</el-button>
+							<el-button v-else type="primary" :disabled="scope.row.returnReceiptDetails.length > 0" icon="Bell"
+								@click="handleStartReport(scope.row)">报工</el-button>
 						</template>
 					</el-table-column>
 				</el-table>
 			</div>
 		</div>
 		<!-- 分页 -->
-		<pagination
-			v-show="total > 0"
-			:total="total"
-			v-model:page="queryParams.pageNum"
-			v-model:limit="queryParams.pageSize"
-			@pagination="getList"
-		/>
+		<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
+			v-model:limit="queryParams.pageSize" @pagination="getList" />
+		<carrier-choice-dialog ref="carrierChoiceDialogRef" @handleSaveSuccess="carrierChoiceSumbit()" />
 	</div>
 </template>
 
 <script setup>
-import { listProcess,editOutsourcedOrderDetailProcess,getLastProcessQualifitedNum } from '@/api/business/outsourcedOrderDetailProcess.js'
+import { listProcess, editOutsourcedOrderDetailProcess, getLastProcessQualifitedNum } from '@/api/business/outsourcedOrderDetailProcess.js'
+import CarrierChoiceDialog from '../dialog/CarrierChoiceDialog.vue';
 const { proxy } = getCurrentInstance()
 /** 字典数组区 */
 const { is_report } = proxy.useDict('is_report')
@@ -165,6 +120,7 @@ const dataTable = ref(null)
 const spanProps = ref([])
 const loading = ref(false)
 const total = ref(0)
+const carrierChoiceDialogRef = ref(null)
 // 用于计算合并行的计数器
 const spanArr = ref([])
 /** 查询对象 */
@@ -174,19 +130,19 @@ const queryParams = ref({
 	formEndDate: null,
 	lotCode: '',
 	productDescription: '',
-	status:'0',
-	returnStatus:'0',
+	status: '0',
+	returnStatus: '0',
 	pageNum: 1,
 	pageSize: 10
 })
 
 /***********************  工段相关事件  ****************************/
-const getTime =()=>{
+const getTime = () => {
 	getNowDate();
-  	getPassDate();
-	  getList()
+	getPassDate();
+	getList()
 }
-const getList = () => {	
+const getList = () => {
 	loading.value = true
 	listProcess(queryParams.value).then((res) => {
 		dataList.value = res.rows
@@ -197,99 +153,99 @@ const getList = () => {
 			// getSpanArr(dataList.value, 'formDate')
 			// getSpanArr(dataList.value, 'lotCode')
 			// getSpanArr(dataList.value, 'productDescription')
-			spanProps.value = ['formCode', 'formDate','lotCode','productDescription'];
+			spanProps.value = ['formCode', 'formDate', 'lotCode', 'productDescription'];
 			spanPropGroup(dataList.value)
 		}
 	})
 }
 //获取当前时间
 function getNowDate() {
-  var nowDate = new Date();
-  var date = {
-    year: nowDate.getFullYear(),
-    month: nowDate.getMonth() + 1,
-    day: nowDate.getDate(),
-  };
-  const dayDate =
-    date.year +
-    "-" +
-    (date.month >= 10 ? date.month : "0" + date.month) +
-    "-" +
-    (date.day >= 10 ? date.day : "0" + date.day);
-  console.log(dayDate);
-  queryParams.value.endTime = dayDate;
+	var nowDate = new Date();
+	var date = {
+		year: nowDate.getFullYear(),
+		month: nowDate.getMonth() + 1,
+		day: nowDate.getDate(),
+	};
+	const dayDate =
+		date.year +
+		"-" +
+		(date.month >= 10 ? date.month : "0" + date.month) +
+		"-" +
+		(date.day >= 10 ? date.day : "0" + date.day);
+	console.log(dayDate);
+	queryParams.value.endTime = dayDate;
 }
 //获取30天前时间
 function getPassDate() {
-  var myDate = new Date();
-  myDate.setDate(myDate.getDate() - 29);
-  var dateTemp;
-  var day;
-  for (var i = 0; i < 30; i++) {
-    if (myDate.getDate() < 10) {
-      day = "0" + myDate.getDate().toString();
-    } else {
-      day = myDate.getDate().toString();
-    }
-  }
-  var month = myDate.getMonth() + 1;
-  dateTemp =
-    myDate.getFullYear() +
-    "-" +
-    (month < 10 ? "0" + month : "" + month) +
-    "-" +
-    day;
-  queryParams.value.startTime = dateTemp;
+	var myDate = new Date();
+	myDate.setDate(myDate.getDate() - 29);
+	var dateTemp;
+	var day;
+	for (var i = 0; i < 30; i++) {
+		if (myDate.getDate() < 10) {
+			day = "0" + myDate.getDate().toString();
+		} else {
+			day = myDate.getDate().toString();
+		}
+	}
+	var month = myDate.getMonth() + 1;
+	dateTemp =
+		myDate.getFullYear() +
+		"-" +
+		(month < 10 ? "0" + month : "" + month) +
+		"-" +
+		day;
+	queryParams.value.startTime = dateTemp;
 }
 //计算损耗率
 const handleChangeloss = (row) => {
-	let percent = (row.productionNum - row.qualifiedNum)/row.productionNum * 100; 
-        row.loss = Math.ceil(percent * 100) / 100; 
+	let percent = (row.productionNum - row.qualifiedNum) / row.productionNum * 100;
+	row.loss = Math.ceil(percent * 100) / 100;
 }
 //报工确认
 const handleSaveRow = (row) => {
 	var flag = true
-	if(row.qualifiedNum == 0) {
+	if (row.qualifiedNum == 0) {
 		flag = false
 		proxy.$modal
-        .confirm("合格数为0是否确定保存")
-        .then(() =>{
-			let percent = (row.productionNum - row.qualifiedNum)/row.productionNum * 100; 
-        row.loss = Math.ceil(percent * 100) / 100; 
-			editOutsourcedOrderDetailProcess(row).then((res) => {
-		if(res.code == 200) {
-			row.editStatus = false
-			proxy.$modal.msgSuccess('报工成功')
-			getList()		
-		}
-	})
-    })
+			.confirm("合格数为0是否确定保存")
+			.then(() => {
+				let percent = (row.productionNum - row.qualifiedNum) / row.productionNum * 100;
+				row.loss = Math.ceil(percent * 100) / 100;
+				editOutsourcedOrderDetailProcess(row).then((res) => {
+					if (res.code == 200) {
+						row.editStatus = false
+						proxy.$modal.msgSuccess('报工成功')
+						getList()
+					}
+				})
+			})
 	}
-	if(row.productionNum>row.productNum) {
+	if (row.productionNum > row.productNum) {
 		flag = false
 		proxy.$modal.msgError('投产数不能大于外协数量')
 	}
-	if(row.productionNum < row.qualifiedNum) {
+	if (row.productionNum < row.qualifiedNum) {
 		flag = false
 		proxy.$modal.msgError('合格数不能大于投产数')
-	}else {
+	} else {
 		var tempList = dataList.value.filter(item => {
-			return item.detailId ==row.detailId
+			return item.detailId == row.detailId
 		})
 		var index = tempList.indexOf(row)
-			if(index>0 && row.productionNum > tempList[index-1].qualifiedNum) {
-				flag = false
-				proxy.$modal.msgError('投产数不能大于上一道序合格数')
+		if (index > 0 && row.productionNum > tempList[index - 1].qualifiedNum) {
+			flag = false
+			proxy.$modal.msgError('投产数不能大于上一道序合格数')
 		}
 	}
-	if(flag) {
+	if (flag) {
 		editOutsourcedOrderDetailProcess(row).then((res) => {
-		if(res.code == 200) {
-			row.editStatus = false
-			proxy.$modal.msgSuccess('报工成功')
-			getList()		
-		}
-	})
+			if (res.code == 200) {
+				row.editStatus = false
+				proxy.$modal.msgSuccess('报工成功')
+				getList()
+			}
+		})
 	}
 }
 const handleCancelRow = (row) => {
@@ -314,15 +270,15 @@ const handleStartReport = (row) => {
 	// 		if(!row.productionNum) {
 	// 			row.productionNum = row.productNum
 	// 		}
-			
+
 	// 	}
 	//获得上一道序报工的合格数
-	getLastProcessQualifitedNum(row).then(res =>{
-		if(res.code == 200) {
+	getLastProcessQualifitedNum(row).then(res => {
+		if (res.code == 200) {
 			row.editStatus = true
 			row.productionNum = res.data
-			if(row.status == 0){
-			row.qualifiedNum = res.data
+			if (row.status == 0) {
+				row.qualifiedNum = res.data
 			}
 		}
 	})
@@ -330,52 +286,62 @@ const handleStartReport = (row) => {
 let rowSpansMap = new Map(); //存需要开始合并的行号,向下合并多少行
 
 const spanPropGroup = (data) => {
-  let oldRow = null; //需要合并的行
-  rowSpansMap = new Map(); //重置Map
-  oldRow = data[0]; //默认第0行为需要合并的行
-  rowSpansMap.set(0, 1); //第0行,向下合并一行(其实就是自己单独一行)
-  let spanRow = 0; //记录需要开始合并的行号
-  for (let i = 1; i < data.length; i++) {
-    const item = data[i];
-    let isSame = true;
-    //遍历需要判断的属性判断对应值是否全部相等
-    for (let j = 0; j < spanProps.value.length; j++) {
-      const prop = spanProps.value[j];
-      //只要有一个属性值不相等则记录新的需要合并的行号
-      if (item[prop] != oldRow[prop]) {
-        oldRow = item;
-        rowSpansMap.set(i, 1);
-        spanRow = i;
-        isSame = false;
-        break;
-      }
-    }
-    //如果所有属性值相同则所需要合并的行数+1
-    if (isSame) {
-      let span = rowSpansMap.get(spanRow);
-      rowSpansMap.set(spanRow, span + 1);
-    }
-  }
+	let oldRow = null; //需要合并的行
+	rowSpansMap = new Map(); //重置Map
+	oldRow = data[0]; //默认第0行为需要合并的行
+	rowSpansMap.set(0, 1); //第0行,向下合并一行(其实就是自己单独一行)
+	let spanRow = 0; //记录需要开始合并的行号
+	for (let i = 1; i < data.length; i++) {
+		const item = data[i];
+		let isSame = true;
+		//遍历需要判断的属性判断对应值是否全部相等
+		for (let j = 0; j < spanProps.value.length; j++) {
+			const prop = spanProps.value[j];
+			//只要有一个属性值不相等则记录新的需要合并的行号
+			if (item[prop] != oldRow[prop]) {
+				oldRow = item;
+				rowSpansMap.set(i, 1);
+				spanRow = i;
+				isSame = false;
+				break;
+			}
+		}
+		//如果所有属性值相同则所需要合并的行数+1
+		if (isSame) {
+			let span = rowSpansMap.get(spanRow);
+			rowSpansMap.set(spanRow, span + 1);
+		}
+	}
 };
- 
-const rowSpanMethod =({ row, column, rowIndex, columnIndex }) => {
-  //采样值5-9列所对应的行不需要合并
-  if (columnIndex != 11 && columnIndex != 7 && columnIndex != 8 && columnIndex != 9 && columnIndex != 10&& columnIndex != 12 ) {
-    //根据当前行号从map中获取开始合并的行根据当前行号从map中获取开始合并的行号,向下合并多少行
-    const span = rowSpansMap.get(rowIndex);
-    if (span != null) {
-      return {
-        rowspan: span, //向下合并span行
-        colspan: 1,
-      };
-    } else {
-      return {
-        rowspan: 0,
-        colspan: 0,
-      };
-    }
-  }
+
+const rowSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
+	//采样值5-9列所对应的行不需要合并
+	if (columnIndex != 11 && columnIndex != 7 && columnIndex != 8 && columnIndex != 9 && columnIndex != 10 && columnIndex != 12) {
+		//根据当前行号从map中获取开始合并的行根据当前行号从map中获取开始合并的行号,向下合并多少行
+		const span = rowSpansMap.get(rowIndex);
+		if (span != null) {
+			return {
+				rowspan: span, //向下合并span行
+				colspan: 1,
+			};
+		} else {
+			return {
+				rowspan: 0,
+				colspan: 0,
+			};
+		}
+	}
 };
+
+const handleChoiceCarrier = (row) => {
+	// 弹出选择载具对话框
+	carrierChoiceDialogRef.value.open(row)
+}
+
+const carrierChoiceSumbit = (result) => {
+	getList()
+}
+
 // const rowSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
 // 	if (columnIndex === 0 || columnIndex === 1 || columnIndex === 2 || columnIndex === 3 || columnIndex === 4) {
 // 		const _row = spanArr.value[rowIndex]

+ 55 - 121
src/views/business/returnReceipt/form.vue

@@ -1,34 +1,21 @@
 <template>
-  <el-drawer
-    title="外协单信息"
-    :with-header="false"
-    v-model="visible"
-    direction="rtl"
-    size="100%"
-  >
+  <el-drawer title="外协单信息" :with-header="false" v-model="visible" direction="rtl" size="100%">
     <div class="form-container column-container">
       <div class="form-btns-container">
         <span class="title-label">
-          <el-icon><Document /></el-icon>
+          <el-icon>
+            <Document />
+          </el-icon>
           <span>收回单信息</span>
         </span>
         <el-button-group>
-          <el-button v-if="editStatus&& submitStatus" type="success" @click="saveForm">
+          <el-button v-if="editStatus && submitStatus" type="success" @click="saveForm">
             保存
           </el-button>
-          <el-button
-            v-if="editStatus && submitStatus"
-            type="primary"
-            @click="submitForm"
-          >
+          <el-button v-if="editStatus && submitStatus" type="primary" @click="submitForm">
             提交
           </el-button>
-          <el-button
-            v-if="!editStatus"
-            type="primary"
-            icon="Finished"
-            @click="cancel"
-          >
+          <el-button v-if="!editStatus" type="primary" icon="Finished" @click="cancel">
             确定
           </el-button>
         </el-button-group>
@@ -38,13 +25,7 @@
           <!-- <span>关闭</span> -->
         </div>
       </div>
-      <el-form
-        ref="formRef"
-        class="master-container"
-        :model="form"
-        v-loading="loading"
-        label-width="120px"
-      >
+      <el-form ref="formRef" class="master-container" :model="form" v-loading="loading" label-width="120px">
         <el-row :gutter="20">
           <el-col :span="6">
             <el-form-item label="单据号" prop="formCode">
@@ -53,21 +34,15 @@
           </el-col>
           <el-col :span="6">
             <el-form-item label="表单日期" prop="formDate">
-              <el-date-picker
-                v-if="editStatus && submitStatus"
-                :clearable="false"
-                v-model="form.formDate"
-                type="date"
-                value-format="YYYY-MM-DD"
-                style="width: 100%"
-              >
+              <el-date-picker v-if="editStatus && submitStatus" v-model="form.formDate" type="date"
+                value-format="YYYY-MM-DD" style="width: 100%">
               </el-date-picker>
               <el-input v-model="form.formDate" v-else readonly />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="备注" prop="remark">
-              <el-input v-model.trim="form.remark" v-if="editStatus&& submitStatus" />
+              <el-input v-model.trim="form.remark" v-if="editStatus && submitStatus" />
               <el-input v-model="form.remark" v-else readonly />
             </el-form-item>
           </el-col>
@@ -75,86 +50,31 @@
       </el-form>
       <!-- 渲染数据区 -->
       <div class="form-details-btns-container">
-        <el-button
-          type="primary"
-          icon="Plus"
-          v-if="editStatus && submitStatus"
-          @click="handleShowDialogOutSourceDetails"
-        >
+        <el-button type="primary" icon="Plus" v-if="editStatus && submitStatus"
+          @click="handleShowDialogOutSourceDetails">
           添加收回明细
         </el-button>
       </div>
       <div class="el-table-container">
         <div class="el-table-inner-container">
-          <el-table
-            v-loading="loading"
-            :data="form.details"
-            size="small"
-            border
-            height="100%"
-          >
-            <el-table-column
-              label="行号"
-              type="index"
-              align="center"
-              width="48"
-            />
-            <el-table-column
-              label="批次号"
-              align="center"
-              prop="lotCode"
-              width="104"
-            />
-            <el-table-column
-              label="产品描述"
-              align="center"
-              prop="productDescription"
-              width="320"
-            />
-            <el-table-column
-              label="产品数量"
-              align="center"
-              prop="productNum"
-              width="96"
-            />
-            <el-table-column
-              label="箱号"
-              align="center"
-              prop="newCarrier"
-              width="320"
-            />
-            <el-table-column
-              label="外协工序"
-              align="center"
-              prop="processAlias"
-              width="320"
-            />
-            <el-table-column
-              label="收回数量"
-              align="center"
-              prop="receiptNum"
-              width="104"
-            />
+          <el-table v-loading="loading" :data="form.details" size="small" border height="100%">
+            <el-table-column label="行号" type="index" align="center" width="48" />
+            <el-table-column label="批次号" align="center" prop="lotCode" width="104" />
+            <el-table-column label="产品描述" align="center" prop="productDescription" width="320" />
+            <el-table-column label="产品数量" align="center" prop="productNum" width="96" />
+            <el-table-column label="箱号" align="center" prop="newCarrier" width="320" />
+            <el-table-column label="外协工序" align="center" prop="processAlias" width="320" />
+            <el-table-column label="收回数量" align="center" prop="receiptNum" width="104" />
             <el-table-column label="备注" align="center" prop="remark">
               <template #default="scope">
-                <el-input v-model.trim="scope.row.remark" v-if="editStatus&& submitStatus" />
+                <el-input v-model.trim="scope.row.remark" v-if="editStatus && submitStatus" />
                 <el-input v-model="scope.row.remark" v-else readonly />
               </template>
             </el-table-column>
-            <el-table-column
-              label="操作"
-              align="center"
-              class-name="small-padding fixed-width"
-              width="64"
-            >
+            <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="64">
               <template #default="scope">
-                <el-button
-                  v-if="editStatus && submitStatus"
-                  link
-                  type="danger"
-                  icon="Delete"
-                  @click="handleDeletedDetails(scope.row)"
-                >
+                <el-button v-if="editStatus && submitStatus" link type="danger" icon="Delete"
+                  @click="handleDeletedDetails(scope.row)">
                   删除
                 </el-button>
               </template>
@@ -165,10 +85,8 @@
     </div>
 
     <!-- 外协商选择 -->
-    <dialog-outsource-details
-      ref="dialogOutsourceDetailsRef"
-      :multiple-selected="handleMultipleSelectedOutsourceDetails"
-    />
+    <dialog-outsource-details ref="dialogOutsourceDetailsRef"
+      :multiple-selected="handleMultipleSelectedOutsourceDetails" />
   </el-drawer>
 </template>
 <script setup>
@@ -176,6 +94,7 @@ import {
   getReceipt,
   addReceipt,
   updateReceipt,
+  checkFurnace
 } from "@/api/business/returnReceipt";
 import dialogOutsourceDetails from "./DialogOutsourceDetails";
 import { getTenant } from "@/utils/auth";
@@ -299,13 +218,17 @@ const handleMultipleSelectedOutsourceDetails = (selection) => {
 
 /** 提交按钮 */
 function submitForm() {
-  proxy.$refs["formRef"].validate((valid) => {
+  proxy.$refs["formRef"].validate(async (valid) => {
     if (valid) {
       var flag = true;
       if (form.value.details.length == 0) {
         flag = false;
         proxy.$modal.msgError("收回明细不能为空");
       }
+      if (form.value.details.findIndex(v => v.newCarrier == null || v.newCarrier == '') >= 0) {
+        flag = false
+        proxy.$modal.msgError("收回明细中载具箱号不能为空")
+      }
       // for (let i = 0; i < form.value.details.length; i++) {
       // 	if (form.value.details[i].receiptNum <= 0) {
       // 		flag = false;
@@ -313,6 +236,13 @@ function submitForm() {
       // 		return;
       // 	}
       // 	}
+
+      // 判断是否按炉结算
+      const checkRes = await checkFurnace(form.value.details);
+      if (!checkRes.data) {
+        flag = false
+        proxy.$modal.msgError(checkRes.msg)
+      }
       if (flag) {
         form.value.isSubmit = 1;
         handleChangeRemark();
@@ -342,6 +272,10 @@ function saveForm() {
         flag = false;
         proxy.$modal.msgError("收回明细不能为空");
       }
+      if (form.value.details.findIndex(v => v.newCarrier == null || v.newCarrier == '') >= 0) {
+        flag = false
+        proxy.$modal.msgError("收回明细中载具箱号不能为空")
+      }
       if (flag) {
         form.value.isSubmit = 0;
         handleChangeRemark();
@@ -375,17 +309,17 @@ function handleChangeRemark() {
 
 //删除收回明细
 function handleDeletedDetails(row) {
-	//前端同时操作form.value的两个集合
-	form.value.details.splice(form.value.details.indexOf(row), 1);
-	var index = []
-	for(let i = 0;i<form.value.detailInfo.length;i++) {
-		if(form.value.detailInfo[i].lotCode == row.lotCode){
-			index.push(i)
-		}	
-	}
-	for (let i = index.length - 1; i >= 0; i--) {
-  form.value.detailInfo.splice(index[i], 1);
-}
+  //前端同时操作form.value的两个集合
+  form.value.details.splice(form.value.details.indexOf(row), 1);
+  var index = []
+  for (let i = 0; i < form.value.detailInfo.length; i++) {
+    if (form.value.detailInfo[i].lotCode == row.lotCode) {
+      index.push(i)
+    }
+  }
+  for (let i = index.length - 1; i >= 0; i--) {
+    form.value.detailInfo.splice(index[i], 1);
+  }
 }
 
 /** 暴露给父组件的方法 */