mao 1 rok pred
rodič
commit
848a0dc6ab

+ 1 - 1
package.json

@@ -31,7 +31,7 @@
     "moment": "^2.29.4",
     "nprogress": "0.2.0",
     "pinia": "2.0.22",
-    "qs": "^6.11.0",
+    "qs": "^6.11.2",
     "sortable.js": "^0.3.0",
     "sortablejs": "^1.15.0",
     "vue": "3.2.45",

+ 21 - 6
src/views/business/carrier/form.vue

@@ -7,12 +7,15 @@
         <!--        <el-form-item label="载具编号" prop="code" required>-->
         <!--          <el-input v-model.trim="form.code" placeholder="请输入载具编号" />-->
         <!--        </el-form-item>-->
-        <el-form-item label="是否多批" prop="status">
-          <el-select v-model="form.isAllowMore">
-            <el-option v-for="item in is_allow_more" :key="item.value" :label="item.label"
-                       :value="item.value"></el-option>
-          </el-select>
+        <el-form-item label="父级类别" prop="parentId">
+          <el-tree-select v-model="form.categoryId" :data="parentCategories" :render-after-expand="false" />
         </el-form-item>
+<!--        <el-form-item label="是否多批" prop="status">-->
+<!--          <el-select v-model="form.isAllowMore">-->
+<!--            <el-option v-for="item in is_allow_more" :key="item.value" :label="item.label"-->
+<!--                       :value="item.value"></el-option>-->
+<!--          </el-select>-->
+<!--        </el-form-item>-->
         <el-form-item label="备注" prop="remark">
           <el-input v-model.trim="form.remark" placeholder="请输入备注"/>
         </el-form-item>
@@ -25,15 +28,18 @@
   </el-dialog>
 </template>
 <script setup>
-import {getCarrier, saveCarrier, updateCarrier} from '@/api/business/carrier'
+import {getCarrier, getCategory, saveCarrier, updateCarrier} from '@/api/business/carrier'
 
 const {proxy} = getCurrentInstance()
 const {is_allow_more} = proxy.useDict('is_allow_more')
 const emit = defineEmits(['handleSaveSuccess'])
+const parentCategories = ref([])
 
 const loading = ref(false)
 const visible = ref(false)
 const form = ref({})
+const categoryFrom = ref({})
+
 const rules = {
   code: [{required: true, message: '载具编号不能为空', trigger: 'blur'}]
 }
@@ -65,6 +71,15 @@ const reset = () => {
   proxy.resetForm('carrierFormRef')
 }
 
+getCategory(0).then((res) => {
+  if (res.data.formData) {
+    categoryFrom.value = res.data.formData
+  }
+  console.log(res.data.parentOptions)
+  parentCategories.value = res.data.parentOptions
+  loading.value = false
+})
+
 /** 提交按钮 */
 const handleSave = () => {
   proxy.$refs['carrierFormRef'].validate((valid) => {

+ 35 - 12
src/views/business/carrier/formCategory.vue

@@ -1,15 +1,22 @@
 <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">
-          <el-tree-select v-model="form.parentId" :data="parentCategories" check-strictly :render-after-expand="false" />
+      <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="name">
-          <el-input v-model.trim="form.name" placeholder="类别名称" />
+          <el-input v-model.trim="form.name" placeholder="类别名称"/>
+        </el-form-item>
+        <el-form-item label="是否多批" prop="status" v-if="form.parentId !== '0'">
+          <el-select v-model="form.isAllowMore">
+            <el-option v-for="item in is_allow_more" :key="item.value" :label="item.label"
+                       :value="item.value"></el-option>
+          </el-select>
         </el-form-item>
         <el-form-item label="备注" prop="remark">
-          <el-input v-model.trim="form.remark" placeholder="请填写备注" />
+          <el-input v-model.trim="form.remark" placeholder="请填写备注"/>
         </el-form-item>
       </el-form>
     </div>
@@ -20,8 +27,10 @@
   </el-dialog>
 </template>
 <script setup>
-import { getCategory, saveCategory } from '@/api/business/carrier'
-const { proxy } = getCurrentInstance()
+import {getCategory, saveCategory} from '@/api/business/carrier'
+
+const {proxy} = getCurrentInstance()
+const {is_allow_more} = proxy.useDict('is_allow_more')
 const emit = defineEmits(['handleSaveSuccess'])
 
 /** 父类别 */
@@ -32,10 +41,12 @@ const visible = ref(false)
 const data = reactive({
   form: {},
   rules: {
-    name: [{ required: true, message: '类别名称不能为空', trigger: 'blur' }]
+    name: [{required: true, message: '类别名称不能为空', trigger: 'blur'}],
+    parentId: {required: true, trigger: "blur", validator: validateParentId}
   }
 })
-const { form, rules } = toRefs(data)
+const {form, rules} = toRefs(data)
+
 /***********************  方法区  ****************************/
 /** 打开抽屉 */
 function open(id) {
@@ -45,6 +56,7 @@ function open(id) {
   getCategory(id || 0).then((res) => {
     if (res.data.formData) {
       form.value = res.data.formData
+      form.value.isAllowMore = form.value.isAllowMore + ''
     }
     console.log(res.data.parentOptions)
     parentCategories.value = res.data.parentOptions
@@ -52,10 +64,10 @@ function open(id) {
       value: '0',
       label: '一级分类'
     })
-    if(id) {
+    if (id) {
       var index = parentCategories.value.findIndex(obj => obj.value === id);
-      if(index > -1) {
-      parentCategories.value.splice(index,1)
+      if (index > -1) {
+        parentCategories.value.splice(index, 1)
       }
     }
     loading.value = false
@@ -96,6 +108,17 @@ function handleSave() {
   })
 }
 
+/**
+ * 校验自己不能是自己的父级
+ */
+function validateParentId(rule, value, callback) {
+  if (value == form.value.id) {
+    callback(new Error('不能选择自己为父级'))
+  } else {
+    callback()
+  }
+}
+
 /** 暴露给父组件的方法 */
 defineExpose({
   open

+ 118 - 87
src/views/business/carrier/index.vue

@@ -4,10 +4,12 @@
     <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 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-button type="primary" icon="Plus" @click="handleShowCategoryDialog(null)"
+                     v-hasPermi="['business:carrier:add']">新增
+          </el-button>
         </el-form-item>
       </el-form>
       <!-- 列表区 -->
@@ -27,7 +29,10 @@
               </template>
             </el-table-column>
           </el-table> -->
-          <el-tree ref="categoryTable" v-loading="categoryLoading" :data="carrierCategoryList" :props="{ label: 'name', children: 'children' }" :expand-on-click-node="false" :filter-node-method="filterNode" default-expand-all node-key="id" highlight-current @node-click="handleCurrentCategoryChange">
+          <el-tree ref="categoryTable" v-loading="categoryLoading" :data="carrierCategoryList"
+                   :props="{ label: 'name', children: 'children' }" :expand-on-click-node="false"
+                   :filter-node-method="filterNode" default-expand-all node-key="id" highlight-current
+                   @node-click="handleCurrentCategoryChange">
             <template #default="{ node, data }">
               <div style="
                   display: flex;
@@ -35,13 +40,17 @@
                   justify-content: space-between;
                 ">
                 <span>
-                  <span v-if="data.parentId == 0" style="display: inline-block; width: 20px;">{{ getNodeIndex(data) }}. </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 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 link type="danger" icon="Delete" @click="handleDeleteCategory(data)"
+                             v-hasPermi="['business:carrier:remove']">删除
                   </el-button>
                 </span>
               </div>
@@ -54,43 +63,49 @@
     <!-- 右侧区域 -->
     <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 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-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="info" icon="Search" :disabled="carrierCategoryList.length == 0" @click="handleQueryCarrier">
+            搜索
+          </el-button>
           <!-- <el-button type="success" icon="Refresh" @click="handleRefreshCarrier">刷新</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="Download"
+                     @click="handleBatchDownloadQrCode">批量下载二维码
+          </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 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">
                 {{ scope.row.status }}
-                <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" />
+                <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="remark" label="备注" align="center"/>
             <!-- <el-table-column prop="abandonmentDate" label="废弃日期" width="120" align="center">
               <template #default="scope">
                 {{
@@ -107,11 +122,17 @@
             </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 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>
+                <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>
@@ -119,31 +140,33 @@
       </div>
 
       <!-- 分页 -->
-      <pagination v-show="carrierTotal > 0" :total="carrierTotal" v-model:page="carrierParams.pageNum" v-model:limit="carrierParams.pageSize" @pagination="getCarriers" />
+      <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"/>
 
     <!-- 载具表单 -->
-    <carrier-form ref="carrierRef" @handleSaveSuccess="handleRefreshCarrier" />
+    <carrier-form ref="carrierRef" @handleSaveSuccess="handleRefreshCarrier"/>
 
     <!-- 废弃弹窗 -->
-    <carrier-abandonment-form ref="carrierAbandonmentRef" @handleSaveSuccess="handleRefreshCarrier" />
+    <carrier-abandonment-form ref="carrierAbandonmentRef" @handleSaveSuccess="handleRefreshCarrier"/>
   </div>
 </template>
 
 <script setup name="Process">
-import { listCategory, delCategory, listCarrier, saveCarrierReject, download } from '@/api/business/carrier'
+import {listCategory, delCategory, listCarrier, saveCarrierReject, download} from '@/api/business/carrier'
 import carrierForm from './form'
 import carrierCategoryForm from './formCategory'
 import carrierAbandonmentForm from './formAbandonment'
-import { nextTick } from 'vue'
+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')
+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([])
@@ -168,7 +191,7 @@ const data = reactive({
   }
 })
 
-const { queryParams, carrierParams } = toRefs(data)
+const {queryParams, carrierParams} = toRefs(data)
 /** 查询对象 */
 
 /****************************  载具类别相关事件  ****************************/
@@ -212,10 +235,12 @@ const handleCurrentCategoryChange = (row) => {
     carrierTotal.value = 0
   }
 }
+
 function getNodeIndex(data) {
   const index = carrierCategoryList.value.findIndex((item) => item.id === data.id)
   return index + 1
 }
+
 function handleShowCategoryDialog(data) {
   if (data) {
     proxy.$refs.carrierCategoryRef.open(data.id)
@@ -226,40 +251,41 @@ function handleShowCategoryDialog(data) {
 
 /** 删除按钮操作 */
 const handleDeleteCategory = (data) => {
-   // 禁用按钮点击
-   disableButtons();
-   var showErrorMessage = false
+  // 禁用按钮点击
+  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();
-    })
+      .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
@@ -286,7 +312,7 @@ const handleQueryCategory = () => {
 
 const getCarriers = () => {
   disableButtons();
-   categoryLoading.value = true
+  categoryLoading.value = true
   carrierLoading.value = true
   carrierParams.value.categoryId = currentCategory.value.id
   listCarrier(carrierParams.value).then((res) => {
@@ -297,6 +323,7 @@ const getCarriers = () => {
     carrierTotal.value = res.total
   })
 }
+
 /**
  * 列表checkbox列选择 事件
  */
@@ -304,6 +331,7 @@ function handleSelectionChange(selection) {
   selections.value = selection
   console.log(selections.value)
 }
+
 const handleRefreshCarrier = () => {
   getCarriers()
 }
@@ -315,28 +343,29 @@ const handleQueryCarrier = () => {
 
 /** 修改按钮操作 */
 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(() => {})
+      .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(() => {
+      })
 }
 
 // /** 批量下载二维码 */
@@ -359,7 +388,7 @@ const handleUnAbandoned = (row) => {
 // }
 async function handleBatchDownloadQrCode() {
   console.log(selections.value);
-  
+
   const zip = new JSZip();
   const zipFilename = '二维码.zip';
 
@@ -373,13 +402,14 @@ async function handleBatchDownloadQrCode() {
     // 将二维码图片添加到 ZIP 文件中
     zip.file(selections.value[i].code + '.png', qrCodeBlob);
   }
-  
+
   // 生成 ZIP 文件并提供下载
-  zip.generateAsync({ type: 'blob' }).then((content) => {
+  zip.generateAsync({type: 'blob'}).then((content) => {
     // 使用 FileSaver.js 将 ZIP 文件保存到本地
     saveAs(content, zipFilename);
   });
 }
+
 onMounted(() => {
   getCategories()
 })
@@ -390,6 +420,7 @@ onMounted(() => {
   display: inline-block;
   width: 100%;
 }
+
 :deep(.el-tree-node__content) {
   height: 40px;
   border-bottom: 1px solid #ebeef5;