Browse Source

项目详情合同新增挂靠比例和分包费用字段

songxy 8 months ago
parent
commit
f310131adb

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

@@ -9,6 +9,14 @@ export interface ContractQueryParams {
  * 合同数据类型
  */
 export interface Contract {
+  /**
+   * 挂靠笔记
+   */
+  attachRatio?: number
+  /**
+   * 分包金额
+   */
+  attachAmount?: number
   /**
    * 合同费用状态,{ 2,"未付清"},{ 3,"已付清"},{ 4,"手动设置已付清"}
    */

+ 2 - 1
client/src/utils/dict.ts

@@ -160,5 +160,6 @@ export enum DICT_TYPE {
   SEX_TYPES = 'sex_type',
   PROJECT_REPORT_STATUS = 'project_report_status',
   TRACKING_PROJECT_STATE = 'tracking_project_state',
-  PROJECT_SECTOR = 'project_sector'
+  PROJECT_SECTOR = 'project_sector',
+  XL_TYPE = 'xl_type'
 }

+ 8 - 0
client/src/utils/index.ts

@@ -269,3 +269,11 @@ export const deleteKey = (target: object, key: string): object => {
   }
   return nObj
 }
+
+/**
+ * 格式化浮点类型数字
+ */
+export const parseFloatNumber = (val: string | number | undefined): number => {
+  if (!val) return 0
+  return parseFloat(val.toString())
+}

+ 1 - 2
client/src/views/OaSystem/officeCenter/noticeAndLearn/detail.vue

@@ -8,7 +8,7 @@
           <span style="margin: 0px 50px">阅读次数:{{ detailForm.readNum }}</span>
         </p>
         <div>
-          <span class="title">附件:</span>
+          <span class="title" style="min-width: 60px">附件:</span>
           <ul class="prviewFile">
             <li v-for="(item, index) in fileUrls" :key="index">
               <span>
@@ -136,7 +136,6 @@ if (query.id) {
           margin-right: 10px;
         }
         > .prviewFile {
-          display: flex;
           > li {
             margin-right: 20px;
           }

+ 0 - 130
client/src/views/OaSystem/personnelManagement/ygdaPage/index.ts

@@ -391,136 +391,6 @@ export const formRules = {
   nickname: [{ required: true, message: '名称不能为空', trigger: 'blur' }]
 }
 
-// 表格
-export const tableColumnConfig = [
-  {
-    name: 'deptName',
-    title: '所属部门'
-  },
-
-  {
-    name: 'state',
-    title: '状态',
-    type: 'select',
-    options: [
-      {
-        value: 1,
-        label: '实习'
-      },
-      {
-        value: 2,
-        label: '试用'
-      },
-      {
-        value: 3,
-        label: '正式'
-      },
-      {
-        value: 4,
-        label: '离职'
-      }
-    ]
-  },
-  {
-    name: 'zzmm',
-    title: '政治面貌',
-    type: 'select',
-    options: [
-      {
-        value: 1,
-        label: '群众'
-      },
-      {
-        value: 2,
-        label: '团员'
-      },
-      {
-        value: 3,
-        label: '党员'
-      }
-    ]
-  },
-  {
-    name: 'hkxz',
-    title: '户口性质',
-    type: 'select',
-    options: [
-      {
-        value: 1,
-        label: '城镇'
-      },
-      {
-        value: 2,
-        label: '农村'
-      }
-    ]
-  },
-  {
-    name: 'byxx',
-    title: '毕业院校'
-  },
-  {
-    name: 'bysj',
-    title: '毕业时间',
-    type: 'time'
-  },
-  {
-    name: 'zgxl',
-    title: '最高学历',
-    type: 'select',
-    options: [
-      {
-        value: 1,
-        label: '高中'
-      },
-      {
-        value: 2,
-        label: '中专'
-      },
-      {
-        value: 3,
-        label: '大专'
-      },
-      {
-        value: 4,
-        label: '本科'
-      },
-      {
-        value: 5,
-        label: '硕士'
-      },
-      {
-        value: 6,
-        label: '博士'
-      }
-    ]
-  },
-  {
-    name: 'major',
-    title: '专业'
-  },
-
-  {
-    name: 'cjgzsj',
-    title: '参加工作时间',
-    type: 'time'
-  },
-  {
-    name: 'rgssj',
-    title: '入职时间',
-    type: 'time'
-  },
-  {
-    name: 'htdqs',
-    title: '合同到期时间',
-    type: 'time'
-  },
-  {
-    name: 'zzsj',
-    title: '转正时间',
-    type: 'time'
-  }
-]
 //搜索
 export const searchConfig = [
   {

+ 79 - 36
client/src/views/OaSystem/personnelManagement/ygdaPage/index.vue

@@ -44,40 +44,83 @@
     <div class="tableBox">
       <TableLayout :is-loading="loading" :data="list">
         <el-table-column fixed align="center" type="index" label="序号" width="80" />
-        <el-table-column fixed align="center" prop="nickname" label="员工姓名" width="120" />
-        <template v-for="item in tableColumnConfigList" :key="item.name">
-          <el-table-column
-            v-if="item.type === undefined"
-            align="center"
-            show-overflow-tooltip
-            :prop="item.name"
-            :label="item.title"
-            width="120"
-          />
-          <el-table-column
-            v-if="item.type === 'select'"
-            align="center"
-            :prop="item.name"
-            :label="item.title"
-            width="120"
-            :formatter="
-              (row, column, cellValue) => {
-                return item.options?.find((e) => {
-                  return e.value == cellValue
-                })?.label
-              }
-            "
-          />
-          <el-table-column
-            v-if="item.type === 'time'"
-            align="center"
-            :prop="item.name"
-            :label="item.title"
-            :formatter="dateFormatter2"
-            width="150"
-          />
-        </template>
-
+        <el-table-column fixed align="center" prop="nickname" label="员工姓名" width="100" />
+        <el-table-column
+          align="center"
+          prop="deptName"
+          label="所属部门"
+          width="200"
+          show-overflow-tooltip
+        />
+        <el-table-column align="center" prop="state" label="状态" width="80">
+          <template #default="scope">
+            {{ getDictLabel(DICT_TYPE.STAFF_STATE_TYPES, scope.row.state) }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="zzmm" label="政治面貌" width="100">
+          <template #default="scope">
+            {{ getDictLabel(DICT_TYPE.POLITY_TYPES, scope.row.zzmm) }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="hkxz" label="户口性质" width="120">
+          <template #default="scope">
+            {{ getDictLabel(DICT_TYPE.HK_TYPES, scope.row.hkxz) }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="byxx"
+          label="毕业院校"
+          width="180"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          align="center"
+          prop="bysj"
+          label="毕业时间"
+          :formatter="dateFormatter2"
+          width="120"
+        />
+        <el-table-column align="center" prop="zgxl" label="最高学历" width="120">
+          <template #default="scope">
+            {{ getDictLabel(DICT_TYPE.XL_TYPE, scope.row.zgxl) }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="major"
+          label="专业"
+          width="200"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          align="center"
+          prop="cjgzsj"
+          label="参加工作时间"
+          :formatter="dateFormatter2"
+          width="120"
+        />
+        <el-table-column
+          align="center"
+          prop="rgssj"
+          label="入职时间"
+          :formatter="dateFormatter2"
+          width="120"
+        />
+        <el-table-column
+          align="center"
+          prop="htdqs"
+          label="合同到期时间"
+          :formatter="dateFormatter2"
+          width="120"
+        />
+        <el-table-column
+          align="center"
+          prop="zzsj"
+          label="转正时间"
+          :formatter="dateFormatter2"
+          width="120"
+        />
         <el-table-column align="center" label="操作" fixed="right" width="120">
           <template #default="scope">
             <div style="display: flex">
@@ -108,13 +151,13 @@
 <script setup lang="ts">
 import * as StaffRecordsApi from '@/api/oa/staffRecords'
 import { dateFormatter2 } from '@/utils/formatTime'
-import { getTableConfigDict, tableColumnConfig, searchConfig } from './index'
+import { DICT_TYPE, getDictLabel } from '@/utils/dict'
+import { getTableConfigDict, searchConfig } from './index'
 // import DeptSelect from '@/components/DeptSelect/index.vue'
 import TableLayout from '../../oaViews/layout/TableLayout.vue'
 import DeptTree from '@/views/OaSystem/components/DeptTree/index.vue'
 import download from '@/utils/download'
 
-const tableColumnConfigList = getTableConfigDict(tableColumnConfig)
 const searchConfigList = getTableConfigDict(searchConfig)
 
 defineOptions({ name: 'YgdaPage' })

+ 3 - 1
client/src/views/OaSystem/personnelManagement/ygdaPage/staffDetail.vue

@@ -101,7 +101,9 @@ const { mutate: generateStaffNumber } = useMutation({
 /**表单保存 */
 const submitForm = (formEl: FormInstance | undefined) => {
   if (!formEl) return
-
+  if (formData.value['schoolList'] && formData.value['schoolList'].length > 0) {
+    formData.value.zgxl = formData.value['schoolList'][0]['xl']
+  }
   formEl.validate((valid) => {
     if (valid) {
       addUserMutate(formData.value)

+ 1 - 1
client/src/views/OaSystem/projectCenter/projectBook/deptProject.vue

@@ -57,7 +57,7 @@
           <el-radio :label="1">进行中({{ process }})</el-radio>
           <el-radio :label="4">已验收({{ accepted }})</el-radio>
           <el-radio :label="2">已结项({{ finished }})</el-radio>
-          <el-radio :label="3">已止({{ terminated }})</el-radio>
+          <el-radio :label="3">已止({{ terminated }})</el-radio>
           <el-radio>全部({{ totalNum }})</el-radio>
         </el-radio-group>
       </div>

+ 1 - 1
client/src/views/OaSystem/projectCenter/projectBook/myProject.vue

@@ -65,7 +65,7 @@
           <el-radio :label="1">进行中({{ process }})</el-radio>
           <el-radio :label="4">已验收({{ accepted }})</el-radio>
           <el-radio :label="2">已结项({{ finished }})</el-radio>
-          <el-radio :label="3">已止({{ terminated }})</el-radio>
+          <el-radio :label="3">已止({{ terminated }})</el-radio>
           <el-radio>全部({{ totalNum }})</el-radio>
         </el-radio-group>
       </div>

+ 1 - 1
client/src/views/OaSystem/projectCenter/projectBook/projectBook.vue

@@ -42,7 +42,7 @@
           <el-radio :label="1">进行中({{ process }})</el-radio>
           <el-radio :label="4">已验收({{ accepted }})</el-radio>
           <el-radio :label="2">已结项({{ finished }})</el-radio>
-          <el-radio :label="3">已止({{ terminated }})</el-radio>
+          <el-radio :label="3">已止({{ terminated }})</el-radio>
           <el-radio>全部({{ totalNum }})</el-radio>
         </el-radio-group>
       </div>

+ 34 - 10
client/src/views/OaSystem/projectCenter/projectDetail/components/xmht/index.vue

@@ -113,6 +113,20 @@
                 </el-select>
               </td>
             </tr>
+            <tr v-if="mContractDetail.mainType == '5'">
+              <td class="th">挂靠比例(%):</td>
+              <td>
+                <el-input
+                  v-model="mContractDetail.attachRatio"
+                  :disabled="!editor"
+                  @input="computedAttachAmountHandle"
+                />
+              </td>
+              <td class="th">分包金额(元):</td>
+              <td>
+                <el-input v-model="mContractDetail.attachAmount" :disabled="true" />
+              </td>
+            </tr>
             <tr>
               <td class="th">委托方:</td>
               <td>
@@ -732,6 +746,7 @@ import { useRoute } from 'vue-router'
 import { useProjectPermis } from '@/store/modules/projectPermis'
 import { DICT_TYPE, getDictOptions } from '@/utils/dict'
 import { openFlow } from '@/utils/flow'
+import { parseFloatNumber } from '@/utils/index'
 import { filterNodeMethod } from '@/utils/tree'
 import subscribe from '@/utils/Subscribe'
 import TreeSelectV2 from '@/components/TreeSelectV2/index.vue'
@@ -875,24 +890,25 @@ const saveContractHandle = () => {
 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)
+    parseFloatNumber(mContractDetail.value?.taxHsjeJskf) +
+    parseFloatNumber(mContractDetail.value?.taxHsjeFw) +
+    parseFloatNumber(mContractDetail.value?.taxHsjeRjcp) +
+    parseFloatNumber(mContractDetail.value?.taxHsjeYj)
 
   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)
+    parseFloatNumber(parseFloatNumber(mContractDetail.value?.taxHsjeJskf) / 1) +
+    parseFloatNumber(parseFloatNumber(mContractDetail.value?.taxHsjeFw) / 1.06) +
+    parseFloatNumber(parseFloatNumber(mContractDetail.value?.taxHsjeRjcp) / 1.13) +
+    parseFloatNumber(parseFloatNumber(mContractDetail.value?.taxHsjeYj) / 1.13)
   //计算不含税总额
-  mContractDetail.value.taxBhsze = parseFloat(taxBhsze.toFixed(2))
+  mContractDetail.value.taxBhsze = parseFloatNumber(taxBhsze.toFixed(2))
 
   //计算综合税率
   mContractDetail.value.taxZhsl =
     taxBhsze === 0
       ? 0
-      : parseFloat(((mContractDetail.value.taxHsjeTotal - taxBhsze) / taxBhsze).toFixed(6))
+      : parseFloatNumber(((mContractDetail.value.taxHsjeTotal - taxBhsze) / taxBhsze).toFixed(6))
+  computedAttachAmountHandle()
 }
 /**
  * 编辑保存主合同信息
@@ -977,6 +993,14 @@ const { mutate: startOutsourcingMutate } = useMutation(startOutsourcingApply, {
   onSuccess: (data) => openFlow(router, data, '外包申请')
 })
 const handleStartOutsourcing = () => startOutsourcingMutate(projectDetail.value.id as ProjectId)
+/**
+ * 动态计算分包合同额
+ */
+const computedAttachAmountHandle = () => {
+  mContractDetail.value.attachAmount =
+    (100 - parseFloatNumber(mContractDetail.value.attachRatio)) *
+    parseFloatNumber(mContractDetail.value.taxHsjeTotal)
+}
 </script>
 <style lang="scss" scoped>
 @import './index.scss';

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

@@ -197,6 +197,19 @@
               </tr>
             </table>
           </div>
+          <div class="tableBox" v-show="isMaster">
+            <h4><i class="icon"></i>分包信息</h4>
+            <table>
+              <tr>
+                <td class="th">分包费(元):</td>
+                <td>{{ projectDetail['yssj'] }}</td>
+                <td class="th">已支付(元):</td>
+                <td>{{ projectDetail['ysdyxx'] }}</td>
+                <td class="th">未支付(元):</td>
+                <td>{{ projectDetail['ysdyxx'] }}</td>
+              </tr>
+            </table>
+          </div>
           <div class="tableBox">
             <h4><i class="icon"></i>产值信息</h4>
             <table>

+ 4 - 0
zjugis-business/src/main/java/com/zjugis/business/bean/request/ContractRequest.java

@@ -138,4 +138,8 @@ public class  ContractRequest {
     @DateTimeFormat(pattern="yyyy-MM-dd")
     private LocalDate dueTime;
 
+    private BigDecimal attachRatio;
+
+    private BigDecimal attachAmount;
+
 }

+ 3 - 0
zjugis-business/src/main/java/com/zjugis/business/bean/response/ContractResponse.java

@@ -224,4 +224,7 @@ public class ContractResponse {
 
     private String bz;
 
+    private BigDecimal attachRatio;
+
+    private BigDecimal attachAmount;
 }