lipenghui 5 mesi fa
parent
commit
473b5638d5

+ 147 - 0
src/views/pms/device/CustomerList.vue

@@ -0,0 +1,147 @@
+<template>
+  <Dialog v-model="dialogVisible" :title="dialogTitle" style="width: 1100px;max-height: 800px">
+  <ContentWrap>
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="客商名称" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入客商名称"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </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-form-item>
+    </el-form>
+  </ContentWrap>
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
+      <el-table-column :label="props.type==='supplier'?'供应商名称':'制造商名称'" align="center" prop="name" />
+      <el-table-column :label="props.type==='supplier'?'供应商分类':'制造商分类'" align="center" prop="classification" >
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.SUPPLIER_TYPE" :value="scope.row.classification" />
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" prop="status">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.SUPPLIER_STATUS" :value="scope.row.status" />
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="createTime"
+        width="180"
+        :formatter="dateFormatter"
+      />
+      <el-table-column label="操作" align="center">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="choose(scope.row)"
+          >
+            选择
+          </el-button>
+
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+    </Dialog>
+</template>
+
+<script setup lang="ts">
+  import {DictDataVO} from "@/api/system/dict/dict.data";
+  import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
+  import {dateFormatter} from "@/utils/formatTime";
+  import { Api, SupplierVO } from '@/api/supplier/base'
+  import * as DictTypeApi from "@/api/system/dict/dict.type";
+  import { propTypes } from '@/utils/propTypes'
+  const emit = defineEmits(['choose']) // 定义 success 事件,用于操作成功后的回调
+  const dialogVisible = ref(false) // 弹窗的是否展示
+  const dialogTitle = ref('') // 弹窗的是否展示
+  const loading = ref(true) // 列表的加载中
+  const queryFormRef = ref() // 搜索的表单
+  const list = ref<DictDataVO[]>([]) // 列表的数据
+  const dictTypeList = ref<DictTypeApi.DictTypeVO[]>() // 字典类型的列表
+  const total = ref(0) // 列表的总页数
+  const props = defineProps({
+    type: propTypes.bool.def(''), // 是否作为详情组件
+  })
+  const queryParams = reactive({
+    pageNo: 1,
+    pageSize: 10,
+    customerNature: undefined,
+    code: undefined,
+    name: undefined,
+    classification: undefined,
+    type: undefined,
+    nature: undefined,
+    creditCode: undefined,
+    tin: undefined,
+    corporation: undefined,
+    incorporationDate: [],
+    address: undefined,
+    bizScope: undefined,
+    registeredCapital: undefined,
+    annualTurnove: undefined,
+    size: undefined,
+    status: undefined,
+    remark: undefined,
+    createTime: [],
+    customerNature: undefined
+  })
+  const open = async (type: string, id?: number) => {
+    dialogVisible.value = true
+    queryParams.customerNature = props.type
+    await getList()
+    dialogTitle.value = props.type==='supplier'?'供应商':'制造商';
+  }
+  defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+  const getList = async () => {
+    loading.value = true
+    try {
+      console.log(JSON.stringify(queryParams))
+      const data = await Api.getPage(queryParams)
+      list.value = data.list
+      total.value = data.total
+    } finally {
+      loading.value = false
+    }
+  }
+  /** 搜索按钮操作 */
+  const handleQuery = () => {
+    queryParams.pageNo = 1
+    getList()
+  }
+  const choose = (row: DictDataVO) => {
+    emit("choose", row);
+    dialogVisible.value = false;
+  }
+  /** 重置按钮操作 */
+  const resetQuery = () => {
+    queryFormRef.value.resetFields()
+    handleQuery()
+  }
+</script>
+<style scoped lang="scss">
+
+</style>

+ 98 - 87
src/views/pms/device/IotDeviceForm.vue

@@ -25,30 +25,22 @@
       </div>
       <div class="base-expandable-content" :class="{ 'is-expanded': baseIsExpanded }">
         <el-row>
-          <el-col :span="8">
+          <el-col :span="6">
             <el-form-item label="资产编码" prop="deviceCode">
               <el-input v-model="formData.deviceCode" placeholder="请输入资产编码" />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <el-col :span="6">
             <el-form-item label="设备名称" prop="deviceName">
               <el-input v-model="formData.deviceName" placeholder="请输入设备名称" />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <el-col :span="6">
             <el-form-item label="品牌" prop="brand">
-              <el-input v-model="formData.brand" placeholder="请输入品牌" @click="openForm"/>
-
+              <el-select v-model="formData.brand" placeholder="请输入品牌" @click="openForm"/>
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="8">
-            <el-form-item label="规格型号" prop="model">
-              <el-input v-model="formData.model" placeholder="请输入规格型号" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
+          <el-col :span="6">
             <el-form-item label="所在部门" prop="orgId">
               <el-tree-select
                 v-model="formData.orgId"
@@ -60,7 +52,9 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+        </el-row>
+        <el-row>
+          <el-col :span="6">
             <el-form-item label="设备状态">
               <el-select v-model="formData.deviceStatus" placeholder="请选择">
                 <el-option
@@ -71,10 +65,13 @@
                 />
               </el-select>
             </el-form-item>
-            </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="8">
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="规格型号" prop="model">
+              <el-input v-model="formData.model" placeholder="请输入规格型号" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
             <el-form-item label="资产性质">
               <el-select v-model="formData.assetProperty" placeholder="请选择">
                 <el-option
@@ -86,11 +83,18 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+        </el-row>
+        <el-row>
+          <el-col :span="6">
             <el-form-item label="图片" prop="picUrl">
-              <UploadImg v-model="formData.picUrl" :disabled="isDetail" height="50px" />
+              <UploadImg v-model="formData.picUrl" :disabled="isDetail" height="60px" />
             </el-form-item>
           </el-col>
+          <el-col :span="18">
+          <el-form-item label="备注" prop="remark">
+            <el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" />
+          </el-form-item>
+          </el-col>
         </el-row>
       </div>
       <div style="margin-bottom: 20px;margin-top: 10px;margin-left: 15px">
@@ -112,19 +116,15 @@
       </div>
       <div class="zz-expandable-content" :class="{ 'is-expanded': zzIsExpanded }">
         <el-row>
-          <el-col :span="8">
+          <el-col :span="6">
             <el-form-item label="制造商" prop="manufacturerId">
-              <el-input v-model="formData.manufacturerId" placeholder="请输入制造商" />
+              <el-select v-model="formData.manufacturerId" placeholder="请输入制造商" @click="openCustomer('manufacturer')"/>
             </el-form-item>
           </el-col>
-          <el-col :span="8">
-            <el-form-item label="供应商" prop="supplierId">
-              <el-input v-model="formData.supplierId" placeholder="请输入供应商" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="生产日期" prop="manDate">
+          <el-col :span="6">
+            <el-form-item label="生产日期" prop="manDate" >
               <el-date-picker
+                style="width: 150%"
                 v-model="formData.manDate"
                 type="date"
                 value-format="x"
@@ -132,16 +132,27 @@
               />
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="8">
+          <el-col :span="6">
+            <el-form-item label="供应商" prop="supplierId">
+              <el-select v-model="formData.supplierId" placeholder="请输入供应商" @click="openCustomer('supplier')"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
             <el-form-item label="铭牌信息" prop="nameplate">
               <el-input v-model="formData.nameplate" placeholder="请输入铭牌信息" />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+        </el-row>
+        <el-row>
+          <el-col :span="6">
             <el-form-item label="质保到期" prop="expires">
-              <el-input v-model="formData.expires" placeholder="请输入质保到期" />
+              <el-date-picker
+                style="width: 150%"
+                v-model="formData.expires"
+                type="date"
+                value-format="x"
+                placeholder="选择质保到期"
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -165,14 +176,15 @@
       </div>
       <div class="cw-expandable-content" :class="{ 'is-expanded': cwIsExpanded }">
         <el-row>
-          <el-col :span="8">
+          <el-col :span="6">
             <el-form-item label="采购价格" prop="plPrice">
-              <el-input v-model="formData.plPrice" type="number" placeholder="请输入采购/租赁价格" />
+              <el-input v-model="formData.plPrice" @input="handleInput(formData.plPrice, 'plPrice')" placeholder="请输入采购/租赁价格" />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <el-col :span="6">
             <el-form-item label="采购日期" prop="plDate">
               <el-date-picker
+                style="width: 150%"
                 v-model="formData.plDate"
                 type="date"
                 value-format="x"
@@ -180,17 +192,15 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <el-col :span="6">
             <el-form-item label="折旧年限" prop="plYear">
               <el-input v-model="formData.plYear" type="number" placeholder="请输入折旧年限" />
             </el-form-item>
           </el-col>
-        </el-row>
-
-        <el-row>
-          <el-col :span="8">
+          <el-col :span="6">
             <el-form-item label="折旧开始日期" prop="plStartDate">
               <el-date-picker
+                style="width: 150%"
                 v-model="formData.plStartDate"
                 type="date"
                 value-format="x"
@@ -198,27 +208,27 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+        </el-row>
+
+        <el-row>
+          <el-col :span="6">
             <el-form-item label="已提折旧月数" prop="plMonthed">
-              <el-input v-model="formData.plMonthed" placeholder="请输入已提折旧月数" />
+              <el-input v-model="formData.plMonthed" type="number" placeholder="请输入已提折旧月数" />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <el-col :span="6">
             <el-form-item label="已提折旧金额" prop="plAmounted">
-              <el-input v-model="formData.plAmounted" placeholder="请输入已提折旧金额" />
+              <el-input v-model="formData.plAmounted" @input="handleInput(formData.plAmounted, 'plAmounted')" placeholder="请输入已提折旧金额" />
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="8">
+          <el-col :span="6">
             <el-form-item label="剩余金额" prop="remainAmount">
-              <el-input v-model="formData.remainAmount" placeholder="请输入剩余金额" />
+              <el-input v-model="formData.remainAmount" @input="handleInput(formData.remainAmount, 'remainAmount')" placeholder="请输入剩余金额" />
             </el-form-item>
           </el-col>
         </el-row>
       </div>
       <div style="margin-bottom: 20px;margin-top: 10px;margin-left: 15px">
-
         <el-button @click="qtInfoClick" style="font-size: 18px;border: none">
           <Icon
             color="black"
@@ -236,44 +246,11 @@
 
       </div>
       <div class="qt-expandable-content" :class="{ 'is-expanded': qtIsExpanded }">
-      <el-row>
-        <el-col :span="8">
-          <el-form-item label="资料分类id" prop="infoId">
-            <el-input v-model="formData.infoId" placeholder="请输入资料分类id" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="资料类型" prop="infoType">
-            <el-select v-model="formData.infoType" placeholder="请选择资料类型">
-              <el-option label="请选择字典生成" value="" />
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="资料名称" prop="infoName">
-            <el-input v-model="formData.infoName" placeholder="请输入资料名称" />
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <el-row>
-        <el-col :span="8">
-          <el-form-item label="资料备注" prop="infoRemark">
-            <el-input v-model="formData.infoRemark" placeholder="请输入资料备注" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="资料附件" prop="infoUrl">
-            <el-input v-model="formData.infoUrl" placeholder="请输入资料附件" />
-          </el-form-item>
-        </el-col>
-      </el-row>
+
 
       <el-form-item label="动态模板信息" prop="templateJson">
         <el-input v-model="formData.templateJson" placeholder="请输入动态模板信息" />
       </el-form-item>
-          <el-form-item label="备注" prop="remark">
-            <el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" />
-          </el-form-item>
       </div>
     </el-form>
 <!--    <template #footer>-->
@@ -292,10 +269,12 @@
   </el-form>
   </ContentWrap>
   <BrandList ref="brandFormRef" @choose="brandChoose" />
+  <CustomerList ref="customerFormRef" @choose="customerChoose" :type="customerType"/>
 </template>
 <script setup lang="ts">
 import { IotDeviceApi, IotDeviceVO } from '@/api/pms/device'
 import BrandList from "@/views/pms/device/BrandList.vue";
+import CustomerList from "@/views/pms/device/CustomerList.vue";
 import {defaultProps, handleTree} from "@/utils/tree";
 import * as DeptApi from "@/api/system/dept";
 import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
@@ -320,6 +299,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
 const dialogTitle = ref('') // 弹窗的标题
 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
 const formType = ref('') // 表单的类型:create - 新增;update - 修改
+const customerType = ref('')
 const formData = ref({
   id: undefined,
   deviceCode: undefined,
@@ -362,16 +342,23 @@ const formRules = reactive({
 })
 
 const brandChoose = (row) =>{
-  debugger
   console.log(JSON.stringify(row.value))
   formData.value.brand = row.value;
-
+}
+const customerChoose = (row) =>{
+  console.log(JSON.stringify(row.value))
+  formData.value.brand = row.value;
 }
 /** 添加/修改操作 */
 const brandFormRef = ref()
 const openForm = () => {
   brandFormRef.value.open()
 }
+const customerFormRef = ref()
+const openCustomer = (type) => {
+  customerType.value = type;
+  customerFormRef.value.open()
+}
 const allshouqi = () =>{
   baseIsExpanded.value = false
   zzIsExpanded.value = false
@@ -402,6 +389,30 @@ const open = async (type: string, id?: number) => {
 }
 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
 
+const handleInput = (value,obj) => {
+  // 1. 过滤非法字符(只允许数字和小数点)
+  let filtered = value.replace(/[^\d.]/g, '');
+
+  // 2. 处理多个小数点的情况
+  filtered = filtered.replace(/\.{2,}/g, '.');
+
+  // 3. 限制小数点后最多两位
+  let decimalParts = filtered.split('.');
+  if (decimalParts.length > 1) {
+    decimalParts = decimalParts.slice(0, 2);
+    filtered = decimalParts.join('.');
+  }
+
+  // 4. 处理以小数点开头的情况(自动补0)
+  if (filtered.startsWith('.')) {
+    filtered = '0' + filtered;
+  }
+
+  // 5. 更新绑定值(同时处理连续输入多个0的情况)
+  formData.value[obj] = filtered.replace(/^0+(?=\d)/, '');
+
+};
+
 const close = () => {
   delView(unref(currentRoute))
   push({ name: 'IotDevicePms',query: {

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

@@ -263,7 +263,6 @@ const rules = reactive({
   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' }]
 })