Explorar el Código

更新项目合同、更新依赖

ZaiZai hace 2 años
padre
commit
27ba59cd70

+ 1 - 1
package.json

@@ -13,7 +13,7 @@
         "dayjs": "^1.11.8",
         "echarts": "^5.4.2",
         "element-plus": "2.3.6",
-        "hc-vue3-ui": "^1.2.6",
+        "hc-vue3-ui": "^1.2.8",
         "js-base64": "^3.7.5",
         "js-cookie": "^3.0.5",
         "js-fast-way": "^0.1.0",

+ 28 - 0
src/styles/project/contract/form.scoped.scss

@@ -0,0 +1,28 @@
+.hc-project-contract-form-base {
+    position: relative;
+    height: 100%;
+    overflow: hidden;
+    display: flex;
+    padding-top: 24px;
+    .base-form-box {
+        position: relative;
+        padding-right: 24px;
+        height: 100%;
+        flex: 1;
+    }
+    .base-invoice-box {
+        position: relative;
+        width: 34%;
+        height: 100%;
+        padding-left: 24px;
+        border-left: 1px dashed #bbbbbb;
+        .title {
+            color: #101010;
+            font-size: 18px;
+        }
+        .invoice-form {
+            position: relative;
+            margin-top: 64px;
+        }
+    }
+}

+ 0 - 0
src/styles/project/contract/form.scss


+ 178 - 0
src/views/project/contract/components/base.vue

@@ -0,0 +1,178 @@
+<template>
+    <HcCard actionUi="text-center">
+        <div class="hc-project-contract-form-base">
+            <div class="base-form-box">
+                <el-scrollbar>
+                    <el-form ref="formBaseRef"
+                             :model="formBaseModel"
+                             :rules="formBaseRules"
+                             :disabled="isDisabled"
+                             label-position="left"
+                             label-width="auto"
+                             size="large"
+                    >
+                        <el-form-item label="合同编号:">
+                            <el-input v-model="formInvoiceModel.key1"/>
+                        </el-form-item>
+                        <el-form-item label="合同名称:" prop="key2">
+                            <el-input v-model="formInvoiceModel.key2"/>
+                        </el-form-item>
+                        <el-form-item label="合同类型:" prop="key2">
+                            <el-select block v-model="formInvoiceModel.key3">
+                                <el-option label="选项1" value="选项1"/>
+                                <el-option label="选项2" value="选项2"/>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="所属项目:" prop="key2">
+                            <el-select block v-model="formInvoiceModel.key4">
+                                <el-option label="选项1" value="选项1"/>
+                                <el-option label="选项2" value="选项2"/>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="签订时间:" prop="key2">
+                            <el-date-picker class="block" v-model="formInvoiceModel.key5" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD"/>
+                        </el-form-item>
+                        <el-form-item label="合同起止日期:" prop="key2">
+                            <HcDatePicker :dates="betweenTime" clearable @change="betweenTimeUpdate"/>
+                        </el-form-item>
+                        <el-form-item label="对方单位回款联系人名称:">
+                            <el-input v-model="formInvoiceModel.key1"/>
+                        </el-form-item>
+                        <el-form-item label="对方单位回款联系人电话:">
+                            <el-input v-model="formInvoiceModel.key1"/>
+                        </el-form-item>
+                        <el-form-item label="合同已履约回款:">
+                            <el-input v-model="formInvoiceModel.key1"/>
+                        </el-form-item>
+                        <el-form-item label="合同未履约回款:">
+                            <el-input v-model="formInvoiceModel.key1"/>
+                        </el-form-item>
+                    </el-form>
+                </el-scrollbar>
+            </div>
+            <div class="base-invoice-box">
+                <el-scrollbar>
+                    <div class="title">开票相关信息</div>
+                    <div class="invoice-form">
+                        <el-form ref="formInvoiceRef"
+                                 :model="formInvoiceModel"
+                                 :rules="formInvoiceRules"
+                                 :disabled="isDisabled"
+                                 label-position="left"
+                                 label-width="auto"
+                                 size="large"
+                        >
+                            <el-form-item label="发票抬头:">
+                                <el-input v-model="formInvoiceModel.key1"/>
+                            </el-form-item>
+                            <el-form-item label="纳税人识别号:">
+                                <el-input v-model="formInvoiceModel.key1"/>
+                            </el-form-item>
+                            <el-form-item label="开户银行:">
+                                <el-input v-model="formInvoiceModel.key1"/>
+                            </el-form-item>
+                            <el-form-item label="银行账户:">
+                                <el-input v-model="formInvoiceModel.key1"/>
+                            </el-form-item>
+                            <el-form-item label="收件人:">
+                                <el-input v-model="formInvoiceModel.key1"/>
+                            </el-form-item>
+                            <el-form-item label="联系电话:">
+                                <el-input v-model="formInvoiceModel.key1"/>
+                            </el-form-item>
+                            <el-form-item label="邮寄地址:">
+                                <el-input v-model="formInvoiceModel.key1"
+                                    :autosize="{ minRows: 5, maxRows: 8 }"
+                                    type="textarea"
+                                />
+                            </el-form-item>
+                        </el-form>
+                    </div>
+                </el-scrollbar>
+            </div>
+        </div>
+        <template #action>
+            <el-button size="large" type="info" hc-btn @click="goBackClick">
+                <HcIcon name="arrow-go-back"/>
+                <span v-if="isDisabled">返回上一级</span>
+                <span v-else>取消并返回</span>
+            </el-button>
+            <el-button size="large" type="primary" hc-btn @click="saveClick" v-if="!isDisabled">
+                <HcIcon name="check-double"/>
+                <span>提交保存</span>
+            </el-button>
+        </template>
+    </HcCard>
+</template>
+
+<script setup>
+import {ref, watch} from "vue";
+import {useRouter} from 'vue-router'
+
+const router = useRouter()
+
+//参数
+const props = defineProps({
+    datas: {
+        type: Object,
+        default: () => ({})
+    },
+    disabled: {
+        type: Boolean,
+        default: false
+    },
+})
+
+const infoData = ref(props.datas)
+const isDisabled = ref(props.disabled)
+
+//深度监听
+watch(() => [
+    props.datas,
+], ([datas]) => {
+    infoData.value = datas
+}, {deep: true})
+
+//监听
+watch(() => [
+    props.disabled,
+], ([disabled]) => {
+    isDisabled.value = disabled
+})
+
+//基础表单
+const formBaseRef = ref(null)
+const formBaseModel = ref({})
+const formBaseRules = {
+    key2: [
+        {required: true, message: '请输入', trigger: 'blur'},
+    ],
+}
+
+//日期时间被选择
+const betweenTime = ref(null)
+const betweenTimeUpdate = ({arr, query}) => {
+    betweenTime.value = arr
+}
+
+
+//开发票表单
+const formInvoiceRef = ref(null)
+const formInvoiceModel = ref({})
+const formInvoiceRules = {}
+
+
+//返回
+const goBackClick = () => {
+    router.back()
+}
+
+//提交保存
+const saveClick = () => {
+
+}
+</script>
+
+<style scoped lang="scss">
+@import "~src/styles/project/contract/form.scoped.scss";
+</style>

+ 11 - 0
src/views/project/contract/components/file.vue

@@ -0,0 +1,11 @@
+<template>
+
+</template>
+
+<script setup>
+
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 11 - 0
src/views/project/contract/components/milestone.vue

@@ -0,0 +1,11 @@
+<template>
+
+</template>
+
+<script setup>
+
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 23 - 213
src/views/project/contract/form.vue

@@ -1,237 +1,47 @@
 <template>
-    <HcCard>
-        <template #header>
-            <el-form ref="formRef" inline :model="formModel" :rules="formRules">
-                <el-form-item label="关联项目" prop="key1">
-                    <el-select v-model="formModel.key1" block clearable placeholder="项目名称">
-                        <el-option v-for="item in projectName" :label="item.name" :value="item.key"/>
-                    </el-select>
-                </el-form-item>
-                <el-form-item label="预算制订人" prop="key2">
-                    <el-input v-model="formModel.key2" placeholder="预算制订人" />
-                </el-form-item>
-                <el-form-item label="预算总额" prop="key3">
-                    <el-input v-model="formModel.key3" placeholder="预算总额" disabled>
-                        <template #append>元</template>
-                    </el-input>
-                </el-form-item>
-            </el-form>
+    <HcTabsSimple :cur="tabsKey" :datas="tabsData" @tabClick="tabsClick">
+        <template #tab-base>
+            <baseTabCard :datas="infoData" :disabled="dataType === 'view'" v-if="tabsKey === 'base'"/>
         </template>
-        <template #extra>
-            <el-button type="primary" hc-btn @click="addTableData">
-                <HcIcon name="add"/>
-                <span>新增预算</span>
-            </el-button>
+        <template #tab-file>
+            <fileTabCard :datas="infoData" :disabled="dataType === 'view'" v-if="tabsKey === 'file'"/>
         </template>
-        <HcTable :isIndex="false" :column="tableColumn" :datas="tableData">
-            <template #key1="{row,index}">
-                <el-select v-model="row.key1" placeholder="项目进程" v-if="row.isEditMode">
-                    <el-option v-for="item in projectProcess" :label="item.name" :value="item.key"/>
-                </el-select>
-                <div v-else>{{row.key1}}</div>
-            </template>
-            <template #key2="{row,index}">
-                <el-select v-model="row.key2" placeholder="预算类型" v-if="row.isEditMode">
-                    <el-option v-for="item in budgetType" :label="item.name" :value="item.key"/>
-                </el-select>
-                <div v-else>{{row.key2}}</div>
-            </template>
-            <template #key3="{row,index}">
-                <el-select v-model="row.key3" placeholder="任务明细" v-if="row.isEditMode">
-                    <el-option v-for="item in taskDetail" :label="item.name" :value="item.key"/>
-                </el-select>
-                <div v-else>{{row.key3}}</div>
-            </template>
-            <template #key4="{row,index}">
-                <el-input v-model="row.key4" v-if="row.isEditMode"/>
-                <div v-else>{{row.key4}}</div>
-            </template>
-            <template #key5="{row,index}">
-                <el-input v-model="row.key5" v-if="row.isEditMode"/>
-                <div v-else>{{row.key5}}</div>
-            </template>
-            <template #key6="{row,index}">
-                <el-select v-model="row.key6" v-if="row.isEditMode">
-                    <el-option label="维护" value="1"/>
-                    <el-option label="业务" value="2"/>
-                </el-select>
-                <div v-else>{{row.key6}}</div>
-            </template>
-            <template #key7="{row,index}">
-                <el-input v-model="row.key7" v-if="row.isEditMode" disabled/>
-                <div v-else>{{row.key7}}</div>
-            </template>
-            <template #key8="{row,index}">
-                <el-input v-model="row.key8" v-if="row.isEditMode"/>
-                <div v-else>{{row.key8}}</div>
-            </template>
-            <template #key9="{row,index}">
-                <el-input v-model="row.key9" v-if="row.isEditMode"/>
-                <div v-else>{{row.key9}}</div>
-            </template>
-            <template #key10="{row,index}">
-                <el-input v-model="row.key10" v-if="row.isEditMode"/>
-                <div v-else>{{row.key10}}</div>
-            </template>
-            <template #key11="{row,index}">
-                <el-input v-model="row.key11" v-if="row.isEditMode" disabled/>
-                <div v-else>{{row.key11}}</div>
-            </template>
-            <template #key12="{row,index}">
-                <el-input v-model="row.key12" v-if="row.isEditMode"/>
-                <div v-else>{{row.key12}}</div>
-            </template>
-            <template #key13="{row,index}">
-                <el-input v-model="row.key13" v-if="row.isEditMode" disabled/>
-                <div v-else>{{row.key13}}</div>
-            </template>
-            <template #key14="{row,index}">
-                <el-input v-model="row.key14" v-if="row.isEditMode"/>
-                <div v-else>{{row.key14}}</div>
-            </template>
-            <template #action="{row,index}">
-                <el-button size="small" type="primary" @click="row.isEditMode = false" v-if="row.isEditMode">
-                    <HcIcon name="check"/>
-                    <span>完成</span>
-                </el-button>
-                <el-button size="small" type="primary" @click="row.isEditMode = true" v-else>
-                    <HcIcon name="edit"/>
-                    <span>编辑</span>
-                </el-button>
-                <el-button size="small" type="danger" @click="delTableData(row,index)">
-                    <HcIcon name="delete-bin"/>
-                    <span>删除</span>
-                </el-button>
-            </template>
-        </HcTable>
-    </HcCard>
+        <template #tab-milestone>
+            <milestoneTab :datas="infoData" :disabled="dataType === 'view'" v-if="tabsKey === 'milestone'"/>
+        </template>
+    </HcTabsSimple>
 </template>
 
 <script setup>
 import {onActivated, ref} from "vue";
 import {useRouter, useRoute} from 'vue-router'
-import {delMessage} from "~uti/tools";
+import baseTabCard from "./components/base.vue";
+import fileTabCard from "./components/file.vue";
+import milestoneTab from "./components/milestone.vue";
 
 //初始变量
 const router = useRouter()
 const useRoutes = useRoute()
 const dataId = ref(useRoutes?.query?.id ?? '')
+const dataType = ref(useRoutes?.query?.type ?? '')
 
 //缓存页面被激活时
 onActivated(() => {
     dataId.value = useRoutes?.query?.id ?? ''
-    console.log(useRoutes.query)
+    dataType.value = useRoutes?.query?.type ?? ''
 })
 
-//项目名称
-const projectName = ref([
-    {name: '陈油路', key: '陈油路'},
-    {name: '奉建路', key: '奉建路'}
-])
-
-//项目进程
-const projectProcess = ref([
-    {name: '商机-演示沟通', key: '1'},
-    {name: '商机-成本核算及报价', key: '2'},
-    {name: '合同-服务范围洽谈', key: '3'},
-    {name: '产品-研发', key: '4'},
-    {name: '产品-配置', key: '5'},
-    {name: '产品-测试', key: '6'},
-    {name: '产品-交付', key: '7'},
-    {name: '实施-系统培训', key: '8'},
-    {name: '实施-现场服务', key: '9'},
-    {name: '实施-合同回款', key: '10'},
-    {name: '项目验收', key: '11'},
-])
-
-//预算类型
-const budgetType = ref([
-    {name: '合同签订阶段', key: '1'},
-    {name: '项目注册阶段', key: '2'},
-    {name: '项目准备阶段', key: '3'},
-    {name: '项目研发阶段', key: '4'},
-    {name: '项目配置阶段', key: '5'},
-    {name: '项目测试阶段', key: '6'},
-    {name: '项目培训阶段', key: '7'},
-    {name: '项目编辑阶段', key: '8'},
-    {name: '资料编辑阶段', key: '9'},
-    {name: '过程服务阶段', key: '10'},
-    {name: '交工阶段', key: '11'},
-    {name: '资料收集阶段', key: '12'},
-    {name: '竣工编辑阶段', key: '13'},
-    {name: '档案验收阶段', key: '14'},
-    {name: '档案移交阶段', key: '15'},
-    {name: '耗材', key: '16'},
-])
-
-//任务明细
-const taskDetail = ref([
-    {name: '审核图纸', key: '1'},
-    {name: '风险评估', key: '2'},
-    {name: '合同报价', key: '3'},
-    {name: '合同洽谈及签订', key: '4'},
-    {name: '项目注册', key: '5'},
-    {name: '数据配置', key: '6'},
-    {name: '项目WBS划分', key: '7'},
+//选项卡
+const tabsKey = ref('base')
+const tabsData = ref([
+    {icon: 'file-list-3', label: '合同基础信息', key: 'base'},
+    {icon: 'file-word', label: '合同附件', key: 'file'},
+    {icon: 'creative-commons-sa', label: '合同回款里程碑', key: 'milestone'},
 ])
-
-//顶部表单数据
-const formRef = ref(null)
-const formModel = ref({key1: '', key2: '', key3: ''})
-const formRules = {
-    key1: {
-        required: true,
-        trigger: 'blur',
-        message: "请选择关联项目"
-    },
-    key2: {
-        required: true,
-        trigger: 'blur',
-        message: "请输入预算制订人"
-    }
+const tabsClick = (key) => {
+    tabsKey.value = key
 }
 
-//工资预算表格
-const tableColumn = [
-    {key: 'key1', name: '项目环节', width: '200'},
-    {key: 'key2', name: '预算类型', width: '200'},
-    {key: 'key3', name: '任务明细', width: '200'},
-    {key: 'key4', name: '预计工作日(小数/整数/天)', width: '160'},
-    {key: 'key5', name: '投入人员数量', width: '140'},
-    {key: 'key6', name: '人日单价', width: '140'},
-    {key: 'key7', name: '预计人工成本', width: '160'},
-    {key: 'key8', name: '预计差旅费(元)', width: '160'},
-    {key: 'key9', name: '外包单价', width: '140'},
-    {key: 'key10', name: '外包数量', width: '140'},
-    {key: 'key11', name: '外包金额', width: '140'},
-    {key: 'key12', name: '其他', width: '140'},
-    {key: 'key13', name: '预算金额', width: '120'},
-    {key: 'key14', name: '测算备注', width: '200'},
-    {key: 'action', name: '操作', width: '160', align: 'center', fixed: 'right'},
-]
-const tableData = ref([
-    {id: 1, key1: '', key2: '', key3: '', key4: '33', key5: '44', key6: '', key7: '22', isEditMode: false},
-])
-
-//新增工资预算表格
-const addTableData = () => {
-    tableData.value.unshift({isEditMode: true})
-}
+const infoData = ref({})
 
-//删除工资预算表格
-const delTableData = (row,index) => {
-    delMessage(() => {
-        if (!row.id)  {
-            tableData.value.splice(index, 1)
-        }
-    })
-}
 </script>
-
-<style lang="scss" scoped>
-
-</style>
-
-<style lang="scss">
-
-</style>

+ 43 - 32
src/views/project/contract/index.vue

@@ -7,14 +7,12 @@
                 </el-select>
             </div>
             <div class="w-40 ml-2">
-                <el-select v-model="searchForm.user" block clearable placeholder="预算制订人" size="large">
-                    <el-option v-for="item in users" :label="item.name" :value="item.key"/>
+                <el-select v-model="searchForm.projectType" block clearable placeholder="服务类型" size="large">
+                    <el-option v-for="item in projectType" :label="item.name" :value="item.key"/>
                 </el-select>
             </div>
-            <div class="w-52 ml-2">
-                <el-select v-model="searchForm.project" block clearable placeholder="项目名称" size="large">
-                    <el-option v-for="item in projectName" :label="item.name" :value="item.key"/>
-                </el-select>
+            <div class="w-48 ml-2">
+                <el-input v-model="searchForm.queryValue" clearable placeholder="请输入项目名称进行查询" size="large"/>
             </div>
             <div class="ml-4">
                 <el-button type="primary" @click="searchClick" size="large">
@@ -30,13 +28,20 @@
             </div>
         </template>
         <template #extra>
+            <el-button size="large" type="primary" hc-btn @click="updateClick">
+                <HcIcon name="refresh"/>
+                <span>合同回款更新</span>
+            </el-button>
             <el-button size="large" type="primary" hc-btn @click="addRowClick">
                 <HcIcon name="add"/>
-                <span>新增项目预算</span>
+                <span>新增项目合同信息</span>
             </el-button>
         </template>
 
         <HcTable :isIndex="false" :column="tableColumn" :datas="tableData" :loading="tableLoading">
+            <template #key1="{row}">
+                <span class="text-blue" @click="rowNameTap(row)">{{row.key1}}</span>
+            </template>
             <template #action="{row,index}">
                 <el-button plain size="small" type="primary" @click="editRowClick(row)">编辑</el-button>
                 <el-button plain size="small" type="danger">删除</el-button>
@@ -63,19 +68,6 @@ const projectType = ref([
     {name: '市政', key: '市政'},
 ])
 
-//报销人
-const users = ref([
-    {name: '张三', key: '张三'},
-    {name: '李四', key: '李四'}
-])
-
-//项目名称
-const projectName = ref([
-    {name: '陈油路', key: '陈油路'},
-    {name: '奉建路', key: '奉建路'}
-])
-
-
 //搜索表单
 const searchForm = ref({
     projectType: null, user: null, project: null,
@@ -103,13 +95,13 @@ const pageChange = ({current, size}) => {
 //获取数据
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'key', name: '编号', width: '100', align: 'center'},
-    {key: 'key1', name: '项目名称'},
-    {key: 'key2', name: '预算制订人'},
-    {key: 'key3', name: '总成本预算', width: '140', align: 'center'},
-    {key: 'key4', name: '目前已用预算', width: '140', align: 'center'},
-    {key: 'key5', name: '剩余预算总额', width: '140', align: 'center'},
-    {key: 'key6', name: '项目负责人', width: '140', align: 'center'},
+    {key: 'key', name: '合同编号', width: '120', align: 'center'},
+    {key: 'key1', name: '合同名称'},
+    {key: 'key2', name: '合同类型', width: '140', align: 'center'},
+    {key: 'key3', name: '签订时间', width: '160', align: 'center'},
+    {key: 'key4', name: '合同起止日期', width: '220', align: 'center'},
+    {key: 'key5', name: '合同已履约回款', width: '140', align: 'center'},
+    {key: 'key6', name: '合同未履约回款', width: '140', align: 'center'},
     {key: 'action', name: '操作', width: '130', align: 'center'},
 ]
 const tableData = ref([
@@ -125,21 +117,40 @@ const getTableData = () => {
 
 }
 
+//预览
+const rowNameTap = (row) => {
+    router.push({
+        name: 'project-contract-form',
+        query: {
+            id: row.id,
+            type: 'view'
+        }
+    })
+}
+
+//新增预算
+const addRowClick = () => {
+    router.push({
+        name: 'project-contract-form',
+        query: {type: 'edit'}
+    })
+}
 
 //编辑预算
 const editRowClick = (row) => {
     router.push({
-        name: 'project-budget-form',
+        name: 'project-contract-form',
         query: {
-            id: row.id
+            id: row.id,
+            type: 'edit'
         }
     })
 }
 
-//新增预算
-const addRowClick = () => {
+//合同回款更
+const updateClick = () => {
     router.push({
-        name: 'project-budget-form'
+        name: 'project-contract-update'
     })
 }
 </script>

+ 4 - 4
yarn.lock

@@ -816,10 +816,10 @@ has@^1.0.3:
   dependencies:
     function-bind "^1.1.1"
 
-hc-vue3-ui@^1.2.6:
-  version "1.2.6"
-  resolved "http://47.110.251.215:9000/hc-vue3-ui/-/hc-vue3-ui-1.2.6.tgz#11c528c1f25419b557769dfc21141f09186d504a"
-  integrity sha512-Etiy/Juq+IDPLxyGzh+3GRBQzUTZ8he+xiPYk+FXO6l5+8/kU8k/aMvaUJqKVnzkB3HoOtvmAbcgbBkttd4INA==
+hc-vue3-ui@^1.2.8:
+  version "1.2.8"
+  resolved "http://47.110.251.215:9000/hc-vue3-ui/-/hc-vue3-ui-1.2.8.tgz#a3f9a1c22c925b15b37ac171ac84d0170338fd40"
+  integrity sha512-1AbaHvl1F8XxfNIFu/nnT5L2ZEZE0ZI7C/tPZb2BCZ1q1NRzKZJzcF3UY8DfiwXenKVDIvg4Yv3MMGD9l0/YvA==
   dependencies:
     axios "^1.4.0"
     dayjs "^1.11.8"