songxy преди 1 година
родител
ревизия
c3e8e35b38

+ 15 - 2
client/src/interface/contract.ts

@@ -41,6 +41,10 @@ export interface Contract {
    * 委托方
    */
   clientName?: string
+  /**
+   * 委托方编号
+   */
+  clientNumber: string
   /**
    * 合同金额
    */
@@ -56,7 +60,7 @@ export interface Contract {
   /**
    * 合同编号
    */
-  contractNumber?: string
+  contractNumber: string
   /**
    * 合同拿回日期
    */
@@ -171,6 +175,11 @@ export interface Contract {
    * 分包理由
    */
   subReason?: string
+
+  /**
+   * 销售经理
+   */
+  areaManagerId: string
 }
 
 export interface ExtraConstract {
@@ -202,6 +211,10 @@ export interface ExtraConstract {
    * 委托方
    */
   clientName?: string
+  /**
+   * 委托方编号
+   */
+  clientNumber: string
   /**
    * 公司认定金额
    */
@@ -213,7 +226,7 @@ export interface ExtraConstract {
   /**
    * 合同编号
    */
-  contractNumber?: string
+  contractNumber: string
   /**
    * 合同拿回日期
    */

+ 2 - 2
client/src/service/project.ts

@@ -119,11 +119,11 @@ export const getProjectMileStone = async (projectId: ProjectId) => {
  * @param id
  * @param projectId
  */
-export const finishProjectMileStone = async (id: string, projectId: ProjectId) => {
+export const finishProjectMileStone = async (params: { id: string; projectId: ProjectId }) => {
   return await request.get(
     {
       url: '/project-milestone/finish',
-      params: { id, projectId }
+      params: params
     },
     '/business'
   )

+ 4 - 1
client/src/views/OaSystem/components/UserOrgTree/index.vue

@@ -3,6 +3,7 @@
     style="width: 100%"
     v-model="receiveUserId"
     :data="allUserList"
+    :default-expand-all="defaultExpandAll"
     :filter-node-method="filterNodeMethod"
     placeholder=" "
     filterable
@@ -14,7 +15,9 @@ import { useQuery } from '@tanstack/vue-query'
 import { getAllUserSimpleByList } from '@/service/system'
 
 defineOptions({ name: 'UserOrgTree' })
-const props = defineProps<{ modelValue: any }>()
+const props = withDefaults(defineProps<{ modelValue: any; defaultExpandAll: boolean }>(), {
+  defaultExpandAll: false
+})
 const emit = defineEmits<{ (e: 'update:modelValue', v: string): void }>()
 const receiveUserId = computed({
   get: () => props.modelValue,

+ 15 - 8
client/src/views/OaSystem/projectCenter/projectDetail/components/xmht/ContractMilestone.vue

@@ -1,18 +1,25 @@
 <script setup lang="ts">
-import { useQuery } from '@tanstack/vue-query'
+import { useMutation } from '@tanstack/vue-query'
 import { getContractMilestoneList } from '@/service/contract'
-import { ContractQueryParams } from '@/interface/contract'
 
 /**
  * 项目合同里程碑
  */
-const props = defineProps<ContractQueryParams>()
-const { contractId } = toRefs(props)
-
-const { data: contractMilestoneList } = useQuery(
-  [getContractMilestoneList.name, unref(contractId)],
-  async () => await getContractMilestoneList(unref(contractId))
+const props = defineProps<{
+  contractId: string | null
+}>()
+watch(
+  () => props.contractId,
+  () => {
+    getContractMilestoneListMutate(props.contractId as string)
+  }
 )
+const contractMilestoneList = ref<any>()
+const { mutate: getContractMilestoneListMutate } = useMutation(getContractMilestoneList, {
+  onSuccess: (data: any) => {
+    contractMilestoneList.value = data
+  }
+})
 </script>
 
 <template>

+ 0 - 48
client/src/views/OaSystem/projectCenter/projectDetail/components/xmht/ContractPayment.vue

@@ -1,48 +0,0 @@
-<script setup lang="ts">
-import { useQuery } from '@tanstack/vue-query'
-import { ContractQueryParams } from '@/interface/contract'
-import { getContractPaymentList } from '@/service/contract'
-
-/**
- * 项目合同付款
- */
-const props = defineProps<ContractQueryParams>()
-const { contractId } = toRefs(props)
-
-const { data: contractPaymentList } = useQuery(
-  [getContractPaymentList.name, unref(contractId)],
-  async () => await getContractPaymentList(unref(contractId))
-)
-</script>
-
-<template>
-  <div class="tableBox tableLineBox">
-    <h4><i class="icon"></i>付款详情</h4>
-    <table>
-      <thead>
-        <tr>
-          <th>序号</th>
-          <th>申请时间</th>
-          <th>申请金额(元)</th>
-          <th>实际付款时间</th>
-          <th>用款说明</th>
-          <th>操作</th>
-        </tr>
-      </thead>
-      <tbody>
-        <tr>
-          <td></td>
-          <td></td>
-          <td></td>
-          <td></td>
-          <td></td>
-          <td></td>
-        </tr>
-      </tbody>
-    </table>
-  </div>
-</template>
-
-<style scoped lang="scss">
-@import './index.scss';
-</style>

+ 15 - 7
client/src/views/OaSystem/projectCenter/projectDetail/components/xmht/ContractReturnedMoney.vue

@@ -1,18 +1,26 @@
 <script setup lang="ts">
-import { useQuery } from '@tanstack/vue-query'
-import { ContractQueryParams } from '@/interface/contract'
+import { useMutation } from '@tanstack/vue-query'
 import { getContractReturnedMoneyList } from '@/service/contract'
 
 /**
  * 项目合同回款
  */
-const props = defineProps<ContractQueryParams>()
-const { contractId } = toRefs(props)
+const props = defineProps<{
+  contractId: string | null
+}>()
 
-const { data: contractRMoneyList } = useQuery(
-  [getContractReturnedMoneyList.name, unref(contractId)],
-  async () => await getContractReturnedMoneyList(unref(contractId))
+watch(
+  () => props.contractId,
+  () => {
+    getContractReturnedMoneyListMutate(props.contractId as string)
+  }
 )
+const contractRMoneyList = ref<any>()
+const { mutate: getContractReturnedMoneyListMutate } = useMutation(getContractReturnedMoneyList, {
+  onSuccess(data) {
+    contractRMoneyList.value = data
+  }
+})
 
 const invoiceTypeMap = {
   '1': '增值税专用发票',

+ 28 - 18
client/src/views/OaSystem/projectCenter/projectDetail/components/xmht/index.vue

@@ -55,7 +55,7 @@
         <div class="tableBox tableBox—first">
           <h4><i class="icon"></i>基本信息</h4>
           <ul>
-            <li v-if="editor === false" @click="handleEdit">编辑合同</li>
+            <li v-if="editor === false" @click="handleEditor">编辑合同</li>
             <li v-else @click="saveContractHandle">保存合同</li>
             <li>用款申请</li>
             <li @click="() => startContractInvoiceMuate(mainContractDetail?.id)">开票申请</li>
@@ -130,10 +130,10 @@
               <td>
                 <el-date-picker
                   style="width: 100%"
-                  :disabled="true"
+                  :disabled="!editor"
                   v-model="mainContractDetail.contractOn"
                   type="date"
-                  @change="($evt) => (mainContractDetail['contractOn'] = $evt)"
+                  value-format="YYYY-MM-DD"
                   placeholder="请选择合同拿出时间"
                 />
               </td>
@@ -141,10 +141,10 @@
               <td>
                 <el-date-picker
                   style="width: 100%"
-                  :disabled="true"
+                  :disabled="!editor"
                   v-model="mainContractDetail.contractOff"
                   type="date"
-                  @change="($evt) => (mainContractDetail['contractOff'] = $evt)"
+                  value-format="YYYY-MM-DD"
                   placeholder="请选择合同拿回时间"
                 />
               </td>
@@ -267,11 +267,11 @@
         <div class="tableBox tableBox—first">
           <h4><i class="icon"></i>基本信息</h4>
           <ul>
-            <li v-if="editor === false" @click="handleEdit">编辑合同</li>
+            <li v-if="editor === false" @click="handleEditor">编辑合同</li>
             <li v-else @click="saveContractHandle">保存合同</li>
             <li>用款申请</li>
           </ul>
-          <table v-if="childContractDetail?.contractType === 2">
+          <table v-if="childContractDetail?.contractType == 2">
             <tr>
               <td class="th">分包理由:</td>
               <td colspan="3">
@@ -349,13 +349,13 @@
             <tr>
               <td class="th">外包包理由:</td>
               <td colspan="3">
-                <el-input v-model="childContractDetail.outReason" :disabled="!editor" />
+                <el-input v-model="childContractDetail.subReason" :disabled="!editor" />
               </td>
             </tr>
             <tr>
               <td class="th">外包金额(元):</td>
               <td>
-                <el-input v-model="childContractDetail.outAmount" :disabled="!editor" />
+                <el-input v-model="childContractDetail.subAmount" :disabled="!editor" />
               </td>
               <td class="th">供应商:</td>
               <td>
@@ -366,8 +366,8 @@
               <td class="th">是否需要签订合同:</td>
               <td>
                 <el-radio-group v-model="childContractDetail.isSign" :disabled="!editor">
-                  <el-radio label="1">是</el-radio>
-                  <el-radio label="0">否</el-radio>
+                  <el-radio :label="1">是</el-radio>
+                  <el-radio :label="0">否</el-radio>
                 </el-radio-group>
               </td>
               <td class="th">分包质量把控人:</td>
@@ -424,7 +424,8 @@ import {
   putContract,
   startContractInvoice,
   queryCustomerTree,
-  queryCompanyTree
+  queryCompanyTree,
+  getContractPaymentList
 } from '@/service/contract'
 import { useQuery, useMutation } from '@tanstack/vue-query'
 import { Contract } from '@/interface/contract'
@@ -492,7 +493,7 @@ const secondTypeList = shallowReactive<TypeSelectInterface[]>([
   }
 ])
 const editor = ref<Boolean>(false)
-const mainContractDetail = ref<any>()
+const mainContractDetail = ref<Contract>({} as Contract)
 const childContractDetail = ref<any>()
 const contractDetails = ref<any[]>([])
 const childrenContracts = ref<any[]>([])
@@ -518,10 +519,13 @@ const { refetch } = useQuery(
     }
   }
 )
-const handleEdit = () => {
-  console.log('handleEdit: ')
-  editor.value = true
-}
+//查询分包付款数据
+const { mutate: queryContractPaymentMutate } = useMutation(getContractPaymentList, {
+  onSuccess: (data) => {
+    console.log('data--------------------------')
+    console.log(data)
+  }
+})
 
 /***
  * 查询委托方数据
@@ -536,7 +540,7 @@ const { data: assigneeTree } = useQuery(['assigneeTree'], async () => await quer
   staleTime: Infinity
 })
 /**
- * 切换子项目信息
+ * 切换子合同
  * **/
 const mainContractIndex = ref<number>(0)
 const contractInfoIndex = ref<number>(0)
@@ -550,6 +554,7 @@ const switchContractInfo = (item: any, key: number, mKey?: number): void => {
     }
   } else {
     childContractDetail.value = item
+    queryContractPaymentMutate(item.id)
   }
 }
 
@@ -557,6 +562,8 @@ const saveContractHandle = () => {
   if (contractInfoIndex.value === 0) {
     //主合同
     saveContract(mainContractDetail.value)
+  } else {
+    saveContract(childContractDetail.value)
   }
 }
 /**
@@ -574,6 +581,9 @@ const { mutate: saveContract } = useMutation(putContract, {
     })
   }
 })
+const handleEditor = () => {
+  editor.value = !editor.value
+}
 /**
  * 发起开票申请流程
  */

+ 12 - 8
client/src/views/OaSystem/projectCenter/projectDetail/components/xmxx/ProjectMember.vue

@@ -1,7 +1,7 @@
 <script setup lang="ts">
 import { useMutation, useQuery } from '@tanstack/vue-query'
 import { addMember, deleteMember, getProjectMember } from '@/service/project'
-import { ProjectMember, ProjectQueryParams } from '@/interface/project'
+import { ProjectMember } from '@/interface/project'
 import { ElMessage } from 'element-plus'
 import UserOrgTree from '@/views/OaSystem/components/UserOrgTree/index.vue'
 
@@ -12,13 +12,14 @@ const defaultMemberData = {
 /**
  * 项目成员
  */
-const props = defineProps<ProjectQueryParams>()
-const { projectId } = toRefs(props)
+const props = defineProps<{
+  projectId: string
+}>()
 const workerRelationBool = ref<boolean>(false)
 const projectWorkerRelation = ref<ProjectMember>(defaultMemberData)
 const { data: projectWorkerRelationList, refetch } = useQuery(
-  [getProjectMember.name, unref(projectId)],
-  async () => await getProjectMember(unref(projectId))
+  [getProjectMember.name, props.projectId],
+  async () => await getProjectMember(props?.projectId)
 )
 watch(
   () => props.projectId,
@@ -51,14 +52,14 @@ const { mutate: handleAdd } = useMutation(addMember, {
 const handleDeleteMember = (workerId: string) => {
   handleDelete({
     workerId,
-    projectId: unref(projectId)
+    projectId: props.projectId as string
   })
 }
 
 const handleAddMember = () => {
   handleAdd({
     ...projectWorkerRelation.value,
-    projectId: unref(projectId)
+    projectId: props.projectId as string
   })
 }
 </script>
@@ -112,7 +113,10 @@ const handleAddMember = () => {
             <el-row>
               <el-col :span="24">
                 <el-form-item label="人员选择">
-                  <UserOrgTree v-model="projectWorkerRelation['workerId']" />
+                  <UserOrgTree
+                    :default-expand-all="true"
+                    v-model="projectWorkerRelation['workerId']"
+                  />
                 </el-form-item>
               </el-col>
             </el-row>

+ 94 - 19
client/src/views/OaSystem/projectCenter/projectDetail/components/xmxx/ProjectMileStone.vue

@@ -1,18 +1,22 @@
 <script setup lang="ts">
-import { ProjectQueryParams } from '@/interface/project'
 import { useMutation, useQuery } from '@tanstack/vue-query'
 import { finishProjectMileStone, getProjectMileStone } from '@/service/project'
 
-const stoneStatus = ['未开始', '进行中', '已完成']
-
 /**
  * 项目里程碑
  */
-const props = defineProps<ProjectQueryParams>()
-const { projectId } = toRefs(props)
-const { data: projectMilestoneList, refetch } = useQuery(
-  [getProjectMileStone.name, unref(projectId)],
-  async () => await getProjectMileStone(unref(projectId))
+const props = defineProps<{
+  projectId: string
+}>()
+const projectMilestoneList = ref<any>([])
+const { refetch } = useQuery(
+  [getProjectMileStone.name, props.projectId],
+  async () => await getProjectMileStone(props.projectId),
+  {
+    onSuccess: (data) => {
+      projectMilestoneList.value = data
+    }
+  }
 )
 watch(
   () => props.projectId,
@@ -20,7 +24,7 @@ watch(
     refetch()
   }
 )
-const { mutate: handleFinish, isLoading } = useMutation(finishProjectMileStone, {
+const { mutate: handleFinish } = useMutation(finishProjectMileStone, {
   onSuccess: () => {
     refetch()
     ElMessage({
@@ -29,31 +33,98 @@ const { mutate: handleFinish, isLoading } = useMutation(finishProjectMileStone,
     })
   }
 })
+const pMileStoneAddHandle = () => {
+  projectMilestoneList.value.push({
+    id: '',
+    name: '',
+    planFinishTime: '',
+    actualFinishTime: '',
+    state: 2,
+    sortnum: 1,
+    projectId: ''
+  })
+}
+interface StateTypeInterface {
+  value: number
+  label: string
+}
+const stateTypes: StateTypeInterface[] = [
+  {
+    value: 0,
+    label: '未开始'
+  },
+  {
+    value: 1,
+    label: '进行中'
+  },
+  {
+    value: 2,
+    label: '已完成'
+  }
+]
+const confirmHandle = (id: string, index: number) => {
+  projectMilestoneList.value.splice(index, 1)
+}
 </script>
 
 <template>
   <div class="xmjdBox">
+    <div class="btnGroup">
+      <el-button type="primary" @click="pMileStoneAddHandle"> 新增 </el-button>
+    </div>
     <div class="tableBox">
-      <el-table :data="projectMilestoneList" style="width: 100%">
-        <el-table-column type="sortnum" label="序号" width="100" />
-        <el-table-column prop="name" label="里程碑名称" />
-        <el-table-column prop="planFinishTime" label="计划完成时间" width="200" />
-        <el-table-column label="实际完成时间" prop="actualFinishTime" width="200" />
-        <el-table-column label="状态" prop="state" width="200">
+      <el-table :data="projectMilestoneList" border style="width: 100%" header-align="center">
+        <el-table-column label="里程碑名称">
+          <template #default="scope">
+            <el-input :disabled="scope.row.id !== ''" v-model="scope.row.name" />
+          </template>
+        </el-table-column>
+        <el-table-column prop="planFinishTime" label="计划完成时间" width="260">
+          <template #default="scope">
+            <el-date-picker
+              :disabled="scope.row.id !== ''"
+              style="width: 100%"
+              v-model="scope.row.planFinishTime"
+              value-format="YYYY-MM-DD"
+            />
+          </template>
+        </el-table-column>
+
+        <el-table-column label="实际完成时间" prop="actualFinishTime" width="260">
           <template #default="scope">
-            {{ stoneStatus?.[Number(scope.row?.state ?? 0)] ?? '-' }}
+            <el-date-picker
+              :disabled="scope.row.id !== ''"
+              style="width: 100%"
+              v-model="scope.row.actualFinishTime"
+              value-format="YYYY-MM-DD"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="状态" width="200">
+          <template #default="scope">
+            <el-select :disabled="scope.row.id !== ''" v-model="scope.row.state">
+              <el-option
+                v-for="(item, index) in stateTypes"
+                :key="index"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
           </template>
         </el-table-column>
         >
         <el-table-column label="操作" width="200">
           <template #default="scope">
             <el-button
-              v-if="scope.row?.state !== 2"
-              @click="handleFinish(scope.row.id)"
+              @click="handleFinish({ id: scope.row.id, projectId: scope.row.projectId })"
               type="text"
-              size="small"
               >完成
             </el-button>
+            <el-popconfirm title="确定删除?" @confirm="confirmHandle(scope.row.id, scope.$index)">
+              <template #reference>
+                <el-button style="margin-left: 20px" type="text">刪除 </el-button>
+              </template>
+            </el-popconfirm>
           </template>
         </el-table-column>
       </el-table>
@@ -64,5 +135,9 @@ const { mutate: handleFinish, isLoading } = useMutation(finishProjectMileStone,
 <style scoped lang="scss">
 .xmjdBox {
   margin-top: 20px;
+  > .btnGroup {
+    text-align: right;
+    margin-bottom: 15px;
+  }
 }
 </style>

+ 3 - 3
client/src/views/OaSystem/projectCenter/projectDetail/components/xmxx/index.vue

@@ -189,9 +189,9 @@
         </div>
       </template>
       <!--项目成员-->
-      <ProjectMember v-else-if="currentIndex === 1" :projectId="currentProjectId as string" />
+      <ProjectMember v-else-if="currentIndex === 1" :projectId="currentProjectId" />
       <!--项目里程碑-->
-      <ProjectMileStone v-else :projectId="currentProjectId as string" />
+      <ProjectMileStone v-else :projectId="currentProjectId" />
     </div>
     <AddSubProject
       :projectId="_mainProjectId"
@@ -224,7 +224,7 @@ const { id: _mainProjectId = '', subId = '' } = query as {
   id: string
   subId: string
 }
-const currentProjectId = ref<string>()
+const currentProjectId = ref<string>('')
 const isMaster = computed(() => _mainProjectId === currentProjectId.value)
 /***
  * 查询项目和子项目详情数据