YangJian0701 преди 1 година
родител
ревизия
7cf7c652c4

BIN
ERP.rar


+ 6 - 0
src/api/percentage/index.ts

@@ -0,0 +1,6 @@
+import $http from '../index'
+
+// 提成管理-列表
+export const percentage_List = (params: any) => $http.post('/storage/Percentage/List', params)
+// 员工-列表
+export const percentage_User_List = (params: any) => $http.post('/storage/Percentage/User/List', params)

+ 5 - 1
src/components/Upload/index.vue

@@ -141,7 +141,7 @@ defineExpose({
 
 <template>
   <div>
-    <el-upload ref="upload" :accept="accept" :disabled="disabled" v-model:file-list="fileList" style="width: 50px;height: 50px;"
+    <el-upload ref="upload" :accept="accept" :disabled="disabled" v-model:file-list="fileList"
       action="https://up-z2.qiniup.com" :list-type="listType" :limit="limit" :before-upload="beforeUpload"
       :auto-upload="true" :on-success="onSuccess" :on-error="onError" :on-exceed="handleExceed" :on-remove="handleRemove"
       :on-preview="handlePictureCardPreview" :data="uploadData" @click="clickToken">
@@ -172,4 +172,8 @@ defineExpose({
   width: 100%;
   height: 100%;
 }
+.el-upload--picture-card {
+    height: 50px;
+    width: 50px;
+}
 </style>

+ 7 - 1
src/hooks/useTablePublic.ts

@@ -110,7 +110,13 @@ export const options = [
   { name: '未通过', id: 2 },
   { name: '待审核', id: 3 }
 ]
-
+export const options1 = [
+  { name: '待审核', id: 1 },
+  { name: '审核通过', id: 2 },
+  { name: '审核不通过', id: 3 },
+  { name: '已部分打款', id: 4 },
+  { name: '已全部打款', id: 5 }
+]
 export function useTablePublic() {
   const globalStore = GlobalStore()
   const validate_T_product = (rule: any, value: any, callback: any) => {

+ 2 - 0
src/layouts/Header/Breadcrumb.vue

@@ -23,6 +23,8 @@ const getExtraBreadcrumb = (name: string) => {
   switch (name) {
     case 'ContractDetail':
       return getBreadcrumb('/contractDetail', 'ue628', '/contract')
+    case 'PercentageDetail':
+      return getBreadcrumb('/percentageDetail', 'ue628', '/percentage')
     case 'InStorageDetail':
       return getBreadcrumb('/inStorageDetail', 'ue60f', '/inStorage')
     case 'ReceiveOutStock':

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

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

+ 8 - 2
src/views/salary/Reimburse/ReimburseFrom.vue

@@ -92,6 +92,12 @@
                 <el-input v-model="scope.row.T_approval_money" :disabled="data.drawerTiti=='详情'?true:false" placeholder="审批金额" />
               </template>
             </el-table-column>
+            <el-table-column label="审批意见" width="100" show-overflow-tooltip>
+              <template #default="scope">
+                <el-input v-model="scope.row.T_approval_opinion" v-if="data.drawerTiti!='详情'" placeholder="审批意见" />
+                <div v-if="data.drawerTiti=='详情'" style="overflow:hidden; white-space: nowrap; text-overflow: ellipsis;">{{ scope.row.T_approval_opinion }}</div>
+              </template>
+            </el-table-column>
             <el-table-column label="费用事由" width="150">
               <template #default="scope">
                 {{ scope.row.T_reasons }}
@@ -189,6 +195,7 @@ const data = reactive({
       T_fee_details:null,
       T_fee_details_name:null,
       T_approval_money:null,
+      T_approval_opinion:null,
       T_fee_type:null,
       T_fee_type_name:null,
       T_img:null,
@@ -257,9 +264,8 @@ const subFun = async ()=>{
 
   const arrObjMap:any = []
   arrObj.forEach((item:any)=>{
-    arrObjMap.push(item.Id + ',' + item.T_approval_money)
+    arrObjMap.push(item.Id + ',' + item.T_approval_money + ','  +item.T_approval_opinion)
   })
-
   const resIt:any = await Reimburse_Edit({
     T_id:data.Id,
     T_approval_details:arrObjMap.length==0?'':arrObjMap.join('|')+'|',

+ 25 - 10
src/views/salary/ReimburseMy.vue

@@ -1,8 +1,7 @@
 <template>
     <div class="reimburseMy">
         <div class="reimburseMy-table">
-            <el-button type="primary" icon="Plus" style="margin-bottom: 10px;"
-                @click="showDrawer('news', null)">新增报销</el-button>
+            <el-button type="primary" icon="Plus" style="margin-bottom: 10px;" @click="showDrawer('news', null)">新增报销</el-button>
             <el-table :data="data.tableData" style="width: 100%" border>
                 <el-table-column :show-overflow-tooltip="true" label="序号" type="index" width="70" />
                 <!-- <el-table-column :show-overflow-tooltip="true" prop="Id" label="ID" width="180" /> -->
@@ -45,7 +44,7 @@
             <el-form :model="data.fromData" label-position="top">
                 <el-form-item label="报销总金额">
                     <div style="display: flex;">
-                        <el-input v-model.number="data.fromData.T_money" style="flex: 1;"
+                        <el-input v-model="data.fromData.T_money" style="flex: 1;"
                             :disabled="data.drawerTiti == '详情' ? true : false" />
                         <span style="padding-left: 20px;">元</span>
                     </div>
@@ -104,10 +103,15 @@
                                     :disabled="data.disabledNum == scope.$index ? false : true" />
                             </template>
                         </el-table-column>
-                        <el-table-column label="审批金额" width="100">
-                        <template #default="scope">
-                            <el-input v-model="scope.row.T_approval_money" :disabled="data.drawerTiti=='详情'?true:false" placeholder="审批金额" />
-                        </template>
+                        <el-table-column label="审批金额" width="100" v-if="data.drawerTiti=='详情'">
+                            <template #default="scope">
+                                <el-input v-model="scope.row.T_approval_money" :disabled="data.drawerTiti=='详情'?true:false" placeholder="审批金额" />
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="审批意见" width="100" v-if="data.drawerTiti=='详情'">
+                            <template #default="scope">
+                                <el-input v-model="scope.row.T_approval_opinion" :disabled="data.drawerTiti=='详情'?true:false" placeholder="审批意见" />
+                            </template>
                         </el-table-column>
                         <el-table-column label="费用事由" width="150">
                             <template #default="scope">
@@ -202,6 +206,7 @@ const data = reactive({
             mapPick: [],
             selectData:[],
             T_approval_money:"",
+            T_approval_opinion:"",
             T_trip_start_time: "",
             T_trip_end_time: "",
             T_trip_origin: "",
@@ -268,6 +273,7 @@ const subData = () => {
 const seteditApi = async()=>{
     console.log('编辑',data.fromData)
     let obj = {...data.fromData}
+    obj.T_money = Number(obj.T_money)
     obj.ReimburseDetails.forEach(item=>{
         item.T_money = Number(item.T_money)
     })
@@ -281,12 +287,19 @@ const seteditApi = async()=>{
 }
 //新增api
 const setAddApi = async () => {
-    let obj = {...data.fromData}
-    obj.ReimburseDetails.forEach(item=>{
+    let obj:any = {...data.fromData}
+    obj.T_money = Number(obj.T_money)
+    obj.ReimburseDetails.forEach((item:any)=>{
         item.T_money = Number(item.T_money)
     })
+    delete obj.T_approval_money
+    if(obj.ReimburseDetails){
+        obj.ReimburseDetails.forEach((item:any) => {
+            delete item.T_approval_money
+            delete item.T_approval_opinion
+        });
+    }
     const resIt: any = await ReimburseMy_Add(obj)
-    console.log('新增返回', resIt)
     if (resIt.Code == 200) {
         ElMessage.success('新增成功')
         data.drawer = false
@@ -366,6 +379,7 @@ const showDrawer = (e: string, datas: any) => {
                     mapPick: [],
                     selectData:[],
                     T_approval_money:"",
+                    T_approval_opinion:"",
                     T_trip_start_time: "",
                     T_trip_end_time: "",
                     T_trip_origin: "",
@@ -448,6 +462,7 @@ const newAdd = () => {
         mapPick: [],
         selectData:[],
         T_approval_money:"",
+        T_approval_opinion:"",
         T_trip_start_time: "",
         T_trip_end_time: "",
         T_trip_origin: "",

+ 163 - 0
src/views/storehouse/sales/Percentage.vue

@@ -0,0 +1,163 @@
+<script setup lang="ts">
+import { ref, reactive, defineAsyncComponent, onMounted } from 'vue'
+import { useRouter } from 'vue-router'
+import { fnMd5 } from '@/utils/common'
+import { ElMessageBox, ElMessage } from 'element-plus'
+import TableBase from '@/components/TableBase/index.vue'
+import { Edit, Delete, Finished, View } from '@element-plus/icons-vue'
+import type { ColumnProps } from '@/components/TableBase/interface/index'
+import { percentage_List, percentage_User_List } from '@/api/percentage/index'
+import { useTablePublic, options1 } from '@/hooks/useTablePublic'
+
+const ContractForm = defineAsyncComponent({
+  loader: () => import(/*webpackChunkName: 'ContractForm'*/ './ContractForm.vue'),
+  delay: 500,
+  timeout: 3000,
+  suspensible: true
+})
+const router = useRouter()
+const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
+const ContractFormRef = ref<InstanceType<typeof ContractForm> | null>(null)
+const { globalStore, searchOnTableList, updateOnTableList } = useTablePublic()
+
+const columns: ColumnProps[] = [
+  { type: 'index', label: '序号', width: 80 },
+  { prop: 'T_number', label: '合同编号' },
+  { prop: 'T_customer', label: '客户名称' },
+  { prop: 'T_contract_money', label: '合同总金额' },
+  { prop: 'T_recoveries_money', label: '回款金额' },
+  { prop: 'T_type', label: '提成类型', name: 'T_type' },
+  { prop: 'T_uuid_name', label: '提成人员' },
+  { prop: 'T_money', label: '提成金额' },
+  { prop: 'T_send_money', label: '已发提成金额' },
+  { prop: 'T_State', label: '状态', name: 'T_State' },
+  { prop: 'operation', label: '操作', width: 260, fixed: 'right' }
+]
+
+const openContractFormDrawer = (type: string, row?: any) => {
+  ContractFormRef.value?.openDrawer(type, row)
+}
+const processContract = (id: string) => router.push({ name: 'PercentageDetail', params: { id, type: fnMd5('contract') } })
+
+const initParam = reactive({
+  User_tokey: globalStore.GET_User_tokey,
+  T_name: '',
+  T_state: '',
+  T_uuid: '',
+})
+const loading = ref(false)
+interface ListItem {
+  value: string
+  label: string
+}
+const list = ref<ListItem[]>([])
+const optionsData = ref<ListItem[]>([])
+const remoteMethod = async (query: string) => {
+  if (query) {
+    loading.value = true
+    setTimeout(() => {
+      loading.value = false
+      optionsData.value = list.value.filter((item: any) => {
+        return item.label.toLowerCase().includes(query.toLowerCase())
+      })
+    }, 200)
+  } else {
+    optionsData.value = []
+  }
+}
+const click2 = async () => { optionsData.value = list.value }
+onMounted(async () => {
+  const result: any = await percentage_User_List({})
+  let arr = result.Data.Data || []
+  list.value = arr.map((item: any) => {
+    return { value: item.T_uuid, label: item.T_user }
+  })
+})
+</script>
+
+<template>
+  <div class="contract">
+    <TableBase ref="TableRef" :columns="columns" :requestApi="percentage_List" :initParam="initParam">
+      <template #table-header>
+        <div class="input-suffix">
+          <el-row :gutter="20" style="margin-bottom: 0">
+            <el-col :xl="5" :md="6">
+              <span class="inline-flex items-center">合同编号:</span>
+              <el-input v-model="initParam.T_name" type="text" class="w-50 m-2" placeholder="按合同编号搜索"
+                @change="searchOnTableList(TableRef)" />
+            </el-col>
+            <el-col :xl="5" :md="6">
+              <span class="inline-flex items-center">员工:</span>
+              <el-select v-model="initParam.T_uuid" filterable remote reserve-keyword placeholder="员工"
+                :remote-method="remoteMethod" :loading="loading" @click="click2" clearable style="width: 200px;">
+                <el-option v-for="item in optionsData" :key="item.value" :label="item.label" :value="item.value" />
+              </el-select>
+            </el-col>
+            <el-col :xl="5" :md="6">
+              <span class="inline-flex items-center">状态:</span>
+              <el-select v-model="initParam.T_state" class="w-50" clearable placeholder="请选择状态~">
+                <el-option v-for="item in options1" :key="item.id" :label="item.name" :value="item.id" />
+              </el-select>
+            </el-col>
+            <el-col :xl="6" :md="2" class="btn"> <el-button type="primary"
+                @click="searchOnTableList(TableRef)">搜索</el-button></el-col>
+          </el-row>
+        </div>
+      </template>
+      <template #T_type="{ row }">
+        <el-tag v-if="row.T_type === 1" type="success" effect="dark"> 验证实施 </el-tag>
+        <el-tag v-if="row.T_type === 2" type="" effect="dark"> 报告编写 </el-tag>
+      </template>
+      <template #T_State="{ row }">
+        <el-tag v-if="row.T_State === 1" type="info" effect="dark"> 待审核 </el-tag>
+        <el-tag v-if="row.T_State === 2" type="success" effect="dark"> 审核通过 </el-tag>
+        <el-tag v-if="row.T_State === 3" type="danger" effect="dark"> 审核不通过 </el-tag>
+        <el-tag v-if="row.T_State === 4" type="info" effect="dark"> 部分打款 </el-tag>
+        <el-tag v-if="row.T_State === 5" type="" effect="dark"> 全部打款 </el-tag>
+      </template>
+      <template #T_out="{ row }">
+        <el-tag v-if="row.T_out === 2 || row.T_out === 3" type="success" effect="dark">
+          {{ row.T_out === 2 ? '部分出库' : '已出库' }}
+        </el-tag>
+        <el-tag v-else-if="row.T_out === 1" type="warning" effect="dark"> 未出库 </el-tag>
+        <el-tag v-else type="danger" effect="dark"> --- </el-tag>
+      </template>
+      <template #right="{ row }">
+        <el-button link type="warning" size="small" :icon="Finished" @click="processContract(row.T_number)">审核</el-button>
+        <el-button link type="primary" size="small" :icon="Edit"
+          @click="openContractFormDrawer('edit', row)">编辑</el-button>
+        <el-button link type="success" size="small" :icon="View" @click="processContract(row.T_number)">详情</el-button>
+      </template>
+    </TableBase>
+    <ContractForm ref="ContractFormRef" @onTableList="updateOnTableList(TableRef)" />
+  </div>
+</template>
+
+<style scoped lang="scss">
+@import '@/styles/var.scss';
+
+.contract {
+  @include f-direction;
+
+  :deep(.el-drawer__header) {
+    margin-bottom: 0;
+  }
+
+  .input-suffix {
+    width: 100%;
+
+    .inline-flex {
+      white-space: nowrap;
+    }
+
+    .btn {
+      display: flex;
+      justify-content: end;
+    }
+
+    .w-50 {
+      width: 12.5rem;
+    }
+  }
+}
+</style>

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

@@ -0,0 +1,389 @@
+<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: route.params.id })
+  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
+    }
+  })
+}
+
+onMounted(() => {
+  const { params } = route
+  getStorehouseContractGet()
+  params.verify && (isVerify.value = false)
+  params.type === fnMd5('contract') && (isSale.value = true)
+
+  columns = isVerify.value ? columns : VerifyColumns
+})
+onUnmounted(() => {
+  isSale.value = false
+})
+</script>
+<template>
+  <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>
+</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>

+ 26 - 9
src/views/workAttendance/MyOvertime.vue

@@ -123,7 +123,9 @@ const AddOvertime = (formEl: FormInstance | undefined) => {
   formEl.validate(async valid => {
     if (valid) {
       let res: any = {}
-      let time = duration.value * 60
+      let time = duration.value * 60 + minutes.value
+      console.log('提交minutes',duration.value,minutes.value,time)
+      if(time<0){ElMessage.error('时间选择错误,请重新选择');return}
       if (isNew.value) {
         res = await Overtime_Add({ ...form.value, T_approver: form.value.uuid, T_duration: time })
       } else {
@@ -176,14 +178,24 @@ const getApproverInfo = (row: any) => {
   dialog.value?.DialogClose()
 }
 
+
 const duration = computed(() => {
-  const end_time = dayJs(form.value.T_end_time)
-  if (!form.value.T_end_time) {
-    return 0
-  }
-  let count: number = end_time.diff(form.value.T_start_time, 'hour', true)
-  let num: number = Number(count.toFixed(2))
-  return Math.round(num * 10) / 10
+  if (!form.value.T_start_time || !form.value.T_end_time) { return 0 }
+  let strTime = form.value.T_start_time
+  let endTime = form.value.T_end_time
+  var endDate:any = new Date(strTime) //开始时间 
+  var nowDate:any = new Date(endTime) //结束时间 
+  let h:any = (nowDate - endDate) / (60 * 60 * 1000)
+  return parseInt(h) //获取小时部分 
+})
+const minutes = computed(() => {
+  if (!form.value.T_start_time || !form.value.T_end_time) {return 0}
+  let strTime = form.value.T_start_time
+  let endTime = form.value.T_end_time
+  var endDate:any = new Date(strTime) //开始时间 
+  var nowDate:any = new Date(endTime) //结束时间 
+  let m:any = (nowDate - endDate) % (60 * 60 * 1000) / (60 * 1000); //获取分钟部分
+  return parseInt(m)
 })
 </script>
 
@@ -283,9 +295,14 @@ const duration = computed(() => {
           />
         </el-form-item>
         <el-form-item label="加班时长:" :label-width="formLabelWidth" prop="T_duration">
-          <el-input v-model="duration" autocomplete="off" placeholder="请假时长">
+          <template style="display: flex;align-items: center;gap:20px">
+            <el-input v-model="duration" autocomplete="off" placeholder="请假时长">
             <template #suffix> 小时 </template>
           </el-input>
+          <el-input v-model="minutes" autocomplete="off" placeholder="请假时长">
+            <template #suffix> 分钟 </template>
+          </el-input>
+          </template>
         </el-form-item>
         <el-form-item label="取证:" :label-width="formLabelWidth" prop="T_prove_img">
           <Upload