Răsfoiți Sursa

前端修改tab

lipenghui 5 luni în urmă
părinte
comite
322b0b5759

+ 21 - 0
src/api/supplier/base/index.ts

@@ -1,4 +1,5 @@
 import request from '@/config/axios'
+import {Sku} from "@/api/mall/product/spu";
 
 // 供应商主数据 VO
 export interface SupplierVO {
@@ -21,6 +22,26 @@ export interface SupplierVO {
   remark: string // 备注
 }
 
+export interface Supplier {
+  id?: number // 主键
+  code?: string // 供应商编号 自动生成
+  name?: string // 供应商名称
+  classification?: string // 供应商分类
+  type?: string // 公司类型
+  nature?: string // 供应商性质
+  creditCode?: string // 社会信用代码
+  tin?: string // 纳税人识别号
+  corporation?: string // 法人
+  incorporationDate?: Date // 成立日期
+  address?: string // 公司地址
+  bizScope?: string // 经营范围
+  registeredCapital?: number // 注册资金 单位:万元
+  annualTurnove?: number // 年营业额 单位:万元
+  size?: string // 公司规模 数据字典
+  status?: number // 商品状态: 1 草稿 2活动 3 关闭
+  remark?: string // 备注
+}
+
 // 供应商主数据 API
 export const Api = {
   // 查询供应商主数据分页

+ 26 - 0
src/router/modules/remaining.ts

@@ -242,6 +242,32 @@ const remainingRouter: AppRouteRecordRaw[] = [
       hidden: true
     },
     children: [
+      {
+        path: 'supplier/detail/add',
+        component: () => import('@/views/supplier/base/form/index.vue'),
+        name: 'SupplierDetailAdd',
+        meta: {
+          noCache: false,
+          hidden: true,
+          canTo: true,
+          icon: 'ep:edit',
+          title: '供应商添加',
+          activeMenu: '/supplier/base'
+        }
+      },
+      {
+        path: 'supplier/detail/edit/:id(\\d+)',
+        component: () => import('@/views/supplier/base/form/index.vue'),
+        name: 'SupplierDetailEdit',
+        meta: {
+          noCache: true,
+          hidden: true,
+          canTo: true,
+          icon: 'ep:edit',
+          title: '供应商编辑',
+          activeMenu: '/supplier/base'
+        }
+      },
       {
         path: '/supplier/detail/info/:id(\\d+)',
         component: () => import('@/views/supplier/base/form/index.vue'),

+ 47 - 5
src/views/supplier/base/Form.vue

@@ -10,9 +10,13 @@
 <!--      <el-form-item label="供应商编号" prop="code">-->
 <!--        <el-input v-model="formData.code" placeholder="请输入供应商编号" />-->
 <!--      </el-form-item>-->
+      <el-row>
+      <el-col :span="12">
       <el-form-item label="供应商名称" prop="name">
         <el-input v-model="formData.name" placeholder="请输入供应商名称" />
       </el-form-item>
+      </el-col>
+        <el-col :span="12">
       <el-form-item label="供应商分类" prop="classification">
         <el-select v-model="formData.classification" placeholder="请选择">
           <el-option
@@ -23,6 +27,10 @@
           />
         </el-select>
       </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
       <el-form-item label="公司类型" prop="type">
         <el-select v-model="formData.type" placeholder="请选择">
           <el-option
@@ -33,6 +41,8 @@
           />
         </el-select>
       </el-form-item>
+        </el-col>
+        <el-col :span="12">
       <el-form-item label="供应商性质" prop="nature">
         <el-select v-model="formData.nature" placeholder="请选择">
           <el-option
@@ -43,6 +53,10 @@
           />
         </el-select>
       </el-form-item>
+          </el-col>
+        </el-row>
+      <el-row>
+        <el-col :span="12">
       <el-form-item label="状态" prop="status">
         <el-select v-model="formData.status" placeholder="请选择">
           <el-option
@@ -53,6 +67,8 @@
           />
         </el-select>
       </el-form-item>
+          </el-col>
+        <el-col :span="12">
       <el-form-item label="公司规模" prop="size">
         <el-select v-model="formData.size" placeholder="请选择">
           <el-option
@@ -63,15 +79,27 @@
           />
         </el-select>
       </el-form-item>
+          </el-col>
+        </el-row>
+      <el-row>
+        <el-col :span="12">
       <el-form-item label="社会信用代码" prop="creditCode">
         <el-input v-model="formData.creditCode" placeholder="请输入社会信用代码" />
       </el-form-item>
+          </el-col>
+        <el-col :span="12">
       <el-form-item label="纳税人识别号" prop="tin">
         <el-input v-model="formData.tin" placeholder="请输入纳税人识别号" />
       </el-form-item>
+          </el-col>
+        </el-row>
+      <el-row>
+        <el-col :span="12">
       <el-form-item label="法人" prop="corporation">
         <el-input v-model="formData.corporation" placeholder="请输入法人" />
       </el-form-item>
+        </el-col>
+        <el-col :span="12">
       <el-form-item label="成立日期" prop="incorporationDate">
         <el-date-picker
           v-model="formData.incorporationDate"
@@ -80,21 +108,35 @@
           placeholder="选择成立日期"
         />
       </el-form-item>
+          </el-col>
+        </el-row>
+      <el-row>
+        <el-col :span="12">
       <el-form-item label="公司地址" prop="address">
         <el-input v-model="formData.address" placeholder="请输入公司地址" />
       </el-form-item>
-      <el-form-item label="经营范围" prop="bizScope">
-        <el-input type="textarea" v-model="formData.bizScope" placeholder="请输入经营范围" />
-      </el-form-item>
+        </el-col>
+        <el-col :span="12">
       <el-form-item label="注册资金" prop="registeredCapital">
         <el-input type="number" v-model="formData.registeredCapital" placeholder="请输入注册资金 单位:万元" />
       </el-form-item>
+          </el-col>
+        </el-row>
       <el-form-item label="年营业额" prop="annualTurnove">
         <el-input type="number" v-model="formData.annualTurnove" placeholder="请输入年营业额 单位:万元" />
       </el-form-item>
-      <el-form-item label="备注" prop="remark">
-        <el-input v-model="formData.remark" placeholder="请输入备注" />
+      <el-row>
+        <el-col :span="12">
+      <el-form-item label="经营范围" prop="bizScope">
+        <el-input type="textarea" v-model="formData.bizScope" placeholder="请输入经营范围" />
       </el-form-item>
+          </el-col>
+        <el-col :span="12">
+        <el-form-item label="备注" prop="remark">
+          <el-input type="textarea" v-model="formData.remark" placeholder="请输入备注" />
+        </el-form-item>
+          </el-col>
+        </el-row>
     </el-form>
     <template #footer>
       <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>

+ 341 - 0
src/views/supplier/base/form/SupplierInfoForm.vue

@@ -0,0 +1,341 @@
+<!-- 商品发布 - 基础设置 -->
+<template>
+  <ContentWrap v-loading="formLoading">
+    <el-form
+      ref="formRef"
+      :disabled="isDetail"
+      :model="formData"
+      :rules="rules"
+      label-width="120px"
+    >
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="供应商名称" prop="name">
+            <el-input v-model="formData.name" placeholder="请输入供应商名称" class="w-80!" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="供应商分类" prop="classification">
+            <el-select v-model="formData.classification" placeholder="请选择" class="w-80!">
+              <el-option
+                v-for="dict in getIntDictOptions(DICT_TYPE.SUPPLIER_TYPE)"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="公司类型" prop="type">
+            <el-select v-model="formData.type" placeholder="请选择" class="w-80!">
+              <el-option
+                v-for="dict in getIntDictOptions(DICT_TYPE.SUPPLIER_COMPANY_TYPE)"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="供应商性质" prop="nature">
+            <el-select v-model="formData.nature" placeholder="请选择" class="w-80!">
+              <el-option
+                v-for="dict in getIntDictOptions(DICT_TYPE.SUPPLIER_NATURE)"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="状态" prop="status">
+            <el-select v-model="formData.status" placeholder="请选择" class="w-80!">
+              <el-option
+                v-for="dict in getIntDictOptions(DICT_TYPE.SUPPLIER_STATUS)"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="公司规模" prop="size">
+            <el-select v-model="formData.size" placeholder="请选择" class="w-80!">
+              <el-option
+                v-for="dict in getIntDictOptions(DICT_TYPE.SUPPLIER_SIZE)"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="社会信用代码" prop="creditCode">
+            <el-input
+              v-model="formData.creditCode"
+              class="w-80!"
+              placeholder="请输入社会信用代码"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="纳税人识别号" prop="tin">
+            <el-input v-model="formData.tin" class="w-80!" placeholder="请输入纳税人识别号" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="法人" prop="corporation">
+            <el-input v-model="formData.corporation" class="w-80!" placeholder="请输入法人" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="成立日期" prop="incorporationDate">
+            <el-date-picker
+              class="w-80!"
+              v-model="formData.incorporationDate"
+              type="date"
+              value-format="x"
+              placeholder="选择成立日期"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="公司地址" prop="address">
+            <el-input v-model="formData.address" class="w-80!" placeholder="请输入公司地址" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="注册资金" prop="registeredCapital">
+            <el-input
+              type="number"
+              v-model="formData.registeredCapital"
+              class="w-80!"
+              placeholder="请输入注册资金"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-form-item label="年营业额" prop="annualTurnove">
+        <el-input
+          v-model="formData.annualTurnove"
+          type="number"
+          class="w-80!"
+          placeholder="请输入年营业额"
+        />
+      </el-form-item>
+      <el-form-item label="经营范围" prop="bizScope">
+        <el-input type="textarea" v-model="formData.bizScope" placeholder="请输入经营范围" />
+      </el-form-item>
+      <el-form-item label="备注" prop="remark">
+        <el-input type="textarea" v-model="formData.remark" placeholder="请输入备注" />
+      </el-form-item>
+      <!--    <el-form-item label="商品简介" prop="introduction">-->
+      <!--      <el-input-->
+      <!--        v-model="formData.introduction"-->
+      <!--        :autosize="{ minRows: 2, maxRows: 2 }"-->
+      <!--        :clearable="true"-->
+      <!--        :show-word-limit="true"-->
+      <!--        class="w-80!"-->
+      <!--        maxlength="128"-->
+      <!--        placeholder="请输入商品简介"-->
+      <!--        type="textarea"-->
+      <!--      />-->
+      <!--    </el-form-item>-->
+      <!--    <el-form-item label="商品封面图" prop="picUrl">-->
+      <!--      <UploadImg v-model="formData.picUrl" :disabled="isDetail" height="80px" />-->
+      <!--    </el-form-item>-->
+      <!--    <el-form-item label="商品轮播图" prop="sliderPicUrls">-->
+      <!--      <UploadImgs v-model="formData.sliderPicUrls" :disabled="isDetail" />-->
+      <!--    </el-form-item>-->
+    </el-form>
+    <el-form>
+      <el-form-item style="float: right">
+        <el-button v-if="!isDetail" :loading="formLoading" type="primary" @click="submitForm">
+          保存
+        </el-button>
+        <el-button @click="close">返回</el-button>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+</template>
+<script lang="ts" setup>
+import { PropType } from 'vue'
+import { copyValueToTarget } from '@/utils'
+import { propTypes } from '@/utils/propTypes'
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import { Api, SupplierVO } from '@/api/supplier/base'
+import {useTagsViewStore} from "@/store/modules/tagsView";
+import type { Supplier } from '@/api/supplier/base/index'
+const { delView } = useTagsViewStore() // 视图操作
+const { push, currentRoute } = useRouter() // 路由
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const { t } = useI18n() // 国际化
+defineOptions({ name: 'SupplierBaseInfo' })
+const props = defineProps({
+  propFormData: {
+    type: Object as PropType<Supplier>,
+    default: () => {}
+  },
+  isDetail: propTypes.bool.def(false), // 是否作为详情组件
+  supplierId: {type:String,required:true}
+})
+const supplierid = props.supplierId;
+const message = useMessage() // 消息弹窗
+const formRef = ref() // 表单 Ref
+const formData = reactive<Supplier>({
+  id: '',
+  code: undefined,
+  name: undefined,
+  classification: undefined,
+  type: undefined,
+  nature: undefined,
+  creditCode: undefined,
+  tin: undefined,
+  corporation: undefined,
+  incorporationDate: undefined,
+  address: undefined,
+  bizScope: undefined,
+  registeredCapital: undefined,
+  annualTurnove: undefined,
+  size: undefined,
+  status: undefined,
+  remark: undefined
+})
+// const rules = reactive({
+//   name: [required],
+//   categoryId: [required],
+//   keyword: [required],
+//   introduction: [required],
+//   picUrl: [required],
+//   sliderPicUrls: [required],
+//   brandId: [required]
+// })
+
+/** 将传进来的值赋值给 formData */
+watch(
+  () => props.propFormData,
+  (data) => {
+    if (!data) {
+      return
+    }
+    copyValueToTarget(formData, data)
+  },
+  {
+    immediate: true
+  }
+)
+
+const rules = reactive({
+  name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
+  classification: [{ required: true, message: '供应商分类不能为空', trigger: 'blur' }],
+  type: [{ required: true, message: '公司类型不能为空', trigger: 'blur' }],
+  nature: [{ required: true, message: '供应商性质不能为空', trigger: 'blur' }],
+  creditCode: [{ required: true, message: '社会信用代码不能为空', trigger: 'blur' }],
+  status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
+})
+
+/** 表单校验 */
+const validate = async () => {
+  if (!formRef) return
+  try {
+    await unref(formRef)?.validate()
+    // 校验通过更新数据
+    Object.assign(props.propFormData, formData)
+  } catch (e) {
+    message.error('【基础设置】不完善,请填写相关信息')
+    emit('update:activeName', 'info')
+    throw e // 目的截断之后的校验
+  }
+}
+defineExpose({ validate })
+const emit = defineEmits(['success','update:activeName','sendParam']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  // 校验表单
+  await formRef.value.validate()
+  // 提交请求
+  formLoading.value = true
+  try {
+    const data = formData as unknown as SupplierVO
+    if (!supplierid.id){
+      await Api.create(data).then(res => {
+        const param = {id: res}
+        emit('sendParam', param);
+      })
+      message.success(t('common.createSuccess'))
+    } else {
+      await Api.update(data)
+      message.success(t('common.updateSuccess'))
+    }
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+  //try {
+  // 校验各表单
+  // await unref(infoRef)?.validate()
+  // await unref(skuRef)?.validate()
+  // await unref(deliveryRef)?.validate()
+  // await unref(descriptionRef)?.validate()
+  // await unref(otherRef)?.validate()
+  // // 深拷贝一份, 这样最终 server 端不满足,不需要影响原始数据
+  // const deepCopyFormData = cloneDeep(unref(formData.value)) as ProductSpuApi.Spu
+  // deepCopyFormData.skus!.forEach((item) => {
+  //   // 给sku name赋值
+  //   item.name = deepCopyFormData.name
+  //   // sku相关价格元转分
+  //   item.price = convertToInteger(item.price)
+  //   item.marketPrice = convertToInteger(item.marketPrice)
+  //   item.costPrice = convertToInteger(item.costPrice)
+  //   item.firstBrokeragePrice = convertToInteger(item.firstBrokeragePrice)
+  //   item.secondBrokeragePrice = convertToInteger(item.secondBrokeragePrice)
+  // })
+  // // 处理轮播图列表
+  // const newSliderPicUrls: any[] = []
+  // deepCopyFormData.sliderPicUrls!.forEach((item: any) => {
+  //   // 如果是前端选的图
+  //   typeof item === 'object' ? newSliderPicUrls.push(item.url) : newSliderPicUrls.push(item)
+  // })
+  // deepCopyFormData.sliderPicUrls = newSliderPicUrls
+  // 校验都通过后提交表单
+  // const data = deepCopyFormData as ProductSpuApi.Spu
+  // const id = params.id as unknown as number
+  // if (!id) {
+  //   await ProductSpuApi.createSpu(data)
+  //   message.success(t('common.createSuccess'))
+  // } else {
+  //   await ProductSpuApi.updateSpu(data)
+  //   message.success(t('common.updateSuccess'))
+  // }
+  // close()
+  //} finally {
+  //  formLoading.value = false
+  //}
+}
+const close = () => {
+  delView(unref(currentRoute))
+  push({ name: 'Suppliers',query: {
+      date: new Date().getTime(),
+    } })
+}
+/** 初始化 */
+onMounted(async () => {
+  // 获得分类树
+  // const data = await ProductCategoryApi.getCategoryList({})
+  // categoryList.value = handleTree(data, 'id')
+  // 获取商品品牌列表
+  // brandList.value = await ProductBrandApi.getSimpleBrandList()
+  console.log(JSON.stringify(formData.value))
+})
+</script>

+ 132 - 147
src/views/supplier/base/form/index.vue

@@ -2,142 +2,127 @@
   <ContentWrap v-loading="formLoading">
     <el-tabs v-model="activeName">
       <el-tab-pane label="基础信息" name="info">
-        <InfoForm
+        <SupplierInfoForm
           ref="infoRef"
           v-model:activeName="activeName"
           :is-detail="isDetail"
           :propFormData="formData"
+          :supplierId="{ id }"
+          @sendParam="handleParamTransfer"
         />
       </el-tab-pane>
       <el-tab-pane label="证件信息" name="sku">
-        <SkuForm
-          ref="skuRef"
-          v-model:activeName="activeName"
-          :is-detail="isDetail"
-          :propFormData="formData"
-        />
-      </el-tab-pane>
-      <el-tab-pane label="联系人" name="delivery">
-        <DeliveryForm
-          ref="deliveryRef"
-          v-model:activeName="activeName"
-          :is-detail="isDetail"
-          :propFormData="formData"
-        />
-      </el-tab-pane>
-      <el-tab-pane label="核心产品" name="description">
-        <DescriptionForm
-          ref="descriptionRef"
-          v-model:activeName="activeName"
-          :is-detail="isDetail"
-          :propFormData="formData"
-        />
-      </el-tab-pane>
-      <el-tab-pane label="联系记录" name="other">
-        <OtherForm
-          ref="otherRef"
+        <CertList
+          ref="certRef"
           v-model:activeName="activeName"
           :is-detail="isDetail"
           :propFormData="formData"
+          :receivedParam="sharedParam"
         />
       </el-tab-pane>
+      <!--      <el-tab-pane label="联系人" name="delivery">-->
+      <!--        <DeliveryForm-->
+      <!--          ref="deliveryRef"-->
+      <!--          v-model:activeName="activeName"-->
+      <!--          :is-detail="isDetail"-->
+      <!--          :propFormData="formData"-->
+      <!--        />-->
+      <!--      </el-tab-pane>-->
+      <!--      <el-tab-pane label="核心产品" name="description">-->
+      <!--        <DescriptionForm-->
+      <!--          ref="descriptionRef"-->
+      <!--          v-model:activeName="activeName"-->
+      <!--          :is-detail="isDetail"-->
+      <!--          :propFormData="formData"-->
+      <!--        />-->
+      <!--      </el-tab-pane>-->
+      <!--      <el-tab-pane label="联系记录" name="other">-->
+      <!--        <OtherForm-->
+      <!--          ref="otherRef"-->
+      <!--          v-model:activeName="activeName"-->
+      <!--          :is-detail="isDetail"-->
+      <!--          :propFormData="formData"-->
+      <!--        />-->
+      <!--      </el-tab-pane>-->
     </el-tabs>
-    <el-form>
-      <el-form-item style="float: right">
-        <el-button v-if="!isDetail" :loading="formLoading" type="primary" @click="submitForm">
-          保存
-        </el-button>
-        <el-button @click="close">返回</el-button>
-      </el-form-item>
-    </el-form>
+    <!--    <el-form>-->
+    <!--      <el-form-item style="float: right">-->
+    <!--        <el-button v-if="!isDetail" :loading="formLoading" type="primary" @click="submitForm">-->
+    <!--          保存-->
+    <!--        </el-button>-->
+    <!--        <el-button @click="close">返回</el-button>-->
+    <!--      </el-form-item>-->
+    <!--    </el-form>-->
   </ContentWrap>
 </template>
 <script lang="ts" setup>
-import { cloneDeep } from 'lodash-es'
-import { useTagsViewStore } from '@/store/modules/tagsView'
 import * as ProductSpuApi from '@/api/mall/product/spu'
-import InfoForm from '@/views/mall/product/spu/form/InfoForm.vue'
-import DescriptionForm from '@/views/mall/product/spu/form/DescriptionForm.vue'
-import OtherForm from '@/views/mall/product/spu/form/OtherForm.vue'
-import SkuForm from '@/views/mall/product/spu/form/SkuForm.vue'
-import DeliveryForm from '@/views/mall/product/spu/form/DeliveryForm.vue'
-import { convertToInteger, floatToFixed2, formatToFraction } from '@/utils'
+import SupplierInfoForm from '@/views/supplier/base/form/SupplierInfoForm.vue'
+import CertList from '@/views/supplier/certificate/index.vue'
+import { Api, SupplierVO } from '@/api/supplier/base'
 
 defineOptions({ name: 'ProductSpuAdd' })
 
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
-const { push, currentRoute } = useRouter() // 路由
 const { params, name } = useRoute() // 查询参数
-const { delView } = useTagsViewStore() // 视图操作
-
+const sharedParam = ref(params.id as unknown as number); // 用于存储从 Tab 1 传递到 Tab 2 的参数
+// 处理参数传递的方法
+const handleParamTransfer = (param) => {
+  sharedParam.value = param.id;
+};
 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
 const activeName = ref('info') // Tag 激活的窗口
 const isDetail = ref(false) // 是否查看详情
 const infoRef = ref() // 商品信息 Ref
-const skuRef = ref() // 商品规格 Ref
-const deliveryRef = ref() // 物流设置 Ref
-const descriptionRef = ref() // 商品详情 Ref
-const otherRef = ref() // 其他设置 Ref
+const id = params.id as unknown as number
 // SPU 表单数据
-const formData = ref<ProductSpuApi.Spu>({
-  name: '', // 商品名称
-  categoryId: undefined, // 商品分类
-  keyword: '', // 关键字
-  picUrl: '', // 商品封面图
-  sliderPicUrls: [], // 商品轮播图
-  introduction: '', // 商品简介
-  deliveryTypes: [], // 配送方式数组
-  deliveryTemplateId: undefined, // 运费模版
-  brandId: undefined, // 商品品牌
-  specType: false, // 商品规格
-  subCommissionType: false, // 分销类型
-  skus: [
-    {
-      price: 0, // 商品价格
-      marketPrice: 0, // 市场价
-      costPrice: 0, // 成本价
-      barCode: '', // 商品条码
-      picUrl: '', // 图片地址
-      stock: 0, // 库存
-      weight: 0, // 商品重量
-      volume: 0, // 商品体积
-      firstBrokeragePrice: 0, // 一级分销的佣金
-      secondBrokeragePrice: 0 // 二级分销的佣金
-    }
-  ],
-  description: '', // 商品详情
-  sort: 0, // 商品排序
-  giveIntegral: 0, // 赠送积分
-  virtualSalesCount: 0 // 虚拟销量
+const formData = ref({
+  id: undefined,
+  code: undefined,
+  name: undefined,
+  classification: undefined,
+  type: undefined,
+  nature: undefined,
+  creditCode: undefined,
+  tin: undefined,
+  corporation: undefined,
+  incorporationDate: undefined,
+  address: undefined,
+  bizScope: undefined,
+  registeredCapital: undefined,
+  annualTurnove: undefined,
+  size: undefined,
+  status: undefined,
+  remark: undefined,
 })
 
 /** 获得详情 */
 const getDetail = async () => {
-  if ('ProductSpuDetail' === name) {
+  if ('SupplierDetailInfo' === name) {
     isDetail.value = true
   }
-  const id = params.id as unknown as number
+  debugger;
   if (id) {
     formLoading.value = true
     try {
-      const res = (await ProductSpuApi.getSpu(id)) as ProductSpuApi.Spu
-      res.skus?.forEach((item) => {
-        if (isDetail.value) {
-          item.price = floatToFixed2(item.price)
-          item.marketPrice = floatToFixed2(item.marketPrice)
-          item.costPrice = floatToFixed2(item.costPrice)
-          item.firstBrokeragePrice = floatToFixed2(item.firstBrokeragePrice)
-          item.secondBrokeragePrice = floatToFixed2(item.secondBrokeragePrice)
-        } else {
-          // 回显价格分转元
-          item.price = formatToFraction(item.price)
-          item.marketPrice = formatToFraction(item.marketPrice)
-          item.costPrice = formatToFraction(item.costPrice)
-          item.firstBrokeragePrice = formatToFraction(item.firstBrokeragePrice)
-          item.secondBrokeragePrice = formatToFraction(item.secondBrokeragePrice)
-        }
-      })
+      const res = (await Api.get(id)) as SupplierVO
+      // res.skus?.forEach((item) => {
+      //   if (isDetail.value) {
+      //     item.price = floatToFixed2(item.price)
+      //     item.marketPrice = floatToFixed2(item.marketPrice)
+      //     item.costPrice = floatToFixed2(item.costPrice)
+      //     item.firstBrokeragePrice = floatToFixed2(item.firstBrokeragePrice)
+      //     item.secondBrokeragePrice = floatToFixed2(item.secondBrokeragePrice)
+      //   } else {
+      //     // 回显价格分转元
+      //     item.price = formatToFraction(item.price)
+      //     item.marketPrice = formatToFraction(item.marketPrice)
+      //     item.costPrice = formatToFraction(item.costPrice)
+      //     item.firstBrokeragePrice = formatToFraction(item.firstBrokeragePrice)
+      //     item.secondBrokeragePrice = formatToFraction(item.secondBrokeragePrice)
+      //   }
+      // })
       formData.value = res
     } finally {
       formLoading.value = false
@@ -146,56 +131,56 @@ const getDetail = async () => {
 }
 
 /** 提交按钮 */
-const submitForm = async () => {
-  // 提交请求
-  formLoading.value = true
-  try {
-    // 校验各表单
-    await unref(infoRef)?.validate()
-    await unref(skuRef)?.validate()
-    await unref(deliveryRef)?.validate()
-    await unref(descriptionRef)?.validate()
-    await unref(otherRef)?.validate()
-    // 深拷贝一份, 这样最终 server 端不满足,不需要影响原始数据
-    const deepCopyFormData = cloneDeep(unref(formData.value)) as ProductSpuApi.Spu
-    deepCopyFormData.skus!.forEach((item) => {
-      // 给sku name赋值
-      item.name = deepCopyFormData.name
-      // sku相关价格元转分
-      item.price = convertToInteger(item.price)
-      item.marketPrice = convertToInteger(item.marketPrice)
-      item.costPrice = convertToInteger(item.costPrice)
-      item.firstBrokeragePrice = convertToInteger(item.firstBrokeragePrice)
-      item.secondBrokeragePrice = convertToInteger(item.secondBrokeragePrice)
-    })
-    // 处理轮播图列表
-    const newSliderPicUrls: any[] = []
-    deepCopyFormData.sliderPicUrls!.forEach((item: any) => {
-      // 如果是前端选的图
-      typeof item === 'object' ? newSliderPicUrls.push(item.url) : newSliderPicUrls.push(item)
-    })
-    deepCopyFormData.sliderPicUrls = newSliderPicUrls
-    // 校验都通过后提交表单
-    const data = deepCopyFormData as ProductSpuApi.Spu
-    const id = params.id as unknown as number
-    if (!id) {
-      await ProductSpuApi.createSpu(data)
-      message.success(t('common.createSuccess'))
-    } else {
-      await ProductSpuApi.updateSpu(data)
-      message.success(t('common.updateSuccess'))
-    }
-    close()
-  } finally {
-    formLoading.value = false
-  }
-}
+// const submitForm = async () => {
+//   // 提交请求
+//   formLoading.value = true
+//   try {
+//     // 校验各表单
+//     await unref(infoRef)?.validate()
+//     await unref(skuRef)?.validate()
+//     await unref(deliveryRef)?.validate()
+//     await unref(descriptionRef)?.validate()
+//     await unref(otherRef)?.validate()
+//     // 深拷贝一份, 这样最终 server 端不满足,不需要影响原始数据
+//     const deepCopyFormData = cloneDeep(unref(formData.value)) as ProductSpuApi.Spu
+//     deepCopyFormData.skus!.forEach((item) => {
+//       // 给sku name赋值
+//       item.name = deepCopyFormData.name
+//       // sku相关价格元转分
+//       item.price = convertToInteger(item.price)
+//       item.marketPrice = convertToInteger(item.marketPrice)
+//       item.costPrice = convertToInteger(item.costPrice)
+//       item.firstBrokeragePrice = convertToInteger(item.firstBrokeragePrice)
+//       item.secondBrokeragePrice = convertToInteger(item.secondBrokeragePrice)
+//     })
+//     // 处理轮播图列表
+//     const newSliderPicUrls: any[] = []
+//     deepCopyFormData.sliderPicUrls!.forEach((item: any) => {
+//       // 如果是前端选的图
+//       typeof item === 'object' ? newSliderPicUrls.push(item.url) : newSliderPicUrls.push(item)
+//     })
+//     deepCopyFormData.sliderPicUrls = newSliderPicUrls
+//     // 校验都通过后提交表单
+//     const data = deepCopyFormData as ProductSpuApi.Spu
+//     const id = params.id as unknown as number
+//     if (!id) {
+//       await ProductSpuApi.createSpu(data)
+//       message.success(t('common.createSuccess'))
+//     } else {
+//       await ProductSpuApi.updateSpu(data)
+//       message.success(t('common.updateSuccess'))
+//     }
+//     close()
+//   } finally {
+//     formLoading.value = false
+//   }
+// }
 
 /** 关闭按钮 */
-const close = () => {
-  delView(unref(currentRoute))
-  push({ name: 'ProductSpu' })
-}
+// const close = () => {
+//   delView(unref(currentRoute))
+//   push({ name: 'Suppliers' })
+// }
 
 /** 初始化 */
 onMounted(async () => {

+ 17 - 5
src/views/supplier/base/index.vue

@@ -204,10 +204,17 @@
 <script setup lang="ts">
 import { dateFormatter } from '@/utils/formatTime'
 import download from '@/utils/download'
-import { Api, VO } from '@/api/supplier/base'
+import { Api, SupplierVO } from '@/api/supplier/base'
 import Form from './Form.vue'
 import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
+import { useRoute, useRouter } from 'vue-router'
+import { watch } from 'vue'
 
+const route = useRoute()
+const router = useRouter() // 路由对象
+// watch(route, (to, from) => {
+//   router.go(0)
+// })
 /** 供应商主数据 列表 */
 defineOptions({ name: 'Suppliers' })
 
@@ -215,7 +222,7 @@ const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
 const { push } = useRouter() // 路由跳转
 const loading = ref(true) // 列表的加载中
-const list = ref<VO[]>([]) // 列表的数据
+const list = ref<SupplierVO[]>([]) // 列表的数据
 const total = ref(0) // 列表的总页数
 const queryParams = reactive({
   pageNo: 1,
@@ -270,10 +277,15 @@ const resetQuery = () => {
 
 /** 添加/修改操作 */
 const formRef = ref()
-const openForm = (type: string, id?: number) => {
-  formRef.value.open(type, id)
+const openForm = (type?:string,id?: number) => {
+  // 修改
+  if (typeof id === 'number') {
+    push({ name: 'SupplierDetailEdit', params: { id } })
+    return
+  }
+  // 新增
+  push({ name: 'SupplierDetailAdd' })
 }
-
 /** 删除按钮操作 */
 const handleDelete = async (id: number) => {
   try {

+ 29 - 22
src/views/supplier/certificate/CertificateForm.vue

@@ -7,16 +7,16 @@
       label-width="100px"
       v-loading="formLoading"
     >
-      <el-form-item label="供应商" prop="supplierId">
-        <el-select v-model="formData.supplierId" filterable placeholder="请选择">
-          <el-option
-            v-for="dict in supplierList"
-            :key="dict.id"
-            :label="dict.name"
-            :value="dict.id"
-          />
-        </el-select>
-      </el-form-item>
+      <!--      <el-form-item label="供应商" prop="supplierId">-->
+      <!--        <el-select v-model="formData.supplierId" filterable placeholder="请选择">-->
+      <!--          <el-option-->
+      <!--            v-for="dict in supplierList"-->
+      <!--            :key="dict.id"-->
+      <!--            :label="dict.name"-->
+      <!--            :value="dict.id"-->
+      <!--          />-->
+      <!--        </el-select>-->
+      <!--      </el-form-item>-->
       <el-form-item label="证件类型" prop="type">
         <el-select v-model="formData.type" placeholder="请选择">
           <el-option
@@ -31,7 +31,7 @@
         <el-input v-model="formData.name" placeholder="请输入证件名称" />
       </el-form-item>
       <el-form-item label="附件" prop="urls">
-        <UploadFile :is-show-tip="false" v-model="formData.urls"/>
+        <UploadFile :is-show-tip="false" v-model="formData.urls" />
       </el-form-item>
     </el-form>
     <template #footer>
@@ -41,11 +41,11 @@
   </Dialog>
 </template>
 <script lang="ts" setup>
-import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import { CertificateApi, CertificateVO } from '@/api/supplier/certificate'
-import {SupplierVO} from "@/api/supplier/base";
-import * as SupplierBaseApi from "@/api/supplier/base";
-import {FormRules} from "element-plus";
+import * as SupplierBaseApi from '@/api/supplier/base'
+import { SupplierVO } from '@/api/supplier/base'
+import { FormRules } from 'element-plus'
 
 /** 供应商证件资质 表单 */
 defineOptions({ name: 'CertificateForm' })
@@ -63,15 +63,17 @@ const formData = ref({
   supplierName: undefined,
   type: undefined,
   name: undefined,
-  urls: undefined,
+  urls: undefined
 })
 const formRules = reactive<FormRules>({
-  supplierId: [{ required: true, message: '供应商不能为空', trigger: 'blur' }],
+  // supplierId: [{ required: true, message: '供应商不能为空', trigger: 'blur' }],
   type: [{ required: true, message: '证件类型不能为空', trigger: 'blur' }],
-  name: [{ required: true, message: '证件名称不能为空', trigger: 'blur' }],
+  name: [{ required: true, message: '证件名称不能为空', trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
-
+const props = defineProps({
+  supplierId: { type: Number, default: () => null }
+})
 /** 打开弹窗 */
 const open = async (type: string, id?: number) => {
   dialogVisible.value = true
@@ -101,11 +103,16 @@ const submitForm = async () => {
   try {
     const data = formData.value as unknown as CertificateVO
     // const supplier = data.supplierId
-    // data.supplierId = supplier.id
+    if (!props.supplierId.receivedParam){
+      message.error("请先保存供应商");
+      return
+    }
+    data.supplierId = props.supplierId.receivedParam
     // data.supplierName = supplier.name
+
     if (data.urls) {
       if (Array.isArray(data.urls)) {
-        data.urls = data.urls.join(",")
+        data.urls = data.urls.join(',')
       }
     }
     if (formType.value === 'create') {
@@ -130,7 +137,7 @@ const resetForm = () => {
     supplierId: undefined,
     type: undefined,
     name: undefined,
-    urls: undefined,
+    urls: undefined
   }
   formRef.value?.resetFields()
 }

+ 52 - 53
src/views/supplier/certificate/index.vue

@@ -17,13 +17,8 @@
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="证件类型" label-width="85px"  prop="type">
-        <el-select
-          v-model="queryParams.type"
-          placeholder="证件类型"
-          clearable
-          class="!w-240px"
-        >
+      <el-form-item label="证件类型" label-width="85px" prop="type">
+        <el-select v-model="queryParams.type" placeholder="证件类型" clearable class="!w-240px">
           <el-option
             v-for="dict in getIntDictOptions(DICT_TYPE.SUPPLIER_CERT)"
             :key="dict.value"
@@ -41,33 +36,24 @@
           class="!w-240px"
         />
       </el-form-item>
-<!--      <el-form-item label="创建时间" prop="createTime">-->
-<!--        <el-date-picker-->
-<!--          v-model="queryParams.createTime"-->
-<!--          value-format="YYYY-MM-DD HH:mm:ss"-->
-<!--          type="daterange"-->
-<!--          start-placeholder="开始日期"-->
-<!--          end-placeholder="结束日期"-->
-<!--          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"-->
-<!--          class="!w-220px"-->
-<!--        />-->
-<!--      </el-form-item>-->
+      <!--      <el-form-item label="创建时间" prop="createTime">-->
+      <!--        <el-date-picker-->
+      <!--          v-model="queryParams.createTime"-->
+      <!--          value-format="YYYY-MM-DD HH:mm:ss"-->
+      <!--          type="daterange"-->
+      <!--          start-placeholder="开始日期"-->
+      <!--          end-placeholder="结束日期"-->
+      <!--          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"-->
+      <!--          class="!w-220px"-->
+      <!--        />-->
+      <!--      </el-form-item>-->
       <el-form-item>
         <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
         <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
-        <el-button
-          type="primary"
-          plain
-          @click="openForm('create')"
-        >
+        <el-button v-if="!isDetail" type="primary" plain @click="openForm('create')" >
           <Icon icon="ep:plus" class="mr-5px" /> 新增
         </el-button>
-        <el-button
-          type="success"
-          plain
-          @click="handleExport"
-          :loading="exportLoading"
-        >
+        <el-button v-if="!isDetail" type="success" plain @click="handleExport" :loading="exportLoading">
           <Icon icon="ep:download" class="mr-5px" /> 导出
         </el-button>
       </el-form-item>
@@ -77,13 +63,13 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
-<!--      <el-table-column label="主键" align="center" prop="id" />-->
-      <el-table-column label="供应商" align="center" prop="supplierId" >
+      <!--      <el-table-column label="主键" align="center" prop="id" />-->
+      <el-table-column label="供应商" align="center" prop="supplierId">
         <template #default="scope">
           <span>{{ supplierList.find((item) => item.id === scope.row.supplierId)?.name }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="证件类型" align="center" prop="type" >
+      <el-table-column label="证件类型" align="center" prop="type">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.SUPPLIER_CERT" :value="scope.row.type" />
         </template>
@@ -97,22 +83,12 @@
         :formatter="dateFormatter"
         width="180px"
       />
-      <el-table-column label="操作" align="center" min-width="120px">
+      <el-table-column v-if="!isDetail" label="操作" align="center" min-width="120px">
         <template #default="scope">
-          <el-button
-            link
-            type="primary"
-            @click="openForm('update', scope.row.id)"
-          >
+          <el-button link type="primary" @click="openForm('update', scope.row.id)">
             编辑
           </el-button>
-          <el-button
-            link
-            type="danger"
-            @click="handleDelete(scope.row.id)"
-          >
-            删除
-          </el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row.id)"> 删除 </el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -126,7 +102,12 @@
   </ContentWrap>
 
   <!-- 表单弹窗:添加/修改 -->
-  <CertificateForm ref="formRef" @success="getList" />
+  <CertificateForm ref="formRef" :supplierId="{ receivedParam }" @success="getList" />
+  <el-form>
+    <el-form-item style="float: right">
+      <el-button @click="close">返回</el-button>
+    </el-form-item>
+  </el-form>
 </template>
 
 <script setup lang="ts">
@@ -134,15 +115,22 @@ import { dateFormatter } from '@/utils/formatTime'
 import download from '@/utils/download'
 import { CertificateApi, CertificateVO } from '@/api/supplier/certificate'
 import CertificateForm from './CertificateForm.vue'
-import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
-import {SupplierVO} from "@/api/supplier/base";
-import * as SupplierBaseApi from "@/api/supplier/base";
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import * as SupplierBaseApi from '@/api/supplier/base'
+import { SupplierVO } from '@/api/supplier/base'
+import { propTypes } from '@/utils/propTypes'
+import {useTagsViewStore} from "@/store/modules/tagsView";
+const { delView } = useTagsViewStore() // 视图操作
+const { push, currentRoute } = useRouter() // 路由
 /** 供应商证件资质 列表 */
 defineOptions({ name: 'SupplierCertificate' })
 const supplierList = ref([] as SupplierVO[])
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
-
+const props = defineProps({
+  isDetail: propTypes.bool.def(false), // 是否作为详情组件
+  receivedParam: { type: undefined, default: () => null }
+})
 const loading = ref(true) // 列表的加载中
 const list = ref<CertificateVO[]>([]) // 列表的数据
 const total = ref(0) // 列表的总页数
@@ -154,27 +142,32 @@ const queryParams = reactive({
   type: undefined,
   name: undefined,
   urls: undefined,
-  createTime: [],
+  createTime: []
 })
 const queryFormRef = ref() // 搜索的表单
 const exportLoading = ref(false) // 导出的加载中
 
 /** 查询列表 */
 const getList = async () => {
+  supplierList.value = await SupplierBaseApi.Api.getAll()
   loading.value = true
   try {
+    debugger
+    queryParams.supplierId = props.receivedParam === null?'0000000000':props.receivedParam
     const data = await CertificateApi.getCertificatePage(queryParams)
     list.value = data.list
     total.value = data.total
+    queryParams.supplierId = undefined
   } finally {
     loading.value = false
   }
 }
 
 /** 搜索按钮操作 */
-const handleQuery = () => {
+const handleQuery = async () => {
   queryParams.pageNo = 1
-  getList()
+  await getList()
+  supplierList.value = await SupplierBaseApi.Api.getAll()
 }
 
 /** 重置按钮操作 */
@@ -222,4 +215,10 @@ onMounted(async () => {
   await getList()
   supplierList.value = await SupplierBaseApi.Api.getAll()
 })
+const close = () => {
+  delView(unref(currentRoute))
+  push({ name: 'Suppliers',query: {
+      date: new Date().getTime(),
+    } })
+}
 </script>