类型调整、员工表去除多余按键、测算页面红绿对换
This commit is contained in:
@@ -12,6 +12,7 @@ export interface ProjectProfitVO {
|
||||
subcontractPlanningAmount?: number
|
||||
specialSubcontractPlanningAmount?: number
|
||||
sourceCoopSubcontractPlanningAmount?: number
|
||||
comprehensiveSubcontractPlanningAmount?: number
|
||||
majorOutputValue?: number
|
||||
majorExpectedPerformance?: number
|
||||
innovationOutputRate?: number
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
width="180"
|
||||
:formatter="dateFormatter"
|
||||
/>
|
||||
<el-table-column align="center" fixed="right" label="操作" width="160">
|
||||
<el-table-column align="center" fixed="right" label="操作" width="100">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-hasPermi="['tjt:employee:update']"
|
||||
@@ -152,14 +152,6 @@
|
||||
>
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-hasPermi="['tjt:employee:delete']"
|
||||
link
|
||||
type="danger"
|
||||
@click="handleDelete(scope.row.id)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -495,15 +487,6 @@ const submitForm = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
const handleDelete = async (id: number) => {
|
||||
try {
|
||||
await message.delConfirm()
|
||||
await EmployeeApi.deleteEmployee(id)
|
||||
message.success(t('common.delSuccess'))
|
||||
await getList()
|
||||
} catch {}
|
||||
}
|
||||
|
||||
let activatedOnce = false
|
||||
|
||||
onMounted(async () => {
|
||||
|
||||
@@ -292,6 +292,7 @@ import {
|
||||
formatAmountText,
|
||||
fromPercentValue,
|
||||
getOwnershipTypeLabel,
|
||||
OUTPUT_SPLIT_SPECIALTY,
|
||||
OUTPUT_SPLIT_SPECIALTY_OPTIONS,
|
||||
QUARTER_OPTIONS,
|
||||
toPercentValue
|
||||
@@ -299,15 +300,7 @@ import {
|
||||
|
||||
defineOptions({ name: 'TjtOutputSplit' })
|
||||
|
||||
type AnnualCategoryKey =
|
||||
| 'project_lead'
|
||||
| 'arch'
|
||||
| 'decor'
|
||||
| 'struct'
|
||||
| 'water'
|
||||
| 'elec'
|
||||
| 'hvac'
|
||||
| 'digital'
|
||||
type AnnualCategoryKey = (typeof OUTPUT_SPLIT_SPECIALTY)[keyof typeof OUTPUT_SPLIT_SPECIALTY]
|
||||
|
||||
interface QuarterYearRow {
|
||||
distributionYear: number
|
||||
@@ -315,14 +308,14 @@ interface QuarterYearRow {
|
||||
}
|
||||
|
||||
const annualCategoryOptions: { label: string; value: AnnualCategoryKey }[] = [
|
||||
{ label: '项目经理/工程负责人', value: 'project_lead' },
|
||||
{ label: '建筑专业', value: 'arch' },
|
||||
{ label: '装修专业', value: 'decor' },
|
||||
{ label: '结构专业', value: 'struct' },
|
||||
{ label: '水专业', value: 'water' },
|
||||
{ label: '电气专业', value: 'elec' },
|
||||
{ label: '暖通专业', value: 'hvac' },
|
||||
{ label: '数字化设计专业', value: 'digital' }
|
||||
{ label: '项目经理/工程负责人', value: OUTPUT_SPLIT_SPECIALTY.projectLead },
|
||||
{ label: '建筑专业', value: OUTPUT_SPLIT_SPECIALTY.arch },
|
||||
{ label: '装修专业', value: OUTPUT_SPLIT_SPECIALTY.decor },
|
||||
{ label: '结构专业', value: OUTPUT_SPLIT_SPECIALTY.struct },
|
||||
{ label: '水专业', value: OUTPUT_SPLIT_SPECIALTY.water },
|
||||
{ label: '电气专业', value: OUTPUT_SPLIT_SPECIALTY.elec },
|
||||
{ label: '暖通专业', value: OUTPUT_SPLIT_SPECIALTY.hvac },
|
||||
{ label: '数字化设计专业', value: OUTPUT_SPLIT_SPECIALTY.digital }
|
||||
]
|
||||
|
||||
const message = useMessage()
|
||||
@@ -339,7 +332,7 @@ const currentPlanning = ref<PlanningApi.ProjectPlanningVO>()
|
||||
const formData = ref<OutputSplitApi.ProjectOutputSplitVO>()
|
||||
const editForm = ref<OutputSplitApi.ProjectOutputSplitVO>()
|
||||
const quarterRows = ref<QuarterYearRow[]>([])
|
||||
const selectedAnnualCategory = ref<AnnualCategoryKey>('project_lead')
|
||||
const selectedAnnualCategory = ref<AnnualCategoryKey>(OUTPUT_SPLIT_SPECIALTY.projectLead)
|
||||
const dialogVisible = ref(false)
|
||||
const queryFormRef = ref()
|
||||
const projectTableRef = ref()
|
||||
@@ -438,7 +431,7 @@ const annualCategoryMeta = computed(() => {
|
||||
if (!model || !option) {
|
||||
return { label: '-', ratio: 0, totalAmount: 0 }
|
||||
}
|
||||
if (selectedAnnualCategory.value === 'project_lead') {
|
||||
if (selectedAnnualCategory.value === OUTPUT_SPLIT_SPECIALTY.projectLead) {
|
||||
const ratio = Number(toNumeric(model.projectLeadRatio).toFixed(4))
|
||||
return {
|
||||
label: option.label,
|
||||
|
||||
@@ -301,7 +301,7 @@
|
||||
<el-table-column align="center" label="设计部位" min-width="120" fixed="left">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip
|
||||
:content="row.designPart"
|
||||
:content="getDesignPartLabel(row.designPart)"
|
||||
:disabled="!hasValue(row.designPart)"
|
||||
placement="top"
|
||||
>
|
||||
@@ -581,7 +581,7 @@
|
||||
{{ activeRemarkRow.sortNo || '-' }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="设计部位">
|
||||
{{ activeRemarkRow.designPart || '-' }}
|
||||
{{ getDesignPartLabel(activeRemarkRow.designPart) }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="设计内容/设计类型">
|
||||
{{ activeRemarkRow.buildingType || '-' }}
|
||||
@@ -621,6 +621,7 @@ import {
|
||||
fromPercentValue,
|
||||
getCalculationRatioDefaultPercent,
|
||||
getCalculationRatioLabel,
|
||||
getDesignPartLabel,
|
||||
getOwnershipTypeLabel,
|
||||
getReviewOutsourceDefaultPercent,
|
||||
isComprehensiveOwnership,
|
||||
|
||||
@@ -105,16 +105,21 @@
|
||||
{{ formatAmountText(scope.row.comprehensivePlanningAmount) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="专项分包人工成本(元)" width="170">
|
||||
<el-table-column align="center" label="专项分包-专业所人工成本(元)" width="210">
|
||||
<template #default="scope">
|
||||
{{ formatAmountText(scope.row.specialSubcontractPlanningAmount) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="源头合作分包人工成本(元)" width="200">
|
||||
<el-table-column align="center" label="专项分包-源头合作分包人工成本(元)" width="250">
|
||||
<template #default="scope">
|
||||
{{ formatAmountText(scope.row.sourceCoopSubcontractPlanningAmount) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="专项分包-综合所人工成本(元)" width="230">
|
||||
<template #default="scope">
|
||||
{{ formatAmountText(scope.row.comprehensiveSubcontractPlanningAmount) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="专业所考核产值(元)" width="150">
|
||||
<template #default="scope">
|
||||
{{ formatAmountText(scope.row.majorOutputValue) }}
|
||||
@@ -198,12 +203,15 @@
|
||||
<el-descriptions-item label="综合所人工成本(元)">
|
||||
{{ formatAmountText(currentProfit.comprehensivePlanningAmount) }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="专项分包人工成本(元)">
|
||||
<el-descriptions-item label="专项分包-专业所人工成本(元)">
|
||||
{{ formatAmountText(currentProfit.specialSubcontractPlanningAmount) }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="源头合作分包人工成本(元)">
|
||||
<el-descriptions-item label="专项分包-源头合作分包人工成本(元)">
|
||||
{{ formatAmountText(currentProfit.sourceCoopSubcontractPlanningAmount) }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="专项分包-综合所人工成本(元)">
|
||||
{{ formatAmountText(currentProfit.comprehensiveSubcontractPlanningAmount) }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="专业所考核产值(元)">
|
||||
{{ formatAmountText(currentProfit.majorOutputValue) }}
|
||||
</el-descriptions-item>
|
||||
@@ -453,10 +461,10 @@ const submitProfitForm = async () => {
|
||||
|
||||
const profitLossClass = (value?: number) => {
|
||||
if ((value || 0) > 0) {
|
||||
return 'text-[var(--el-color-danger)] font-600'
|
||||
return 'text-[var(--el-color-success)] font-600'
|
||||
}
|
||||
if ((value || 0) < 0) {
|
||||
return 'text-[var(--el-color-success)] font-600'
|
||||
return 'text-[var(--el-color-danger)] font-600'
|
||||
}
|
||||
return 'text-[var(--el-text-color-primary)]'
|
||||
}
|
||||
|
||||
@@ -139,13 +139,13 @@
|
||||
<el-col :span="12">
|
||||
<el-form-item :label="statusReasonLabel" :prop="statusReasonProp">
|
||||
<el-input
|
||||
v-if="formData.projectStatus === '暂停'"
|
||||
v-if="formData.projectStatus === PROJECT_STATUS.paused"
|
||||
v-model="formData.pauseReason"
|
||||
maxlength="255"
|
||||
placeholder="请输入暂停原因"
|
||||
/>
|
||||
<el-input
|
||||
v-else-if="formData.projectStatus === '中止'"
|
||||
v-else-if="formData.projectStatus === PROJECT_STATUS.terminated"
|
||||
v-model="formData.terminateReason"
|
||||
maxlength="255"
|
||||
placeholder="请输入中止原因"
|
||||
@@ -276,37 +276,19 @@
|
||||
import type { FormRules } from 'element-plus'
|
||||
import * as EmployeeApi from '@/api/tjt/employee'
|
||||
import * as ProjectApi from '@/api/tjt/project'
|
||||
import {
|
||||
DEFAULT_INNOVATION_OUTPUT_RATE,
|
||||
OUTPUT_SPLIT_ROLE,
|
||||
PROJECT_CATEGORY_OPTIONS,
|
||||
PROJECT_STATUS,
|
||||
PROJECT_STATUS_OPTIONS,
|
||||
PROJECT_TYPE_OPTIONS
|
||||
} from '@/views/tjt/shared/planning'
|
||||
|
||||
defineOptions({ name: 'TjtProjectForm' })
|
||||
|
||||
const ROLE_PROJECT_MANAGER = 'project_manager'
|
||||
const ROLE_ENGINEERING_PRINCIPAL = 'engineering_principal'
|
||||
|
||||
const PROJECT_TYPE_OPTIONS = [
|
||||
{ label: '建筑工程', value: '建筑工程' },
|
||||
{ label: '精装工程', value: '精装工程' },
|
||||
{ label: '综合工程', value: '综合工程' },
|
||||
{ label: '专项设计', value: '专项设计' },
|
||||
{ label: 'BIM设计', value: 'BIM设计' },
|
||||
{ label: '其他', value: '其他' }
|
||||
]
|
||||
|
||||
const PROJECT_CATEGORY_OPTIONS = [
|
||||
{ label: '住宅', value: '住宅' },
|
||||
{ label: '公建', value: '公建' },
|
||||
{ label: '工业', value: '工业' },
|
||||
{ label: '园林景观', value: '园林景观' },
|
||||
{ label: '其他', value: '其他' }
|
||||
]
|
||||
|
||||
const PROJECT_STATUS_OPTIONS = [
|
||||
{ label: '进行中', value: '进行中' },
|
||||
{ label: '完成', value: '完成' },
|
||||
{ label: '暂停', value: '暂停' },
|
||||
{ label: '中止', value: '中止' }
|
||||
]
|
||||
|
||||
const DEFAULT_INNOVATION_OUTPUT_RATE = 0.01
|
||||
const ROLE_PROJECT_MANAGER = OUTPUT_SPLIT_ROLE.projectManager
|
||||
const ROLE_ENGINEERING_PRINCIPAL = OUTPUT_SPLIT_ROLE.engineeringPrincipal
|
||||
|
||||
const { t } = useI18n()
|
||||
const message = useMessage()
|
||||
@@ -340,7 +322,7 @@ const createFormData = (): ProjectApi.ProjectVO => ({
|
||||
projectType: '',
|
||||
projectCategory: '',
|
||||
projectStartYear: new Date().getFullYear(),
|
||||
projectStatus: '进行中',
|
||||
projectStatus: PROJECT_STATUS.inProgress,
|
||||
pauseReason: '',
|
||||
terminateReason: '',
|
||||
innovationOutputRate: DEFAULT_INNOVATION_OUTPUT_RATE,
|
||||
@@ -358,7 +340,7 @@ const normalizeFormData = (data: ProjectApi.ProjectVO): ProjectApi.ProjectVO =>
|
||||
...data,
|
||||
projectType: normalizeValue(data.projectType, PROJECT_TYPE_OPTIONS),
|
||||
projectCategory: normalizeValue(data.projectCategory, PROJECT_CATEGORY_OPTIONS),
|
||||
projectStatus: normalizeValue(data.projectStatus, PROJECT_STATUS_OPTIONS, '进行中'),
|
||||
projectStatus: normalizeValue(data.projectStatus, PROJECT_STATUS_OPTIONS, PROJECT_STATUS.inProgress),
|
||||
innovationOutputRate: data.innovationOutputRate ?? DEFAULT_INNOVATION_OUTPUT_RATE,
|
||||
otherCost: data.otherCost ?? 0,
|
||||
pauseReason: data.pauseReason || '',
|
||||
@@ -438,20 +420,20 @@ const projectStartYearValue = computed({
|
||||
})
|
||||
|
||||
const statusReasonLabel = computed(() =>
|
||||
formData.value.projectStatus === '中止' ? '中止原因' : '暂停原因'
|
||||
formData.value.projectStatus === PROJECT_STATUS.terminated ? '中止原因' : '暂停原因'
|
||||
)
|
||||
|
||||
const statusReasonProp = computed(() =>
|
||||
formData.value.projectStatus === '中止' ? 'terminateReason' : 'pauseReason'
|
||||
formData.value.projectStatus === PROJECT_STATUS.terminated ? 'terminateReason' : 'pauseReason'
|
||||
)
|
||||
|
||||
watch(
|
||||
() => formData.value.projectStatus,
|
||||
(status) => {
|
||||
if (status !== '暂停') {
|
||||
if (status !== PROJECT_STATUS.paused) {
|
||||
formData.value.pauseReason = ''
|
||||
}
|
||||
if (status !== '中止') {
|
||||
if (status !== PROJECT_STATUS.terminated) {
|
||||
formData.value.terminateReason = ''
|
||||
}
|
||||
}
|
||||
@@ -466,7 +448,7 @@ const formRules = reactive<FormRules>({
|
||||
pauseReason: [
|
||||
{
|
||||
validator: (_rule, value, callback) => {
|
||||
if (formData.value.projectStatus === '暂停' && !String(value || '').trim()) {
|
||||
if (formData.value.projectStatus === PROJECT_STATUS.paused && !String(value || '').trim()) {
|
||||
callback(new Error('暂停状态必须填写暂停原因'))
|
||||
return
|
||||
}
|
||||
@@ -478,7 +460,7 @@ const formRules = reactive<FormRules>({
|
||||
terminateReason: [
|
||||
{
|
||||
validator: (_rule, value, callback) => {
|
||||
if (formData.value.projectStatus === '中止' && !String(value || '').trim()) {
|
||||
if (formData.value.projectStatus === PROJECT_STATUS.terminated && !String(value || '').trim()) {
|
||||
callback(new Error('中止状态必须填写中止原因'))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -255,6 +255,7 @@ import download from '@/utils/download'
|
||||
import {
|
||||
formatAmountText,
|
||||
getOwnershipTypeLabel,
|
||||
OUTPUT_SPLIT_SPECIALTY,
|
||||
OUTPUT_SPLIT_SPECIALTY_OPTIONS,
|
||||
QUARTER_OPTIONS,
|
||||
toPercentValue
|
||||
@@ -262,15 +263,7 @@ import {
|
||||
|
||||
defineOptions({ name: 'TjtReportProjectQuarter' })
|
||||
|
||||
type AnnualCategoryKey =
|
||||
| 'project_lead'
|
||||
| 'arch'
|
||||
| 'decor'
|
||||
| 'struct'
|
||||
| 'water'
|
||||
| 'elec'
|
||||
| 'hvac'
|
||||
| 'digital'
|
||||
type AnnualCategoryKey = (typeof OUTPUT_SPLIT_SPECIALTY)[keyof typeof OUTPUT_SPLIT_SPECIALTY]
|
||||
|
||||
interface QuarterYearRow {
|
||||
distributionYear: number
|
||||
@@ -280,14 +273,14 @@ interface QuarterYearRow {
|
||||
type ExportDialogType = 'projectQuarter' | 'projectLeadQuarter'
|
||||
|
||||
const annualCategoryOptions: { label: string; value: AnnualCategoryKey }[] = [
|
||||
{ label: '项目经理/工程负责人', value: 'project_lead' },
|
||||
{ label: '建筑专业', value: 'arch' },
|
||||
{ label: '装修专业', value: 'decor' },
|
||||
{ label: '结构专业', value: 'struct' },
|
||||
{ label: '水专业', value: 'water' },
|
||||
{ label: '电气专业', value: 'elec' },
|
||||
{ label: '暖通专业', value: 'hvac' },
|
||||
{ label: '数字化设计专业', value: 'digital' }
|
||||
{ label: '项目经理/工程负责人', value: OUTPUT_SPLIT_SPECIALTY.projectLead },
|
||||
{ label: '建筑专业', value: OUTPUT_SPLIT_SPECIALTY.arch },
|
||||
{ label: '装修专业', value: OUTPUT_SPLIT_SPECIALTY.decor },
|
||||
{ label: '结构专业', value: OUTPUT_SPLIT_SPECIALTY.struct },
|
||||
{ label: '水专业', value: OUTPUT_SPLIT_SPECIALTY.water },
|
||||
{ label: '电气专业', value: OUTPUT_SPLIT_SPECIALTY.elec },
|
||||
{ label: '暖通专业', value: OUTPUT_SPLIT_SPECIALTY.hvac },
|
||||
{ label: '数字化设计专业', value: OUTPUT_SPLIT_SPECIALTY.digital }
|
||||
]
|
||||
|
||||
const message = useMessage()
|
||||
@@ -308,7 +301,7 @@ const currentProject = ref<ProjectApi.ProjectVO>()
|
||||
const currentPlanning = ref<PlanningApi.ProjectPlanningVO>()
|
||||
const formData = ref<OutputSplitApi.ProjectOutputSplitVO>()
|
||||
const quarterRows = ref<QuarterYearRow[]>([])
|
||||
const selectedAnnualCategory = ref<AnnualCategoryKey>('project_lead')
|
||||
const selectedAnnualCategory = ref<AnnualCategoryKey>(OUTPUT_SPLIT_SPECIALTY.projectLead)
|
||||
const queryFormRef = ref()
|
||||
const projectTableRef = ref()
|
||||
const planningTableRef = ref()
|
||||
@@ -416,7 +409,7 @@ const annualCategoryMeta = computed(() => {
|
||||
if (!model || !option) {
|
||||
return { ratio: 0 }
|
||||
}
|
||||
if (selectedAnnualCategory.value === 'project_lead') {
|
||||
if (selectedAnnualCategory.value === OUTPUT_SPLIT_SPECIALTY.projectLead) {
|
||||
return {
|
||||
ratio: Number(toNumeric(model.projectLeadRatio).toFixed(4))
|
||||
}
|
||||
|
||||
@@ -267,11 +267,16 @@ import * as PlanningApi from '@/api/tjt/planning'
|
||||
import * as ProjectApi from '@/api/tjt/project'
|
||||
import * as ReportApi from '@/api/tjt/report'
|
||||
import download from '@/utils/download'
|
||||
import { formatAmountText, formatPercentText, getOwnershipTypeLabel } from '@/views/tjt/shared/planning'
|
||||
import {
|
||||
formatAmountText,
|
||||
formatPercentText,
|
||||
getOwnershipTypeLabel,
|
||||
OUTPUT_SPLIT_SPECIALTY
|
||||
} from '@/views/tjt/shared/planning'
|
||||
|
||||
defineOptions({ name: 'TjtReportSpecialtyPerson' })
|
||||
|
||||
const PROJECT_LEAD_GROUP_CODE = 'project_lead'
|
||||
const PROJECT_LEAD_GROUP_CODE = OUTPUT_SPLIT_SPECIALTY.projectLead
|
||||
|
||||
const message = useMessage()
|
||||
const currentYear = new Date().getFullYear()
|
||||
|
||||
@@ -4,36 +4,75 @@ export type Option<T = string> = {
|
||||
}
|
||||
|
||||
export const OWNERSHIP_TYPE = {
|
||||
major: '专业所',
|
||||
comprehensive: '综合所',
|
||||
specialSubcontract: '专项分包',
|
||||
sourceCoopSubcontract: '源头合作分包'
|
||||
major: 'major',
|
||||
comprehensive: 'comprehensive',
|
||||
specialSubcontract: 'special_subcontract_major',
|
||||
sourceCoopSubcontract: 'special_subcontract_source_coop',
|
||||
comprehensiveSubcontract: 'special_subcontract_comprehensive'
|
||||
} as const
|
||||
|
||||
export const OWNERSHIP_TYPE_LABEL: Record<(typeof OWNERSHIP_TYPE)[keyof typeof OWNERSHIP_TYPE], string> = {
|
||||
[OWNERSHIP_TYPE.major]: '专业所',
|
||||
[OWNERSHIP_TYPE.comprehensive]: '综合所',
|
||||
[OWNERSHIP_TYPE.specialSubcontract]: '专项分包-专业所',
|
||||
[OWNERSHIP_TYPE.sourceCoopSubcontract]: '专项分包-源头合作分包',
|
||||
[OWNERSHIP_TYPE.comprehensiveSubcontract]: '专项分包-综合所'
|
||||
}
|
||||
|
||||
export const CALCULATION_METHOD = {
|
||||
guidancePrice: '指导价法',
|
||||
contractPrice: '合同价法',
|
||||
virtualOutput: '虚拟产值法'
|
||||
guidancePrice: 'guidance_price',
|
||||
contractPrice: 'contract_price',
|
||||
virtualOutput: 'virtual_output'
|
||||
} as const
|
||||
|
||||
export const CALCULATION_METHOD_LABEL: Record<
|
||||
(typeof CALCULATION_METHOD)[keyof typeof CALCULATION_METHOD],
|
||||
string
|
||||
> = {
|
||||
[CALCULATION_METHOD.guidancePrice]: '指导价法',
|
||||
[CALCULATION_METHOD.contractPrice]: '合同价法',
|
||||
[CALCULATION_METHOD.virtualOutput]: '虚拟产值法'
|
||||
}
|
||||
|
||||
export const VIRTUAL_CALCULATION_METHOD = {
|
||||
guidancePrice: '指导单价法',
|
||||
guidanceTotalPrice: '指导总价法',
|
||||
workingDay: '工日法'
|
||||
guidancePrice: 'guidance_price',
|
||||
guidanceTotalPrice: 'guidance_total_price',
|
||||
workingDay: 'working_day'
|
||||
} as const
|
||||
|
||||
export const VIRTUAL_CALCULATION_METHOD_LABEL: Record<
|
||||
(typeof VIRTUAL_CALCULATION_METHOD)[keyof typeof VIRTUAL_CALCULATION_METHOD],
|
||||
string
|
||||
> = {
|
||||
[VIRTUAL_CALCULATION_METHOD.guidancePrice]: '指导单价法',
|
||||
[VIRTUAL_CALCULATION_METHOD.guidanceTotalPrice]: '指导总价法',
|
||||
[VIRTUAL_CALCULATION_METHOD.workingDay]: '工日法'
|
||||
}
|
||||
|
||||
export const DESIGN_STAGE = {
|
||||
scheme: '方案',
|
||||
constructionDrawing: '施工图',
|
||||
schemeAndConstructionDrawing: '方案+施工图'
|
||||
scheme: 'scheme',
|
||||
constructionDrawing: 'construction_drawing',
|
||||
schemeAndConstructionDrawing: 'scheme_and_construction_drawing'
|
||||
} as const
|
||||
|
||||
export const DESIGN_STAGE_LABEL: Record<(typeof DESIGN_STAGE)[keyof typeof DESIGN_STAGE], string> = {
|
||||
[DESIGN_STAGE.scheme]: '方案',
|
||||
[DESIGN_STAGE.constructionDrawing]: '施工图',
|
||||
[DESIGN_STAGE.schemeAndConstructionDrawing]: '方案+施工图'
|
||||
}
|
||||
|
||||
export const DESIGN_PART = {
|
||||
realEstate: '地上部分',
|
||||
underground: '地下部分',
|
||||
other: '其他'
|
||||
realEstate: 'above_ground',
|
||||
underground: 'underground',
|
||||
other: 'other'
|
||||
} as const
|
||||
|
||||
export const DESIGN_PART_LABEL: Record<(typeof DESIGN_PART)[keyof typeof DESIGN_PART], string> = {
|
||||
[DESIGN_PART.realEstate]: '地上部分',
|
||||
[DESIGN_PART.underground]: '地下部分',
|
||||
[DESIGN_PART.other]: '其他'
|
||||
}
|
||||
|
||||
export const PROJECT_TYPE = {
|
||||
building: '建筑工程',
|
||||
decoration: '精装工程',
|
||||
@@ -52,12 +91,19 @@ export const PROJECT_CATEGORY = {
|
||||
} as const
|
||||
|
||||
export const PROJECT_STATUS = {
|
||||
inProgress: '进行中',
|
||||
completed: '完成',
|
||||
paused: '暂停',
|
||||
terminated: '中止'
|
||||
inProgress: 'in_progress',
|
||||
completed: 'completed',
|
||||
paused: 'paused',
|
||||
terminated: 'terminated'
|
||||
} as const
|
||||
|
||||
export const PROJECT_STATUS_LABEL: Record<(typeof PROJECT_STATUS)[keyof typeof PROJECT_STATUS], string> = {
|
||||
[PROJECT_STATUS.inProgress]: '进行中',
|
||||
[PROJECT_STATUS.completed]: '完成',
|
||||
[PROJECT_STATUS.paused]: '暂停',
|
||||
[PROJECT_STATUS.terminated]: '中止'
|
||||
}
|
||||
|
||||
export const EMPLOYEE_GENDER = {
|
||||
male: '男',
|
||||
female: '女'
|
||||
@@ -100,46 +146,68 @@ export const normalizeProjectStatus = (value?: string) =>
|
||||
normalizeValue(value, Object.values(PROJECT_STATUS))
|
||||
|
||||
export const OWNERSHIP_TYPE_OPTIONS: Option[] = [
|
||||
{ label: OWNERSHIP_TYPE.major, value: OWNERSHIP_TYPE.major },
|
||||
{ label: OWNERSHIP_TYPE.comprehensive, value: OWNERSHIP_TYPE.comprehensive },
|
||||
{ label: OWNERSHIP_TYPE.specialSubcontract, value: OWNERSHIP_TYPE.specialSubcontract },
|
||||
{ label: OWNERSHIP_TYPE_LABEL[OWNERSHIP_TYPE.major], value: OWNERSHIP_TYPE.major },
|
||||
{ label: OWNERSHIP_TYPE_LABEL[OWNERSHIP_TYPE.comprehensive], value: OWNERSHIP_TYPE.comprehensive },
|
||||
{
|
||||
label: OWNERSHIP_TYPE.sourceCoopSubcontract,
|
||||
label: OWNERSHIP_TYPE_LABEL[OWNERSHIP_TYPE.specialSubcontract],
|
||||
value: OWNERSHIP_TYPE.specialSubcontract
|
||||
},
|
||||
{
|
||||
label: OWNERSHIP_TYPE_LABEL[OWNERSHIP_TYPE.sourceCoopSubcontract],
|
||||
value: OWNERSHIP_TYPE.sourceCoopSubcontract
|
||||
},
|
||||
{
|
||||
label: OWNERSHIP_TYPE_LABEL[OWNERSHIP_TYPE.comprehensiveSubcontract],
|
||||
value: OWNERSHIP_TYPE.comprehensiveSubcontract
|
||||
}
|
||||
]
|
||||
|
||||
export const CALCULATION_METHOD_OPTIONS: Option[] = [
|
||||
{ label: CALCULATION_METHOD.guidancePrice, value: CALCULATION_METHOD.guidancePrice },
|
||||
{ label: CALCULATION_METHOD.contractPrice, value: CALCULATION_METHOD.contractPrice },
|
||||
{ label: CALCULATION_METHOD.virtualOutput, value: CALCULATION_METHOD.virtualOutput }
|
||||
{
|
||||
label: CALCULATION_METHOD_LABEL[CALCULATION_METHOD.guidancePrice],
|
||||
value: CALCULATION_METHOD.guidancePrice
|
||||
},
|
||||
{
|
||||
label: CALCULATION_METHOD_LABEL[CALCULATION_METHOD.contractPrice],
|
||||
value: CALCULATION_METHOD.contractPrice
|
||||
},
|
||||
{
|
||||
label: CALCULATION_METHOD_LABEL[CALCULATION_METHOD.virtualOutput],
|
||||
value: CALCULATION_METHOD.virtualOutput
|
||||
}
|
||||
]
|
||||
|
||||
export const VIRTUAL_CALCULATION_METHOD_OPTIONS: Option[] = [
|
||||
{
|
||||
label: VIRTUAL_CALCULATION_METHOD.guidancePrice,
|
||||
label: VIRTUAL_CALCULATION_METHOD_LABEL[VIRTUAL_CALCULATION_METHOD.guidancePrice],
|
||||
value: VIRTUAL_CALCULATION_METHOD.guidancePrice
|
||||
},
|
||||
{
|
||||
label: VIRTUAL_CALCULATION_METHOD.guidanceTotalPrice,
|
||||
label: VIRTUAL_CALCULATION_METHOD_LABEL[VIRTUAL_CALCULATION_METHOD.guidanceTotalPrice],
|
||||
value: VIRTUAL_CALCULATION_METHOD.guidanceTotalPrice
|
||||
},
|
||||
{ label: VIRTUAL_CALCULATION_METHOD.workingDay, value: VIRTUAL_CALCULATION_METHOD.workingDay }
|
||||
{
|
||||
label: VIRTUAL_CALCULATION_METHOD_LABEL[VIRTUAL_CALCULATION_METHOD.workingDay],
|
||||
value: VIRTUAL_CALCULATION_METHOD.workingDay
|
||||
}
|
||||
]
|
||||
|
||||
export const DESIGN_STAGE_OPTIONS: Option[] = [
|
||||
{ label: DESIGN_STAGE.scheme, value: DESIGN_STAGE.scheme },
|
||||
{ label: DESIGN_STAGE.constructionDrawing, value: DESIGN_STAGE.constructionDrawing },
|
||||
{ label: DESIGN_STAGE_LABEL[DESIGN_STAGE.scheme], value: DESIGN_STAGE.scheme },
|
||||
{
|
||||
label: DESIGN_STAGE.schemeAndConstructionDrawing,
|
||||
label: DESIGN_STAGE_LABEL[DESIGN_STAGE.constructionDrawing],
|
||||
value: DESIGN_STAGE.constructionDrawing
|
||||
},
|
||||
{
|
||||
label: DESIGN_STAGE_LABEL[DESIGN_STAGE.schemeAndConstructionDrawing],
|
||||
value: DESIGN_STAGE.schemeAndConstructionDrawing
|
||||
}
|
||||
]
|
||||
|
||||
export const DESIGN_PART_OPTIONS: Option[] = [
|
||||
{ label: DESIGN_PART.realEstate, value: DESIGN_PART.realEstate },
|
||||
{ label: DESIGN_PART.underground, value: DESIGN_PART.underground },
|
||||
{ label: DESIGN_PART.other, value: DESIGN_PART.other }
|
||||
{ label: DESIGN_PART_LABEL[DESIGN_PART.realEstate], value: DESIGN_PART.realEstate },
|
||||
{ label: DESIGN_PART_LABEL[DESIGN_PART.underground], value: DESIGN_PART.underground },
|
||||
{ label: DESIGN_PART_LABEL[DESIGN_PART.other], value: DESIGN_PART.other }
|
||||
]
|
||||
|
||||
export const CONTRACT_SIGN_OPTIONS: Option<boolean>[] = [
|
||||
@@ -165,10 +233,10 @@ export const PROJECT_CATEGORY_OPTIONS: Option[] = [
|
||||
]
|
||||
|
||||
export const PROJECT_STATUS_OPTIONS: Option[] = [
|
||||
{ label: PROJECT_STATUS.inProgress, value: PROJECT_STATUS.inProgress },
|
||||
{ label: PROJECT_STATUS.completed, value: PROJECT_STATUS.completed },
|
||||
{ label: PROJECT_STATUS.paused, value: PROJECT_STATUS.paused },
|
||||
{ label: PROJECT_STATUS.terminated, value: PROJECT_STATUS.terminated }
|
||||
{ label: PROJECT_STATUS_LABEL[PROJECT_STATUS.inProgress], value: PROJECT_STATUS.inProgress },
|
||||
{ label: PROJECT_STATUS_LABEL[PROJECT_STATUS.completed], value: PROJECT_STATUS.completed },
|
||||
{ label: PROJECT_STATUS_LABEL[PROJECT_STATUS.paused], value: PROJECT_STATUS.paused },
|
||||
{ label: PROJECT_STATUS_LABEL[PROJECT_STATUS.terminated], value: PROJECT_STATUS.terminated }
|
||||
]
|
||||
|
||||
export const EMPLOYEE_GENDER_OPTIONS: Option[] = [
|
||||
@@ -206,22 +274,43 @@ export const QUARTER_OPTIONS: Option<number>[] = [
|
||||
{ label: '四季度', value: 4 }
|
||||
]
|
||||
|
||||
export const OUTPUT_SPLIT_SPECIALTY = {
|
||||
projectLead: 'project_lead',
|
||||
arch: 'arch',
|
||||
decor: 'decor',
|
||||
struct: 'struct',
|
||||
water: 'water',
|
||||
elec: 'elec',
|
||||
hvac: 'hvac',
|
||||
digital: 'digital'
|
||||
} as const
|
||||
|
||||
export const OUTPUT_SPLIT_ROLE = {
|
||||
director: 'director',
|
||||
check: 'check',
|
||||
review: 'review',
|
||||
approve: 'approve',
|
||||
design: 'design',
|
||||
projectManager: 'project_manager',
|
||||
engineeringPrincipal: 'engineering_principal'
|
||||
} as const
|
||||
|
||||
export const OUTPUT_SPLIT_SPECIALTY_OPTIONS: Option[] = [
|
||||
{ label: '建筑', value: 'arch' },
|
||||
{ label: '装饰', value: 'decor' },
|
||||
{ label: '结构', value: 'struct' },
|
||||
{ label: '给排水', value: 'water' },
|
||||
{ label: '电气', value: 'elec' },
|
||||
{ label: '暖通', value: 'hvac' },
|
||||
{ label: '数字化设计', value: 'digital' }
|
||||
{ label: '建筑', value: OUTPUT_SPLIT_SPECIALTY.arch },
|
||||
{ label: '装饰', value: OUTPUT_SPLIT_SPECIALTY.decor },
|
||||
{ label: '结构', value: OUTPUT_SPLIT_SPECIALTY.struct },
|
||||
{ label: '给排水', value: OUTPUT_SPLIT_SPECIALTY.water },
|
||||
{ label: '电气', value: OUTPUT_SPLIT_SPECIALTY.elec },
|
||||
{ label: '暖通', value: OUTPUT_SPLIT_SPECIALTY.hvac },
|
||||
{ label: '数字化设计', value: OUTPUT_SPLIT_SPECIALTY.digital }
|
||||
]
|
||||
|
||||
export const SPECIALTY_ROLE_OPTIONS: Option[] = [
|
||||
{ label: '专业负责人', value: 'director' },
|
||||
{ label: '校对', value: 'check' },
|
||||
{ label: '审核', value: 'review' },
|
||||
{ label: '审定', value: 'approve' },
|
||||
{ label: '设计', value: 'design' }
|
||||
{ label: '专业负责人', value: OUTPUT_SPLIT_ROLE.director },
|
||||
{ label: '校对', value: OUTPUT_SPLIT_ROLE.check },
|
||||
{ label: '审核', value: OUTPUT_SPLIT_ROLE.review },
|
||||
{ label: '审定', value: OUTPUT_SPLIT_ROLE.approve },
|
||||
{ label: '设计', value: OUTPUT_SPLIT_ROLE.design }
|
||||
]
|
||||
|
||||
export const isMajorOwnership = (value?: string) =>
|
||||
@@ -232,8 +321,12 @@ export const isSpecialSubcontractOwnership = (value?: string) =>
|
||||
normalizeOwnershipType(value) === OWNERSHIP_TYPE.specialSubcontract
|
||||
export const isSourceCoopSubcontractOwnership = (value?: string) =>
|
||||
normalizeOwnershipType(value) === OWNERSHIP_TYPE.sourceCoopSubcontract
|
||||
export const isComprehensiveSubcontractOwnership = (value?: string) =>
|
||||
normalizeOwnershipType(value) === OWNERSHIP_TYPE.comprehensiveSubcontract
|
||||
export const isSubcontractOwnership = (value?: string) =>
|
||||
isSpecialSubcontractOwnership(value) || isSourceCoopSubcontractOwnership(value)
|
||||
isSpecialSubcontractOwnership(value) ||
|
||||
isSourceCoopSubcontractOwnership(value) ||
|
||||
isComprehensiveSubcontractOwnership(value)
|
||||
|
||||
export const isGuidancePriceMethod = (value?: string) =>
|
||||
normalizeCalculationMethod(value) === CALCULATION_METHOD.guidancePrice
|
||||
|
||||
@@ -325,15 +325,17 @@ import {
|
||||
formatPercentText,
|
||||
fromPercentValue,
|
||||
getOwnershipTypeLabel,
|
||||
OUTPUT_SPLIT_ROLE,
|
||||
OUTPUT_SPLIT_SPECIALTY,
|
||||
toPercentValue
|
||||
} from '@/views/tjt/shared/planning'
|
||||
|
||||
defineOptions({ name: 'TjtStaffAssignment' })
|
||||
|
||||
const DESIGN_ROLE_CODE = 'design'
|
||||
const PROJECT_LEAD_GROUP_CODE = 'project_lead'
|
||||
const ROLE_PROJECT_MANAGER = 'project_manager'
|
||||
const ROLE_ENGINEERING_PRINCIPAL = 'engineering_principal'
|
||||
const DESIGN_ROLE_CODE = OUTPUT_SPLIT_ROLE.design
|
||||
const PROJECT_LEAD_GROUP_CODE = OUTPUT_SPLIT_SPECIALTY.projectLead
|
||||
const ROLE_PROJECT_MANAGER = OUTPUT_SPLIT_ROLE.projectManager
|
||||
const ROLE_ENGINEERING_PRINCIPAL = OUTPUT_SPLIT_ROLE.engineeringPrincipal
|
||||
const EPSILON = 0.0001
|
||||
|
||||
type SpecialtyRolePersonVO = SpecialtyRoleSplitApi.SpecialtyRolePersonVO
|
||||
|
||||
Reference in New Issue
Block a user