guoyujia 1 рік тому
батько
коміт
5d535acc73

+ 9 - 0
src/api/business/outsourcedOrderDetail.js

@@ -59,3 +59,12 @@ export function delDetail(id) {
     method: 'delete'
   })
 }
+//获取报工完成的发出单明细
+// 获取已完成的外协单从表
+export function getFinishedOutsourceDetailList(query) {
+	return request({
+		url: baseUrl + '/business/outsourceDetail/getFinishedOutsourceDetailList',
+		method: 'get',
+		params: query
+	})
+}

+ 9 - 0
src/api/business/outsourcedOrderDetailProcess.js

@@ -1,4 +1,5 @@
 import request from '@/utils/request'
+const baseUrl = import.meta.env.VITE_APP_PRODUCTION_API
 
 // 查询外协单从对应的外协工序的从列表
 export function listProcess(query) {
@@ -34,6 +35,14 @@ export function updateProcess(data) {
     data: data
   })
 }
+// 查询外协单从对应的外协工序的从详细
+export function getOrderDetailProcess(data) {
+	return request({
+		url: baseUrl + '/business/outsourceDetailProcess/getOrderDetailProcess',
+		method: 'post',
+		data:data
+	})
+}
 
 // 删除外协单从对应的外协工序的从
 export function delProcess(id) {

+ 38 - 0
src/api/business/returnReceiptDetail.js

@@ -18,3 +18,41 @@ export function getDetail(id) {
 		method: 'get'
 	})
 }
+// 查询外协单从详细
+export function getReturnReceiptDetail(query) {
+	return request({
+		url: baseUrl + '/business/returnReceiptDetail/getReturnReceiptDetail',
+		method: 'get',
+		params:query
+	})
+}
+// 新增收回单明细
+export function addReceiptDetail(data) {
+	return request({
+		url: baseUrl + '/business/returnReceiptDetail',
+		method: 'post',
+		data: data
+	})
+}
+export function delReceiptDetail(id) {
+	return request({
+		url: baseUrl + '/business/returnReceiptDetail/' + id,
+		method: 'delete'
+	})
+}
+// 新增收回单明细
+export function saveOrUpdateDetail(data) {
+	return request({
+		url: baseUrl + '/business/returnReceiptDetail/saveOrUpdateDetail',
+		method: 'post',
+		data: data
+	})
+}
+// 新增收回单明细
+export function saveDetails(data) {
+	return request({
+		url: baseUrl + '/business/returnReceiptDetail/saveDetails',
+		method: 'post',
+		data: data
+	})
+}

+ 220 - 0
src/views/business/returnReceiptDetail/DialogOutsourceDetails.vue

@@ -0,0 +1,220 @@
+<template>
+	<el-dialog
+		title="添加收回明细"
+		v-model="visible"
+		width="900px"
+		height="400px"
+		@close="close"
+		append-to-body
+		draggable
+	>
+		<el-form ref="dialogForm" :model="queryParams" :inline="true" style="padding-top: 16px">
+			<el-form-item label="批次号:" prop="lotCode" label-width="70">
+				<el-input
+					v-model.trim="queryParams.lotCode"
+					type="text"
+					@keydown.enter.prevent
+					style="width: 160px"
+					placeholder="请输入批次号"
+					:clearable="true"
+					@keyup.enter="handleSearch"
+				/>
+			</el-form-item>
+			<el-form-item label="产品描述:" prop="productDescription" label-width="90">
+				<el-input
+					v-model.trim="queryParams.productDescription"
+					type="text"
+					@keydown.enter.prevent
+					style="width: 140px"
+					placeholder="请输入产品描述"
+					:clearable="true"
+					@keyup.enter="handleSearch"
+				/>
+			</el-form-item>
+			<el-form-item label="外协商:" prop="supplierName" label-width="70">
+				<el-input
+					v-model.trim="queryParams.supplierName"
+					type="text"
+					@keydown.enter.prevent
+					style="width: 140px"
+					placeholder="请输入外协商"
+					:clearable="true"
+					@keyup.enter="handleSearch"
+				/>
+			</el-form-item>
+			<el-form-item label-width="20px">
+				<el-button type="info" icon="Search" @click="handleSearch">搜索</el-button>
+			</el-form-item>
+			<!-- <div style="float: inline-end">
+          <span
+		    v-if="!showAll"
+            style="
+              color: rgba(0, 203, 117, 1);
+              font-size: 16px;
+              font-weight: 400;
+              line-height: 40px;
+              cursor: pointer;
+              display: inline-block;
+            "
+            @click="handleShowAllDetail"
+            >+查看所有明细</span
+          >
+		  <span
+		  v-else
+            style="
+              color: rgba(0, 203, 117, 1);
+              font-size: 16px;
+              font-weight: 400;
+              line-height: 40px;
+              cursor: pointer;
+              display: inline-block;
+            "
+            @click="handleShowFinishedDetail"
+            >+查看已完成明细</span
+          >
+        </div> -->
+		</el-form>
+
+		<el-table
+			ref="dialogTable"
+			:data="dataList"
+			size="small"
+			v-loading="loading"
+			border
+			height="370px"
+			@selection-change="handleSelectionChange"
+		>
+			<el-table-column type="selection" width="40" align="center" />
+			<el-table-column type="index" label="行号" width="50" align="center" />
+			<el-table-column label="外协商" align="center" prop="supplierName" width="120" />
+			<el-table-column label="批次号" align="center" prop="lotCode" width="96" />
+			<el-table-column label="料号" align="center" prop="productCode" width="96" />
+			<el-table-column label="产品描述" align="center" prop="productDescription" />
+			<el-table-column label="箱号" align="center" prop="originalCarrier" width="120">
+				<template #default="scope">
+        <!-- 检查 scope.row.newCarrier 是否有值 -->
+        <span v-if="scope.row.newCarrier">{{ scope.row.newCarrier }}</span>
+        <span v-else>{{ scope.row.originalCarrier }}</span>
+      </template>
+			</el-table-column>
+		</el-table>
+		<!-- 分页 -->
+		<pagination
+			v-show="total > 0"
+			:total="total"
+			v-model:page="queryParams.pageNum"
+			v-model:limit="queryParams.pageSize"
+			@pagination="getList"
+		/>
+		<template #footer>
+			<div class="dialog-footer">
+				<el-button type="primary" icon="Check" :disabled="selections.length === 0" @click="handleMultipleSelected">
+					确 定
+				</el-button>
+				<el-button type="danger" icon="Close" @click="close">取 消</el-button>
+			</div>
+		</template>
+	</el-dialog>
+</template>
+<script setup>
+import { listDetailForReceipt,listDetailForAllReceipt } from '@/api/business/outsourcedOrderDetail'
+const { proxy } = getCurrentInstance()
+const total = ref(0)
+const props = defineProps({
+	multipleSelected: {
+		type: Function,
+		default: null
+	}
+})
+
+const { multipleSelected } = toRefs(props)
+const dataList = ref([])
+const visible = ref(false)
+const showAll = ref(false)
+const loading = ref(false)
+const queryParams = ref({
+	existingOutsourceDetailIds: [],
+	productDescription: '',
+	pageNum: 1,
+	pageSize: 10
+})
+const selections = ref([])
+
+/**
+ * 对话框打开 事件
+ */
+function open(data) {
+	visible.value = true
+	showAll.value = false
+	queryParams.value.existingOutsourceDetailIds = data.outsourceDetailIds
+	getList()
+}
+
+//查看对应外协所有批次
+function handleShowAllDetail() {
+	showAll.value = true
+	getAllList()
+}
+//查看对应外协已完成批次
+function handleShowFinishedDetail() {
+	showAll.value = false
+	getList()
+}
+function getAllList() {
+	loading.value = true
+	listDetailForAllReceipt(queryParams.value).then((res) => {
+		dataList.value = res.rows
+		total.value = res.total
+		loading.value = false
+	})
+}
+
+/**
+ * 对话框关闭 事件
+ */
+function close() {
+	proxy.$refs.dialogForm.resetFields()
+	proxy.$refs.dialogTable.clearSelection()
+	queryParams.value.pageNum = 1
+	visible.value = false
+}
+
+/**
+ * 加载数据
+ */
+function getList() {
+	loading.value = true
+	listDetailForReceipt(queryParams.value).then((res) => {
+		dataList.value = res.rows
+		total.value = res.total
+		loading.value = false
+	})
+}
+
+/**
+ * 列表checkbox列选择 事件
+ */
+function handleSelectionChange(selection) {
+	selections.value = selection
+}
+
+/**  搜索 事件 */
+function handleSearch() {
+	if(showAll) {
+		getAllList()
+	}else {
+	getList()
+	}
+}
+/** 多选事件 */
+function handleMultipleSelected() {
+	if (multipleSelected.value) {
+		multipleSelected.value(selections.value)
+	}
+	close()
+}
+
+defineExpose({
+	open
+})
+</script>

+ 132 - 0
src/views/business/returnReceiptDetail/DialogSuppliers.vue

@@ -0,0 +1,132 @@
+<template>
+	<el-dialog title="选择外协商" v-model="visible" width="600px" height="400px" @close="close" append-to-body draggable>
+		<el-form ref="dialogForm" class="master-container" :model="queryParams" :inline="true" style="align-items: center">
+			<div style="display: flex">
+				<el-form-item label="外协商名称:" prop="name">
+					<el-input
+						v-model.trim="queryParams.name"
+						type="text"
+						@keydown.enter.prevent
+						style="width: 120px"
+						placeholder="请输入关键字"
+						:clearable="true"
+						@keyup.enter="handleSearch"
+					/>
+				</el-form-item>
+				<el-form-item label="助记码:" prop="name">
+					<el-input
+						v-model.trim="queryParams.mnemonicCode"
+						type="text"
+						@keydown.enter.prevent
+						style="width: 120px"
+						placeholder="请输入关键字"
+						:clearable="true"
+						@keyup.enter="handleSearch"
+					/>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="info" icon="Search" @click="handleSearch">搜索</el-button>
+				</el-form-item>
+			</div>
+		</el-form>
+
+		<el-table ref="dialogTable" :data="dataList" size="small" v-loading="loading" border height="370px">
+			<el-table-column type="index" label="行号" width="50" align="center" />
+			<el-table-column label="外协商名称" align="center" prop="name" />
+			<el-table-column label="助记码" align="center" prop="mnemonicCode" width="120" />
+			<el-table-column label="操作" width="64" align="center">
+				<template #default="scope">
+					<el-button type="success" icon="finished" circle @click="handleSingleSelected(scope.row)" />
+				</template>
+			</el-table-column>
+		</el-table>
+		<!-- 分页 -->
+		<pagination
+			v-show="total > 0"
+			:total="total"
+			v-model:page="queryParams.pageNum"
+			v-model:limit="queryParams.pageSize"
+			@pagination="getList"
+		/>
+	</el-dialog>
+</template>
+<script setup>
+import { list } from '@/api/business/supplier'
+const { proxy } = getCurrentInstance()
+/** 字典数组区 */
+const { process_status } = proxy.useDict('process_status')
+/** 工序变量 */
+const total = ref(0)
+const props = defineProps({
+	singleSelected: {
+		type: Function,
+		default: null
+	}
+})
+
+const { singleSelected } = toRefs(props)
+const dataList = ref([])
+const visible = ref(false)
+const loading = ref(false)
+const queryParams = ref({
+	name: '',
+	pageNum: 1,
+	pageSize: 10
+})
+const selections = ref([])
+
+/**
+ * 对话框打开 事件
+ */
+function open() {
+	visible.value = true
+	getList()
+}
+
+/**
+ * 对话框关闭 事件
+ */
+function close() {
+	proxy.$refs.dialogForm.resetFields()
+	proxy.$refs.dialogTable.clearSelection()
+	queryParams.value.pageNum = 1
+	visible.value = false
+}
+
+/**
+ * 加载数据
+ */
+function getList() {
+	loading.value = true
+	queryParams.value.supplierId = props.supplierId
+	list(queryParams.value).then((res) => {
+		dataList.value = res.rows
+		total.value = res.total
+		loading.value = false
+	})
+}
+
+/**
+ * 列表checkbox列选择 事件
+ */
+function handleSelectionChange(selection) {
+	selections.value = selection
+}
+
+/**  搜索 事件 */
+function handleSearch() {
+	getList()
+}
+
+/** 单选事件 */
+function handleSingleSelected(row) {
+	if (singleSelected.value) {
+		singleSelected.value(row)
+	}
+	close()
+}
+
+defineExpose({
+	open
+})
+</script>

+ 408 - 0
src/views/business/returnReceiptDetail/form.vue

@@ -0,0 +1,408 @@
+<template>
+	<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>
+					<span>收回明细</span>
+				</span>
+				<el-button-group>
+					<el-button  type="primary" icon="Finished" :loading="isSubmitting" @click="submitForm('save')"> 保存 </el-button>
+					<el-button v-if="form.status == 1" type="danger" icon="Close" @click="submitForm('notCheck')"> 审核不通过 </el-button>
+					<el-button v-else type="success" icon="Check" @click="submitForm('saveAndCheck')"> 保存并审核通过 </el-button>
+				</el-button-group>
+
+				<div class="close-btn" @click="cancel">
+					<i class="fa fa-times" aria-hidden="true" />
+					<!-- <span>关闭</span> -->
+				</div>
+			</div>
+			<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="formDate">
+							<el-date-picker
+							    v-if="editStatus"
+								v-model="form.formDate"
+								type="date"
+								:clearable="false"
+								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="6">
+						<el-form-item label="外协商名称" prop="supplierName">
+							<el-input v-if="editStatus" v-model="form.supplierName" readonly placeholder="请输入外协商名称">
+								<template #append>
+									<el-button icon="Search" @click="handleShowDialogSuppliers" />
+								</template>
+							</el-input>
+							<span v-else>{{ form.supplierName }}</span>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+				<!-- 渲染数据区 -->
+				<div class="form-details-btns-container">
+				<el-button type="primary" icon="Plus" v-if="form.supplierName!=''" :disabled="!editStatus"  @click="handleShowDialogOutSourceDetails"> 添加收回明细 </el-button>
+			</div>
+			<!-- 渲染数据区 -->
+			<div class="el-table-container">
+				<div class="el-table-inner-container">
+					<el-table v-loading="loading" :data="receiptDetailList" size="small" border height="100%" :span-method="rowSpanMethod">
+						<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="originalCarrier"
+							width="320"
+						/>
+						<el-table-column
+							label="新箱号"
+							align="center"
+							prop="newCarrier"
+							width="320"
+						/>
+						<el-table-column label="外协工序" align="center" prop="processAlias" width="150" />
+						<el-table-column label="收回数量" align="center" prop="receiptNum" width="104"/>
+						<el-table-column label="确定数量" align="center" prop="auditNum" width="104">
+							<template #default="scope">
+								<el-input-number
+									v-model="scope.row.auditNum"
+									:min="0"
+									controls-position="right"
+									style="text-align: center"
+								/>
+							</template>
+						</el-table-column>
+						<el-table-column label="备注" align="center" prop="remark">
+							<template #default="scope">
+								<el-input v-model="scope.row.remark" v-if="editStatus" />
+								<el-input v-model="scope.row.remark" v-else readonly />
+							</template>
+						</el-table-column>
+						<el-table-column label="反选" align="center" width="100">
+							<template #default="scope">
+						<el-button
+							icon="delete"
+							link
+							type="danger"
+							@click="handleDelReturnReceiveDetail(scope.row)"
+							>删除
+						</el-button>
+					</template>
+					</el-table-column>
+					</el-table>
+				</div>
+			</div>			
+		</div>
+		<!-- 收回明细选择 -->
+		<dialog-outsource-details
+			ref="dialogOutsourceDetailsRef"
+			:multiple-selected="handleMultipleSelectedOutsourceDetails"
+		/>
+		<!-- 外协商选择 -->
+		<dialog-suppliers ref="dialogSuppliersRef" :single-selected="handleSingleSelectedSuppliers" />
+	</el-drawer>
+</template>
+<script setup>
+import {getOrderDetailProcess} from '@/api/business/outsourcedOrderDetailProcess'
+import {saveOrUpdateDetail,getReturnReceiptDetail} from '@/api/business/returnReceiptDetail'
+import { getTenant } from '@/utils/auth'
+import dialogOutsourceDetails from './DialogOutsourceDetails'
+import dialogSuppliers from './DialogSuppliers'
+const emit = defineEmits(['handleSaveSuccess'])
+const { proxy } = getCurrentInstance()
+/** 表单抽屉 页变量 */
+const loading = ref(false)
+const visible = ref(false)
+const editStatus = ref(true)
+const detailInfo = ref({})
+const isSubmitting = ref(false)
+const spanProps = ref([])
+const receiptDetailList = ref([])
+const webHost = import.meta.env.VITE_APP_BASE_API
+const form = ref({})
+
+/****************************  方法区  ****************************/
+/** 打开抽屉 */
+const open = (row) => {
+	reset()
+	visible.value = true
+    detailInfo.value = row
+	//外协商填写完收回明细
+		editStatus.value = false
+		if(row.returnReceiptDetailList.length>0) {
+		getReturnReceiptDetail({id:row.id}).then(res => {
+			loading.value = true
+			receiptDetailList.value = res.data
+			form.value.supplierName = receiptDetailList.value[0].supplierName
+			form.value.formDate = receiptDetailList.value[0].formDate
+			form.value.status = receiptDetailList.value[0].status
+			loading.value = false
+			spanProps.value = ['lotCode','productDescription','productNum','originalCarrier','newCarrier'];
+			spanPropGroup(receiptDetailList.value)
+		})
+	}else{
+		editStatus.value = true
+		getOrderDetailProcess(row).then((response) => {
+			loading.value = true
+			receiptDetailList.value = response.data
+			form.value.supplierName = receiptDetailList.value[0].supplierName
+			form.value.formDate = receiptDetailList.value[0].formDate
+			form.value.status = receiptDetailList.value[0].status
+			loading.value = false
+			spanProps.value = ['lotCode','productDescription','productNum','originalCarrier','newCarrier'];
+			spanPropGroup(receiptDetailList.value)
+		})
+		
+	}
+}
+
+/** 取消按钮 */
+const cancel = () => {
+	visible.value = false
+}
+/***************************** 外协商对话框相关 *****************************/
+//打开外协商选择对话框
+const handleShowDialogSuppliers = () => {
+	proxy.$refs.dialogSuppliersRef.open()
+}
+//外协商选择带回
+const handleSingleSelectedSuppliers = (selection) => {
+	console.log(selection)
+	//如果收回明细已存在,切换外协商名字,删除添加的收回明细
+	if(selection.id != form.value.supplierId && receiptDetailList.value.length>0) {
+		receiptDetailList.value = []
+	}
+	form.value.supplierId = selection.id
+	form.value.supplierName = selection.name
+}
+
+/***************************** 外协明细对话框相关 *****************************/
+// 打开外协明细选择对话框
+const handleShowDialogOutSourceDetails = () => {
+	var info = {} 
+	info.outsourceDetailIds = receiptDetailList.value.length>0?receiptDetailList.value.map((item) => item.outsourceDetailId):[]
+	info.supplierId = form.value.supplierId
+	proxy.$refs.dialogOutsourceDetailsRef.open(info)
+}
+// 外协明细选择带回
+const handleMultipleSelectedOutsourceDetails = (selection) => {
+	console.log(selection)
+	for(let i = 0;i<selection.length;i++) {
+		for(let j = 0;j<selection[i].processes.length;j++) {
+			const newDetail = {
+				outsourceDetailId: selection[i].processes.detailId,
+					productDescription: selection[i].processes.productDescription,
+					lotCode: selection[i].processes.lotCode,
+					lotId:selection[i].processes.lotId,
+					dayworkId:selection[i].processes.dayworkId,
+					productId: selection[i].processes.productId,
+					productNum: selection[i].processes.productNum,
+					receiptNum: selection[i].processes.receiptNum,
+					originalCarrier: selection[i].processes.originalCarrier,
+					originalCarrierCount: selection[i].processes.originalCarrierCount,
+					newCarrier:selection[i].processes.newCarrier,
+					newCarrierCount:selection[i].processes.newCarrierCount,
+					remark: selection[i].processes.detailRemark,
+					technologicalProcessId:selection[i].processes.technologicalProcessId,
+					technologyVersion:selection[i].processes.technologyVersion,
+					technologicalProcessDetailId:selection[i].processes.technologicalProcessDetailId,
+					processId:selection[i].processes.processId,
+					processAlias:selection[i].processes.processAlias,
+					processCode:selection[i].processes.processCode,
+					processStepNumber:selection[i].processes.processStepNumber,
+					formDate:form.value.formDate,
+					status:0,
+					supplierId:selection[i].processes.supplierId,
+					supplierName:selection[i].processes.supplierName
+			}
+		    receiptDetailList.value.push(newDetail)
+		}
+		console.log(receiptDetailList.value)
+		}
+}
+	/** 表单重置 */
+const reset = () => {
+	form.value = {
+		formDate: proxy.parseTime(new Date(), '{y}-{m}-{d}'),
+		supplierId: '0',
+		supplierName: '',
+		status:0
+	}
+	proxy.resetForm('formRef')
+}
+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);
+    }
+  }
+};
+ 
+const rowSpanMethod =({ row, column, rowIndex, columnIndex }) => {
+  //采样值5-9列所对应的行不需要合并
+  if (columnIndex != 6 && columnIndex != 7 && columnIndex != 8  && columnIndex != 9) {
+    //根据当前行号从map中获取开始合并的行根据当前行号从map中获取开始合并的行号,向下合并多少行
+    const span = rowSpansMap.get(rowIndex);
+    if (span != null) {
+      return {
+        rowspan: span, //向下合并span行
+        colspan: 1,
+      };
+    } else {
+      return {
+        rowspan: 0,
+        colspan: 0,
+      };
+    }
+  }
+};
+/** 提交按钮 */
+function submitForm(data) {
+	proxy.$refs['formRef'].validate((valid) => {
+		if (valid) {
+			var flag = true;
+			if(isSubmitting.value) {
+				return
+			}
+			isSubmitting.value = true	
+			//数据从发出工序明细取得,处理数据
+			if(editStatus) {
+				var detailList = []
+				for(let i = 0;i<receiptDetailList.value.length;i++) {
+					const newDetail = {
+					outsourceDetailId: receiptDetailList.value[i].detailId,
+					productDescription:  receiptDetailList.value[i].productDescription,
+					lotCode: receiptDetailList.value[i].lotCode,
+					lotId:receiptDetailList.value[i].lotId,
+					dayworkId: receiptDetailList.value[i].dayworkId,
+					productId: receiptDetailList.value[i].productId,
+					productNum: receiptDetailList.value[i].productNum,
+					receiptNum: receiptDetailList.value[i].receiptNum,
+					originalCarrier: receiptDetailList.value[i].originalCarrier,
+					originalCarrierCount: receiptDetailList.value[i].originalCarrierCount,
+					newCarrier:receiptDetailList.value[i].newCarrier,
+					newCarrierCount:receiptDetailList.value[i].newCarrierCount,
+					remark: receiptDetailList.value[i].remark,
+					technologicalProcessId:receiptDetailList.value[i].technologicalProcessId,
+					technologyVersion:receiptDetailList.value[i].technologyVersion,
+					technologicalProcessDetailId:receiptDetailList.value[i].technologicalProcessDetailId,
+					processId:receiptDetailList.value[i].processId,
+					processAlias:receiptDetailList.value[i].processAlias,
+					processCode:receiptDetailList.value[i].processCode,
+					processStepNumber:receiptDetailList.value[i].processStepNumber,
+					formDate:form.value.formDate,
+					supplierId:receiptDetailList.value[i].supplierId,
+					supplierName:receiptDetailList.value[i].supplierName
+			}
+					detailList.push(newDetail)
+				}
+			}
+			if(!detailInfo.value || (detailInfo.value.returnReceiptDetailList.length ==0&&receiptDetailList.length == 0)) {
+				proxy.$modal.msgError('明细不能为空')
+				flag = false
+				isSubmitting.value = false
+			}
+			for(var i=0;i< receiptDetailList.value.length;i++) {
+					//审核不通过
+				if(data =='notCheck') {
+					receiptDetailList.value[i].status = 0
+				}
+				//审核通过
+				if(data =='saveAndCheck') {
+					receiptDetailList.value[i].status = 1
+				}
+					//外协没填收回数量,第一行工序确定数量不能超过产品数量,第二行工序确定数量不能超过上一道序的确定数量
+					var index = receiptDetailList.value.indexOf(receiptDetailList.value[i])
+					if(index>0 && receiptDetailList.value[i].auditNum >receiptDetailList.value[index-1].auditNum) {
+						flag = false
+						isSubmitting.value = false
+						proxy.$modal.msgError('第' + (i + 1) +'行确定数量不能超过上一道序的确定数量')
+					}
+			    if(receiptDetailList.value[i].auditNum > receiptDetailList.value[i].productNum) {
+					flag = false
+					isSubmitting.value = false
+					proxy.$modal.msgError('第' + (i + 1) + '行确定数量不能大于产品数量' + receiptDetailList.value[i].productNum)
+			}
+				if(receiptDetailList.value[i].auditNum == 0) {
+					flag = false
+					isSubmitting.value = false;
+					proxy.$modal
+						.confirm("第" + (i+1) + "行确定数量为0,是否确认保存?")
+						.then(() => {
+							flag = true
+					})
+					}
+				}
+			//审核不通过
+			if(data =='notCheck') {
+				for(var i=0;i< receiptDetailList.value.length;i++) {
+					receiptDetailList.value[i].status = 0
+				}
+			}
+			if(data =='saveAndCheck') {
+				for(var i=0;i< receiptDetailList.value.length;i++) {
+					receiptDetailList.value[i].status = 1
+				}
+			}
+			if(flag) {
+				var detail = {
+					outsourceDetailId: detailInfo.value.id,
+					detailList: receiptDetailList.value,
+					dayworkId: detailInfo.value.dayworkId
+				}
+				saveOrUpdateDetail(detail).then((response) => {
+					proxy.$modal.msgSuccess('添加成功')
+					isSubmitting.value = false;
+					visible.value = false
+					emit('handleSaveSuccess')
+				})
+			}
+			}
+	})
+}
+//反选操作
+function handleDelReturnReceiveDetail(row) {
+	proxy.$modal
+    .confirm("是否确认删除选中的数据项,如果删除,同时删除该批次下所有工序?")
+    .then(function () {
+      receiptDetailList.value = []
+    })
+}
+
+/** 暴露给父组件的方法 */
+defineExpose({
+	open
+})
+</script>

+ 175 - 0
src/views/business/returnReceiptDetail/index copy.vue

@@ -0,0 +1,175 @@
+<template>
+	<div class="page-container column-container">
+		<!-- 搜索区 -->
+		<el-form class="list-search-container" :model="queryParams" ref="queryRef" :inline="true" style="margin-right: 0px">
+			<el-form-item label="批次号:" prop="lotCode">
+				<el-input
+					v-model="queryParams.lotCode"
+					placeholder="请输入批次号"
+					style="width: 144px"
+					clearable
+					@keyup.enter="handleQuery"
+				/>
+			</el-form-item>
+            <el-form-item label="产品描述:" prop="productDescription">
+				<el-input
+					v-model="queryParams.productDescription"
+					placeholder="请输入产品描述"
+					style="width: 144px"
+					clearable
+					@keyup.enter="handleQuery"
+				/>
+			</el-form-item>
+			<el-form-item label="收回日期:" >
+				<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-form-item>
+			<el-form-item>
+				<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+				<el-button icon="Refresh" @click="resetQuery">重置</el-button>
+			</el-form-item>
+		</el-form>
+
+		<!-- 功能按钮区 -->
+		<div class="list-btns-container">
+			<el-button type="primary" icon="Plus" @click="handleShowFormDialog(null)"> 新增 </el-button>
+		</div>
+		<!-- 渲染数据区 -->
+		<div class="el-table-container">
+			<div class="el-table-inner-container">
+				<el-table v-loading="loading" :data="dataList" size="small" border height="100%" >
+                    <el-table-column type="index" label="行号" width="50" align="center"/>
+					<el-table-column label="外协商" align="center" prop="supplierName" width="104" />
+					<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="formDate" width="120">
+						<template #default="scope">
+							{{ parseTime(scope.row.formDate, '{y}-{m}-{d}') }}
+						</template>
+					</el-table-column>
+					<el-table-column label="外协工序" align="center" prop="processNames" ></el-table-column>
+                    <el-table-column
+							label ='原箱号'
+							align="center"
+							prop="originalCarrier"
+							width="320"
+						/>
+						<el-table-column
+							label="新箱号"
+							align="center"
+							prop="newCarrier"
+							width="320"
+						/>
+					<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160">
+						<template #default="scope">
+                            <el-button v-if="scope.row.status == 1" link type="primary" icon="View" @click="handleShowFormDialog(scope.row)"> 查看 </el-button>
+                            <el-button v-else link type="warning" icon="Edit" @click="handleShowFormDialog(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"
+		/>
+		<!-- 表单 -->
+		<receipt-detail-form ref="receiptDetailRef" @handleSaveSuccess="getList" />
+	</div>
+</template>
+
+<script setup name="returnReceiptDetail">
+import { getFinishedOutsourceDetailList } from '@/api/business/outsourcedOrderDetail'
+import receiptDetailForm from './form'
+const { proxy } = getCurrentInstance()
+
+const dataList = ref([])
+const loading = ref(true)
+const ids = ref([])
+const total = ref(0)
+/** 查询对象 */
+const queryParams = ref({
+	pageNum: 1,
+	pageSize: 10,
+	formCode: null,
+	formDate: null,
+	startTime:null,
+	endTime:null,
+    supplierName:null
+})
+
+/***********************  方法区  ****************************/
+
+/** 查询外协单主
+带箱方式,是整单的。如果换新箱子,明细中,都需要更换箱子列表 */
+function getList() {
+	loading.value = true
+	getFinishedOutsourceDetailList(queryParams.value).then((response) => {
+		dataList.value = response.rows
+		total.value = response.total
+		loading.value = false
+	})
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+	queryParams.value.pageNum = 1
+	getList()
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+	queryParams.value= ref({
+	pageNum: 1,
+	pageSize: 10,
+	formCode: null,
+	formDate: null,
+	startTime:null,
+	endTime:null
+})
+	handleQuery()
+}
+/**复选框选中数据 */
+function handleSelectionChange(selection) {
+	ids.value = selection.map((item) => item.id)
+}
+/** 修改按钮操作 */
+function handleShowFormDialog(row) {
+	if (row) {
+    row.editStatus = false;
+  }
+  proxy.$refs.receiptDetailRef.open(row ? row : null);
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+	proxy.download(
+		'business/returnReceipt/export',
+		{
+			...queryParams.value
+		},
+		`order_${new Date().getTime()}.xlsx`
+	)
+}
+getList()
+</script>

+ 512 - 0
src/views/business/returnReceiptDetail/index.vue

@@ -0,0 +1,512 @@
+<template>
+  <div class="page-container column-container">
+    <!-- 搜索区 -->
+    <el-form
+      class="list-search-container"
+      :model="queryParams"
+      ref="queryRef"
+      :inline="true"
+      style="margin-right: 0px"
+    >
+	<el-form-item label="外协商:" prop="supplierName">
+        <el-input
+          v-model="queryParams.supplierName"
+          placeholder="请输入外协商"
+          style="width: 144px"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="批次号:" prop="lotCode">
+        <el-input
+          v-model="queryParams.lotCode"
+          placeholder="请输入批次号"
+          style="width: 144px"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="产品描述:" prop="productDescription">
+        <el-input
+          v-model="queryParams.productDescription"
+          placeholder="请输入产品描述"
+          style="width: 144px"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="收回日期:">
+        <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-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 功能按钮区 -->
+    <div class="list-btns-container">
+      <el-button
+        type="primary"
+        icon="Plus"
+        @click="handleAddDetailDialog(null)"
+      >
+        新增
+      </el-button>
+    </div>
+    <!-- 渲染数据区 -->
+    <div class="el-table-container">
+      <div class="el-table-inner-container">
+        <el-table
+          v-loading="loading"
+          :data="dataList"
+          size="small"
+          border
+          height="100%"
+          :span-method="rowSpanMethod"
+        >
+          <el-table-column
+            label="外协商"
+            align="center"
+            prop="supplierName"
+            width="104"
+          >
+          </el-table-column>
+          <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="formDate"
+            width="120"
+          >
+            <template #default="scope">
+              {{ parseTime(scope.row.formDate, "{y}-{m}-{d}") }}
+            </template>
+          </el-table-column>
+          <el-table-column label="外协数量" align="center" prop="productNum" width="100"/>
+          <el-table-column
+            label="外协工序"
+            align="center"
+            prop="processAlias"
+            width="120"
+          ></el-table-column>
+          <el-table-column
+            label="原箱号"
+            align="center"
+            prop="originalCarrier"
+            width="120"
+          />
+          <el-table-column
+            label="新箱号"
+            align="center"
+            prop="newCarrier"
+            width="120"
+          />
+          <el-table-column label="备注" align="center" prop="remark">
+            <template #default="scope">
+              <el-input
+                v-model="scope.row.remark"
+                v-if="scope.row.editStatus"
+              />
+              <span v-else>{{ scope.row.remark }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="状态" align="center" prop="isAudit" width="80">
+            <template #default="scope">
+              <dict-tag
+                :options="is_audit_num"
+                :value="scope.row.isAudit"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="收回数量"
+            align="center"
+            prop="receiptNum"
+          ></el-table-column>
+          <el-table-column
+            label="确定数量"
+            align="center"
+            prop="auditNum"
+            width="150"
+          >
+            <template #default="scope">
+              <el-input-number
+                v-if="scope.row.editStatus || scope.row.editAuditStatus"
+                v-model="scope.row.auditNum"
+                :min="0"
+                controls-position="right"
+                style="text-align: center"
+              />
+              <span v-else>{{ scope.row.auditNum }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="操作"
+            align="center"
+            class-name="small-padding fixed-width"
+            width="250"
+          >
+		  <template #default="scope">
+			<!-- 保存按钮 -->
+			<el-button
+				v-if="scope.row.productionDeptId != 0 && (scope.row.editStatus === true || scope.row.editAuditStatus === true)"
+				link
+				:loading="isSubmitting"
+				type="primary"
+				icon="Check"
+				@click="handleAdd(scope.row)"
+			>保存</el-button>
+
+			<!-- 编辑按钮 -->
+			<el-button
+				v-if="scope.row.productionDeptId != 0 && !(scope.row.editStatus === true || scope.row.editAuditStatus === true)"
+				link
+				type="warning"
+				icon="Edit"
+				@click="handleEditAuditNum(scope.row)"
+			>编辑</el-button>
+
+			<!-- 审核通过按钮 -->
+			<el-button
+				v-if="scope.row.status === 0 && scope.row.id && !scope.row.editStatus && !scope.row.editAuditStatus"
+				link
+				type="warning"
+				icon="CircleCheck"
+				@click="handleCheckDetail(scope.row)"
+			>审核通过</el-button>
+
+			<!-- 审核不通过按钮 -->
+			<el-button
+				v-if="scope.row.status === 1 && scope.row.id && !scope.row.editStatus && !scope.row.editAuditStatus"
+				link
+				type="warning"
+				icon="CircleClose"
+				@click="handleNotCheckDetail(scope.row)"
+			>审核不通过</el-button>
+
+			<!-- 反选按钮 -->
+			<el-button
+				v-if="scope.row.id && scope.row.editStatus"
+				link
+				type="danger"
+				icon="Delete"
+				@click="handleShowFormDialog(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"
+    />
+    <!-- 表单 -->
+    <receipt-detail-form ref="receiptDetailRef" @handleSaveSuccess="getList" />
+    <!-- 收回明细选择 -->
+    <dialog-outsource-details
+      ref="dialogOutsourceDetailsRef"
+      :multiple-selected="handleMultipleSelectedOutsourceDetails"
+    />
+  </div>
+</template>
+
+<script setup name="returnReceiptDetail">
+import { listDetail,saveDetails,delReceiptDetail} from '@/api/business/returnReceiptDetail'
+import receiptDetailForm from './form'
+import dialogOutsourceDetails from './DialogOutsourceDetails'
+const { proxy } = getCurrentInstance()
+/** 字典数组区 */
+const { is_audit_num } = proxy.useDict("is_audit_num");
+
+const spanProps = ref([])
+const dataList = ref([])
+const loading = ref(true)
+const isSubmitting = ref(false)
+const ids = ref([])
+const total = ref(0)
+/** 查询对象 */
+const queryParams = ref({
+	pageNum: 1,
+	pageSize: 10,
+	formCode: null,
+	formDate: null,
+	startTime:null,
+	endTime:null,
+    supplierName:null
+})
+
+/***********************  方法区  ****************************/
+
+/** 查询外协单主
+带箱方式,是整单的。如果换新箱子,明细中,都需要更换箱子列表 */
+function getList() {
+	loading.value = true
+	listDetail(queryParams.value).then((response) => {
+		dataList.value = response.rows
+		dataList.value.forEach(item => {
+			item.editStatus = false
+			item.editAuditStatus = false
+		})
+		total.value = response.total
+		loading.value = false
+		spanProps.value = ['lotCode','productDescription','productNum','originalCarrier','newCarrier'];
+		spanPropGroup(dataList.value)
+	})
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+	queryParams.value.pageNum = 1
+	getList()
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+	queryParams.value= ref({
+	pageNum: 1,
+	pageSize: 10,
+	formCode: null,
+	formDate: null,
+	startTime:null,
+	endTime:null
+})
+	handleQuery()
+}
+/**复选框选中数据 */
+function handleSelectionChange(selection) {
+	ids.value = selection.map((item) => item.id)
+}
+// 外协明细选择带回
+const handleMultipleSelectedOutsourceDetails = (selection) => {
+	console.log(selection)
+	for(let i = 0;i<selection.length;i++) {
+		for(let j = 0;j<selection[i].processes.length;j++) {
+			const newDetail = {
+			outsourceDetailId: selection[i].id,
+			productDescription: selection[i].productDescription,
+			lotCode:selection[i].lotCode,
+			lotId:selection[i].lotId,
+			dayworkId:selection[i].dayworkId,
+			productId:selection[i].productId,
+			productNum: selection[i].productNum,
+			receiptNum: selection[i].processes[j].qualifiedNum?selection[i].processes[j].qualifiedNum:0,
+			originalCarrier:selection[i].originalCarrier,
+			originalCarrierCount:selection[i].originalCarrierCount,
+			newCarrier:selection[i].newCarrier,
+			newCarrierCount:selection[i].newCarrierCount,
+			processNames: selection[i].processNames,
+			formDate:proxy.parseTime(new Date(), '{y}-{m}-{d}'),
+			remark: '',
+			supplierName:selection[i].supplierName,
+			supplierId:selection[i].supplierId,
+			technologicalProcessId:selection[i].processes[j].technologicalProcessId,
+			technologyVersion:selection[i].processes[j].technologyVersion,
+			technologicalProcessDetailId:selection[i].processes[j].technologicalProcessDetailId,
+			processId:selection[i].processes[j].processId,
+			processAlias:selection[i].processes[j].processAlias,
+			processCode:selection[i].processes[j].processCode,
+			processStepNumber:selection[i].processes[j].processStepNumber,
+			status:0,
+			auditNum:selection[i].processes[j].qualifiedNum?selection[i].processes[j].qualifiedNum:0,
+			editStatus:true,
+			isAudit:1
+			}
+		    dataList.value.unshift(newDetail)
+			spanPropGroup(dataList.value)
+		}
+		}
+}
+//新增明细
+function handleAdd(row) {
+	var flag = true;
+	if(isSubmitting.value) {
+		return
+	}
+	isSubmitting.value = true	
+	let tempList = dataList.value.filter(item=>{
+	return item.outsourceDetailId == row.outsourceDetailId})
+	for(let i = 0;i<tempList.length;i++) {
+		if(tempList[i].auditNum == 0){
+			isSubmitting.value = false
+			proxy.$modal
+      .confirm("第" + (i + 1) + "道序确定数量是否确定为0")
+      .then(() => {
+      })
+      .catch(() => {
+        flag = false; 
+        isSubmitting.value = false; 
+      })
+	  .finally(() => {
+		console.log(flag)
+        // 无论用户点击确定还是取消,都在这里检查 flag 值
+        if (flag) {
+          saveDetails(tempList).then(res => {
+            proxy.$modal.msgSuccess('操作成功');
+            isSubmitting.value = false;
+            getList();
+          });
+        }
+      });
+    return;
+  }
+}
+if(flag) {
+	saveDetails(tempList).then(res => {
+            proxy.$modal.msgSuccess('操作成功');
+            isSubmitting.value = false;
+            getList();
+          });
+}
+}
+//审核通过
+function handleCheckDetail(row) {
+	let tempList = dataList.value.filter(item=>{
+	return item.outsourceDetailId == row.outsourceDetailId})
+	tempList.forEach(item=>{
+		item.status = 1
+	})
+	saveDetails(tempList).then(res=>{
+			proxy.$modal.msgSuccess('操作成功')
+				getList()
+		})
+}
+//审核不通过
+function handleNotCheckDetail(row) {
+	let tempList = dataList.value.filter(item=>{
+	return item.outsourceDetailId == row.outsourceDetailId})
+	tempList.forEach(item=>{
+		item.status = 0
+	})
+	saveDetails(tempList).then(res=>{
+			proxy.$modal.msgSuccess('操作成功')
+				getList()
+		})
+}
+function handleEditAuditNum(row) {
+	let tempList = dataList.value.filter(item=>{
+	return item.outsourceDetailId == row.outsourceDetailId})
+	tempList.forEach(item=>{
+		item.editAuditStatus = true
+		item.editStatus = false
+	})
+}
+//反选操作
+function handleDelReturnReceiveDetail(row) {
+	proxy.$modal
+    .confirm("是否确认删除选中的数据项,如果删除,同时删除该批次下所有工序?")
+    .then(function () {
+		delReceiptDetail(row.id).then(res=>{
+			proxy.$modal.msgSuccess('操作成功')
+				getList()
+		})
+    })
+}
+//新增明细
+function handleAddDetailDialog() {
+	var info = {} 
+	info.outsourceDetailIds = dataList.value.length>0?dataList.value.map((item) => item.outsourceDetailId):[]
+	proxy.$refs.dialogOutsourceDetailsRef.open(info)
+}
+/** 修改按钮操作 */
+function handleShowFormDialog(row) {
+	if (row) {
+    row.editStatus = false;
+  }
+  proxy.$refs.receiptDetailRef.open(row ? row : null);
+}
+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);
+    }
+  }
+};
+ 
+const rowSpanMethod =({ row, column, rowIndex, columnIndex }) => {
+  //采样值5-9列所对应的行不需要合并
+  if (columnIndex != 10&&columnIndex != 8&&columnIndex != 5&&columnIndex != 11) {
+    //根据当前行号从map中获取开始合并的行根据当前行号从map中获取开始合并的行号,向下合并多少行
+    const span = rowSpansMap.get(rowIndex);
+    if (span != null) {
+      return {
+        rowspan: span, //向下合并span行
+        colspan: 1,
+      };
+    } else {
+      return {
+        rowspan: 0,
+        colspan: 0,
+      };
+    }
+  }
+};
+/** 导出按钮操作 */
+function handleExport() {
+	proxy.download(
+		'business/returnReceipt/export',
+		{
+			...queryParams.value
+		},
+		`order_${new Date().getTime()}.xlsx`
+	)
+}
+getList()
+</script>