|
|
@@ -1,656 +1,143 @@
|
|
|
-<template>
|
|
|
- <a-card>
|
|
|
- <div class="approval-steps">
|
|
|
- <a-steps :current="current" :items="items"></a-steps>
|
|
|
- <div class="steps-content">
|
|
|
- <a-form class="smart-query-form" ref="stepFormRef" :label-col="labelCol" :model="formModel"
|
|
|
- :rules="formRules">
|
|
|
- <div v-if="current == 0">
|
|
|
- <a-row class="smart-query-form-row">
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="项目模板" name="projectTemplateId" class="smart-query-form-item">
|
|
|
- <DictSelect key-code="BL_PROJECT_TEMPLATE"
|
|
|
- v-model:value="formModel.projectTemplateId" placeholder="请选择项目模板"
|
|
|
- width="100%" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="项目编号" name="projectCode" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.projectCode" placeholder="" disabled />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row class="smart-query-form-row">
|
|
|
- <a-col :span="24">
|
|
|
- <a-form-item label="项目名称" name="projectName" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.projectName" placeholder="请输入项目名称" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row class="smart-query-form-row">
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="项目等级" name="projectLevel" class="smart-query-form-item">
|
|
|
- <DictSelect key-code="BL_PROJECT_LEVEL" v-model:value="formModel.projectLevel"
|
|
|
- placeholder="请选择项目等级" width="100%" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="项目类型" name="projectType" class="smart-query-form-item">
|
|
|
- <DictSelect key-code="BL_PROJECT_TYPE" v-model:value="formModel.projectType"
|
|
|
- placeholder="请选择项目类型" width="100%" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row class="smart-query-form-row">
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="交付经理" name="deliveryManager" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.deliveryManager" placeholder="请选择交付经理"
|
|
|
- @click="showSelectUser('deliveryManager')" readonly />
|
|
|
- </a-form-item>
|
|
|
- <EmployeeTableSelectModal ref="selectDeliveryManagerRef" type="radio"
|
|
|
- @selectDataList="selectedUser('deliveryManager', $event)" />
|
|
|
- </a-col>
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="客户经理" name="accountManager" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.accountManager" placeholder="请选择客户经理"
|
|
|
- @click="showSelectUser('accountManager')" readonly />
|
|
|
- </a-form-item>
|
|
|
- <EmployeeTableSelectModal ref="selectAccountManagerRef" type="radio"
|
|
|
- @selectDataList="selectedUser('accountManager', $event)" />
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row class="smart-query-form-row">
|
|
|
- <a-col :span="24">
|
|
|
- <a-form-item label="成本构成模板" name="templateName" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.templateName" placeholder="请选择成本构成模板"
|
|
|
- @click="showSelectTemplate" />
|
|
|
- </a-form-item>
|
|
|
- <SelectModal ref="TemplateSelectModalRef" @selectedRowList="templateSelectedRowList"
|
|
|
- :modalTableCondition="templateCondition" v-bind="attrs" />
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row class="smart-query-form-row">
|
|
|
- <a-col :span="24">
|
|
|
- <a-form-item label="合同签订状态" name="contractStatus" class="smart-query-form-item">
|
|
|
- <DictSelect key-code="BL_CONTRACT_STATUS" v-model:value="formModel.contractStatus"
|
|
|
- placeholder="请输入合同签订状态" width="100%" mode="" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <template v-if="formModel.contractStatus.includes(CONTRACT_STATUS_ENUM.SIGNED.value)">
|
|
|
- <a-row class="smart-query-form-row">
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="关联合同" name="contractName" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.contractName" placeholder="关联合同"
|
|
|
- @click="showSelectContract" />
|
|
|
- </a-form-item>
|
|
|
- <SelectModal ref="ContractSelectModalRef" @selectedRowList="contractSelectedRowList"
|
|
|
- :modalTableCondition="contractCondition" v-bind="attrs" />
|
|
|
- </a-col>
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="客户名称" name="supplierName" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.supplierName" placeholder="客户名称" disabled />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row class="smart-query-form-row">
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="签约主体" name="signingParty" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.signingParty" placeholder="签约主体" disabled />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="合同含税金额" name="taxAmount" class="smart-query-form-item">
|
|
|
- <a-input-number v-model:value="formModel.taxAmount" placeholder="合同含税金额"
|
|
|
- style="width: 100%" disabled />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row class="smart-query-form-row">
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="税率" name="taxRate" class="smart-query-form-item">
|
|
|
- <a-input-number v-model:value="formModel.taxRate" placeholder="税率" :min="0"
|
|
|
- :max="100" :formatter="value => `${value}%`"
|
|
|
- :parser="value => value.replace('%', '')" style="width: 100%" disabled />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="合同约定进场日期" name="contractStartDate" class="smart-query-form-item"
|
|
|
- :label-col="{ width: '130px' }">
|
|
|
- <a-date-picker v-model:value="formModel.contractStartDate"
|
|
|
- placeholder="合同约定进场日期" value-format="YYYY-MM-DD" style="width: 100%"
|
|
|
- disabled />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row class="smart-query-form-row">
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="合同约定验收日期" name="contractEndDate" class="smart-query-form-item"
|
|
|
- :label-col="{ width: '130px' }">
|
|
|
- <a-date-picker v-model:value="formModel.contractEndDate" placeholder="合同约定验收日期"
|
|
|
- value-format="YYYY-MM-DD" style="width: 100%" disabled />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="计划完工日期" name="planCompleteDate" class="smart-query-form-item"
|
|
|
- :label-col="{ width: '130px' }">
|
|
|
- <a-date-picker v-model:value="formModel.planCompleteDate" placeholder="计划完工日期"
|
|
|
- value-format="YYYY-MM-DD" style="width: 100%" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- </template>
|
|
|
- </div>
|
|
|
- <div v-if="current == 1">
|
|
|
- <a-table size="small" :pagination="false" bordered :dataSource="formModel.projectStageVOList"
|
|
|
- :columns="columns">
|
|
|
- <template #bodyCell="{ column, index }">
|
|
|
- <template v-if="column.dataIndex === 'stageDate'">
|
|
|
- <a-form-item :name="['projectStageVOList', index, column.dataIndex]"
|
|
|
- class="smart-query-form-item"
|
|
|
- :rules="[{ required: true, message: '请选择阶段日期', trigger: 'blur' }]">
|
|
|
- <a-date-picker
|
|
|
- v-model:value="formModel['projectStageVOList'][index][column.dataIndex]"
|
|
|
- value-format="YYYY-MM-DD" style="width: 100%" />
|
|
|
- </a-form-item>
|
|
|
- </template>
|
|
|
- </template>
|
|
|
- </a-table>
|
|
|
- </div>
|
|
|
- <div v-if="current == 2">
|
|
|
- <a-row :gutter="16" class="smart-query-form-row">
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="基准工时" name="baseManHours" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.baseManHours" placeholder="请输入基准工时" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="基准人工成本" name="baseLaborCost" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.baseLaborCost" placeholder="请输入基准人工成本" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row :gutter="16" class="smart-query-form-row">
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="基准费用成本" name="baseExpenseCost" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.baseExpenseCost" placeholder="请输入基准费用成本" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="基准总成本" name="baseTotalCost" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.baseTotalCost" placeholder="请输入基准总成本" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- </div>
|
|
|
- <div v-if="current == 3">
|
|
|
- <a-row :gutter="16" class="smart-query-form-row">
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="省市区" name="provinceCityDistrict" class="smart-query-form-item">
|
|
|
- <AreaCascader type="province_city_district" style="width: 100%"
|
|
|
- v-model:value="provinceCityDistrict" placeholder="请选择省市区"
|
|
|
- @change="changeArea" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="详细地址" name="specificAddress" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.specificAddress" placeholder="请输入详细地址" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row :gutter="16" class="smart-query-form-row">
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="创建日期" name="createDate" class="smart-query-form-item">
|
|
|
- <a-date-picker v-model:value="formModel.createDate" placeholder="创建日期"
|
|
|
- value-format="YYYY-MM-DD" style="width: 100%" disabled />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :span="12">
|
|
|
- <a-form-item label="创建人" name="creator" class="smart-query-form-item">
|
|
|
- <a-input v-model:value="formModel.creator" placeholder="请输入创建人" disabled />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row :gutter="16" class="smart-query-form-row">
|
|
|
- <a-col :span="24">
|
|
|
- <a-form-item label="项目描述" name="projectDescription" class="smart-query-form-item">
|
|
|
- <a-textarea v-model:value="formModel.projectDescription" placeholder="请输入创建人"
|
|
|
- :rows="4" :showCount="true" :allowClear="true" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- </div>
|
|
|
- </a-form>
|
|
|
- </div>
|
|
|
- <div class="steps-action">
|
|
|
- <a-button v-if="current > 0" style="margin-right: 8px" @click="prev">上一步</a-button>
|
|
|
- <a-button v-if="current < steps.length - 1" type="primary" @click="next">下一步</a-button>
|
|
|
- <a-button v-if="current == steps.length - 1" type="primary" @click="submit">
|
|
|
- 提交
|
|
|
- </a-button>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </a-card>
|
|
|
-</template>
|
|
|
-<script setup>
|
|
|
-import dayjs from 'dayjs';
|
|
|
-import { onMounted, reactive, ref, useAttrs } from 'vue';
|
|
|
-import { useRouter } from 'vue-router';
|
|
|
-import { message, Modal } from 'ant-design-vue';
|
|
|
-import _ from 'lodash';
|
|
|
-import DictSelect from '/@/components/support/dict-select/index.vue';
|
|
|
-import AreaCascader from '/@/components/framework/area-cascader/index.vue';
|
|
|
-import { CONTRACT_STATUS_ENUM } from '/@/constants/teamwork/project-approval-const';
|
|
|
-import EmployeeTableSelectModal from '/@/components/system/employee-table-select-modal/index.vue';
|
|
|
-import { useUserStore } from '/@/store/modules/system/user';
|
|
|
-import { projectApi } from '/@/api/teamwork/project/project-api';
|
|
|
-
|
|
|
-import SelectModal from "/@/components/common/table-select-modal/components/modal.vue";
|
|
|
-
|
|
|
-const stepFormRef = ref(null);
|
|
|
-const selectDeliveryManagerRef = ref(null);
|
|
|
-const selectAccountManagerRef = ref(null);
|
|
|
-const attrs = useAttrs();
|
|
|
-const TemplateSelectModalRef = ref(null);
|
|
|
-const ContractSelectModalRef = ref(null);
|
|
|
-const router = useRouter();
|
|
|
-const templateCondition = ref({
|
|
|
- url: '/blProjectCost/template/queryPage',
|
|
|
- search: [
|
|
|
- {
|
|
|
- label: '模板编码',
|
|
|
- field: 'templateCode',
|
|
|
- type: 'input',
|
|
|
- width: '200px',
|
|
|
- },
|
|
|
- {
|
|
|
- label: '模板名称',
|
|
|
- field: 'templateName',
|
|
|
- type: 'input',
|
|
|
- width: '200px',
|
|
|
- },
|
|
|
- ],
|
|
|
- tableAttrs: {
|
|
|
- rowKey: 'id',
|
|
|
- columns: [
|
|
|
- {
|
|
|
- title: '模板编码',
|
|
|
- dataIndex: 'templateCode',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '模板名称',
|
|
|
- dataIndex: 'templateName',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '模板类型',
|
|
|
- dataIndex: 'templateType',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '创建人',
|
|
|
- dataIndex: 'createUserId',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '创建日期',
|
|
|
- dataIndex: 'createTime',
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
-});
|
|
|
-const contractCondition = ref({
|
|
|
- url: '/blContractMaster/queryPage',
|
|
|
- search: [
|
|
|
- {
|
|
|
- label: '合同编码',
|
|
|
- field: 'contractCode',
|
|
|
- type: 'input',
|
|
|
- width: '200px',
|
|
|
- },
|
|
|
- {
|
|
|
- label: '合同名称',
|
|
|
- field: 'contractName',
|
|
|
- type: 'input',
|
|
|
- width: '200px',
|
|
|
- },
|
|
|
- ],
|
|
|
- tableAttrs: {
|
|
|
- rowKey: 'id',
|
|
|
- columns: [
|
|
|
- {
|
|
|
- title: '合同编码',
|
|
|
- dataIndex: 'contractCode',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '合同名称',
|
|
|
- dataIndex: 'contractName',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '合同类型',
|
|
|
- dataIndex: 'contractType',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '合同状态',
|
|
|
- dataIndex: 'contractStatus',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '签约单位',
|
|
|
- dataIndex: 'signingParty',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '合同金额',
|
|
|
- dataIndex: 'txAmount',
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
-});
|
|
|
-
|
|
|
-function templateShowModal(selectedRowKey) {
|
|
|
- TemplateSelectModalRef.value.showModal(selectedRowKey);
|
|
|
-}
|
|
|
-function contractShowModal(selectedRowKey) {
|
|
|
- ContractSelectModalRef.value.showModal(selectedRowKey);
|
|
|
-}
|
|
|
-
|
|
|
-function showSelectUser(type) {
|
|
|
- if (type === 'deliveryManager') {
|
|
|
- selectDeliveryManagerRef.value.showModal();
|
|
|
- } else if (type === 'accountManager') {
|
|
|
- selectAccountManagerRef.value.showModal();
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-function selectedUser(field, list) {
|
|
|
- // console.log('selectedUser', field, list);
|
|
|
- formModel[field] = list[0].actualName;
|
|
|
-};
|
|
|
-
|
|
|
-function changeArea(value, selectedOptions) {
|
|
|
- formModel.provinceCityDistrict = value;
|
|
|
+.data-management {
|
|
|
+ height: 100%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ gap: 20px;
|
|
|
+
|
|
|
+ .data-management-item {
|
|
|
+ flex: 1;
|
|
|
+ align-self: stretch;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:deep(.data-item1) {
|
|
|
+ background: url('/@/assets/images/home/data-mana/data-mana1.svg') no-repeat center;
|
|
|
+ background-size: contain;
|
|
|
+ }
|
|
|
+ &:deep(.data-item2) {
|
|
|
+ background: url('/@/assets/images/home/data-mana/data-mana2.svg') no-repeat center;
|
|
|
+ background-size: contain;
|
|
|
+ }
|
|
|
+ &:deep(.data-item3) {
|
|
|
+ background: url('/@/assets/images/home/data-mana/data-mana3.svg') no-repeat center;
|
|
|
+ background-size: contain;
|
|
|
+ }
|
|
|
+ &:deep(.data-item4) {
|
|
|
+ background: url('/@/assets/images/home/data-mana/data-mana4.svg') no-repeat center;
|
|
|
+ background-size: contain;
|
|
|
+ }
|
|
|
+ &:deep(.data-item5) {
|
|
|
+ background: url('/@/assets/images/home/data-mana/data-mana5.svg') no-repeat center;
|
|
|
+ background-size: contain;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-// --------------------- 数据 ---------------------
|
|
|
-const formModel = reactive({
|
|
|
- projectTemplateId: [], // 项目模板
|
|
|
- projectCode: undefined, // 项目编号
|
|
|
- projectName: undefined, // 项目名称
|
|
|
- projectLevel: [], // 项目等级
|
|
|
- projectType: [], // 项目类型
|
|
|
- deliveryManager: undefined, // 交付经理
|
|
|
- accountManager: undefined, // 客户经理
|
|
|
- templateName: undefined, // 成本构成模板
|
|
|
- costTemplateId: undefined, // 成本构成模板id --不展示
|
|
|
- contractStatus: [], // 合同签订状态
|
|
|
- contactId: undefined, // 合同id --不展示
|
|
|
- supplierName: undefined, // 客户名称
|
|
|
- signingParty: undefined, // 签约主体
|
|
|
- contractName: undefined, // 关联合同
|
|
|
- taxAmount: undefined, // 合同含税金额
|
|
|
- taxRate: undefined, // 税率
|
|
|
- contractStartDate: undefined, // 合同约定进场日期
|
|
|
- contractEndDate: undefined, // 合同约定验收日期
|
|
|
- planCompleteDate: undefined, // 计划完工日期
|
|
|
- baseManHours: undefined, // 基准工时
|
|
|
- baseLaborCost: undefined, // 基准人工成本
|
|
|
- baseExpenseCost: undefined, // 基准费用成本
|
|
|
- baseTotalCost: undefined, // 基准总成本
|
|
|
-
|
|
|
- projectStageVOList: [
|
|
|
- {
|
|
|
- stageId: '1',
|
|
|
- stageName: '项目启动(0)',
|
|
|
- stageDate: undefined,
|
|
|
- duration: '1',
|
|
|
- },
|
|
|
- {
|
|
|
- stageId: '2',
|
|
|
- stageName: '项目策划(0~20)',
|
|
|
- stageDate: undefined,
|
|
|
- duration: '32',
|
|
|
- },
|
|
|
- {
|
|
|
- stageId: '3',
|
|
|
- stageName: '项目前期(20~30)',
|
|
|
- stageDate: undefined,
|
|
|
- duration: '83',
|
|
|
- },
|
|
|
- {
|
|
|
- stageId: '4',
|
|
|
- stageName: '项目中期(30~50)',
|
|
|
- stageDate: undefined,
|
|
|
- duration: '265',
|
|
|
- },
|
|
|
- {
|
|
|
- stageId: '5',
|
|
|
- stageName: '项目后期(50~70)',
|
|
|
- stageDate: undefined,
|
|
|
- duration: '327',
|
|
|
- },
|
|
|
- {
|
|
|
- stageId: '6',
|
|
|
- stageName: '竣前筹备(70~90)',
|
|
|
- stageDate: undefined,
|
|
|
- duration: '388',
|
|
|
- },
|
|
|
- {
|
|
|
- stageId: '7',
|
|
|
- stageName: '竣工管理(100)',
|
|
|
- stageDate: undefined,
|
|
|
- duration: '432',
|
|
|
- },
|
|
|
- ],
|
|
|
-
|
|
|
- // province: undefined, // 省
|
|
|
- // city: undefined, // 市
|
|
|
- // district: undefined, // 区
|
|
|
- provinceCityDistrict: undefined, // 省市区
|
|
|
-
|
|
|
- specificAddress: undefined, // 详细地址
|
|
|
- projectDescription: undefined, // 项目描述
|
|
|
-
|
|
|
- createDate: dayjs().format('YYYY-MM-DD'), // 创建日期 --不传后端
|
|
|
- creator: useUserStore().actualName, // 创建人 --不传后端
|
|
|
-});
|
|
|
-
|
|
|
-// --------------------- 校验规则 ---------------------
|
|
|
-const formRules = {
|
|
|
- // 第一步
|
|
|
- projectTemplateId: [{ required: true, message: '请选择项目模板', trigger: 'change' }],
|
|
|
- // projectCode: [{ required: true, message: '请输入项目编号', trigger: 'change' }],
|
|
|
- projectName: [{ required: true, message: '请输入项目名称', trigger: 'change' }],
|
|
|
- projectLevel: [{ required: true, message: '请选择项目等级', trigger: 'change' }],
|
|
|
- projectType: [{ required: true, message: '请选择项目类型', trigger: 'change' }],
|
|
|
- deliveryManager: [{ required: true, message: '请选择交付经理', trigger: 'change' }],
|
|
|
- accountManager: [{ required: true, message: '请选择客户经理', trigger: 'change' }],
|
|
|
- templateName: [{ required: true, message: '请选择成本构成模板', trigger: 'change' }],
|
|
|
- // costTemplateId: [{ required: true, message: '请选择成本构成模板', trigger: 'change' }],
|
|
|
- contractStatus: [{ required: true, message: '请选择合同签订状态', trigger: 'change' }],
|
|
|
-
|
|
|
- // 合同签订状态-已签约-> 自动带出
|
|
|
- // contractName: [{ required: true, message: '请选择关联合同', trigger: 'change' }],
|
|
|
- // contractId: [{ required: true, message: '请选择关联合同', trigger: 'change' }],
|
|
|
- // supplierName: [{ required: true, message: '请选择客户名称', trigger: 'change' }],
|
|
|
- // signingParty: [{ required: true, message: '请选择签约主体', trigger: 'change' }],
|
|
|
- // taxAmount: [{ required: true, message: '请输入合同含税金额', trigger: 'change' }],
|
|
|
- // taxRate: [{ required: true, message: '请输入税率', trigger: 'change' }],
|
|
|
- // contractStartDate: [{ required: true, message: '请选择合同约定进场日期', trigger: 'change' }],
|
|
|
- // contractEndDate: [{ required: true, message: '请选择合同约定验收日期', trigger: 'change' }],
|
|
|
- // planCompleteDate: [{ required: true, message: '请选择计划完工日期', trigger: 'change' }],
|
|
|
-
|
|
|
- // 第二步
|
|
|
- // 'projectStageVOList.stageDate': [{ required: true, message: '请选择阶段日期', trigger: 'change' }],
|
|
|
-
|
|
|
- // 第三步
|
|
|
- baseManHours: [{ required: true, message: '请输入基准工时', trigger: 'change' }],
|
|
|
- baseLaborCost: [{ required: true, message: '请输入基准人工成本', trigger: 'change' }],
|
|
|
- baseExpenseCost: [{ required: true, message: '请输入基准费用成本', trigger: 'change' }],
|
|
|
- baseTotalCost: [{ required: true, message: '请输入基准总成本', trigger: 'change' }],
|
|
|
-
|
|
|
- // 第四步
|
|
|
- // province: [{ required: true, message: '请选择省', trigger: 'change' }],
|
|
|
- // city: [{ required: true, message: '请选择市', trigger: 'change' }],
|
|
|
- // district: [{ required: true, message: '请选择区', trigger: 'change' }],
|
|
|
- provinceCityDistrict: [{ required: true, message: '请选择省市区', trigger: 'change' }],
|
|
|
- specificAddress: [{ required: true, message: '请输入详细地址', trigger: 'change' }],
|
|
|
- projectDescription: [{ required: true, message: '请输入项目描述', trigger: 'change' }],
|
|
|
-};
|
|
|
+.process-management-item {
|
|
|
+ flex: 1;
|
|
|
|
|
|
-// --------------------- 配置 ---------------------
|
|
|
-const columns = [
|
|
|
- // { // 隐藏
|
|
|
- // title: '阶段Id',
|
|
|
- // dataIndex: 'stageId',
|
|
|
- // key: 'stageId',
|
|
|
- // },
|
|
|
- {
|
|
|
- title: '项目阶段',
|
|
|
- dataIndex: 'stageName',
|
|
|
- key: 'stageName',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '阶段周期',
|
|
|
- dataIndex: 'stageDate',
|
|
|
- key: 'stageDate',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '周期(天)',
|
|
|
- dataIndex: 'duration',
|
|
|
- key: 'duration',
|
|
|
- },
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ cursor: pointer;
|
|
|
|
|
|
-];
|
|
|
-
|
|
|
-const labelCol = { style: { width: '120px' } };
|
|
|
-
|
|
|
-// -------------------- 步骤相关 --------------------
|
|
|
-const current = ref(0);
|
|
|
-
|
|
|
-const next = () => {
|
|
|
- stepFormRef.value.validateFields().then((values) => {
|
|
|
- current.value++;
|
|
|
- }).catch((error) => {
|
|
|
- console.log('step1_error', error);
|
|
|
- });
|
|
|
-
|
|
|
- if (current.value === 0) {
|
|
|
- const validateFiledList = ['projectTemplateId', 'projectName', 'projectLevel', 'projectType', 'deliveryManager',
|
|
|
- 'accountManager', 'templateName', 'contractStatus'];
|
|
|
- stepFormRef.value.validateFields(validateFiledList).then((values) => {
|
|
|
- current.value++;
|
|
|
- }).catch((error) => {
|
|
|
- console.log('step0_error', error);
|
|
|
- });
|
|
|
- } else if (current.value === 1) {
|
|
|
- const filedList = ['stageDate'];
|
|
|
- const validateFiledList = formModel.projectStageVOList.map((_, index) => {
|
|
|
- return filedList.map((filed) => ['projectStageVOList', index, filed]);
|
|
|
- }).flat();
|
|
|
- stepFormRef.value.validateFields(validateFiledList).then((values) => {
|
|
|
- current.value++;
|
|
|
- }).catch((error) => {
|
|
|
- console.log('step1_error', error);
|
|
|
- });
|
|
|
- } else if (current.value === 2) {
|
|
|
- const validateFiledList = ['baseManHours', 'baseLaborCost', 'baseExpenseCost', 'baseTotalCost'];
|
|
|
- stepFormRef.value.validateFields(validateFiledList).then((values) => {
|
|
|
- current.value++;
|
|
|
- }).catch((error) => {
|
|
|
- console.log('step2_error', error);
|
|
|
- });
|
|
|
- } else if (current.value === 3) {
|
|
|
+ &:hover {
|
|
|
+ box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
|
|
|
+ & .process-item-icon img {
|
|
|
+ transform: scale(1.1);
|
|
|
}
|
|
|
-};
|
|
|
-
|
|
|
-const prev = () => {
|
|
|
- current.value--;
|
|
|
-};
|
|
|
-
|
|
|
-const submit = () => {
|
|
|
- Modal.confirm({
|
|
|
- title: '提示',
|
|
|
- content: '确定要提交吗?',
|
|
|
- okText: '确认',
|
|
|
- onOk() {
|
|
|
- postFormData();
|
|
|
- },
|
|
|
- cancelText: '取消',
|
|
|
- onCancel() { },
|
|
|
- });
|
|
|
+ }
|
|
|
+
|
|
|
+ .process-item-icon {
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ transform: translateY(-10%);
|
|
|
+ img {
|
|
|
+ width: 88%;
|
|
|
+ height: 88%;
|
|
|
+ transition: transform 0.3s;
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .process-item-text {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #1d2129;
|
|
|
+ font-weight: 500;
|
|
|
+ transform: translateY(-140%);
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ &::after {
|
|
|
+ position: absolute;
|
|
|
+ top: -66%;
|
|
|
+ right: -30%;
|
|
|
+ content: '→';
|
|
|
+ display: block;
|
|
|
+ color: #86909c;
|
|
|
+ margin-top: 10px;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-const postFormData = () => {
|
|
|
- stepFormRef.value.validateFields().then((values) => {
|
|
|
- projectApi.submitProjectApproval(formModel).then((res) => {
|
|
|
- message.success('提交成功');
|
|
|
- router.push({ path: '/teamwork/project-manage' });
|
|
|
- })
|
|
|
- }).catch((error) => {
|
|
|
- console.log('step1_error', error);
|
|
|
- });
|
|
|
+&:deep(.process-item1) {
|
|
|
+ background: url('/@/assets/images/home/process-mana/process-bg.svg') no-repeat center;
|
|
|
+ background-size: contain;
|
|
|
+}
|
|
|
+&:deep(.process-item2) {
|
|
|
+ background: url('/@/assets/images/home/process-mana/process-bg.svg') no-repeat center;
|
|
|
+ background-size: contain;
|
|
|
+}
|
|
|
+&:deep(.process-item3) {
|
|
|
+ background: url('/@/assets/images/home/process-mana/process-bg.svg') no-repeat center;
|
|
|
+ background-size: contain;
|
|
|
+}
|
|
|
+&:deep(.process-item4) {
|
|
|
+ background: url('/@/assets/images/home/process-mana/process-bg.svg') no-repeat center;
|
|
|
+ background-size: contain;
|
|
|
}
|
|
|
|
|
|
-const steps = [
|
|
|
- {
|
|
|
- title: '填写基本信息',
|
|
|
- content: 'First-content',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '填写节点信息',
|
|
|
- content: 'Second-content',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '填写基准成本',
|
|
|
- content: 'Last-content',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '填写其他信息',
|
|
|
- content: 'Last-content',
|
|
|
- },
|
|
|
-];
|
|
|
-const items = steps.map(item => ({
|
|
|
- key: item.title,
|
|
|
- title: item.title,
|
|
|
-}));
|
|
|
-
|
|
|
-function showSelectTemplate() {
|
|
|
- templateShowModal()
|
|
|
-};
|
|
|
-function showSelectContract() {
|
|
|
- contractShowModal()
|
|
|
-};
|
|
|
-
|
|
|
-function templateSelectedRowList(selectedRowList = {}) {
|
|
|
- formModel.costTemplateId = selectedRowList.id;
|
|
|
- formModel.templateName = selectedRowList.templateName;
|
|
|
-};
|
|
|
-function contractSelectedRowList(selectedRowList = {}) {
|
|
|
- formModel.contactId = selectedRowList.id;
|
|
|
- formModel.contractName = selectedRowList.contractName;
|
|
|
- formModel.supplierName = selectedRowList.customName;
|
|
|
- formModel.signingParty = selectedRowList.signingParty;
|
|
|
- formModel.taxAmount = selectedRowList.taxAmount;
|
|
|
- formModel.taxRate = selectedRowList.taxRate;
|
|
|
- formModel.contractStartDate = selectedRowList.contractStartDate;
|
|
|
- formModel.contractEndDate = selectedRowList.contractEndDate;
|
|
|
- // formModel.planCompleteDate = selectedRowList.planCompleteDate;
|
|
|
-};
|
|
|
-
|
|
|
-onMounted(() => {
|
|
|
-});
|
|
|
-</script>
|
|
|
-
|
|
|
-<style scoped lang="less">
|
|
|
-.approval-steps {
|
|
|
- width: 850px;
|
|
|
- margin: 0 auto;
|
|
|
-
|
|
|
- .steps-content {
|
|
|
- min-height: 150px;
|
|
|
- margin-top: 20px;
|
|
|
- }
|
|
|
-
|
|
|
- .steps-action {
|
|
|
- display: flex;
|
|
|
- justify-content: center;
|
|
|
- margin-top: 18px;
|
|
|
+.integration {
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: repeat(5, 1fr);
|
|
|
+ row-gap: 14px;
|
|
|
+
|
|
|
+ .integration-item {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ .integration-item-box {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ row-gap: 6px;
|
|
|
+ cursor: pointer;
|
|
|
+
|
|
|
+ .integration-item-icon {
|
|
|
+ img {
|
|
|
+ width: 40px;
|
|
|
+ height: 40px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .integration-item-text {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #4e5969;
|
|
|
+ font-weight: 400;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ .integration-item-icon {
|
|
|
+ img {
|
|
|
+ transform: scale(1.1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .integration-item-text {
|
|
|
+ color: #1d2129;
|
|
|
+ text-decoration: underline;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+ }
|
|
|
}
|
|
|
-</style>
|