YangJian0701 1 年之前
父节点
当前提交
180a1e8d45

+ 13 - 1
src/hooks/useTablePublic.ts

@@ -61,7 +61,19 @@ export interface MyPercentageFormType {
   T_submit?: string
   T_product?:any
 }
-
+export interface MyPercentageFormTypeFrom {
+  T_id: string
+  T_number: string
+  T_type: any 
+  T_item: any
+  T_money:string
+  T_uuid?: string
+  T_submit?: string
+  T_product?:any
+  T_state?:any
+  T_approval_money?:any
+  T_approval_opinion?:any
+}
 export interface royaltyType {
   T_name: string
   T_num:number

+ 7 - 0
src/router/modules/staticRouter.ts

@@ -47,6 +47,13 @@ export const staticRouter: RouteRecordRaw[] = [
             meta: {
               title: '提成详情'
             }
+          },{
+            path: '/PercentageDetail1/:id/:type?/:verify?/:titles?',
+            name: 'PercentageDetail1',
+            component: () => import('@/views/storehouse/sales/PercentageDetail1.vue'),
+            meta: {
+              title: '提成详情1'
+            }
           },
           {
             path: '/verifyContractDetail/:id',

+ 8 - 3
src/views/storehouse/inventory/MyPercentageFormStorage.vue

@@ -57,12 +57,17 @@ const ProductSelectionAllChange = (selection: any[]) => emit('ontableDataAll', s
 // 获取产品的列表
 const getProductList = async () => {
   const res: any = await Verifyltem_List(initParam)
-  tableProductData.value.push(...res.Data.Data)
+  let arr = [...res.Data.Data]
+  arr.forEach((item:any)=>{
+    item.T_id = item.Id
+  })
+  tableProductData.value.push(...arr)
   total = res.Data.Num
-  if (selectProductData.value?.length) {
+  console.log('设置选中',selectProductData.value,tableProductData.value)
+  if (selectProductData.value?.length) {//已经选中的传值项
     // 设置产品的选中
     tableProductData.value.forEach((row: any) => {
-      const matchedIndex = selectProductData.value?.findIndex((item: any) => item.Id == row.Id)
+      const matchedIndex = selectProductData.value?.findIndex((item: any) => item.T_id == row.T_id)
       selectTable.value?.toggleRowSelection(row, matchedIndex != -1)
     })
   }

+ 220 - 0
src/views/storehouse/inventory/MyPercentageFormStorage1.vue

@@ -0,0 +1,220 @@
+<script setup lang="ts">
+import {
+  Verifyltem_List
+} from '@/api/mypercentage/index'
+import { ElMessage } from 'element-plus'
+import { GlobalStore } from '@/stores/index'
+import Drawer from '@/components/Drawer/index.vue'
+import { ref, reactive, onMounted, nextTick } from 'vue'
+import { default as vElTableInfiniteScroll } from 'el-table-infinite-scroll'
+import ImageCom from '@/components/Image/index.vue'
+
+let total = 0
+const selectTable = ref()
+const globalStore = GlobalStore()
+const tableProductData = ref<any[]>([])
+const drawerProductRef = ref<InstanceType<typeof Drawer> | null>(null)
+
+const initParam = reactive({
+  User_tokey: globalStore.GET_User_tokey,
+  page: 1,
+  page_z: 20,
+  T_type: 1
+})
+const callbackProductDrawer = (done: () => void) => done()
+// 搜索模型
+const searchModelHandle = () => {
+  total = 0
+  initParam.page = 1
+  tableProductData.value = []
+  getProductList()
+}
+
+// 保存选中的数据id,row-key就是要指定一个key标识这一行的数据
+const getRowKey = (row: any) => {
+  return row.T_id
+}
+
+// 加载第二个抽屉数据
+const load = () => {
+  if (initParam.page && total === tableProductData.value.length) {
+    ElMessage.warning('没有更多数据了!!')
+    return
+  }
+  initParam.page++
+  getProductList()
+}
+// 勾选产品
+const ProductselectionChange = (selection: any[], row: any) => emit('ontableData', row)
+
+
+
+//函数
+const selectFun = async (val: any) => {
+  console.log('选中1111', val,selectTable.value,selectProductData.value)
+  if (val?.length) {//已经选中的传值项
+    // 设置产品的选中
+    tableProductData.value.forEach((row: any) => {
+      const matchedIndex = val?.findIndex((item: any) => item.T_id == row.T_id)
+      selectTable.value?.toggleRowSelection(row, matchedIndex != -1)
+    })
+  }
+}
+const ProductSelectionAllChange = (selection: any[]) => emit('ontableDataAll', selection)
+// 获取产品的列表
+const getProductList = async () => {
+  const res: any = await Verifyltem_List(initParam)
+  let arr = [...res.Data.Data]
+  arr.forEach((item:any)=>{
+    item.T_id = item.Id
+  })
+  tableProductData.value.push(...arr)
+  total = res.Data.Num
+  console.log('设置选中',selectProductData.value,tableProductData.value)
+  if (selectProductData.value?.length) {//已经选中的传值项
+    // 设置产品的选中
+    tableProductData.value.forEach((row: any) => {
+      const matchedIndex = selectProductData.value?.findIndex((item: any) => item.T_id == row.T_id)
+      selectTable.value?.toggleRowSelection(row, matchedIndex != -1)
+    })
+  }
+}
+
+const productColumns = [
+  { type: 'selection', width: 80 },
+  { prop: 'T_img', label: '产品图片', name: 'T_img' },
+  { prop: 'T_name', label: '产品名称' },
+  { prop: 'T_class_name', label: '产品分类' },
+  { prop: 'T_model', label: '产品型号', ellipsis: true },
+  { prop: 'T_spec', label: '产品规格' },
+  { prop: 'T_relation_sn', label: '关联SN', name: 'T_relation_sn' },
+  { prop: 'T_remark', label: '备注', ellipsis: true }
+]
+
+const openDrawer = () => drawerProductRef.value?.openDrawer()
+const clearSelection = () => {
+  initParam.page = 1
+  tableProductData.value = []
+  selectTable.value?.clearSelection()
+}
+const selectTableChange = (row: any) => {
+  nextTick(() => {
+    console.log('删除取消选中',row)
+    selectTable.value?.toggleRowSelection(row, false)
+  })
+}
+
+// props
+const props = defineProps<{ selectProductData?: any[]}>()
+const selectProductData = ref(props.selectProductData)
+
+const emit = defineEmits<{ (event: 'ontableData', value: any): void; (event: 'ontableDataAll', value: any[]): void }>()
+
+interface User {
+  T_id: number
+  T_name: string
+  T_num: number
+  count: number
+}
+
+const toggleSelectionFun = (rows?: User[]) => {
+  console.log('selectTable.value',selectTable.value,rows)
+  if (rows) {
+    rows.forEach((row) => {
+      selectTable.value!.toggleRowSelection(row, undefined)
+    })
+  }
+}
+
+defineExpose({
+  openDrawer,
+  clearSelection,
+  selectTableChange,
+  searchModelHandle,
+  getProductList,
+  initParam,
+  tableProductData,
+  selectTable,
+  toggleSelectionFun,
+  selectFun
+})
+
+</script>
+
+<template>
+  <Drawer ref="drawerProductRef" :handleClose="callbackProductDrawer" size="70%">
+    <template #header="{ params }">
+      <h4 :id="params.titleId" :class="params.titleClass">选择</h4>
+    </template>
+    <el-card class="box-card" shadow="never">
+      <el-table @selection-change="selectFun" ref="selectTable" :row-key="getRowKey" :expand-row-keys="[0]"
+        :data="tableProductData" style="width: 100%; height: 99%" :header-cell-style="{
+          background: '#dedfe0',
+          height: '50px'
+        }" v-el-table-infinite-scroll="load" :infinite-scroll-immediate="false" infinite-scroll-distance="'50px'"
+        @select="ProductselectionChange" @select-all="ProductSelectionAllChange">
+        <template v-for="item in productColumns" :key="item">
+          <el-table-column v-if="item.type === 'index' || item.type === 'selection'" align="center" v-bind="item" />
+          <el-table-column v-if="!item.ellipsis && item.prop" v-bind="item">
+            <template #default="{ row }">
+              <span v-if="item.prop === 'T_relation_sn'">
+                <el-tag v-if="row.T_relation_sn === 1" effect="dark">是</el-tag>
+                <el-tag v-else type="success" effect="dark">否</el-tag>
+              </span>
+              <ImageCom v-if="item.prop === 'T_img'" :src="row.T_img" />
+            </template>
+          </el-table-column>
+          <el-table-column v-if="item.ellipsis && item.prop === 'T_model'" align="center" v-bind="item">
+            <template #default="{ row }">
+              <el-tooltip effect="dark" :content="row.T_model" placement="bottom">
+                {{ row.T_model }}
+              </el-tooltip>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="item.ellipsis && item.prop === 'T_remark'" align="center" v-bind="item">
+            <template #default="{ row }">
+              <el-tooltip effect="customized" placement="left">
+                <template #content>
+                  <div class="tooltip-content">{{ row.T_remark }}</div>
+                </template>
+                {{ row.T_remark }}
+              </el-tooltip>
+            </template>
+          </el-table-column>
+        </template>
+      </el-table>
+    </el-card>
+  </Drawer>
+</template>
+
+<style scoped lang="scss">
+.tooltip-content {
+  max-width: 500px;
+  overflow-y: auto;
+}
+
+.box-card {
+  height: 100%;
+
+  :deep(.el-card__body) {
+    height: calc(100% - 70px);
+  }
+
+  .sn-header {
+    display: flex;
+    justify-content: end;
+  }
+
+  .input-suffix {
+    width: 100%;
+
+    .inline-flex {
+      white-space: nowrap;
+    }
+
+    .d-flex {
+      display: flex;
+    }
+  }
+}
+</style>

+ 4 - 1
src/views/storehouse/sales/ContractForm.vue

@@ -77,7 +77,10 @@ const form = reactive<ContractFormType>({
   T_recoveries: '',
   T_invoice: '',
   T_remit: '',
-  T_submit_name: ''
+  T_submit_name: '',
+  T_approval_money: '',
+  T_approval_opinion: '',
+  T_State: '',
 })
 
 const openDrawer = (type: string, row?: any) => {

+ 1 - 0
src/views/storehouse/sales/MyPercentage.vue

@@ -50,6 +50,7 @@ const initParam = reactive({
 })
 const MyPercentageFormRef = ref<InstanceType<typeof MyPercentageForm> | null>(null)
 const openContractFormDrawer = (type: string, row?: any) => {
+  console.log('编辑',type,type,row)
   MyPercentageFormRef.value?.VerifyltemApi()
   MyPercentageFormRef.value?.openDrawer(type, row)
 }

+ 12 - 10
src/views/storehouse/sales/MyPercentageForm.vue

@@ -156,17 +156,19 @@ const drawerProductRef = ref<InstanceType<typeof MyPercentageFormStorage> | null
 const AddProductionDetailed = () => {
   // selectTable.value.toggleRowSelection(tableProductData.value.find(item => {return 1 == item.Id;}), true )
 
-
+  console.log('添加验证',tableData.value)
   //有问题
   isProduct.value = true
   nextTick(() => {
-    drawerProductRef!.value!.initParam!.T_type = form.T_type || undefined
-    drawerProductRef.value?.searchModelHandle()
     drawerProductRef.value?.openDrawer()
-    console.log('添加',tableData.value,drawerProductRef.value)
-    if(drawerProductRef.value){
-      drawerProductRef.value.toggleSelectionFun(tableData.value)
-    }
+    nextTick(() => {
+      drawerProductRef!.value!.initParam!.T_type = form.T_type || undefined
+      drawerProductRef.value?.searchModelHandle()
+      console.log('添加',tableData.value,drawerProductRef.value)
+      if(drawerProductRef.value){
+        drawerProductRef.value.toggleSelectionFun(tableData.value)
+      }
+    })
   })
 }
 
@@ -292,17 +294,17 @@ defineExpose({
                   <div v-if="item.prop === 'T_priceNum'">{{ Number(row.count) * Number(row.T_price) }}</div>
                 </template>
               </el-table-column>
-              <el-table-column v-bind="item" v-if="item.fixed === 'right'">
+              <!-- <el-table-column v-bind="item" v-if="item.fixed === 'right'">
                 <template #default="{ row }">
                   <el-button link type="danger" size="small" :icon="Delete" @click="deleteProduct(row)">删除</el-button>
                 </template>
-              </el-table-column>
+              </el-table-column> -->
             </template>
             <template #append>
               <el-button type="primary" @click="AddProductionDetailed">
                 <el-icon>
                   <Plus />
-                </el-icon><span style="margin-left: 6px">添加验证</span>
+                </el-icon><span style="margin-left: 6px">(添加/取消)</span>
               </el-button>
             </template>
           </el-table>

+ 16 - 5
src/views/storehouse/sales/Percentage.vue

@@ -13,6 +13,14 @@ const router = useRouter()
 const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
 const { globalStore, searchOnTableList,updateOnTableList  } = useTablePublic()
 
+const PercentageDetail1Ref = ref<InstanceType<typeof PercentageDetail1> | null>(null)
+  const PercentageDetail1 = defineAsyncComponent({
+  loader: () => import(/*webpackChunkName: 'ContractForm'*/ './PercentageDetail1.vue'),
+  delay: 500,
+  timeout: 3000,
+  suspensible: true
+})
+
 const columns: ColumnProps[] = [
   { type: 'index', label: '序号', width: 80 },
   { prop: 'T_number', label: '合同编号' },
@@ -30,11 +38,13 @@ const columns: ColumnProps[] = [
   { prop: 'operation', label: '操作', width: 260, fixed: 'right' }
 ]
 
-const processContract = (id: string,titles:string) => {
-  ContForm.showTable = false
-  router.push({ name: 'PercentageDetail', params: { id, type: fnMd5('contract'),titles:titles}})
+const processContract = (type: string, row?: any) => {
+  // ContForm.showTable = false
+  // router.push({ name: 'PercentageDetail1', params: { id, type: fnMd5('contract'),titles:titles}})
+  // PercentageDetail1Ref.value?.VerifyltemApi()
+  PercentageDetail1Ref.value?.openDrawer(type, row)
 }
-
+ 
 const initParam = reactive({
   User_tokey: globalStore.GET_User_tokey,
   T_name: '',
@@ -136,12 +146,13 @@ const ContractForm = defineAsyncComponent({
         <el-tag v-else type="danger" effect="dark"> --- </el-tag>
       </template>
       <template #right="{ row }"> 
-        <el-button link type="warning" :disabled="![1,3].includes(row.T_State)" size="small"  :icon="Finished" @click="processContract(row.Id,'审核')">审核</el-button>
+        <el-button link type="warning" :disabled="![1,3].includes(row.T_State)" size="small"  :icon="Finished" @click="processContract('审核',row)">审核</el-button>
         <el-button link type="primary" :disabled="![2,4,5].includes(row.T_State)" size="small"  :icon="Edit"  @click="openContractFormDrawer('edit', row)">打款明细</el-button>
         <el-button link type="success" size="small"  :icon="View" @click="processContract(row.Id,'详情')">详情</el-button>
       </template>
     </TableBase>
   <ContractForm ref="ContractFormRef" :ContForm="ContForm" @onTableList="updateOnTableList(TableRef)" />
+  <PercentageDetail1 ref="PercentageDetail1Ref" @onTableList="updateOnTableList(TableRef)" />
   </div>
 </template>
 

+ 389 - 0
src/views/storehouse/sales/PercentageDetail1.vue

@@ -0,0 +1,389 @@
+<script setup lang="ts">
+import {
+  Mycolumns,
+  MyPercentageFormTypeFrom,
+  useTablePublic,
+} from '@/hooks/useTablePublic'
+import {
+  percentage_Get,
+  percentage_Edit,
+  percentage_Add,
+  VerifyContract_List
+} from '@/api/mypercentage/index'
+import { useRouter, useRoute } from 'vue-router'
+
+import { ElMessage } from 'element-plus'
+import TableDetail from './TableDetail.vue'
+import { ref, reactive, nextTick,watch } from 'vue'
+import Drawer from '@/components/Drawer/index.vue'
+import { Delete } from '@element-plus/icons-vue'
+import Upload from '@/components/Upload/index.vue'
+import type { FormInstance, FormRules } from 'element-plus'
+import ContractUser from '@/views/storehouse/outStock/receiveUser.vue'
+import MyPercentageFormStorage from '@/views/storehouse/inventory/MyPercentageFormStorage1.vue'
+import verifyxiang from '@/views/storehouse/sales/verifyxiang.vue'
+
+const isNew = ref(true)
+const isProduct = ref(false)
+const tableData = ref<any[]>([])
+let selectProductData: any[] = []
+const formLabelWidth = ref('120px')
+const { resetForm, globalStore, validate_T_product } = useTablePublic()
+const ruleFormRef = ref<FormInstance>()
+const contractNumberLoading = ref(false)
+const User_tokey = globalStore.GET_User_tokey
+const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
+const uploadRef = ref<InstanceType<typeof Upload> | null>(null)
+const receiveUserdialog = ref<InstanceType<typeof ContractUser> | null>(null)
+const RecoveriesRef = ref<InstanceType<typeof TableDetail> | null>(null)
+const InvoiceRef = ref<InstanceType<typeof TableDetail> | null>(null)
+
+const rules = reactive<FormRules>({
+  T_number: [{ required: true, message: '请输入合同编号', trigger: 'blur' }],
+  T_customer: [{ required: true, message: '请输入客户名称', trigger: 'blur' }],
+  T_type: [{ required: true, message: '请选择合同类型', trigger: 'blur' }],
+  T_product: [{ validator: validate_T_product, message: '必填项', trigger: 'blur' }],
+  T_money: [{ required: true, message: '请输入合同金额', trigger: 'blur' }],
+  T_discount: [{ required: true, message: '请输入优惠金额', trigger: 'blur' }],
+
+  T_date: [{ required: true, message: '请选择签订时间', trigger: 'blur' }],
+  T_submit: [{ required: true, message: '请选择合同负责人', trigger: 'change' }],
+  T_submit_name: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
+
+  T_state: [{ required: true, message: '请选择审批结果', trigger: 'blur' }],
+  T_approval_money: [{ required: true, message: '请输入审批金额', trigger: 'change' }],
+  T_approval_opinion: [{ required: true, message: '请输入审批意见', trigger: 'blur' }]
+})
+
+const callbackDrawer = (done: () => void) => {
+  closeCancle()
+  done()
+}
+
+// 父级方法
+const emit = defineEmits<{ (event: 'onTableList'): void }>()
+
+const form = reactive<MyPercentageFormTypeFrom>({
+  T_id: '',
+  T_uuid: '',
+  T_submit: '',
+  T_type: 1,
+  T_number: '',
+  T_money: '',
+  T_item: '',
+  T_product:null,
+  T_state:'',
+  T_approval_money:'',
+  T_approval_opinion:'',
+
+})
+
+const openDrawer = (type: string, row?: any) => {
+  console.log('传值', type, row)
+  if(row){form.T_id = row.Id}
+  isNew.value = type === 'new' ? true : false //true新增申请   false编辑
+  if (!isNew.value) {//编辑调接口渲染
+    nextTick(() => {
+      editDataEcho(row)
+    })
+  }
+  drawerRef.value?.openDrawer()
+}
+
+// edit data echo
+const editDataEcho = async (row: any) => {
+  console.log('编辑赋值', row)
+  form.T_uuid = row.T_uuid
+  form.T_type = row.T_type
+  form.T_number = row.T_number
+  form.T_money = row.T_money
+  form.T_number = row.T_number
+  form.T_submit = row.T_uuid_name
+
+  form.T_state = 2
+  form.T_approval_money = row.T_approval_money
+  form.T_approval_opinion = row.T_approval_opinion
+
+  const res: any = await percentage_Get({ User_tokey, T_id: row.Id })
+  console.log('请求返回', res)
+  if (res.Code === 200) {
+    const { T_Product, T_invoice, T_recoveries, T_item } = res.Data
+    T_item && (tableData.value = T_item.map((item: any) => {
+      item.count = item.T_num
+      return item
+    }))
+    selectProductData = tableData.value
+    T_invoice && InvoiceRef.value?.setMoneyDeatil(T_invoice)
+    T_recoveries && RecoveriesRef.value?.setMoneyDeatil(T_recoveries)
+    blurHandle()
+  }
+}
+
+const blurHandle = () => {
+  form.T_product = tableData.value.map(item => {
+    if (!item.count) return undefined
+    return `${item.Id},${item.count}|`
+  })
+}
+const deleteProduct = (row: any) => {
+  tableData.value = tableData.value.filter(item => item.T_id !== row.T_id)
+  console.log('删除',row, tableData.value,drawerProductRef.value)
+  // 设置产品的选中
+  nextTick(() => {
+    drawerProductRef.value?.selectTableChange(row)
+  })
+  
+}
+
+const getFomrParams = () => {
+  const params = {...form}
+  params.T_item = params?.T_product.join('')
+  delete params.T_product
+  delete params.T_submit
+  return params
+}
+
+const AddContract = (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  formEl.validate(async valid => {
+    if (valid) {
+      let res: any = {}
+      const params = getFomrParams()
+      if (isNew.value) {
+        res = await percentage_Add(params)
+      } else {
+        res = await percentage_Edit(params)
+      }
+      if (res.Code === 200) {
+        ElMessage.success(`${isNew.value ? '添加' : '修改'}成功!!`)
+        nextTick(() => {
+          closeCancle()
+          emit('onTableList')
+        })
+      }
+    } else false
+  })
+}
+
+const drawerProductRef = ref<InstanceType<typeof MyPercentageFormStorage> | null>(null)
+const verifyxiangRef = ref<InstanceType<typeof verifyxiang> | null>(null)
+
+  
+/**
+ * 添加产品
+ */
+const AddProductionDetailed = () => {
+  // selectTable.value.toggleRowSelection(tableProductData.value.find(item => {return 1 == item.Id;}), true )
+
+  console.log('添加验证',tableData.value)
+  //有问题
+  isProduct.value = true
+  nextTick(() => {
+    drawerProductRef.value?.openDrawer()
+    nextTick(() => {
+      drawerProductRef!.value!.initParam!.T_type = form.T_type || undefined
+      drawerProductRef.value?.searchModelHandle()
+      console.log('添加',tableData.value,drawerProductRef.value)
+      if(drawerProductRef.value){
+        drawerProductRef.value.toggleSelectionFun(tableData.value)
+        drawerProductRef.value.selectFun(tableData.value)
+      }
+    })
+  })
+}
+
+interface User {
+  T_id: number
+  T_name: string
+  T_num: number
+  count: number
+}
+
+
+/**
+ * 产品选择 是否
+ */
+const ProductselectionChange = (row: any) => {
+  console.log('产品选择是否',row)
+  const index = tableData.value.findIndex((item: any) => item.T_id === row.T_id)
+  if (index === -1) {
+    row.count = ''
+    tableData.value.push(row)
+  } else {
+    tableData.value.splice(index, 1)
+  }
+}
+/**
+ * 全选
+ */
+const ProductSelectionAllChange = (selection: any[]) => (tableData.value = selection)
+/**
+ * 生成合同编号
+ */
+ const router = useRouter()
+const getContractNumber = async (id:any) => {
+  console.log('生成合同编号',id,verifyxiangRef.value)
+  // router.push({ name: 'ContractDetail', params: { id, verify: 'verify' } })
+  // contractNumberLoading.value = true
+  verifyxiangRef.value?.openDrawer()
+  window.sessionStorage.setItem('globaId', id);
+  verifyxiangRef.value?.getStorehouseContractGet()
+
+}
+/**
+ * 合同负责人
+ */
+const selectApprover = () => receiveUserdialog.value?.openDrawer()
+const getReceiveInfo = ({ T_uuid, T_name }: { T_uuid: string; T_name: string }) => {
+  console.log('123', T_uuid, T_name)
+  form.T_submit = T_name
+  form.T_uuid = T_uuid
+}
+const closeCancle = () => {
+  resetForm(ruleFormRef.value)
+  isNew.value = isProduct.value = false
+  tableData.value = []
+  selectProductData = []
+  drawerProductRef.value?.clearSelection()
+  RecoveriesRef.value?.clearDetail()
+  InvoiceRef.value?.clearDetail()
+  drawerRef.value?.closeDrawer()
+}
+
+watch(() => tableData.value, (newvalue:any) => {
+  form.T_money = newvalue.reduce((sum:any, e:any) => sum + Number(e.T_price* e.count || 0), 0)
+},{ deep: true,immediate:true});
+
+
+defineExpose({
+  openDrawer,
+})
+</script>
+
+<template>
+  <div class="contract-form">
+    <Drawer ref="drawerRef" :handleClose="callbackDrawer" size="80%">
+      <template #header="{ params }">
+        <h4 :id="params.titleId" :class="params.titleClass">提成管理-审核</h4>
+      </template>
+      <el-form ref="ruleFormRef" :model="form" :rules="rules">
+        <el-form-item label="合同编号:" :label-width="formLabelWidth" prop="T_number">
+          <div>
+            <el-input v-model="form.T_number" type="text" autocomplete="off" placeholder="合同编号" class="w-50" :disabled="true" />
+            <el-button :loading="contractNumberLoading" type="primary" @click="getContractNumber(form.T_number)" style="margin-left: 10px;">查看合同详情</el-button>
+          </div>
+        </el-form-item>
+        <el-form-item label="提成类型:" :label-width="formLabelWidth" prop="T_type">
+          <!-- {{ form.T_type==1?'实施提成':'报告提成' }} -->
+          <el-radio-group v-model="form.T_type" :disabled="true">
+            <el-radio :label="1" v-if="form.T_type==1">实施提成</el-radio>
+            <el-radio :label="2" v-if="form.T_type==2">报告提成</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="验证产品明细:" :label-width="formLabelWidth" prop="T_product">
+          <el-table border stripe :data="tableData" style="width: 100%"
+            :header-cell-style="{ background: '#dedfe0', height: '50px' }">
+            <template v-for="item in Mycolumns" :key="item.prop">
+              <el-table-column v-bind="item" v-if="item.fixed !== 'right'">
+                <template #header v-if="item.prop === 'T_num'">
+                  <span style="color: red">*数量</span>
+                </template>
+                <template #default="{ row }" v-if="item.prop === item.name">
+                  <el-input v-if="item.prop === 'T_num'" v-model.number="row.count" type="text" autocomplete="off"
+                    @blur="blurHandle" />
+                  <div v-if="item.prop === 'T_priceNum'">{{ Number(row.count) * Number(row.T_price) }}</div>
+                </template>
+              </el-table-column>
+              <!-- <el-table-column v-bind="item" v-if="item.fixed === 'right'">
+                <template #default="{ row }">
+                  <el-button link type="danger" size="small" :icon="Delete" @click="deleteProduct(row)">删除</el-button>
+                </template>
+              </el-table-column> -->
+            </template>
+            <template #append>
+              <el-button type="primary" @click="AddProductionDetailed">
+                <el-icon>
+                  <Plus />
+                </el-icon><span style="margin-left: 6px">(添加/取消)</span>
+              </el-button>
+            </template>
+          </el-table>
+        </el-form-item>
+        <el-form-item label="提成金额:" :label-width="formLabelWidth" prop="T_money">
+          <el-input v-model="form.T_money" type="text" autocomplete="off" placeholder="请输入合同金额" class="w-50" />
+        </el-form-item>
+        <el-form-item label="提成人员:" :label-width="formLabelWidth" prop="T_submit">
+          <el-input v-model="form.T_submit" placeholder="请选择合同负责人" class="w-50" @focus="selectApprover"  :disabled="true"/>
+        </el-form-item>
+
+        <el-form-item label="审批结果:" :label-width="formLabelWidth" prop="T_state">
+          <el-radio-group v-model="form.T_state">
+            <el-radio :label="2">已通过</el-radio>
+            <el-radio :label="3">未通过</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="审批金额:" :label-width="formLabelWidth" prop="T_approval_money">
+          <el-input v-model="form.T_approval_money" placeholder="请输入审批金额" class="w-50"/>
+        </el-form-item>
+        <el-form-item label="审批意见:" :label-width="formLabelWidth" prop="T_approval_opinion">
+          <el-input
+            class="w-50"
+            v-model="form.T_approval_opinion"
+            :autosize="{ minRows: 4, maxRows: 6 }"
+            type="textarea"
+            placeholder="请输入审批意见"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div>
+          <el-divider border-style="dashed" />
+          <div class="btn">
+            <el-button @click="closeCancle">取消</el-button>
+            <el-button v-if="isNew" color="#626aef" @click="AddContract(ruleFormRef)">提交</el-button>
+            <el-button v-else color="#626aef" @click="AddContract(ruleFormRef)">修改</el-button>
+          </div>
+        </div>
+      </template>
+    </Drawer>
+    <ContractUser ref="receiveUserdialog" @onUserInfo="getReceiveInfo" title="合同负责人" />
+    <MyPercentageFormStorage v-if="isProduct" ref="drawerProductRef" :selectProductData="selectProductData"
+      @ontableData="ProductselectionChange" @ontableDataAll="ProductSelectionAllChange"></MyPercentageFormStorage>
+    <verifyxiang ref="verifyxiangRef"></verifyxiang>
+  </div>
+</template>
+
+<style scoped lang="scss">
+.contract-form {
+  :deep(.el-table--border .el-table__cell) {
+    border-right: 0;
+  }
+
+  :deep(.table-header),
+  :deep(.card) {
+    border: 0;
+  }
+
+  .box-card {
+    height: 100%;
+
+    :deep(.el-card__body) {
+      height: calc(100% - 70px);
+    }
+  }
+
+  .btn {
+    margin-top: 32px;
+    display: flex;
+    justify-content: center;
+
+    .el-button {
+      padding: 0 32px;
+    }
+  }
+
+  .w-50 {
+    width: 21.5rem;
+  }
+}
+</style>

+ 368 - 0
src/views/storehouse/sales/verifyxiang.vue

@@ -0,0 +1,368 @@
+<script setup lang="ts">
+import { shallowRef, ref, onMounted, onUnmounted } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import { GlobalStore } from '@/stores/index'
+import { fnMd5 } from '@/utils/common'
+import { ElMessage } from 'element-plus'
+import Drawer from '@/components/Drawer/index.vue'
+import ImageCom from '@/components/Image/index.vue'
+import { ColumnProps } from '@/components/TableBase/interface/index'
+import { Storehouse_Contract_Get, Storehouse_Contract_Approval } from '@/api/storehouse/index'
+
+interface InfoType {
+    Id: number
+    T_State: number
+    T_approver: string
+    T_approver_name: string
+    T_customer: string
+    T_date: string
+    T_money: number
+    T_number: string
+    T_out: number
+    T_pdf: string
+    T_remark: string
+    T_submit: string
+    T_type: number
+    T_discount: number
+    T_start_date: string
+    T_end_date: string
+    T_submit_name: string
+    T_project: string
+    T_no_recoveries_money: number
+    T_no_invoice_money: number
+}
+
+
+
+const route = useRoute()
+const router = useRouter()
+const isSale = ref(false)
+const isVerify = ref(true)
+const tableSnData = ref<any[]>([])
+const tableData = ref<any[]>([])
+const invoiceTableData = ref<any[]>([])
+const recoveriesTableData = ref<any[]>([])
+const info = ref<InfoType | undefined>()
+const globalStore = GlobalStore()
+const drawerSnRef = ref<InstanceType<typeof Drawer> | null>(null)
+const headerCellStyle = shallowRef({
+    background: '#909399',
+    height: '50px',
+    color: '#fff'
+})
+
+let columns: ColumnProps[] = [
+    { type: 'index', label: '序号', width: 80, align: 'center ' },
+    { label: '产品图片', prop: 'T_product_img', align: 'center ', name: 'T_product_img' },
+    { label: '产品名称', prop: 'T_product_name', align: 'center ' },
+    { label: '产品分类', prop: 'T_product_class_name', align: 'center ' },
+    { label: '产品型号', prop: 'T_product_model', align: 'center ', name: 'T_product_model' },
+    { label: '产品规格', prop: 'T_product_spec', align: 'center ' },
+    {
+        label: '是否关联SN',
+        prop: 'T_product_relation_sn',
+        align: 'center ',
+        width: 120,
+        name: 'T_product_relation_sn'
+    },
+    { label: '数量', prop: 'T_product_total', align: 'center ' },
+    { label: '已出库数量', prop: 'T_product_out', align: 'center ' },
+    { prop: 'operation', label: '操作', width: 100, fixed: 'right', align: 'center ' }
+]
+
+const VerifyColumns: ColumnProps[] = [
+    { type: 'index', label: '序号', width: 80, align: 'center ' },
+    { label: '产品图片', prop: 'T_product_img', align: 'center ', name: 'T_product_img' },
+    { label: '产品名称', prop: 'T_product_name', align: 'center ' },
+    { label: '产品分类', prop: 'T_product_class_name', align: 'center ' },
+    { label: '产品型号', prop: 'T_product_model', align: 'center ', name: 'T_product_model' },
+    { label: '产品规格', prop: 'T_product_spec', align: 'center ' },
+    { label: '数量', prop: 'T_product_total', align: 'center ' },
+    { label: '单价', prop: 'T_price', align: 'center ' },
+    { label: '总价', prop: 'total', align: 'center ' }
+]
+
+const columnsRecoveries = [
+    { type: 'index', label: '序号', width: 80, align: 'center ' },
+    { label: '回款时间', prop: 'T_date', align: 'center ' },
+    { label: '回款金额', prop: 'T_money', align: 'center ' }
+]
+
+const columnsInvoice = [
+    { type: 'index', label: '序号', width: 80, align: 'center ' },
+    { label: '开票时间', prop: 'T_date', align: 'center ' },
+    { label: '开票金额', prop: 'T_money', align: 'center ' }
+]
+
+const snColumns = [
+    { type: 'index', label: '序号', width: 80, align: 'center ' },
+    { label: 'SN', prop: 'sn', align: 'center ' }
+]
+
+const getStorehouseContractGet = async () => {
+    const res: any = await Storehouse_Contract_Get({ User_tokey: globalStore.GET_User_tokey, T_number: window.sessionStorage.getItem('globaId') })
+    if (res.Code === 200) {
+        info.value = res.Data
+        const { T_Product, T_invoice, T_recoveries } = res.Data
+        tableData.value = T_Product
+        invoiceTableData.value = T_invoice
+        recoveriesTableData.value = T_recoveries
+        if (!isVerify.value && T_Product) {
+            tableData.value = T_Product.map((item: any) => {
+                item.total = item.T_product_total * item.T_price
+                return item
+            })
+        }
+    }
+}
+const previewPdf = (str: string) => window.open(str)
+
+const contractApproval = async (state: number) => {
+    const res: any = await Storehouse_Contract_Approval({
+        User_tokey: globalStore.GET_User_tokey,
+        T_number: route.params.id,
+        T_state: state
+    })
+    if (res.Code === 200) {
+        ElMessage.success('审核成功!!')
+        getStorehouseContractGet()
+    }
+}
+const getState = (val: number, type: string) => {
+    switch (val) {
+        case 1:
+            return type === 'T_State' ? '已通过' : '未出库'
+        case 2:
+            return type === 'T_State' ? '未通过' : '已部分出库'
+        case 3:
+            return type === 'T_State' ? '待审核' : '已全部出库'
+    }
+}
+
+/**
+ * 回调
+ */
+const callbackSnDrawer = (done: () => void) => done()
+
+const previewSn = (devicelist: string[]) => {
+    drawerSnRef.value?.openDrawer()
+    if (!devicelist) return
+    tableSnData.value = devicelist.map((item: string) => {
+        return {
+            sn: item
+        }
+    })
+}
+
+onUnmounted(() => {
+    isSale.value = false
+})
+
+const drawerverifyRef = ref<InstanceType<typeof Drawer> | null>(null)
+const openDrawer = () => drawerverifyRef.value?.openDrawer()
+
+defineExpose({
+  openDrawer,getStorehouseContractGet
+})
+</script>
+<template>
+    <Drawer ref="drawerverifyRef" size="70%">
+        <div class="contract-detail">
+            <div class="info">
+                <h1>
+                    详情<span v-if="isVerify"> - {{ getState(info?.T_State!, 'T_State') }}</span>
+                </h1>
+                <el-divider />
+                <div class="content">
+                    <el-row>
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"><span>合同编号</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5"><span>{{ info?.T_number! }}</span></el-col>
+                    </el-row>
+                    <el-row v-if="isVerify">
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"> <span>客户名称</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5"><span>{{ info?.T_customer! }}</span></el-col>
+                    </el-row>
+                    <el-row>
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"><span>{{ isVerify ? '产品' : '验证' }}明细</span></el-col>
+                        <el-col :span="21">
+                            <el-table border stripe :data="tableData" style="width: 100%"
+                                :header-cell-style="headerCellStyle">
+                                <template v-for="item in columns" :key="item.prop">
+                                    <el-table-column v-bind="item" v-if="item.fixed !== 'right'">
+                                        <template #default="{ row }" v-if="item.prop === item.name">
+                                            <span v-if="item.prop === 'T_product_relation_sn'">
+                                                <el-tag v-if="row.T_product_relation_sn === 1" effect="dark">是</el-tag>
+                                                <el-tag v-else type="success" effect="dark">否</el-tag>
+                                            </span>
+                                            <ImageCom v-if="item.prop === 'T_product_img'" :src="row.T_product_img" />
+                                            <el-tooltip v-if="item.prop === 'T_product_model'" effect="dark"
+                                                :content="row.T_product_model" placement="bottom">
+                                                {{ row.T_product_model }}
+                                            </el-tooltip>
+                                        </template>
+                                    </el-table-column>
+                                    <el-table-column v-bind="item" v-if="item.fixed === 'right'">
+                                        <template #default="{ row }">
+                                            <el-button type="primary" :disabled="!row.T_product_relation_sn"
+                                                @click="previewSn(row.T_device_list)">查看</el-button>
+                                        </template>
+                                    </el-table-column>
+                                </template>
+                            </el-table>
+                        </el-col>
+                    </el-row>
+                    <el-row v-if="isVerify">
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"> <span>业务日期</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5">
+                            <span>{{ info?.T_date! }}</span></el-col>
+                    </el-row>
+
+                    <el-row>
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"> <span>合同金额</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5">
+                            <el-text type="danger">{{ info?.T_money! }}¥</el-text>
+                        </el-col>
+                    </el-row>
+                    <el-row v-if="!isVerify">
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"> <span>优惠金额</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5">
+                            <el-text type="danger">{{ info?.T_discount! }}¥</el-text>
+                        </el-col>
+                    </el-row>
+                    <el-row v-if="!isVerify">
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"> <span>签订时间</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5">
+                            <span>{{ info?.T_date! }}</span></el-col>
+                    </el-row>
+                    <el-row v-if="!isVerify">
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"> <span>起始时间</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5">
+                            <span>{{ info?.T_start_date! }}</span></el-col>
+                    </el-row>
+                    <el-row v-if="!isVerify">
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"> <span>终止时间</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5">
+                            <span>{{ info?.T_end_date! }}</span></el-col>
+                    </el-row>
+
+                    <el-row>
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"> <span>项目</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5">
+                            <span>{{ info?.T_project }}</span>
+                        </el-col>
+                    </el-row>
+
+                    <el-row v-if="isVerify">
+                        <!-- 1-未出库 2-已部分出库 3-已全部出库 -->
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"><span>出库状态</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5"><span>{{ getState(info?.T_out!, 'T_out')
+                        }}</span></el-col>
+                    </el-row>
+
+                    <el-row v-if="isVerify">
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"><span v-if="isVerify">经办人</span><span
+                                v-else>合同负责人</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5"><span>{{ info?.T_submit_name! }}</span></el-col>
+                    </el-row>
+
+                    <el-row>
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"><span>合同备注</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5"><span>{{ info?.T_remark! }}</span></el-col>
+                    </el-row>
+
+                    <el-row>
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"><span>附件</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5"><span v-if="!info?.T_pdf!">无</span>
+                            <el-button v-else type="primary" @click="previewPdf(info?.T_pdf!)">查看附件</el-button></el-col>
+                    </el-row>
+
+                    <el-row>
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"><span>回款明细</span></el-col>
+                        <el-col :span="21">
+                            <el-table border stripe :data="recoveriesTableData" style="width: 100%"
+                                :header-cell-style="headerCellStyle">
+                                <el-table-column v-bind="item" v-for="item in columnsRecoveries"
+                                    :key="item.prop"></el-table-column>
+                            </el-table>
+                        </el-col>
+                    </el-row>
+
+                    <el-row v-if="isVerify">
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"><span>未回款金额</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5">
+                            <el-text type="danger">{{ info?.T_no_recoveries_money! }}¥</el-text>
+                        </el-col>
+                    </el-row>
+
+                    <el-row>
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"><span>开票明细</span></el-col>
+                        <el-col :span="21">
+                            <el-table border stripe :data="invoiceTableData" style="width: 100%"
+                                :header-cell-style="headerCellStyle">
+                                <el-table-column v-bind="item" v-for="item in columnsInvoice"
+                                    :key="item.prop"></el-table-column>
+                            </el-table>
+                        </el-col>
+                    </el-row>
+                    <el-row v-if="isVerify">
+                        <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="2"><span>未开票金额</span></el-col>
+                        <el-col :xs="11" :sm="9" :md="7" :lg="6" :xl="5"><el-text type="danger">{{ info?.T_no_invoice_money!
+                        }}¥</el-text></el-col>
+                    </el-row>
+                </div>
+
+                <el-divider />
+                <div class="submit">
+                    <el-button v-if="info?.T_State === 3 && isSale" type="danger" round
+                        @click="contractApproval(2)">审核不通过</el-button>
+                    <el-button v-if="info?.T_State === 3 && isSale" type="success" round
+                        @click="contractApproval(1)">审核通过</el-button>
+                    <el-button type="primary" round @click="router.back()">返回</el-button>
+                </div>
+            </div>
+            <Drawer ref="drawerSnRef" :handleClose="callbackSnDrawer" size="30%">
+                <el-table :data="tableSnData" style="width: 100%; height: 99%" :header-cell-style="headerCellStyle">
+                    <template v-for="item in snColumns" :key="item">
+                        <el-table-column v-if="item.type === 'index'" v-bind="item" />
+                        <el-table-column v-if="item.prop" v-bind="item" />
+                    </template>
+                </el-table>
+            </Drawer>
+        </div>
+    </Drawer>
+</template>
+
+<style scoped lang="scss">
+.contract-detail {
+    height: 100%;
+    font-weight: bold;
+    color: var(--el-text-color-secondary);
+
+    .info {
+        height: 100%;
+        padding: 20px;
+
+        h1 {
+            font-size: 24px;
+
+            span {
+                color: #f56c6c;
+            }
+        }
+
+        & .content {
+            height: calc(100% - 72px - 25px - 40px);
+            overflow-y: auto;
+
+            .el-row {
+                margin-bottom: 16px;
+            }
+        }
+
+        .submit {
+            display: flex;
+            justify-content: center;
+        }
+    }
+}
+</style>