wangxin 1 年之前
父节点
当前提交
9283114cac

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

@@ -73,6 +73,17 @@ export function saveCarrier(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',

+ 480 - 303
src/views/business/carrier/index.vue

@@ -1,77 +1,197 @@
 <template>
-	<div class="page-container row-container">
-		<!-- 左侧区域 -->
-		<section class="list-part-container">
-			<!-- 搜索区域 -->
-			<el-form class="list-search-container" :model="queryParams" ref="queryRef" :inline="true">
-				<el-form-item class="section-title" label="载具类别" />
-				<el-form-item>
-					<!-- <el-button type="success" icon="Refresh" @click="handleQueryCategory">刷新</el-button> -->
-					<el-button type="primary" icon="Plus" @click="handleShowCategoryDialog(null)" v-hasPermi="['business:carrier:add']">新增 </el-button>
-				</el-form-item>
-			</el-form>
-			<!-- 列表区 -->
-			<div class="el-table-container">
-				<div class="el-table-inner-container">
-					<el-tree ref="categoryTable" v-loading="categoryLoading" :data="carrierCategoryList" :props="{ label: 'name', children: 'children' }" :expand-on-click-node="false" default-expand-all node-key="id" highlight-current @node-click="handleCurrentCategoryChange">
-						<template #default="{ node, data }">
-							<div style="display: flex; width: 100%; justify-content: space-between">
-								<span>
-									<span v-if="data.parentId == 0" style="display: inline-block; width: 20px">{{ getNodeIndex(data) }}. </span>
-									<span>{{ node.label }}</span>
-								</span>
-								<span>
-									<el-button link type="warning" icon="Edit" @click="handleShowCategoryDialog(data)" v-hasPermi="['business:carrier:edit']">编辑 </el-button>
-									<el-button link type="danger" icon="Delete" @click="handleDeleteCategory(data)" v-hasPermi="['business:carrier:remove']">删除 </el-button>
-								</span>
-							</div>
-						</template>
-					</el-tree>
-				</div>
-			</div>
-		</section>
+  <div class="page-container row-container">
+    <!-- 左侧区域 -->
+    <section class="list-part-container">
+      <!-- 搜索区域 -->
+      <el-form
+        class="list-search-container"
+        :model="queryParams"
+        ref="queryRef"
+        :inline="true"
+      >
+        <el-form-item class="section-title" label="载具类别" />
+        <el-form-item>
+          <!-- <el-button type="success" icon="Refresh" @click="handleQueryCategory">刷新</el-button> -->
+          <el-button
+            type="primary"
+            icon="Plus"
+            @click="handleShowCategoryDialog(null)"
+            v-hasPermi="['business:carrier:add']"
+            >新增
+          </el-button>
+        </el-form-item>
+        <el-form-item>
+          <!-- <el-button type="success" icon="Refresh" @click="handleQueryCategory">刷新</el-button> -->
+          <el-button
+            type="primary"
+            icon="Plus"
+            @click="handleMultipleCategoryDialog(null)"
+            v-hasPermi="['*:*:*']"
+            >批量新增
+          </el-button>
+        </el-form-item>
+      </el-form>
+      <!-- 列表区 -->
+      <div class="el-table-container">
+        <div class="el-table-inner-container">
+          <el-tree
+            ref="categoryTable"
+            v-loading="categoryLoading"
+            :data="carrierCategoryList"
+            :props="{ label: 'name', children: 'children' }"
+            :expand-on-click-node="false"
+            default-expand-all
+            node-key="id"
+            highlight-current
+            @node-click="handleCurrentCategoryChange"
+          >
+            <template #default="{ node, data }">
+              <div
+                style="
+                  display: flex;
+                  width: 100%;
+                  justify-content: space-between;
+                "
+              >
+                <span>
+                  <span
+                    v-if="data.parentId == 0"
+                    style="display: inline-block; width: 20px"
+                    >{{ getNodeIndex(data) }}.
+                  </span>
+                  <span>{{ node.label }}</span>
+                </span>
+                <span>
+                  <el-button
+                    link
+                    type="warning"
+                    icon="Edit"
+                    @click="handleShowCategoryDialog(data)"
+                    v-hasPermi="['business:carrier:edit']"
+                    >编辑
+                  </el-button>
+                  <el-button
+                    link
+                    type="danger"
+                    icon="Delete"
+                    @click="handleDeleteCategory(data)"
+                    v-hasPermi="['business:carrier:remove']"
+                    >删除
+                  </el-button>
+                </span>
+              </div>
+            </template>
+          </el-tree>
+        </div>
+      </div>
+    </section>
 
-		<!-- 右侧区域 -->
-		<section class="list-part-container" style="flex: 2">
-			<el-form class="list-search-container" :model="carrierParams" ref="queryRef" :inline="true">
-				<el-form-item class="section-title" label="载具管理" />
-				<el-form-item label="载具编号:">
-					<el-input placeholder="请输入载具编号" :disabled="!carrierFlag" clearable style="width: 180px" v-model.trim="carrierParams.code" @keydown.enter.prevent />
-				</el-form-item>
-				<el-form-item>
-					<el-button type="info" icon="Search" :disabled="carrierCategoryList.length == 0" @click="handleQueryCarrier"> 搜索 </el-button>
-					<!-- <el-button type="primary" icon="Plus" @click="handleShowCarrierDialog(null)" v-hasPermi="['business:carrier:add']">新增</el-button> -->
-					<el-button :disabled="selections.length == 0" type="warning" icon="Download" @click="handleBatchDownloadQrCode">批量下载二维码</el-button>
-					<el-button :disabled="selections.length == 0" type="warning" icon="Printer" @click="handleBatchPrintQrCode">打印</el-button>
-					<!-- <el-button :disabled="selections.length == 0" type="warning" icon="Printer" @click="handleBatchPrintPdf">pdf</el-button> -->
-				</el-form-item>
-			</el-form>
+    <!-- 右侧区域 -->
+    <section class="list-part-container" style="flex: 2">
+      <el-form
+        class="list-search-container"
+        :model="carrierParams"
+        ref="queryRef"
+        :inline="true"
+      >
+        <el-form-item class="section-title" label="载具管理" />
+        <el-form-item label="载具编号:">
+          <el-input
+            placeholder="请输入载具编号"
+            :disabled="!carrierFlag"
+            clearable
+            style="width: 180px"
+            v-model.trim="carrierParams.code"
+            @keydown.enter.prevent
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button
+            type="info"
+            icon="Search"
+            :disabled="carrierCategoryList.length == 0"
+            @click="handleQueryCarrier"
+          >
+            搜索
+          </el-button>
+          <!-- <el-button type="primary" icon="Plus" @click="handleShowCarrierDialog(null)" v-hasPermi="['business:carrier:add']">新增</el-button> -->
+          <el-button
+            :disabled="selections.length == 0"
+            type="warning"
+            icon="Download"
+            @click="handleBatchDownloadQrCode"
+            >批量下载二维码</el-button
+          >
+          <el-button
+            :disabled="selections.length == 0"
+            type="warning"
+            icon="Printer"
+            @click="handleBatchPrintQrCode"
+            >打印</el-button
+          >
+          <!-- <el-button :disabled="selections.length == 0" type="warning" icon="Printer" @click="handleBatchPrintPdf">pdf</el-button> -->
+        </el-form-item>
+      </el-form>
 
-			<!-- 列表区 -->
-			<div class="el-table-container">
-				<div class="el-table-inner-container">
-					<el-table v-loading="carrierLoading" row-key="id" @selection-change="handleSelectionChange" :data="carrierList" height="100%">
-						<el-table-column type="selection" width="40" align="center" :reserve-selection="true" />
-						<el-table-column type="index" label="行号" width="50" align="center" />
-						<el-table-column prop="code" label="载具编号" width="80" align="center" />
-						<el-table-column label="状态" width="80" prop="isAbandoned" align="center">
-							<template #default="scope">
-								<dict-tag :options="carrier_status" :value="scope.row.isAbandoned" />
-							</template>
-						</el-table-column>
-						<!--            <el-table-column label="是否多批" width="80" prop="isAllowMore" align="center">-->
-						<!--              <template #default="scope">-->
-						<!--                {{ scope.row.status }}-->
-						<!--                <dict-tag :options="is_allow_more" :value="scope.row.isAllowMore" />-->
-						<!--              </template>-->
-						<!--            </el-table-column>-->
-						<el-table-column prop="createTime" label="添加日期" width="130" align="center">
-							<template #default="scope">
-								{{ proxy.moment(scope.row.createTime).format('YYYY-MM-DD') }}
-							</template>
-						</el-table-column>
-						<el-table-column prop="remark" label="备注" align="center" />
-						<!-- <el-table-column prop="abandonmentDate" label="废弃日期" width="120" align="center">
+      <!-- 列表区 -->
+      <div class="el-table-container">
+        <div class="el-table-inner-container">
+          <el-table
+            v-loading="carrierLoading"
+            row-key="id"
+            @selection-change="handleSelectionChange"
+            :data="carrierList"
+            height="100%"
+          >
+            <el-table-column
+              type="selection"
+              width="40"
+              align="center"
+              :reserve-selection="true"
+            />
+            <el-table-column
+              type="index"
+              label="行号"
+              width="50"
+              align="center"
+            />
+            <el-table-column
+              prop="code"
+              label="载具编号"
+              width="80"
+              align="center"
+            />
+            <el-table-column
+              label="状态"
+              width="80"
+              prop="isAbandoned"
+              align="center"
+            >
+              <template #default="scope">
+                <dict-tag
+                  :options="carrier_status"
+                  :value="scope.row.isAbandoned"
+                />
+              </template>
+            </el-table-column>
+            <!--            <el-table-column label="是否多批" width="80" prop="isAllowMore" align="center">-->
+            <!--              <template #default="scope">-->
+            <!--                {{ scope.row.status }}-->
+            <!--                <dict-tag :options="is_allow_more" :value="scope.row.isAllowMore" />-->
+            <!--              </template>-->
+            <!--            </el-table-column>-->
+            <el-table-column
+              prop="createTime"
+              label="添加日期"
+              width="130"
+              align="center"
+            >
+              <template #default="scope">
+                {{ proxy.moment(scope.row.createTime).format("YYYY-MM-DD") }}
+              </template>
+            </el-table-column>
+            <el-table-column prop="remark" label="备注" align="center" />
+            <!-- <el-table-column prop="abandonmentDate" label="废弃日期" width="120" align="center">
               <template #default="scope">
                 {{
                   scope.row.abandonmentDate && proxy.moment(scope.row.abandonmentDate).format('YYYY-MM-DD') !== '1970-01-01'
@@ -85,269 +205,326 @@
                 {{ scope.row.abandonmentReason ? scope.row.abandonmentReason : '-' }}
               </template>
             </el-table-column> -->
-						<el-table-column label="操作" width="180" align="center">
-							<template #default="scope">
-								<!--                <el-button-->
-								<!--                  link-->
-								<!--                  type="warning"-->
-								<!--                  icon="Edit"-->
-								<!--                  @click="handleShowCarrierDialog(scope.row.id)"-->
-								<!--                  v-hasPermi="['business:carrier:edit']"-->
-								<!--                >-->
-								<!--                  编辑-->
-								<!--                </el-button>-->
-								<el-button v-if="scope.row.isAbandoned === 0" link type="danger" icon="Delete" @click="handleShowAbandonDialog(scope.row.id)" v-hasPermi="['business:carrier:abandonment']"> 废弃 </el-button>
-								<el-button v-else link type="success" icon="CircleCheck" @click="handleUnAbandoned(scope.row)" v-hasPermi="['business:carrier:unAbandonment']">取消废弃 </el-button>
-							</template>
-						</el-table-column>
-					</el-table>
-				</div>
-			</div>
+            <el-table-column label="操作" width="180" align="center">
+              <template #default="scope">
+                <!--                <el-button-->
+                <!--                  link-->
+                <!--                  type="warning"-->
+                <!--                  icon="Edit"-->
+                <!--                  @click="handleShowCarrierDialog(scope.row.id)"-->
+                <!--                  v-hasPermi="['business:carrier:edit']"-->
+                <!--                >-->
+                <!--                  编辑-->
+                <!--                </el-button>-->
+                <el-button
+                  v-if="scope.row.isAbandoned === 0"
+                  link
+                  type="danger"
+                  icon="Delete"
+                  @click="handleShowAbandonDialog(scope.row.id)"
+                  v-hasPermi="['business:carrier:abandonment']"
+                >
+                  废弃
+                </el-button>
+                <el-button
+                  v-else
+                  link
+                  type="success"
+                  icon="CircleCheck"
+                  @click="handleUnAbandoned(scope.row)"
+                  v-hasPermi="['business:carrier:unAbandonment']"
+                  >取消废弃
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
 
-			<!-- 分页 -->
-			<pagination v-show="carrierTotal > 0" :total="carrierTotal" v-model:page="carrierParams.pageNum" v-model:limit="carrierParams.pageSize" @pagination="getCarriers" />
-		</section>
+      <!-- 分页 -->
+      <pagination
+        v-show="carrierTotal > 0"
+        :total="carrierTotal"
+        v-model:page="carrierParams.pageNum"
+        v-model:limit="carrierParams.pageSize"
+        @pagination="getCarriers"
+      />
+    </section>
 
-		<!-- 载具类别表单 -->
-		<carrier-category-form ref="carrierCategoryRef" @handleSaveSuccess="handleQueryCategory" />
+    <!-- 载具类别表单 -->
+    <carrier-category-form
+      ref="carrierCategoryRef"
+      @handleSaveSuccess="handleQueryCategory"
+    />
+    <multiple-category-form
+      ref="multipleCategoryRef"
+      @handleSaveSuccess="handleQueryCategory"
+    />
 
-		<!-- 载具表单 -->
-		<carrier-form ref="carrierRef" @handleSaveSuccess="handleRefreshCarrier" />
+    <!-- 载具表单 -->
+    <carrier-form ref="carrierRef" @handleSaveSuccess="handleRefreshCarrier" />
 
-		<!-- 废弃弹窗 -->
-		<carrier-abandonment-form ref="carrierAbandonmentRef" @handleSaveSuccess="handleRefreshCarrier" />
-		<div id="image-group" style="height: 0px; width: 0px">
-			<el-image v-for="item in selections" :key="item.id" :src="webHost + item.qcCode" fit="cover" style="width: 100mm; height: 100mm"> </el-image>
-		</div>
-	</div>
+    <!-- 废弃弹窗 -->
+    <carrier-abandonment-form
+      ref="carrierAbandonmentRef"
+      @handleSaveSuccess="handleRefreshCarrier"
+    />
+    <div id="image-group" style="height: 0px; width: 0px">
+      <el-image
+        v-for="item in selections"
+        :key="item.id"
+        :src="webHost + item.qcCode"
+        fit="cover"
+        style="width: 100mm; height: 100mm"
+      >
+      </el-image>
+    </div>
+  </div>
 </template>
 
 <script setup name="Process">
-import { listCategory, delCategory, listCarrier, saveCarrierReject, download, printQrcodePdf } from '@/api/business/carrier'
-import carrierForm from './form'
-import printJS from 'print-js'
-import carrierCategoryForm from './formCategory'
-import carrierAbandonmentForm from './formAbandonment'
-import { nextTick } from 'vue'
-import JSZip from 'jszip'
-import { saveAs } from 'file-saver'
-const { proxy } = getCurrentInstance()
-const { carrier_status } = proxy.useDict('carrier_status')
-const { is_allow_more } = proxy.useDict('is_allow_more')
-const webHost = import.meta.env.VITE_APP_PRODUCTION_API
-const categoryTable = ref(null)
-const carrierCategoryList = ref([])
-const carrierList = ref([])
-const currentCategory = ref({})
-const carrierFlag = ref(true)
-const categoryLoading = ref(false)
-const carrierLoading = ref(false)
-const carrierTotal = ref(0)
-const selections = ref([])
+import {
+  listCategory,
+  delCategory,
+  listCarrier,
+  saveCarrierReject,
+  download,
+  printQrcodePdf,
+} from "@/api/business/carrier";
+import carrierForm from "./form";
+import printJS from "print-js";
+import carrierCategoryForm from "./formCategory";
+import carrierAbandonmentForm from "./formAbandonment";
+import multipleCategoryForm from "./multipleForm";
+import { nextTick } from "vue";
+import JSZip from "jszip";
+import { saveAs } from "file-saver";
+const { proxy } = getCurrentInstance();
+const { carrier_status } = proxy.useDict("carrier_status");
+const { is_allow_more } = proxy.useDict("is_allow_more");
+const webHost = import.meta.env.VITE_APP_PRODUCTION_API;
+const categoryTable = ref(null);
+const carrierCategoryList = ref([]);
+const carrierList = ref([]);
+const currentCategory = ref({});
+const carrierFlag = ref(true);
+const categoryLoading = ref(false);
+const carrierLoading = ref(false);
+const carrierTotal = ref(0);
+const selections = ref([]);
 const data = reactive({
-	form: {},
-	queryParams: {
-		code: '',
-		pageNum: 1,
-		pageSize: 10,
-	},
-	carrierParams: {
-		code: '',
-		pageNum: 1,
-		pageSize: 10,
-	},
-})
+  form: {},
+  queryParams: {
+    code: "",
+    pageNum: 1,
+    pageSize: 10,
+  },
+  carrierParams: {
+    code: "",
+    pageNum: 1,
+    pageSize: 10,
+  },
+});
 
-const { queryParams, carrierParams } = toRefs(data)
+const { queryParams, carrierParams } = toRefs(data);
 
 /****************************  载具类别相关事件  ****************************/
 /** 载具分类列表 */
 const getCategories = () => {
-	categoryLoading.value = true
-	listCategory().then((res) => {
-		categoryLoading.value = false
-		carrierCategoryList.value = res.rows
-		if (carrierCategoryList.value.length > 0) {
-			currentCategory.value = carrierCategoryList.value[0]
-			nextTick(() => {
-				proxy.$refs.categoryTable.setCurrentKey(currentCategory.value.id)
-				handleCurrentCategoryChange(currentCategory.value)
-			})
-		}
-	})
-}
+  categoryLoading.value = true;
+  listCategory().then((res) => {
+    categoryLoading.value = false;
+    carrierCategoryList.value = res.rows;
+    if (carrierCategoryList.value.length > 0) {
+      currentCategory.value = carrierCategoryList.value[0];
+      nextTick(() => {
+        proxy.$refs.categoryTable.setCurrentKey(currentCategory.value.id);
+        handleCurrentCategoryChange(currentCategory.value);
+      });
+    }
+  });
+};
+
+/**
+ * 批量新增载具
+ */
+const handleMultipleCategoryDialog = () => {
+  proxy.$refs.multipleCategoryRef.open();
+};
 /**载具类别点击事件 */
 const handleCurrentCategoryChange = (row) => {
-	if (row) {
-		currentCategory.value = row
-	} else {
-		currentCategory.value = {}
-		if (carrierCategoryList.value.length > 0) {
-			currentCategory.value = carrierCategoryList.value[0]
-		}
-	}
-	if (currentCategory.value.id) {
-		getCarriers()
-	} else {
-		carrierList.value = []
-		carrierTotal.value = 0
-	}
-}
+  if (row) {
+    currentCategory.value = row;
+  } else {
+    currentCategory.value = {};
+    if (carrierCategoryList.value.length > 0) {
+      currentCategory.value = carrierCategoryList.value[0];
+    }
+  }
+  if (currentCategory.value.id) {
+    getCarriers();
+  } else {
+    carrierList.value = [];
+    carrierTotal.value = 0;
+  }
+};
 /**载具类别编号 */
 function getNodeIndex(data) {
-	const index = carrierCategoryList.value.findIndex((item) => item.id === data.id)
-	return index + 1
+  const index = carrierCategoryList.value.findIndex(
+    (item) => item.id === data.id
+  );
+  return index + 1;
 }
 /**打开载具类别弹窗 */
 function handleShowCategoryDialog(data) {
-	if (data) {
-		proxy.$refs.carrierCategoryRef.open(data.id)
-	} else {
-		proxy.$refs.carrierCategoryRef.open()
-	}
+  if (data) {
+    proxy.$refs.carrierCategoryRef.open(data.id);
+  } else {
+    proxy.$refs.carrierCategoryRef.open();
+  }
 }
 
 /** 删除按钮操作 */
 const handleDeleteCategory = (data) => {
-	// 禁用按钮点击
-	disableButtons()
-	var showErrorMessage = false
-	proxy.$modal
-		.confirm('确定删除选中项?')
-		.then(() => {
-			categoryLoading.value = true
-			carrierLoading.value = true
-			if (data.children) {
-				showErrorMessage = true
-				return Promise.reject(new Error('HasChildrenError'))
-			}
-			return delCategory(data.id)
-		})
-		.then(() => {
-			if (!showErrorMessage) {
-				proxy.$modal.msgSuccess('操作成功!')
-				getCategories()
-			}
-		})
-		.catch(() => {
-			categoryLoading.value = false
-			carrierLoading.value = false
-		})
-		.finally(() => {
-			if (showErrorMessage) {
-				proxy.$modal.msgError('该载具类别下有子类别,不能删除')
-			}
-			categoryLoading.value = false
-			carrierLoading.value = false
-			// 启用按钮点击
-			enableButtons()
-		})
-}
+  // 禁用按钮点击
+  disableButtons();
+  var showErrorMessage = false;
+  proxy.$modal
+    .confirm("确定删除选中项?")
+    .then(() => {
+      categoryLoading.value = true;
+      carrierLoading.value = true;
+      if (data.children) {
+        showErrorMessage = true;
+        return Promise.reject(new Error("HasChildrenError"));
+      }
+      return delCategory(data.id);
+    })
+    .then(() => {
+      if (!showErrorMessage) {
+        proxy.$modal.msgSuccess("操作成功!");
+        getCategories();
+      }
+    })
+    .catch(() => {
+      categoryLoading.value = false;
+      carrierLoading.value = false;
+    })
+    .finally(() => {
+      if (showErrorMessage) {
+        proxy.$modal.msgError("该载具类别下有子类别,不能删除");
+      }
+      categoryLoading.value = false;
+      carrierLoading.value = false;
+      // 启用按钮点击
+      enableButtons();
+    });
+};
 /**禁用按钮 */
 function disableButtons() {
-	//禁用按钮同时,禁用载具编号的输入框
-	carrierFlag.value = false
-	// 禁用页面上所有按钮的点击事件
-	const buttons = document.querySelectorAll('button')
-	buttons.forEach((button) => {
-		button.disabled = true
-	})
+  //禁用按钮同时,禁用载具编号的输入框
+  carrierFlag.value = false;
+  // 禁用页面上所有按钮的点击事件
+  const buttons = document.querySelectorAll("button");
+  buttons.forEach((button) => {
+    button.disabled = true;
+  });
 }
 /**取消禁用按钮 */
 function enableButtons() {
-	carrierFlag.value = true
-	// 启用页面上所有按钮的点击事件
-	const buttons = document.querySelectorAll('button')
-	buttons.forEach((button) => {
-		button.disabled = false
-	})
+  carrierFlag.value = true;
+  // 启用页面上所有按钮的点击事件
+  const buttons = document.querySelectorAll("button");
+  buttons.forEach((button) => {
+    button.disabled = false;
+  });
 }
 /**载具类别查询 */
 const handleQueryCategory = () => {
-	getCategories()
-}
+  getCategories();
+};
 /****************************  载具相关事件  ****************************/
 /**获取载具数据 */
 const getCarriers = () => {
-	disableButtons()
-	categoryLoading.value = true
-	carrierLoading.value = true
-	carrierParams.value.categoryId = currentCategory.value.id
-	listCarrier(carrierParams.value).then((res) => {
-		enableButtons()
-		categoryLoading.value = false
-		carrierLoading.value = false
-		carrierList.value = res.rows
-		carrierTotal.value = res.total
-	})
-}
+  disableButtons();
+  categoryLoading.value = true;
+  carrierLoading.value = true;
+  carrierParams.value.categoryId = currentCategory.value.id;
+  listCarrier(carrierParams.value).then((res) => {
+    enableButtons();
+    categoryLoading.value = false;
+    carrierLoading.value = false;
+    carrierList.value = res.rows;
+    carrierTotal.value = res.total;
+  });
+};
 
 /**
  * 列表checkbox列选择 事件
  */
 function handleSelectionChange(selection) {
-	selections.value = selection
-	console.log(selections.value)
+  selections.value = selection;
+  console.log(selections.value);
 }
 /**刷新载具 */
 const handleRefreshCarrier = () => {
-	getCarriers()
-}
+  getCarriers();
+};
 /**载具查询 */
 const handleQueryCarrier = () => {
-	carrierParams.value.pageNum = 1
-	handleRefreshCarrier()
-}
+  carrierParams.value.pageNum = 1;
+  handleRefreshCarrier();
+};
 
 /** 修改按钮操作 */
 const handleShowCarrierDialog = (id) => {
-	proxy.$refs.carrierRef.open({ categoryId: currentCategory.value.id, id: id })
-}
+  proxy.$refs.carrierRef.open({ categoryId: currentCategory.value.id, id: id });
+};
 /**打开废弃弹窗 */
 const handleShowAbandonDialog = (id) => {
-	proxy.$refs.carrierAbandonmentRef.open({ id: id })
-}
+  proxy.$refs.carrierAbandonmentRef.open({ id: id });
+};
 /** 取消废弃*/
 const handleUnAbandoned = (row) => {
-	proxy.$modal
-		.confirm('确定取消废弃选中项?')
-		.then(() => {
-			var carrierReject = {}
-			carrierReject.carrierId = row.id
-			carrierReject.isAbandoned = 0
-			carrierReject.operaionDate = proxy.moment().format('YYYY-MM-DD')
-			return saveCarrierReject(carrierReject)
-		})
-		.then(() => {
-			proxy.$modal.msgSuccess('操作成功!')
-			handleRefreshCarrier()
-		})
-		.catch(() => {})
-}
+  proxy.$modal
+    .confirm("确定取消废弃选中项?")
+    .then(() => {
+      var carrierReject = {};
+      carrierReject.carrierId = row.id;
+      carrierReject.isAbandoned = 0;
+      carrierReject.operaionDate = proxy.moment().format("YYYY-MM-DD");
+      return saveCarrierReject(carrierReject);
+    })
+    .then(() => {
+      proxy.$modal.msgSuccess("操作成功!");
+      handleRefreshCarrier();
+    })
+    .catch(() => {});
+};
 
 const handleBatchPrintQrCode = async () => {
-	const imageGroup = document.getElementById('image-group')
-	// for (var i = 0; i < selections.value.length; i++) {
-	//   console.log(webHost + selections.value[i].qcCode);
-	//   const img = document.createElement('img');
-	//   img.src = webHost + selections.value[i].qcCode
-	//   imageGroup.appendChild(img);
-	// }
-	printJS({
-		printable: 'image-group', // 这里是你要打印内容的DOM元素的id
-		type: 'html',
-		style: '@page { size: auto;  margin: 0mm; }', // 可以添加打印样式
-	})
-	// window.print();
-}
+  const imageGroup = document.getElementById("image-group");
+  // for (var i = 0; i < selections.value.length; i++) {
+  //   console.log(webHost + selections.value[i].qcCode);
+  //   const img = document.createElement('img');
+  //   img.src = webHost + selections.value[i].qcCode
+  //   imageGroup.appendChild(img);
+  // }
+  printJS({
+    printable: "image-group", // 这里是你要打印内容的DOM元素的id
+    type: "html",
+    style: "@page { size: auto;  margin: 0mm; }", // 可以添加打印样式
+  });
+  // window.print();
+};
 
 const handleBatchPrintPdf = () => {
-	printQrcodePdf(selections.value.map((v) => v.id)).then((res) => {
-		const blob = new Blob([res], { type: 'application/pdf' })
-		var url = URL.createObjectURL(blob)
-		window.open(url, 'filename')
-	})
-}
+  printQrcodePdf(selections.value.map((v) => v.id)).then((res) => {
+    const blob = new Blob([res], { type: "application/pdf" });
+    var url = URL.createObjectURL(blob);
+    window.open(url, "filename");
+  });
+};
 
 // /** 批量下载二维码 */
 // function handleBatchDownloadQrCode() {
@@ -369,44 +546,44 @@ const handleBatchPrintPdf = () => {
 // }
 /**批量下载二维码 */
 async function handleBatchDownloadQrCode() {
-	console.log(selections.value)
+  console.log(selections.value);
 
-	const zip = new JSZip()
-	const zipFilename = '二维码.zip'
+  const zip = new JSZip();
+  const zipFilename = "二维码.zip";
 
-	for (var i = 0; i < selections.value.length; i++) {
-		console.log(webHost + selections.value[i].qcCode)
+  for (var i = 0; i < selections.value.length; i++) {
+    console.log(webHost + selections.value[i].qcCode);
 
-		// 下载二维码图片数据
-		const qrCodeResponse = await fetch(webHost + selections.value[i].qcCode)
-		const qrCodeBlob = await qrCodeResponse.blob()
+    // 下载二维码图片数据
+    const qrCodeResponse = await fetch(webHost + selections.value[i].qcCode);
+    const qrCodeBlob = await qrCodeResponse.blob();
 
-		// 将二维码图片添加到 ZIP 文件中
-		zip.file(selections.value[i].code + '.png', qrCodeBlob)
-	}
+    // 将二维码图片添加到 ZIP 文件中
+    zip.file(selections.value[i].code + ".png", qrCodeBlob);
+  }
 
-	// 生成 ZIP 文件并提供下载
-	zip.generateAsync({ type: 'blob' }).then((content) => {
-		// 使用 FileSaver.js 将 ZIP 文件保存到本地
-		saveAs(content, zipFilename)
-	})
+  // 生成 ZIP 文件并提供下载
+  zip.generateAsync({ type: "blob" }).then((content) => {
+    // 使用 FileSaver.js 将 ZIP 文件保存到本地
+    saveAs(content, zipFilename);
+  });
 }
 
 onMounted(() => {
-	getCategories()
-})
+  getCategories();
+});
 </script>
 <style scoped>
 :deep(.el-tree-node__label) {
-	font-size: 14px !important;
-	display: inline-block;
-	width: 100%;
+  font-size: 14px !important;
+  display: inline-block;
+  width: 100%;
 }
 
 :deep(.el-tree-node__content) {
-	height: 40px;
-	border-bottom: 1px solid #ebeef5;
-	padding: 8px 0;
-	line-height: 23px;
+  height: 40px;
+  border-bottom: 1px solid #ebeef5;
+  padding: 8px 0;
+  line-height: 23px;
 }
 </style>

+ 147 - 0
src/views/business/carrier/multipleForm.vue

@@ -0,0 +1,147 @@
+<template>
+  <el-dialog
+    title="载具类别表单"
+    v-model="visible"
+    width="400px"
+    append-to-body
+    draggable
+  >
+    <div class="form-container">
+      <el-form
+        ref="carrierCategoryRef"
+        v-loading="loading"
+        class="master-container"
+        :model="form"
+        :rules="rules"
+        label-width="80px"
+      >
+        <el-form-item label="父级类别" prop="parentId" :rules="rules">
+          <el-tree-select
+            v-model="form.parentId"
+            :data="parentCategories"
+            check-strictly
+            :render-after-expand="false"
+          />
+        </el-form-item>
+
+        <el-form-item label="起始箱码" prop="startCode">
+          <el-input v-model.trim="form.startCode" placeholder="起始箱码" />
+        </el-form-item>
+        <el-form-item label="结束箱码" prop="remark">
+          <el-input v-model.trim="form.endCode" placeholder="结束箱码" />
+        </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 { getCategory, saveMulyipleCategory } from "@/api/business/carrier";
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(["handleSaveSuccess"]);
+/** 字典数组区 */
+const { is_allow_more } = proxy.useDict("is_allow_more");
+/** 父类别 */
+const parentCategories = ref([]);
+const loading = ref(false);
+const visible = ref(false);
+const data = reactive({
+  form: {},
+  rules: {
+    name: [{ required: true, message: "类别名称不能为空", trigger: "blur" }],
+    parentId: [
+      { required: true, trigger: "blur", validator: validateParentId },
+    ],
+  },
+});
+const { form, rules } = toRefs(data);
+
+/***********************  方法区  ****************************/
+/** 打开抽屉 */
+function open(id) {
+  reset();
+  visible.value = true;
+  loading.value = true;
+  getCategory(id || 0).then((res) => {
+    if (res.data.formData) {
+      form.value = res.data.formData;
+      form.value.isAllowMore = form.value.isAllowMore + "";
+    }
+    parentCategories.value = res.data.parentOptions;
+    parentCategories.value.unshift({
+      value: "0",
+      label: "一级分类",
+    });
+    if (id) {
+      var index = parentCategories.value.findIndex((obj) => obj.value === id);
+      if (index > -1) {
+        parentCategories.value.splice(index, 1);
+      }
+    }
+    loading.value = false;
+  });
+}
+
+/** 取消按钮 */
+function handleCancel() {
+  visible.value = false;
+  reset();
+}
+
+/** 表单重置 */
+function reset() {
+  form.value = {
+    id: null,
+    parentId: "0",
+    code: "",
+    name: "",
+    remark: "",
+    sort: 1,
+  };
+  proxy.resetForm("carrierCategoryRef");
+}
+
+/** 提交按钮 */
+function handleSave() {
+  console.log("-----------------", form.value);
+  saveMulyipleCategory(form.value).then((res) => {
+    if (res.code === 200) {
+      proxy.$modal.msgSuccess("操作成功");
+      emit("handleSaveSuccess");
+    }
+    visible.value = false;
+  });
+  // proxy.$refs["carrierCategoryRef"].validate((valid) => {
+  //   if (valid) {
+  //     saveCategory(form.value).then((res) => {
+  //       if (res.code === 200) {
+  //         proxy.$modal.msgSuccess("操作成功");
+  //         emit("handleSaveSuccess");
+  //       }
+  //       visible.value = false;
+  //     });
+  //   }
+  // });
+}
+
+/**
+ * 校验自己不能是自己的父级
+ */
+function validateParentId(rule, value, callback) {
+  if (value == form.value.id) {
+    callback(new Error("不能选择自己为父级"));
+  } else {
+    callback();
+  }
+}
+
+/** 暴露给父组件的方法 */
+defineExpose({
+  open,
+});
+</script>

+ 12 - 8
src/views/business/daywork/form.vue

@@ -416,16 +416,20 @@ const open = (row) => {
     maxQuailifiedNum.value = row.maxQuailifiedNum;
     form.value.workHoursTimestamp = 0;
     form.value.prodNum = row.prodNum;
-    getProcessList({ technologicalProcessId: row.technologicalProcessId }).then(
-      (res) => {
-        processList.value = res.data;
-        for (let i = 0; i < processList.value.length; i++) {
-          if (processList.value[i].label === row.processAlias.trim()) {
-            form.value.processId = processList.value[i].value;
-          }
+    // technologicalProcessId: row.technologicalProcessId
+    getProcessList({
+      technologicalProcessId: row.technologicalProcessId,
+      isAmend: row.isAmend,
+      isWasteRecycling: row.isWasteRecycling,
+      lotId: row.lotId,
+    }).then((res) => {
+      processList.value = res.data;
+      for (let i = 0; i < processList.value.length; i++) {
+        if (processList.value[i].label === row.processAlias.trim()) {
+          form.value.processId = processList.value[i].value;
         }
       }
-    );
+    });
     getDayworkItemRejectList({ dayworkItemId: detailInfo.value.id }).then(
       (response) => {
         if (response.code == 200) {

+ 216 - 50
src/views/business/daywork/index.vue

@@ -3,90 +3,246 @@
     <!-- 左侧区域 -->
     <section class="list-part-container" style="flex: 3">
       <!-- 搜索区 -->
-      <el-form class="list-search-container" :model="queryDayworkParams" ref="queryRef" :inline="true"
-        style="margin-right: 0px">
+      <el-form
+        class="list-search-container"
+        :model="queryDayworkParams"
+        ref="queryRef"
+        :inline="true"
+        style="margin-right: 0px"
+      >
         <el-form-item class="section-title" label="生产批次" />
         <el-form-item label="生产计划单号:">
-          <el-input placeholder="请输入生产计划单号/批次号" v-model.trim="queryDayworkParams.productionPlanNo"
-            @keydown.enter.prevent clearable style="width: 200px" />
+          <el-input
+            placeholder="请输入生产计划单号/批次号"
+            v-model.trim="queryDayworkParams.productionPlanNo"
+            @keydown.enter.prevent
+            clearable
+            style="width: 200px"
+          />
         </el-form-item>
         <el-form-item label="产品描述:">
-          <el-input placeholder="请输入产品描述" v-model.trim="queryDayworkParams.productDescription" @keydown.enter.prevent
-            clearable style="width: 130px" />
+          <el-input
+            placeholder="请输入产品描述"
+            v-model.trim="queryDayworkParams.productDescription"
+            @keydown.enter.prevent
+            clearable
+            style="width: 130px"
+          />
         </el-form-item>
         <el-form-item class="section-title" label="请选择当前工段:">
-          <el-select-v2 v-model="queryDayworkParams.deptId" :options="deptList" placeholder="请选择工段" style="width: 140px"
-            @change="handleDeptChange" />
+          <el-select-v2
+            v-model="queryDayworkParams.deptId"
+            :options="deptList"
+            placeholder="请选择工段"
+            style="width: 140px"
+            @change="handleDeptChange"
+          />
         </el-form-item>
         <el-form-item style="margin-left: 0">
-          <el-button type="info" icon="Search" :disabled="deptList.length === 0" @click="handleQuery">搜索
+          <el-button
+            type="info"
+            icon="Search"
+            :disabled="deptList.length === 0"
+            @click="handleQuery"
+            >搜索
           </el-button>
         </el-form-item>
       </el-form>
       <div class="el-table-container">
         <div class="el-table-inner-container">
-          <el-table ref="dayworkTable" :data="dayworkList" v-loading="dayworkLoading" highlight-current-row
-            height="100%" @current-change="handleDayworkCurrentChange">
-            <el-table-column label="客户简称" prop="companyAlias" width="120" align="center" />
-            <el-table-column label="生产计划单号" prop="productionPlanNo" width="100" align="center" />
-            <el-table-column label="批次号" min-width="120" prop="lotCode" align="center">
+          <el-table
+            ref="dayworkTable"
+            :data="dayworkList"
+            v-loading="dayworkLoading"
+            highlight-current-row
+            height="100%"
+            @current-change="handleDayworkCurrentChange"
+          >
+            <el-table-column
+              label="客户简称"
+              prop="companyAlias"
+              width="120"
+              align="center"
+            />
+            <el-table-column
+              label="生产计划单号"
+              prop="productionPlanNo"
+              width="100"
+              align="center"
+            />
+            <el-table-column
+              label="批次号"
+              min-width="120"
+              prop="lotCode"
+              align="center"
+            >
               <template #default="scope">
-                <el-button link type="primary" v-hasPermi="['business:productionPlan:query']"
-                  @click="handleColumnClick(scope.row)"><span>{{ scope.row.lotCode }}</span></el-button>
+                <el-button
+                  link
+                  type="primary"
+                  v-hasPermi="['business:productionPlan:query']"
+                  @click="handleColumnClick(scope.row)"
+                  ><span>{{ scope.row.lotCode }}</span></el-button
+                >
               </template>
             </el-table-column>
-            <el-table-column label="产品描述" prop="productDescription" align="center" />
-            <el-table-column label="图纸版本" prop="technologyVersion" width="60" align="center" />
-            <el-table-column label="投产量" prop="productionQuantity" width="60" align="center" />
-            <el-table-column label="下达日期" prop="createTime" width="100" align="center">
+            <el-table-column
+              label="产品描述"
+              prop="productDescription"
+              align="center"
+            />
+            <el-table-column
+              label="图纸版本"
+              prop="technologyVersion"
+              width="60"
+              align="center"
+            />
+            <el-table-column
+              label="投产量"
+              prop="productionQuantity"
+              width="60"
+              align="center"
+            />
+            <el-table-column
+              label="下达日期"
+              prop="createTime"
+              width="100"
+              align="center"
+            >
               <template #default="scope">
                 <span>{{
-        proxy.moment(scope.row.createTime).format("YYYY-MM-DD")
-      }}</span>
+                  proxy.moment(scope.row.createTime).format("YYYY-MM-DD")
+                }}</span>
               </template>
             </el-table-column>
-            <el-table-column label="报工总时长" prop="totalWorkingHours" width="150" align="center" />
+            <el-table-column
+              label="报工总时长"
+              prop="totalWorkingHours"
+              width="150"
+              align="center"
+            />
           </el-table>
         </div>
       </div>
       <!-- 分页 -->
-      <pagination v-show="total > 0" :total="total" v-model:page="queryDayworkParams.pageNum"
-        v-model:limit="queryDayworkParams.pageSize" @pagination="getDayworks" />
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryDayworkParams.pageNum"
+        v-model:limit="queryDayworkParams.pageSize"
+        @pagination="getDayworks"
+      />
     </section>
     <!-- 右侧区域 -->
     <section class="list-part-container" style="flex: 2">
       <el-form class="list-search-container" :inline="true">
         <el-form-item class="section-title" label="报工信息" />
-        <el-form-item class="section-title" label="请选择工序:" prop="processId">
-          <el-select-v2 v-model="queryItemParams.processId" clearable :options="processList" placeholder="请选择工序"
-            style="width: 100%" @change="handleProcessChange" />
+        <el-form-item
+          class="section-title"
+          label="请选择工序:"
+          prop="processId"
+        >
+          <el-select-v2
+            v-model="queryItemParams.processId"
+            clearable
+            :options="processList"
+            placeholder="请选择工序"
+            style="width: 100%"
+            @change="handleProcessChange"
+          />
         </el-form-item>
       </el-form>
 
       <div class="el-table-container">
         <div class="el-table-inner-container">
-          <el-table :data="dayworkItemList" v-loading="dayworkItemLoading" height="100%">
-            <el-table-column label="操作者" prop="nickName" width="60" align="center" />
-            <el-table-column label="工序名称" prop="processAlias" align="center" />
-            <el-table-column label="投产量" prop="prodNum" width="60" align="center" />
-            <el-table-column label="合格数" prop="qualifiedNum" width="60" align="center" />
-            <el-table-column label="废品数" prop="rejectNum" width="60" align="center" />
-            <el-table-column label="开始时间" prop="startTime" width="160" align="center" />
-            <el-table-column label="结束时间" prop="endTime" width="160" align="center" />
-            <el-table-column label="总工时" prop="workingHours" width="160" align="center" />
-            <el-table-column label="生产状态" prop="status" width="100" align="center">
+          <el-table
+            :data="dayworkItemList"
+            v-loading="dayworkItemLoading"
+            height="100%"
+          >
+            <el-table-column
+              label="操作者"
+              prop="nickName"
+              width="60"
+              align="center"
+            />
+            <el-table-column
+              label="工序名称"
+              prop="processAlias"
+              align="center"
+            />
+            <el-table-column
+              label="投产量"
+              prop="prodNum"
+              width="60"
+              align="center"
+            />
+            <el-table-column
+              label="合格数"
+              prop="qualifiedNum"
+              width="60"
+              align="center"
+            />
+            <el-table-column
+              label="废品数"
+              prop="rejectNum"
+              width="60"
+              align="center"
+            />
+            <el-table-column
+              label="开始时间"
+              prop="startTime"
+              width="160"
+              align="center"
+            />
+            <el-table-column
+              label="结束时间"
+              prop="endTime"
+              width="160"
+              align="center"
+            />
+            <el-table-column
+              label="总工时"
+              prop="workingHours"
+              width="160"
+              align="center"
+            />
+            <el-table-column
+              label="生产状态"
+              prop="status"
+              width="100"
+              align="center"
+            >
               <template #default="scope">
                 <dict-tag :options="daywork_status" :value="scope.row.status" />
               </template>
             </el-table-column>
-            <el-table-column fixed="right" label="操作" align="center" width="70px">
+            <el-table-column
+              fixed="right"
+              label="操作"
+              align="center"
+              width="70px"
+            >
               <template #default="scope">
-                <el-button v-if="scope.row.deptProcessStatus &&
-        (scope.row.status == 2 || scope.row.status == 3) &&
-        scope.row.processId == latestProcessId
-        " link type="warning" icon="Edit" @click="handleUpdateDayworkItem(scope.row)">编辑
+                <el-button
+                  v-if="
+                    scope.row.deptProcessStatus &&
+                    (scope.row.status == 2 || scope.row.status == 3) &&
+                    scope.row.processId == latestProcessId
+                  "
+                  link
+                  type="warning"
+                  icon="Edit"
+                  @click="handleUpdateDayworkItem(scope.row)"
+                  >编辑
                 </el-button>
-                <el-button v-else link type="primary" icon="View" @click="handleCheckDayworkItem(scope.row)">查看
+                <el-button
+                  v-else
+                  link
+                  type="primary"
+                  icon="View"
+                  @click="handleCheckDayworkItem(scope.row)"
+                  >查看
                 </el-button>
               </template>
             </el-table-column>
@@ -94,11 +250,19 @@
         </div>
       </div>
       <!-- 分页 -->
-      <pagination v-show="itemTotal > 0" :total="itemTotal" v-model:page="queryItemParams.pageNum"
-        v-model:limit="queryItemParams.pageSize" @pagination="getDayworkItems" />
+      <pagination
+        v-show="itemTotal > 0"
+        :total="itemTotal"
+        v-model:page="queryItemParams.pageNum"
+        v-model:limit="queryItemParams.pageSize"
+        @pagination="getDayworkItems"
+      />
     </section>
     <!-- 报工信息表单 -->
-    <daywork-item-form ref="dayworkItemRef" @handleSaveSuccess="handleGetDayworkItems" />
+    <daywork-item-form
+      ref="dayworkItemRef"
+      @handleSaveSuccess="handleGetDayworkItems"
+    />
   </div>
 </template>
 
@@ -283,6 +447,8 @@ function handleUpdateDayworkItem(row) {
   row.productionPlanDetailId = currentDaywork.value.productionPlanDetailId;
   row.dayworkId = currentDaywork.value.id;
   row.lotId = currentDaywork.value.lotId;
+  row.isAmend = currentDaywork.value.isAmend;
+  row.isWasteRecycling = currentDaywork.value.isWasteRecycling;
   row.maxQuailifiedNum = maxQuailifiedNum;
   row.totalQuailifiedNum = totalQuailifiedNum;
   //判断是否是当前工段
@@ -377,9 +543,9 @@ function getProcess() {
   //工序下拉框
   getProcessList({
     technologicalProcessId: queryItemParams.value.technologicalProcessId,
-    isWasteRecycling:currentDaywork.value.isWasteRecycling,
-    isAmend:currentDaywork.value.isAmend,
-    lotId:currentDaywork.value.lotId
+    isWasteRecycling: currentDaywork.value.isWasteRecycling,
+    isAmend: currentDaywork.value.isAmend,
+    lotId: currentDaywork.value.lotId,
   }).then((res) => {
     processList.value = res.data;
   });