瀏覽代碼

功能优化

songxy 11 月之前
父節點
當前提交
cb8f13ebe8

+ 2 - 2
client/.env.base

@@ -4,8 +4,8 @@ NODE_ENV=development
 VITE_DEV=true
 
 # 请求路径
-VITE_BASE_URL='http://10.10.10.7:18080'
-# VITE_BASE_URL='http://10.10.9.168:48080'
+# VITE_BASE_URL='http://10.10.10.7:18080'
+VITE_BASE_URL='http://10.10.8.187:48080'
 # 上传路径
 VITE_UPLOAD_URL='/infra/file/upload'
 # File上传路径

+ 12 - 0
client/src/interface/contract.ts

@@ -314,3 +314,15 @@ export interface ContractSub {
   paymentTerms: string
   bz: string
 }
+
+export interface ContractMilestone {
+  type?: number
+  sortnum?: number
+  id: string
+  contractId: string
+  name: string
+  returnAmount: string
+  actualReturnAmount: string
+  planReturnTime: string
+  description: string
+}

+ 43 - 1
client/src/service/contract.ts

@@ -1,5 +1,5 @@
 import request from '@/config/axios'
-import { Contract, ContractId, ContractSub } from '@/interface/contract'
+import { Contract, ContractId, ContractSub, ContractMilestone } from '@/interface/contract'
 import { ProjectId } from '@/interface/project'
 import { listToTree } from '@/utils/tree'
 
@@ -88,6 +88,48 @@ export const getContractMilestoneList = async (contractId: ContractId) => {
   )
 }
 
+/**
+ * 新增合同里程碑
+ * @param data
+ */
+export const addContractMilestone = async (data: ContractMilestone) => {
+  return await request.post(
+    {
+      url: '/contract-milestone',
+      data
+    },
+    '/business'
+  )
+}
+
+/**
+ * 更新合同里程碑
+ * @param data
+ */
+export const updateContractMilestone = async (data: ContractMilestone) => {
+  return await request.put(
+    {
+      url: '/contract-milestone',
+      data
+    },
+    '/business'
+  )
+}
+
+/**
+ * 删除合同里程碑
+ * @param contractId
+ */
+export const deleteContractMilestoneList = async (deleteByIdList: string) => {
+  return await request.delete(
+    {
+      url: '/contract-milestone',
+      data: deleteByIdList
+    },
+    '/business'
+  )
+}
+
 /**
  * 合同回款
  * @param contractId

+ 78 - 14
client/src/views/OaSystem/projectCenter/projectDetail/components/xmht/ContractMilestone.vue

@@ -1,6 +1,11 @@
 <script setup lang="ts">
 import { useMutation } from '@tanstack/vue-query'
-import { getContractMilestoneList } from '@/service/contract'
+import {
+  getContractMilestoneList,
+  addContractMilestone,
+  updateContractMilestone,
+  deleteContractMilestoneList
+} from '@/service/contract'
 
 /**
  * 项目合同里程碑
@@ -25,11 +30,17 @@ watch(
 const contractMilestoneList = ref<any>()
 const { mutate: getContractMilestoneListMutate } = useMutation(getContractMilestoneList, {
   onSuccess: (data: any) => {
-    contractMilestoneList.value = data
+    contractMilestoneList.value = data.map((item) => {
+      item['type'] = 2
+      return item
+    })
   }
 })
 const addClickHandle = () => {
   contractMilestoneList.value.push({
+    type: 1, // 1 新增/编辑 2 查看
+    id: '',
+    contractId: '',
     name: '',
     returnAmount: '',
     actualReturnAmount: '',
@@ -37,14 +48,41 @@ const addClickHandle = () => {
     description: ''
   })
 }
+const saveContractMilestone = (item) => {
+  if (item['type'] === 2) {
+    item['type'] = 1
+    return
+  }
+  item['contractId'] = props.contractId
+  item['actualReturnAmount'] = parseFloat(item['actualReturnAmount'])
+  if (item['id'] === '') {
+    addContractMilestone(item).then((result) => {
+      item['type'] = 2
+      item['id'] = result
+    })
+  } else {
+    updateContractMilestone(item).then((result) => {
+      item['type'] = 2
+    })
+  }
+}
+const message = useMessage()
+const removeContractMilestone = (item, index) => {
+  deleteContractMilestoneList([item['id']]).then((result) => {
+    if (result) {
+      message.error('删除成功!')
+      contractMilestoneList.value.splice(index, 1)
+    }
+  })
+}
 </script>
 
 <template>
   <div class="tableBox tableLineBox">
     <h4 class="td_title"><i class="icon"></i>合同里程碑</h4>
-    <!-- <div class="add_box">
+    <div class="add_box">
       <el-button type="primary" @click="addClickHandle">新增</el-button>
-    </div> -->
+    </div>
     <table>
       <thead>
         <tr>
@@ -55,22 +93,48 @@ const addClickHandle = () => {
           <th>已回款金额(元)</th>
           <th>预计到款时间</th>
           <th>说明</th>
-          <!-- <th>操作</th> -->
+          <th>操作</th>
         </tr>
       </thead>
       <tbody>
         <tr v-for="(item, index) in contractMilestoneList" :key="index">
           <td>{{ index + 1 }}</td>
-          <td>{{ item['name'] }}</td>
+          <td>
+            <el-input type="text" :disabled="item['type'] === 2" v-model="item['name']" />
+          </td>
           <td>{{ ((item['returnAmount'] / (contractAmount || 1)) * 100).toFixed(0) }}%</td>
-          <td>{{ item['returnAmount'] }}</td>
-          <td>{{ item['actualReturnAmount'] }}</td>
-          <td>{{ item['planReturnTime'] }}</td>
-          <td>{{ item['description'] }}</td>
-          <!-- <td style="width: 120px">
-            <el-button type="primary" size="small">编辑</el-button>
-            <el-button type="danger" size="small">删除</el-button>
-          </td> -->
+          <td>
+            <el-input type="text" :disabled="item['type'] === 2" v-model="item['returnAmount']" />
+          </td>
+          <td>
+            <el-input
+              type="text"
+              :disabled="item['type'] === 2"
+              v-model="item['actualReturnAmount']"
+            />
+          </td>
+          <td>
+            <el-date-picker
+              style="width: 100%"
+              v-model="item.planReturnTime"
+              type="date"
+              :disabled="item['type'] === 2"
+              value-format="YYYY-MM-DD"
+              :clearable="false"
+              placeholder="请选择预计到款时间"
+            />
+          </td>
+          <td>
+            <el-input type="text" :disabled="item['type'] === 2" v-model="item['description']" />
+          </td>
+          <td style="width: 120px">
+            <el-button type="primary" size="small" @click="saveContractMilestone(item)">
+              {{ item['type'] === 1 ? '保存' : '编辑' }}
+            </el-button>
+            <el-button type="danger" size="small" @click="removeContractMilestone(item, index)"
+              >删除</el-button
+            >
+          </td>
         </tr>
       </tbody>
     </table>

+ 38 - 6
client/src/views/OaSystem/projectCenter/projectDetail/components/xmht/index.vue

@@ -298,7 +298,11 @@
                   技术开发
                 </td>
                 <td>
-                  <el-input v-model="mContractDetail.taxHsjeJskf" :disabled="!editor" />
+                  <el-input
+                    v-model="mContractDetail.taxHsjeJskf"
+                    :disabled="!editor"
+                    @input="computedContractPriceHandle"
+                  />
                 </td>
                 <td rowspan="5">
                   <span>{{ mContractDetail.taxZhsl }}</span>
@@ -333,7 +337,7 @@
                   <el-input
                     v-model="mContractDetail.taxHsjeFw"
                     :disabled="!editor"
-                    style="width: 100%"
+                    @input="computedContractPriceHandle"
                   />
                 </td>
               </tr>
@@ -343,7 +347,11 @@
                   产品软件
                 </td>
                 <td>
-                  <el-input v-model="mContractDetail.taxHsjeRjcp" :disabled="!editor" />
+                  <el-input
+                    v-model="mContractDetail.taxHsjeRjcp"
+                    :disabled="!editor"
+                    @input="computedContractPriceHandle"
+                  />
                 </td>
               </tr>
               <tr>
@@ -352,7 +360,11 @@
                   硬件(平板等)
                 </td>
                 <td>
-                  <el-input v-model="mContractDetail.taxHsjeYj" :disabled="!editor" />
+                  <el-input
+                    v-model="mContractDetail.taxHsjeYj"
+                    :disabled="!editor"
+                    @input="computedContractPriceHandle"
+                  />
                 </td>
               </tr>
               <tr class="subtotal">
@@ -791,8 +803,6 @@ const { refetch } = useQuery(
       }
       mContractDetails.value = tData
       mContractDetail.value = tData[0] //初始化主合同
-      console.log('mContractDetail------------------------------')
-      console.log(mContractDetail)
     }
   }
 )
@@ -832,6 +842,28 @@ const saveContractHandle = () => {
     saveContractSub(cContractDetail.value)
   }
 }
+const computedContractPriceHandle = () => {
+  //计算小计
+  mContractDetail.value.taxHsjeTotal =
+    parseFloat(mContractDetail.value?.taxHsjeJskf || 0) +
+    parseFloat(mContractDetail.value?.taxHsjeFw || 0) +
+    parseFloat(mContractDetail.value?.taxHsjeRjcp || 0) +
+    parseFloat(mContractDetail.value?.taxHsjeYj || 0)
+
+  const taxBhsze: number =
+    parseFloat(parseFloat(mContractDetail.value?.taxHsjeJskf || 0) / 1) +
+    parseFloat(parseFloat(mContractDetail.value?.taxHsjeFw || 0) / 1.06) +
+    parseFloat(parseFloat(mContractDetail.value?.taxHsjeRjcp || 0) / 1.13) +
+    parseFloat(parseFloat(mContractDetail.value?.taxHsjeYj || 0) / 1.13)
+  //计算不含税总额
+  mContractDetail.value.taxBhsze = parseFloat(taxBhsze.toFixed(2))
+
+  //计算综合税率
+  mContractDetail.value.taxZhsl =
+    taxBhsze === 0
+      ? 0
+      : parseFloat(((mContractDetail.value.taxHsjeTotal - taxBhsze) / taxBhsze).toFixed(6))
+}
 /**
  * 编辑保存主合同信息
  * **/