Merge branch 'refs/heads/master' into wsq-20260727
# Conflicts: # src/views/gh/improvementProposal/components/ImprovementProposalForm.vue
This commit is contained in:
@@ -4,27 +4,27 @@
|
|||||||
<div class="jeecg-basic-table-form-container">
|
<div class="jeecg-basic-table-form-container">
|
||||||
<a-form ref="formRef" @keyup.enter="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
<a-form ref="formRef" @keyup.enter="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
<a-row :gutter="24" class="search-form-row">
|
<a-row :gutter="24" class="search-form-row">
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="年份" name="year">
|
<a-form-item label="年份" name="year">
|
||||||
<a-date-picker v-model:value="queryParam.year" picker="year" value-format="YYYY" placeholder="请选择年份" allow-clear style="width: 100%" @change="searchQuery" />
|
<a-date-picker v-model:value="queryParam.year" picker="year" value-format="YYYY" placeholder="请选择年份" allow-clear style="width: 100%" @change="searchQuery" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="分管所领导" name="manageSuoleader">
|
<a-form-item label="分管所领导" name="manageSuoleader">
|
||||||
<DeptRoleUserSelectDropDown v-model:value="queryParam.manageSuoleader" :deptId="PARTY_COMMITTEE_DEPT_ID" :roleId="CHARGE_LEADER_ROLE_ID" placeholder="请选择分管所领导" allow-clear style="width: 100%" @change="searchQuery" />
|
<DeptRoleUserSelectDropDown v-model:value="queryParam.manageSuoleader" :deptId="PARTY_COMMITTEE_DEPT_ID" :roleId="CHARGE_LEADER_ROLE_ID" placeholder="请选择分管所领导" allow-clear style="width: 100%" @change="searchQuery" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="事项名称" name="title">
|
<a-form-item label="事项名称" name="title">
|
||||||
<JInput v-model:value="queryParam.title" type="like" placeholder="请输入事项名称" allow-clear trim @update:value="searchQuery" />
|
<JInput v-model:value="queryParam.title" type="like" placeholder="请输入事项名称" allow-clear trim @update:value="searchQuery" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="会议决议" name="content">
|
<a-form-item label="会议决议" name="content">
|
||||||
<JInput v-model:value="queryParam.content" type="like" placeholder="请输入会议决议" allow-clear trim @update:value="searchQuery" />
|
<JInput v-model:value="queryParam.content" type="like" placeholder="请输入会议决议" allow-clear trim @update:value="searchQuery" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col v-if="toggleSearchStatus" :lg="6" :md="8" :sm="12">
|
<a-col v-if="toggleSearchStatus" :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="完成状态" name="bpmStatus">
|
<a-form-item label="完成状态" name="bpmStatus">
|
||||||
<JDictSelectTag
|
<JDictSelectTag
|
||||||
v-model:value="queryParam.bpmStatus"
|
v-model:value="queryParam.bpmStatus"
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
/>
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<span class="table-page-search-submitButtons">
|
<span class="table-page-search-submitButtons">
|
||||||
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
|
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
|
||||||
<a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
|
<a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
|
||||||
@@ -707,7 +707,7 @@
|
|||||||
xs:24,
|
xs:24,
|
||||||
sm:4,
|
sm:4,
|
||||||
xl:6,
|
xl:6,
|
||||||
xxl:4
|
xxl:8
|
||||||
});
|
});
|
||||||
const wrapperCol = reactive({
|
const wrapperCol = reactive({
|
||||||
xs: 24,
|
xs: 24,
|
||||||
|
|||||||
@@ -4,27 +4,27 @@
|
|||||||
<div class="jeecg-basic-table-form-container">
|
<div class="jeecg-basic-table-form-container">
|
||||||
<a-form ref="formRef" @keyup.enter="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
<a-form ref="formRef" @keyup.enter="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="意见主题" name="title">
|
<a-form-item label="意见主题" name="title">
|
||||||
<JInput v-model:value="queryParam.title" type="like" placeholder="请输入意见主题" allow-clear trim @change="searchQuery" />
|
<JInput v-model:value="queryParam.title" type="like" placeholder="请输入意见主题" allow-clear trim @change="searchQuery" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="分管所领导" name="manageSuoleader">
|
<a-form-item label="分管所领导" name="manageSuoleader">
|
||||||
<DeptRoleUserSelectDropDown v-model:value="queryParam.manageSuoleader" :deptId="PARTY_COMMITTEE_DEPT_ID" :roleId="CHARGE_LEADER_ROLE_ID" placeholder="请选择分管所领导" allow-clear style="width: 100%" @change="searchQuery" />
|
<DeptRoleUserSelectDropDown v-model:value="queryParam.manageSuoleader" :deptId="PARTY_COMMITTEE_DEPT_ID" :roleId="CHARGE_LEADER_ROLE_ID" placeholder="请选择分管所领导" allow-clear style="width: 100%" @change="searchQuery" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="5" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="牵头部门" name="responDeptid">
|
<a-form-item label="牵头部门" name="responDeptid">
|
||||||
<sz-select-dept placeholder="请选择牵头部门" v-model:value="selectedResponDept" checkStrictly allow-clear @change="handleResponDeptChange" />
|
<sz-select-dept placeholder="请选择牵头部门" v-model:value="selectedResponDept" checkStrictly allow-clear @change="handleResponDeptChange" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="5" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="协办部门" name="assistDeptid">
|
<a-form-item label="协办部门" name="assistDeptid">
|
||||||
<sz-select-dept placeholder="请选择协办部门" v-model:value="selectedAssistDept" checkStrictly allow-clear @change="handleAssistDeptChange" />
|
<sz-select-dept placeholder="请选择协办部门" v-model:value="selectedAssistDept" checkStrictly allow-clear @change="handleAssistDeptChange" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<span class="table-page-search-submitButtons">
|
<span class="table-page-search-submitButtons">
|
||||||
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
|
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
|
||||||
<a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
|
<a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
|
||||||
@@ -631,7 +631,7 @@
|
|||||||
xs:24,
|
xs:24,
|
||||||
sm:4,
|
sm:4,
|
||||||
xl:6,
|
xl:6,
|
||||||
xxl:4
|
xxl:8
|
||||||
});
|
});
|
||||||
const wrapperCol = reactive({
|
const wrapperCol = reactive({
|
||||||
xs: 24,
|
xs: 24,
|
||||||
|
|||||||
@@ -4,17 +4,17 @@
|
|||||||
<div class="jeecg-basic-table-form-container">
|
<div class="jeecg-basic-table-form-container">
|
||||||
<a-form ref="formRef" @keyup.enter="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
<a-form ref="formRef" @keyup.enter="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="重要讲话指示批示情况" name="speakStatus">
|
<a-form-item label="重要讲话指示批示情况" name="speakStatus">
|
||||||
<JInput v-model:value="queryParam.speakStatus" type="like" placeholder="请输入重要讲话指示批示情况" allow-clear trim @change="searchQuery" />
|
<JInput v-model:value="queryParam.speakStatus" type="like" placeholder="请输入重要讲话指示批示情况" allow-clear trim @change="searchQuery" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="6" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="牵头部门" name="implDept">
|
<a-form-item label="牵头部门" name="implDept">
|
||||||
<SzSelectDept v-model:value="selectedImplDept" :multiple="true" placeholder="选择牵头部门" allow-clear style="width: 100%" @change="handleImplDeptChange" />
|
<SzSelectDept v-model:value="selectedImplDept" :multiple="true" placeholder="选择牵头部门" allow-clear style="width: 100%" @change="handleImplDeptChange" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="所党委责任领导" name="responsiblePerson">
|
<a-form-item label="所党委责任领导" name="responsiblePerson">
|
||||||
<DeptRoleUserSelectDropDown v-model:value="queryParam.responsiblePerson" :deptId="PARTY_COMMITTEE_DEPT_ID" :roleId="SDW_LEADER_ROLE_ID" placeholder="请选择所党委责任领导" allow-clear style="width: 100%" @change="searchQuery" />
|
<DeptRoleUserSelectDropDown v-model:value="queryParam.responsiblePerson" :deptId="PARTY_COMMITTEE_DEPT_ID" :roleId="SDW_LEADER_ROLE_ID" placeholder="请选择所党委责任领导" allow-clear style="width: 100%" @change="searchQuery" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
<!-- <JDictSelectTag v-model:value="queryParam.completionStatus" dictCode="db_status" placeholder="请选择完成状态" allow-clear @change="searchQuery" />-->
|
<!-- <JDictSelectTag v-model:value="queryParam.completionStatus" dictCode="db_status" placeholder="请选择完成状态" allow-clear @change="searchQuery" />-->
|
||||||
<!-- </a-form-item>-->
|
<!-- </a-form-item>-->
|
||||||
<!-- </a-col>-->
|
<!-- </a-col>-->
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item name="bpmStatus" label="督办状态">
|
<a-form-item name="bpmStatus" label="督办状态">
|
||||||
<a-select v-model:value="bpmStatusFilter" placeholder="请选择" allow-clear @change="handleBpmStatusChange">
|
<a-select v-model:value="bpmStatusFilter" placeholder="请选择" allow-clear @change="handleBpmStatusChange">
|
||||||
<a-select-option value="1">未开始</a-select-option>
|
<a-select-option value="1">未开始</a-select-option>
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
</a-select>
|
</a-select>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<span class="table-page-search-submitButtons">
|
<span class="table-page-search-submitButtons">
|
||||||
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
|
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
|
||||||
<a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
|
<a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
|
||||||
@@ -229,13 +229,13 @@ import { PARTY_COMMITTEE_DEPT_ID, SDW_LEADER_ROLE_ID } from '/@/constant/supervi
|
|||||||
xs: 24,
|
xs: 24,
|
||||||
sm: 8,
|
sm: 8,
|
||||||
xl: 10,
|
xl: 10,
|
||||||
xxl: 8,
|
xxl: 14,
|
||||||
});
|
});
|
||||||
const wrapperCol = reactive({
|
const wrapperCol = reactive({
|
||||||
xs: 24,
|
xs: 24,
|
||||||
sm: 16,
|
sm: 16,
|
||||||
xl: 14,
|
xl: 14,
|
||||||
xxl: 16,
|
xxl: 10,
|
||||||
});
|
});
|
||||||
|
|
||||||
// 高级查询配置
|
// 高级查询配置
|
||||||
|
|||||||
@@ -4,22 +4,22 @@
|
|||||||
<div class="jeecg-basic-table-form-container">
|
<div class="jeecg-basic-table-form-container">
|
||||||
<a-form ref="formRef" @keyup.enter="reload" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
<a-form ref="formRef" @keyup.enter="reload" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="整改措施" name="improveMeasure">
|
<a-form-item label="整改措施" name="improveMeasure">
|
||||||
<JInput v-model:value="queryParam.improveMeasure" type="like" placeholder="请输入整改措施" allow-clear trim @change="reload" />
|
<JInput v-model:value="queryParam.improveMeasure" type="like" placeholder="请输入整改措施" allow-clear trim @change="reload" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="分管所领导" name="chargeLeaderId">
|
<a-form-item label="分管所领导" name="chargeLeaderId">
|
||||||
<DeptRoleUserSelectDropDown v-model:value="queryParam.chargeLeaderId" :deptId="PARTY_COMMITTEE_DEPT_ID" :roleId="CHARGE_LEADER_ROLE_ID" placeholder="请选择分管所领导" allow-clear style="width: 100%" @change="reload" />
|
<DeptRoleUserSelectDropDown v-model:value="queryParam.chargeLeaderId" :deptId="PARTY_COMMITTEE_DEPT_ID" :roleId="CHARGE_LEADER_ROLE_ID" placeholder="请选择分管所领导" allow-clear style="width: 100%" @change="reload" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item label="措施责任部门" name="measureResDept">
|
<a-form-item label="措施责任部门" name="measureResDept">
|
||||||
<SzSelectDept v-model:value="queryParam.measureResDept" :multiple="true" checkStrictly allow-clear @change="reload" />
|
<SzSelectDept v-model:value="queryParam.measureResDept" :multiple="true" checkStrictly allow-clear @change="reload" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<a-form-item name="bpmStatus" label="督办状态">
|
<a-form-item name="bpmStatus" label="督办状态">
|
||||||
<a-select v-model:value="bpmStatusFilter" placeholder="请选择" allow-clear @change="handleBpmStatusChange">
|
<a-select v-model:value="bpmStatusFilter" placeholder="请选择" allow-clear @change="handleBpmStatusChange">
|
||||||
<a-select-option value="1">未开始</a-select-option>
|
<a-select-option value="1">未开始</a-select-option>
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
</a-select>
|
</a-select>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="8" :sm="12">
|
<a-col :xl="4" :lg="6" :md="8" :sm="12">
|
||||||
<span class="table-page-search-submitButtons">
|
<span class="table-page-search-submitButtons">
|
||||||
<a-button type="primary" preIcon="ant-design:search-outlined" @click="reload">查询</a-button>
|
<a-button type="primary" preIcon="ant-design:search-outlined" @click="reload">查询</a-button>
|
||||||
<a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
|
<a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
|
||||||
@@ -574,7 +574,7 @@
|
|||||||
xs: 24,
|
xs: 24,
|
||||||
sm: 4,
|
sm: 4,
|
||||||
xl: 6,
|
xl: 6,
|
||||||
xxl: 4,
|
xxl: 9,
|
||||||
});
|
});
|
||||||
const wrapperCol = reactive({
|
const wrapperCol = reactive({
|
||||||
xs: 24,
|
xs: 24,
|
||||||
|
|||||||
@@ -17,7 +17,13 @@ enum Api {
|
|||||||
getLatestProposalSequence = '/improvementproposal/improvementProposal/getLatestProposalSequence',
|
getLatestProposalSequence = '/improvementproposal/improvementProposal/getLatestProposalSequence',
|
||||||
startProcess = '/improvementproposal/improvementProposal/startProcess',
|
startProcess = '/improvementproposal/improvementProposal/startProcess',
|
||||||
bpmInitialReview = '/improvementproposal/improvementProposal/bpm/initialReview',
|
bpmInitialReview = '/improvementproposal/improvementProposal/bpm/initialReview',
|
||||||
|
bpmMyDeptScore = '/improvementproposal/improvementProposal/bpm/myDeptScore',
|
||||||
|
bpmDeptScore = '/improvementproposal/improvementProposal/bpm/deptScore',
|
||||||
|
bpmSubmitDeptScore = '/improvementproposal/improvementProposal/bpm/submitDeptScore',
|
||||||
bpmLeaderAward = '/improvementproposal/improvementProposal/bpm/leaderAward',
|
bpmLeaderAward = '/improvementproposal/improvementProposal/bpm/leaderAward',
|
||||||
|
bpmInstituteVoteCandidates = '/improvementproposal/improvementProposal/bpm/instituteVoteCandidates',
|
||||||
|
bpmInstituteVoteMembers = '/improvementproposal/improvementProposal/bpm/instituteVoteMembers',
|
||||||
|
bpmSubmitInstituteVote = '/improvementproposal/improvementProposal/bpm/submitInstituteVote',
|
||||||
bpmArchiveAward = '/improvementproposal/improvementProposal/bpm/archiveAward',
|
bpmArchiveAward = '/improvementproposal/improvementProposal/bpm/archiveAward',
|
||||||
bpmInstituteVote = '/improvementproposal/improvementProposal/bpm/instituteVote',
|
bpmInstituteVote = '/improvementproposal/improvementProposal/bpm/instituteVote',
|
||||||
}
|
}
|
||||||
@@ -102,6 +108,12 @@ export const startProposalProcess = (id: string) => defHttp.post({ url: Api.star
|
|||||||
|
|
||||||
/** 流程节点专用接口会在任务提交前保存业务字段和网关变量。 */
|
/** 流程节点专用接口会在任务提交前保存业务字段和网关变量。 */
|
||||||
export const saveInitialReview = (params) => defHttp.post({ url: Api.bpmInitialReview, params });
|
export const saveInitialReview = (params) => defHttp.post({ url: Api.bpmInitialReview, params });
|
||||||
|
export const queryMyDeptScore = (params) => defHttp.get({ url: Api.bpmMyDeptScore, params });
|
||||||
|
export const saveDeptScore = (params) => defHttp.post({ url: Api.bpmDeptScore, params });
|
||||||
|
export const submitDeptScore = (params) => defHttp.post({ url: Api.bpmSubmitDeptScore, params });
|
||||||
export const saveLeaderAward = (params) => defHttp.post({ url: Api.bpmLeaderAward, params });
|
export const saveLeaderAward = (params) => defHttp.post({ url: Api.bpmLeaderAward, params });
|
||||||
|
export const queryInstituteVoteCandidates = (params) => defHttp.get({ url: Api.bpmInstituteVoteCandidates, params });
|
||||||
|
export const saveInstituteVoteMembers = (params) => defHttp.post({ url: Api.bpmInstituteVoteMembers, params });
|
||||||
export const saveArchiveAward = (params) => defHttp.post({ url: Api.bpmArchiveAward, params });
|
export const saveArchiveAward = (params) => defHttp.post({ url: Api.bpmArchiveAward, params });
|
||||||
export const castInstituteVote = (params) => defHttp.post({ url: Api.bpmInstituteVote, params });
|
export const castInstituteVote = (params) => defHttp.post({ url: Api.bpmInstituteVote, params });
|
||||||
|
export const submitInstituteVote = (params) => defHttp.post({ url: Api.bpmSubmitInstituteVote, params });
|
||||||
|
|||||||
@@ -131,6 +131,38 @@ export const improvementDeptScoreColumns: JVxeColumn[] = [
|
|||||||
{ required: true, message: '${title}不能为空' },
|
{ required: true, message: '${title}不能为空' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: '安全得分',
|
||||||
|
key: 'safetyScore',
|
||||||
|
type: JVxeTypes.inputNumber,
|
||||||
|
width:"200px",
|
||||||
|
placeholder: '请输入${title}',
|
||||||
|
defaultValue:'',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '质量得分',
|
||||||
|
key: 'qualityScore',
|
||||||
|
type: JVxeTypes.inputNumber,
|
||||||
|
width:"200px",
|
||||||
|
placeholder: '请输入${title}',
|
||||||
|
defaultValue:'',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '效率得分',
|
||||||
|
key: 'efficiencyScore',
|
||||||
|
type: JVxeTypes.inputNumber,
|
||||||
|
width:"200px",
|
||||||
|
placeholder: '请输入${title}',
|
||||||
|
defaultValue:'',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '成本得分',
|
||||||
|
key: 'costScore',
|
||||||
|
type: JVxeTypes.inputNumber,
|
||||||
|
width:"200px",
|
||||||
|
placeholder: '请输入${title}',
|
||||||
|
defaultValue:'',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: '改善效果得分',
|
title: '改善效果得分',
|
||||||
key: 'effectScore',
|
key: 'effectScore',
|
||||||
@@ -292,13 +324,17 @@ export const superQuerySchema = {
|
|||||||
scorerId: {title: '评委ID',order: 2,view: 'text', type: 'string',},
|
scorerId: {title: '评委ID',order: 2,view: 'text', type: 'string',},
|
||||||
scorerName: {title: '评委姓名',order: 3,view: 'text', type: 'string',},
|
scorerName: {title: '评委姓名',order: 3,view: 'text', type: 'string',},
|
||||||
scoreStatus: {title: '评分状态:pending/completed',order: 4,view: 'text', type: 'string',},
|
scoreStatus: {title: '评分状态:pending/completed',order: 4,view: 'text', type: 'string',},
|
||||||
effectScore: {title: '改善效果得分',order: 5,view: 'number', type: 'number',},
|
safetyScore: {title: '安全得分',order: 5,view: 'number', type: 'number',},
|
||||||
promotionScore: {title: '可推广度得分',order: 6,view: 'number', type: 'number',},
|
qualityScore: {title: '质量得分',order: 6,view: 'number', type: 'number',},
|
||||||
originalityScore: {title: '独创性得分',order: 7,view: 'number', type: 'number',},
|
efficiencyScore: {title: '效率得分',order: 7,view: 'number', type: 'number',},
|
||||||
effortScore: {title: '努力度得分',order: 8,view: 'number', type: 'number',},
|
costScore: {title: '成本得分',order: 8,view: 'number', type: 'number',},
|
||||||
totalScore: {title: '加权总分',order: 9,view: 'number', type: 'number',},
|
effectScore: {title: '改善效果平均得分',order: 9,view: 'number', type: 'number',},
|
||||||
scoreOpinion: {title: '评分意见',order: 10,view: 'textarea', type: 'string',},
|
promotionScore: {title: '可推广度得分',order: 10,view: 'number', type: 'number',},
|
||||||
scoreTime: {title: '评分时间',order: 11,view: 'datetime', type: 'string',},
|
originalityScore: {title: '独创性得分',order: 11,view: 'number', type: 'number',},
|
||||||
|
effortScore: {title: '努力度得分',order: 12,view: 'number', type: 'number',},
|
||||||
|
totalScore: {title: '加权总分',order: 13,view: 'number', type: 'number',},
|
||||||
|
scoreOpinion: {title: '评分意见',order: 14,view: 'textarea', type: 'string',},
|
||||||
|
scoreTime: {title: '评分时间',order: 15,view: 'datetime', type: 'string',},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
improvementInstituteVote: {
|
improvementInstituteVote: {
|
||||||
|
|||||||
@@ -27,10 +27,6 @@
|
|||||||
<div class="attachment-label">改善后附件</div>
|
<div class="attachment-label">改善后附件</div>
|
||||||
<SUploadFile :bussiness-id="`${proposal.id}:after`" :disabled="true" :multiple="true" />
|
<SUploadFile :bussiness-id="`${proposal.id}:after`" :disabled="true" :multiple="true" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<div class="attachment-label">其他附件</div>
|
|
||||||
<SUploadFile :bussiness-id="`${proposal.id}:other`" :disabled="true" :multiple="true" />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<span v-else>-</span>
|
<span v-else>-</span>
|
||||||
</a-descriptions-item>
|
</a-descriptions-item>
|
||||||
@@ -44,50 +40,56 @@
|
|||||||
|
|
||||||
<a-form class="process-form" :label-col="labelCol" :wrapper-col="wrapperCol">
|
<a-form class="process-form" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
<a-form-item v-if="isTask('Task_improve001')" label="初步评定奖项" required>
|
<a-form-item v-if="isTask('Task_improve001')" label="初步评定奖项" required>
|
||||||
<a-radio-group v-model:value="initialAward">
|
<JDictSelectTag v-model:value="initialAward" dictCode="proposal_prize" type="radio" />
|
||||||
<a-radio v-for="item in awardOptions" :key="item.value" :value="item.value">{{ item.label }}</a-radio>
|
|
||||||
</a-radio-group>
|
|
||||||
<div class="form-help">金奖、银奖进入部门评议小组打分;铜奖、参与奖直接进入部门负责人审核。</div>
|
<div class="form-help">金奖、银奖进入部门评议小组打分;铜奖、参与奖直接进入部门负责人审核。</div>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<template v-if="isTask('Task_improve002')">
|
<template v-if="isTask('Task_improve002')">
|
||||||
<a-form-item label="部门评分记录">
|
<a-form-item label="我的评分">
|
||||||
<a-table row-key="id" size="small" bordered :columns="scoreColumns" :data-source="scoreRows" :pagination="false">
|
<a-descriptions bordered size="small" :column="1">
|
||||||
<template #bodyCell="{ column, record }">
|
<a-descriptions-item label="评分状态">{{ scoreStatusLabel }}</a-descriptions-item>
|
||||||
<template v-if="column.key === 'status'">{{ record.scoreStatus === 'completed' ? '已评分' : '待评分' }}</template>
|
<a-descriptions-item label="加权总分">{{ currentScore?.totalScore ?? '-' }}</a-descriptions-item>
|
||||||
</template>
|
<a-descriptions-item label="评分时间" :span="2">{{ formatDateTime(currentScore?.scoreTime) }}</a-descriptions-item>
|
||||||
</a-table>
|
</a-descriptions>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="评分操作">
|
<a-form-item label="评分操作">
|
||||||
<a-button type="primary" :disabled="!currentScore" @click="openScoreModal">打分</a-button>
|
<a-button type="primary" :disabled="scoreLocked" @click="openScoreModal">{{ scoreLocked ? '评分已锁定' : '打分' }}</a-button>
|
||||||
<span v-if="!currentScore" class="form-help">当前用户不在部门评分名单中。</span>
|
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="isTask('Task_improve003')">
|
<template v-if="isTask('Task_improve003')">
|
||||||
<a-form-item label="初步评定奖项">{{ awardLabel(proposal.initialAward) }}</a-form-item>
|
<a-form-item label="初步评定奖项">{{ awardLabel(proposal.initialAward) }}</a-form-item>
|
||||||
<a-form-item v-if="proposal.needDeptScore === '1'" label="部门评议结果">
|
<a-form-item v-if="proposal.needDeptScore === '1'" label="部门评议小组打分结果">
|
||||||
平均分:{{ proposal.deptAvgScore ?? '-' }};系统建议奖项:{{ awardLabel(proposal.suggestedAward) }}
|
平均分:{{ proposal.deptAvgScore ?? '-' }};建议奖项:{{ awardLabel(proposal.suggestedAward) }}
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="负责人确认奖项" required>
|
<a-form-item label="负责人确认奖项" required>
|
||||||
<a-radio-group v-model:value="leaderFinalAward">
|
<a-radio-group v-if="leaderAwardBase" v-model:value="leaderFinalAward">
|
||||||
<a-radio v-for="item in awardOptions" :key="item.value" :value="item.value">{{ item.label }}</a-radio>
|
<a-radio v-for="item in leaderAwardOptions" :key="item.value" :value="item.value">{{ item.label }}</a-radio>
|
||||||
</a-radio-group>
|
</a-radio-group>
|
||||||
|
<div v-if="leaderAwardBase" class="form-help">评定基准:{{ awardLabel(leaderAwardBase) }},仅可选择当前档位或降档奖项。</div>
|
||||||
|
<div v-else class="form-help">部门评议建议奖项尚未生成,暂不能确认负责人奖项。</div>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="isTask('Task_improve004')">
|
<template v-if="isTask('Task_improve004')">
|
||||||
<a-form-item label="所级评议人员">
|
<a-form-item label="负责人确认奖项">{{ awardLabel(proposal.leaderFinalAward) }}</a-form-item>
|
||||||
<a-table row-key="id" size="small" bordered :columns="voteMemberColumns" :data-source="voteRows" :pagination="false" />
|
<a-form-item label="所级评议人员" required>
|
||||||
<div class="form-help">所级评议人员选择和投票记录初始化将在后续功能中接入。</div>
|
<a-checkbox-group v-model:value="selectedInstituteVoterIds" class="vote-member-grid">
|
||||||
|
<a-checkbox v-for="member in instituteVoteCandidates" :key="member.id" :value="member.id" class="vote-member-option">
|
||||||
|
<span class="vote-member-name">{{ member.realname || member.username }}</span>
|
||||||
|
<span class="vote-member-username">{{ member.username }}</span>
|
||||||
|
</a-checkbox>
|
||||||
|
</a-checkbox-group>
|
||||||
|
<div v-if="!instituteVoteCandidates.length" class="form-help">未查询到所级评议小组人员。</div>
|
||||||
|
<div v-else class="form-help">请选择本次所级评议投票人员,提交办理后将生成对应投票待办。</div>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="isTask('Task_improve005')">
|
<template v-if="isTask('Task_improve005')">
|
||||||
<a-form-item label="我的投票">
|
<a-form-item label="我的投票">
|
||||||
<a-space v-if="currentVote">
|
<a-space v-if="currentVote">
|
||||||
<a-button type="primary" :disabled="currentVote.voteStatus === 'voted'" :loading="savingVote" @click="castVote('agree')">同意</a-button>
|
<a-button :type="currentVote.voteResult === 'agree' ? 'primary' : 'default'" :disabled="voteLocked" :loading="savingVote" @click="saveVoteDraft('agree')">投票通过</a-button>
|
||||||
<a-button danger :disabled="currentVote.voteStatus === 'voted'" :loading="savingVote" @click="castVote('disagree')">不同意</a-button>
|
<a-button danger :type="currentVote.voteResult === 'disagree' ? 'primary' : 'default'" :disabled="voteLocked" :loading="savingVote" @click="saveVoteDraft('disagree')">投票反对</a-button>
|
||||||
<span>{{ voteResultLabel(currentVote) }}</span>
|
<span>{{ voteResultLabel(currentVote) }}</span>
|
||||||
</a-space>
|
</a-space>
|
||||||
<span v-else class="form-help">当前用户不在所级评议投票名单中。</span>
|
<span v-else class="form-help">当前用户不在所级评议投票名单中。</span>
|
||||||
@@ -116,12 +118,53 @@
|
|||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<a-modal v-model:open="scoreModalVisible" title="部门评议打分" :footer="null" :mask-closable="false">
|
<a-modal v-model:open="scoreModalVisible" title="部门评议打分" :footer="null" :mask-closable="false" :body-style="{ padding: '24px 28px 20px' }">
|
||||||
<a-descriptions v-if="currentScore" bordered size="small" :column="1">
|
<a-form layout="vertical">
|
||||||
<a-descriptions-item label="评委">{{ currentScore.scorerName || '-' }}</a-descriptions-item>
|
<a-alert class="score-range-alert" type="info" show-icon message="所有评分项均须填写 0-100 分,最多可保留两位小数。" />
|
||||||
<a-descriptions-item label="评分状态">{{ currentScore.scoreStatus === 'completed' ? '已评分' : '待评分' }}</a-descriptions-item>
|
<a-row :gutter="12">
|
||||||
</a-descriptions>
|
<a-col :span="24">
|
||||||
<div class="form-help">四个评分维度录入、加权计算和评分提交将在下一阶段开发。</div>
|
<a-form-item label="改善效果(权重 50%)" required>
|
||||||
|
<a-row :gutter="12">
|
||||||
|
<a-col :xs="24" :sm="12" :lg="6">
|
||||||
|
<a-form-item label="安全" required><a-input-number v-model:value="scoreForm.safetyScore" :min="0" :max="100" :precision="2" :disabled="scoreLocked" style="width: 100%" /></a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :xs="24" :sm="12" :lg="6">
|
||||||
|
<a-form-item label="质量" required><a-input-number v-model:value="scoreForm.qualityScore" :min="0" :max="100" :precision="2" :disabled="scoreLocked" style="width: 100%" /></a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :xs="24" :sm="12" :lg="6">
|
||||||
|
<a-form-item label="效率" required><a-input-number v-model:value="scoreForm.efficiencyScore" :min="0" :max="100" :precision="2" :disabled="scoreLocked" style="width: 100%" /></a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :xs="24" :sm="12" :lg="6">
|
||||||
|
<a-form-item label="成本" required><a-input-number v-model:value="scoreForm.costScore" :min="0" :max="100" :precision="2" :disabled="scoreLocked" style="width: 100%" /></a-form-item>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<div class="form-help">改善效果得分按安全、质量、效率、成本四项的平均分自动计算:{{ effectAveragePreview }}</div>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :xs="24" :sm="12">
|
||||||
|
<a-form-item label="可推广度(权重 20%)" required>
|
||||||
|
<a-input-number v-model:value="scoreForm.promotionScore" :min="0" :max="100" :precision="2" :disabled="scoreLocked" style="width: 100%" />
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :xs="24" :sm="12">
|
||||||
|
<a-form-item label="独创性(权重 20%)" required>
|
||||||
|
<a-input-number v-model:value="scoreForm.originalityScore" :min="0" :max="100" :precision="2" :disabled="scoreLocked" style="width: 100%" />
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :xs="24" :sm="12">
|
||||||
|
<a-form-item label="努力度(权重 10%)" required>
|
||||||
|
<a-input-number v-model:value="scoreForm.effortScore" :min="0" :max="100" :precision="2" :disabled="scoreLocked" style="width: 100%" />
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<a-form-item label="评分意见">
|
||||||
|
<a-textarea v-model:value="scoreForm.scoreOpinion" :rows="3" :disabled="scoreLocked" />
|
||||||
|
</a-form-item>
|
||||||
|
<a-space>
|
||||||
|
<a-button v-if="!scoreLocked" type="primary" :loading="savingScore" @click="saveScoreDraft">保存评分</a-button>
|
||||||
|
<span v-else>评分已锁定,请重新提交流程办理</span>
|
||||||
|
</a-space>
|
||||||
|
</a-form>
|
||||||
</a-modal>
|
</a-modal>
|
||||||
</section>
|
</section>
|
||||||
</a-spin>
|
</a-spin>
|
||||||
@@ -131,16 +174,22 @@
|
|||||||
import { computed, ref, watch } from 'vue';
|
import { computed, ref, watch } from 'vue';
|
||||||
import { useMessage } from '/@/hooks/web/useMessage';
|
import { useMessage } from '/@/hooks/web/useMessage';
|
||||||
import { useUserStore } from '/@/store/modules/user';
|
import { useUserStore } from '/@/store/modules/user';
|
||||||
|
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
|
||||||
import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue';
|
import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue';
|
||||||
import TaskHandleInnerContent from '/@/views/super/bpm/process/personalOffice/myHandleTask/content/TaskHandleInnerContent.vue';
|
import TaskHandleInnerContent from '/@/views/super/bpm/process/personalOffice/myHandleTask/content/TaskHandleInnerContent.vue';
|
||||||
import {
|
import {
|
||||||
castInstituteVote,
|
castInstituteVote,
|
||||||
queryDataById,
|
queryDataById,
|
||||||
queryImprovementDeptScoreListByMainId,
|
queryInstituteVoteCandidates,
|
||||||
queryImprovementInstituteVoteListByMainId,
|
queryImprovementInstituteVoteListByMainId,
|
||||||
|
queryMyDeptScore,
|
||||||
saveArchiveAward,
|
saveArchiveAward,
|
||||||
|
saveDeptScore,
|
||||||
saveInitialReview,
|
saveInitialReview,
|
||||||
|
saveInstituteVoteMembers,
|
||||||
saveLeaderAward,
|
saveLeaderAward,
|
||||||
|
submitInstituteVote,
|
||||||
|
submitDeptScore,
|
||||||
} from '../ImprovementProposal.api';
|
} from '../ImprovementProposal.api';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -152,14 +201,18 @@
|
|||||||
const { createMessage } = useMessage();
|
const { createMessage } = useMessage();
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
|
const savingScore = ref(false);
|
||||||
const savingVote = ref(false);
|
const savingVote = ref(false);
|
||||||
const scoreModalVisible = ref(false);
|
const scoreModalVisible = ref(false);
|
||||||
const proposal = ref<Recordable>({});
|
const proposal = ref<Recordable>({});
|
||||||
const scoreRows = ref<Recordable[]>([]);
|
const currentScore = ref<Recordable | null>(null);
|
||||||
const voteRows = ref<Recordable[]>([]);
|
const voteRows = ref<Recordable[]>([]);
|
||||||
|
const instituteVoteCandidates = ref<Recordable[]>([]);
|
||||||
|
const selectedInstituteVoterIds = ref<string[]>([]);
|
||||||
const initialAward = ref('');
|
const initialAward = ref('');
|
||||||
const leaderFinalAward = ref('');
|
const leaderFinalAward = ref('');
|
||||||
const finalAward = ref('');
|
const finalAward = ref('');
|
||||||
|
const scoreForm = ref<Recordable>(createEmptyScoreForm());
|
||||||
const labelCol = { xs: { span: 24 }, sm: { span: 5 } };
|
const labelCol = { xs: { span: 24 }, sm: { span: 5 } };
|
||||||
const wrapperCol = { xs: { span: 24 }, sm: { span: 19 } };
|
const wrapperCol = { xs: { span: 24 }, sm: { span: 19 } };
|
||||||
|
|
||||||
@@ -169,16 +222,6 @@
|
|||||||
{ value: '2', label: '铜奖' },
|
{ value: '2', label: '铜奖' },
|
||||||
{ value: '3', label: '参与奖' },
|
{ value: '3', label: '参与奖' },
|
||||||
];
|
];
|
||||||
const scoreColumns = [
|
|
||||||
{ title: '评委', dataIndex: 'scorerName', width: 180 },
|
|
||||||
{ title: '状态', key: 'status', width: 120 },
|
|
||||||
{ title: '总分', dataIndex: 'totalScore', width: 120 },
|
|
||||||
];
|
|
||||||
const voteMemberColumns = [
|
|
||||||
{ title: '评委', dataIndex: 'voterName', width: 180 },
|
|
||||||
{ title: '状态', dataIndex: 'voteStatus', width: 120 },
|
|
||||||
];
|
|
||||||
|
|
||||||
// 流程引擎在运行待办中提供 taskDefKey,节点功能只依赖该稳定标识而非表单 URL 参数。
|
// 流程引擎在运行待办中提供 taskDefKey,节点功能只依赖该稳定标识而非表单 URL 参数。
|
||||||
const processInfo = computed(() => ({
|
const processInfo = computed(() => ({
|
||||||
mainId: props.formData?.processDataId || props.formData?.dataId,
|
mainId: props.formData?.processDataId || props.formData?.dataId,
|
||||||
@@ -194,11 +237,30 @@
|
|||||||
}));
|
}));
|
||||||
const showProcessHandle = computed(() => props.formBpm && props.formData?.PROCESS_TAB_TYPE === 'run' && !!processInfo.value.taskId);
|
const showProcessHandle = computed(() => props.formBpm && props.formData?.PROCESS_TAB_TYPE === 'run' && !!processInfo.value.taskId);
|
||||||
const currentUserId = computed(() => String(userStore.getUserInfo?.id || ''));
|
const currentUserId = computed(() => String(userStore.getUserInfo?.id || ''));
|
||||||
const currentScore = computed(() => scoreRows.value.find((item) => String(item.scorerId) === currentUserId.value));
|
const scoreLocked = computed(() => currentScore.value?.scoreStatus === 'completed');
|
||||||
|
const scoreStatusLabel = computed(() => {
|
||||||
|
if (!currentScore.value) return '未保存';
|
||||||
|
return scoreLocked.value ? '评分已锁定' : '已保存,待流程提交';
|
||||||
|
});
|
||||||
|
const effectAveragePreview = computed(() => {
|
||||||
|
const values = ['safetyScore', 'qualityScore', 'efficiencyScore', 'costScore'].map((key) => scoreForm.value[key]);
|
||||||
|
if (values.some((value) => value === undefined || value === null)) return '-';
|
||||||
|
return (values.reduce((sum, value) => sum + Number(value), 0) / values.length).toFixed(2);
|
||||||
|
});
|
||||||
|
// 部门评分完成后必须以系统建议奖项为基准,不能回退到初审奖项。
|
||||||
|
const leaderAwardBase = computed(() => {
|
||||||
|
const award = proposal.value.needDeptScore === '1' ? proposal.value.suggestedAward : proposal.value.initialAward;
|
||||||
|
return awardOptions.some((item) => item.value === String(award)) ? String(award) : '';
|
||||||
|
});
|
||||||
|
const leaderAwardOptions = computed(() => {
|
||||||
|
if (!leaderAwardBase.value) return [];
|
||||||
|
return awardOptions.filter((item) => Number(item.value) >= Number(leaderAwardBase.value));
|
||||||
|
});
|
||||||
const currentVote = computed(() => voteRows.value.find((item) => String(item.voterId) === currentUserId.value));
|
const currentVote = computed(() => voteRows.value.find((item) => String(item.voterId) === currentUserId.value));
|
||||||
|
const voteLocked = computed(() => currentVote.value?.voteStatus === 'voted');
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => [processInfo.value.mainId, processInfo.value.processInstanceId],
|
() => [processInfo.value.mainId, processInfo.value.processInstanceId, processInfo.value.taskId, processInfo.value.taskDefKey],
|
||||||
() => loadProposal(),
|
() => loadProposal(),
|
||||||
{ immediate: true }
|
{ immediate: true }
|
||||||
);
|
);
|
||||||
@@ -207,23 +269,38 @@
|
|||||||
const mainId = processInfo.value.mainId;
|
const mainId = processInfo.value.mainId;
|
||||||
if (!mainId) {
|
if (!mainId) {
|
||||||
proposal.value = {};
|
proposal.value = {};
|
||||||
scoreRows.value = [];
|
currentScore.value = null;
|
||||||
voteRows.value = [];
|
voteRows.value = [];
|
||||||
|
instituteVoteCandidates.value = [];
|
||||||
|
selectedInstituteVoterIds.value = [];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
try {
|
try {
|
||||||
const [main, scores, votes] = await Promise.all([
|
const [main, votes, myScore] = await Promise.all([
|
||||||
queryDataById(mainId),
|
queryDataById(mainId),
|
||||||
queryImprovementDeptScoreListByMainId(mainId),
|
|
||||||
queryImprovementInstituteVoteListByMainId(mainId),
|
queryImprovementInstituteVoteListByMainId(mainId),
|
||||||
|
isTask('Task_improve002') && processInfo.value.processInstanceId && processInfo.value.taskId
|
||||||
|
? queryMyDeptScore(processInfo.value)
|
||||||
|
: Promise.resolve(null),
|
||||||
]);
|
]);
|
||||||
proposal.value = main || {};
|
proposal.value = main || {};
|
||||||
scoreRows.value = scores || [];
|
currentScore.value = myScore || null;
|
||||||
voteRows.value = votes || [];
|
voteRows.value = votes || [];
|
||||||
initialAward.value = proposal.value.initialAward || '';
|
initialAward.value = proposal.value.initialAward || '';
|
||||||
leaderFinalAward.value = proposal.value.leaderFinalAward || '';
|
leaderFinalAward.value = proposal.value.leaderFinalAward || '';
|
||||||
finalAward.value = proposal.value.finalAward || '';
|
finalAward.value = proposal.value.finalAward || '';
|
||||||
|
if (isTask('Task_improve004') && processInfo.value.processInstanceId && processInfo.value.taskId) {
|
||||||
|
instituteVoteCandidates.value = await queryInstituteVoteCandidates(processInfo.value);
|
||||||
|
const candidateIds = new Set(instituteVoteCandidates.value.map((item) => String(item.id)));
|
||||||
|
// 流程提交失败后重新打开 Task4 时,回显本次尚未流转的有效名单。
|
||||||
|
selectedInstituteVoterIds.value = voteRows.value
|
||||||
|
.map((item) => String(item.voterId))
|
||||||
|
.filter((voterId) => candidateIds.has(voterId));
|
||||||
|
} else {
|
||||||
|
instituteVoteCandidates.value = [];
|
||||||
|
selectedInstituteVoterIds.value = [];
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
createMessage.warning('提案数据加载失败');
|
createMessage.warning('提案数据加载失败');
|
||||||
} finally {
|
} finally {
|
||||||
@@ -248,16 +325,38 @@
|
|||||||
}
|
}
|
||||||
await saveInitialReview(actionPayload({ initialAward: initialAward.value }));
|
await saveInitialReview(actionPayload({ initialAward: initialAward.value }));
|
||||||
}
|
}
|
||||||
|
if (isTask('Task_improve002')) {
|
||||||
|
// 弹窗仅保存草稿;通用流程办理前才锁定评分,确保评委在此之前仍可修改。
|
||||||
|
await submitDeptScore(actionPayload());
|
||||||
|
}
|
||||||
if (isTask('Task_improve003')) {
|
if (isTask('Task_improve003')) {
|
||||||
|
if (!leaderAwardBase.value) {
|
||||||
|
createMessage.warning('部门评议建议奖项尚未生成,不能确认负责人奖项');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (!leaderFinalAward.value) {
|
if (!leaderFinalAward.value) {
|
||||||
createMessage.warning('请选择负责人确认奖项');
|
createMessage.warning('请选择负责人确认奖项');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!leaderAwardOptions.value.some((item) => item.value === leaderFinalAward.value)) {
|
||||||
|
createMessage.warning('负责人确认奖项只能选择当前档位或降档奖项');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
await saveLeaderAward(actionPayload({ leaderFinalAward: leaderFinalAward.value }));
|
await saveLeaderAward(actionPayload({ leaderFinalAward: leaderFinalAward.value }));
|
||||||
}
|
}
|
||||||
if (isTask('Task_improve005') && currentVote.value?.voteStatus !== 'voted') {
|
if (isTask('Task_improve004')) {
|
||||||
createMessage.warning('请先完成投票');
|
if (!selectedInstituteVoterIds.value.length) {
|
||||||
return false;
|
createMessage.warning('请至少选择一名所级评议人员');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
await saveInstituteVoteMembers(actionPayload({ voterIds: selectedInstituteVoterIds.value }));
|
||||||
|
}
|
||||||
|
if (isTask('Task_improve005')) {
|
||||||
|
if (!currentVote.value?.voteResult) {
|
||||||
|
createMessage.warning('请先选择投票通过或投票反对');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
await submitInstituteVote(actionPayload());
|
||||||
}
|
}
|
||||||
if (isTask('Task_improve006')) {
|
if (isTask('Task_improve006')) {
|
||||||
if (!finalAward.value) {
|
if (!finalAward.value) {
|
||||||
@@ -273,11 +372,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function castVote(voteResult: string) {
|
async function saveVoteDraft(voteResult: string) {
|
||||||
savingVote.value = true;
|
savingVote.value = true;
|
||||||
try {
|
try {
|
||||||
await castInstituteVote(actionPayload({ voteResult }));
|
await castInstituteVote(actionPayload({ voteResult }));
|
||||||
createMessage.success('投票成功');
|
createMessage.success('投票已保存,提交办理前可修改');
|
||||||
await loadProposal();
|
await loadProposal();
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
createMessage.warning(error?.message || '投票失败');
|
createMessage.warning(error?.message || '投票失败');
|
||||||
@@ -287,16 +386,68 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function openScoreModal() {
|
function openScoreModal() {
|
||||||
// 评分字段、权重计算和完成条件将由下一阶段单独实现,避免当前占位入口误写评分结果。
|
const score = currentScore.value;
|
||||||
|
scoreForm.value = {
|
||||||
|
safetyScore: score?.safetyScore ?? undefined,
|
||||||
|
qualityScore: score?.qualityScore ?? undefined,
|
||||||
|
efficiencyScore: score?.efficiencyScore ?? undefined,
|
||||||
|
costScore: score?.costScore ?? undefined,
|
||||||
|
promotionScore: score?.promotionScore ?? undefined,
|
||||||
|
originalityScore: score?.originalityScore ?? undefined,
|
||||||
|
effortScore: score?.effortScore ?? undefined,
|
||||||
|
scoreOpinion: score?.scoreOpinion || '',
|
||||||
|
};
|
||||||
scoreModalVisible.value = true;
|
scoreModalVisible.value = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function saveScoreDraft() {
|
||||||
|
if (!hasValidScoreValues()) {
|
||||||
|
createMessage.warning('请完整填写 0 到 100 分之间的七项评分');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
savingScore.value = true;
|
||||||
|
try {
|
||||||
|
await saveDeptScore(actionPayload(scoreForm.value));
|
||||||
|
createMessage.success('评分保存成功,可在流程提交前继续修改');
|
||||||
|
scoreModalVisible.value = false;
|
||||||
|
await loadProposal();
|
||||||
|
} catch (error: any) {
|
||||||
|
createMessage.warning(error?.message || '评分保存失败');
|
||||||
|
} finally {
|
||||||
|
savingScore.value = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function createEmptyScoreForm() {
|
||||||
|
return {
|
||||||
|
safetyScore: undefined,
|
||||||
|
qualityScore: undefined,
|
||||||
|
efficiencyScore: undefined,
|
||||||
|
costScore: undefined,
|
||||||
|
promotionScore: undefined,
|
||||||
|
originalityScore: undefined,
|
||||||
|
effortScore: undefined,
|
||||||
|
scoreOpinion: '',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasValidScoreValues() {
|
||||||
|
return ['safetyScore', 'qualityScore', 'efficiencyScore', 'costScore', 'promotionScore', 'originalityScore', 'effortScore'].every((key) => {
|
||||||
|
const value = scoreForm.value[key];
|
||||||
|
return value !== undefined && value !== null && Number(value) >= 0 && Number(value) <= 100;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function awardLabel(value: string) {
|
function awardLabel(value: string) {
|
||||||
return awardOptions.find((item) => item.value === String(value))?.label || '-';
|
return awardOptions.find((item) => item.value === String(value))?.label || '-';
|
||||||
}
|
}
|
||||||
|
|
||||||
function voteResultLabel(vote: Recordable) {
|
function voteResultLabel(vote: Recordable) {
|
||||||
if (vote.voteStatus !== 'voted') return '待投票';
|
if (vote.voteStatus !== 'voted') {
|
||||||
|
if (vote.voteResult === 'agree') return '已选择投票通过,待提交办理';
|
||||||
|
if (vote.voteResult === 'disagree') return '已选择投票反对,待提交办理';
|
||||||
|
return '待投票';
|
||||||
|
}
|
||||||
return vote.voteResult === 'agree' ? '已投同意票' : '已投不同意票';
|
return vote.voteResult === 'agree' ? '已投同意票' : '已投不同意票';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -304,6 +455,10 @@
|
|||||||
return value ? String(value).slice(0, 10) : '-';
|
return value ? String(value).slice(0, 10) : '-';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function formatDateTime(value?: string) {
|
||||||
|
return value ? String(value) : '-';
|
||||||
|
}
|
||||||
|
|
||||||
function handleSuccess() {
|
function handleSuccess() {
|
||||||
emit('success');
|
emit('success');
|
||||||
}
|
}
|
||||||
@@ -333,7 +488,7 @@
|
|||||||
|
|
||||||
.attachment-grid {
|
.attachment-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -353,6 +508,40 @@
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.score-range-alert {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vote-member-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
||||||
|
gap: 10px 12px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vote-member-option {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
min-height: 42px;
|
||||||
|
margin-inline-start: 0;
|
||||||
|
padding: 8px 10px;
|
||||||
|
border: 1px solid #d9e2ec;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vote-member-name {
|
||||||
|
margin-left: 6px;
|
||||||
|
color: #1f2937;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vote-member-username {
|
||||||
|
margin-left: 6px;
|
||||||
|
color: #64748b;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.attachment-grid {
|
.attachment-grid {
|
||||||
grid-template-columns: 1fr;
|
grid-template-columns: 1fr;
|
||||||
|
|||||||
@@ -34,8 +34,8 @@
|
|||||||
<a-input v-model:value="formData.applicantName" placeholder="请输入申请人姓名" allow-clear ></a-input>
|
<a-input v-model:value="formData.applicantName" placeholder="请输入申请人姓名" allow-clear ></a-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="24">
|
<a-col :span="12">
|
||||||
<a-form-item label="团队名称" v-bind="validateInfos.teamName" id="ImprovementProposalForm-teamName" name="teamName" :labelCol="longLabelCol" :wrapperCol="longWrapperCol">
|
<a-form-item label="团队名称" v-bind="validateInfos.teamName" id="ImprovementProposalForm-teamName" name="teamName">
|
||||||
<a-input v-model:value="formData.teamName" placeholder="请输入团队名称" allow-clear ></a-input>
|
<a-input v-model:value="formData.teamName" placeholder="请输入团队名称" allow-clear ></a-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
@@ -50,24 +50,24 @@
|
|||||||
<a-textarea v-model:value="formData.improvementMethod" :rows="4" placeholder="请输入改善方法及措施" />
|
<a-textarea v-model:value="formData.improvementMethod" :rows="4" placeholder="请输入改善方法及措施" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="24">
|
<a-col :span="12">
|
||||||
<a-form-item label="改善前情况描述" v-bind="validateInfos.beforeDesc" id="ImprovementProposalForm-beforeDesc" name="beforeDesc" :labelCol="longLabelCol" :wrapperCol="longWrapperCol">
|
<a-form-item label="改善前情况描述" v-bind="validateInfos.beforeDesc" id="ImprovementProposalForm-beforeDesc" name="beforeDesc" :labelCol="halfLabelCol" :wrapperCol="halfWrapperCol">
|
||||||
<a-textarea v-model:value="formData.beforeDesc" :rows="4" placeholder="请输入改善前情况描述" />
|
<a-textarea v-model:value="formData.beforeDesc" :rows="4" placeholder="请输入改善前情况描述" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="24">
|
<a-col :span="12">
|
||||||
<a-form-item label="改善前图片" :labelCol="longLabelCol" :wrapperCol="longWrapperCol">
|
<a-form-item label="改善前图片" :labelCol="halfLabelCol" :wrapperCol="halfWrapperCol">
|
||||||
<SUploadFile ref="beforeFileRef" :bussiness-id="formData.proposalNo ? `${formData.proposalNo}:before` : ''" :multiple="true" :disabled="disabled" />
|
<SUploadFile ref="beforeFileRef" :bussiness-id="formData.id ? `${formData.id}:before` : ''" :multiple="true" :disabled="disabled" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="24">
|
<a-col :span="12">
|
||||||
<a-form-item label="改善后情况描述" v-bind="validateInfos.afterDesc" id="ImprovementProposalForm-afterDesc" name="afterDesc" :labelCol="longLabelCol" :wrapperCol="longWrapperCol">
|
<a-form-item label="改善后情况描述" v-bind="validateInfos.afterDesc" id="ImprovementProposalForm-afterDesc" name="afterDesc" :labelCol="halfLabelCol" :wrapperCol="halfWrapperCol">
|
||||||
<a-textarea v-model:value="formData.afterDesc" :rows="4" placeholder="请输入改善后情况描述" />
|
<a-textarea v-model:value="formData.afterDesc" :rows="4" placeholder="请输入改善后情况描述" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="24">
|
<a-col :span="12">
|
||||||
<a-form-item label="改善后图片" :labelCol="longLabelCol" :wrapperCol="longWrapperCol">
|
<a-form-item label="改善后图片" :labelCol="halfLabelCol" :wrapperCol="halfWrapperCol">
|
||||||
<SUploadFile ref="afterFileRef" :bussiness-id="formData.proposalNo ? `${formData.proposalNo}:after` : ''" :multiple="true" :disabled="disabled" />
|
<SUploadFile ref="afterFileRef" :bussiness-id="formData.id ? `${formData.id}:after` : ''" :multiple="true" :disabled="disabled" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="24">
|
<a-col :span="24">
|
||||||
@@ -204,19 +204,19 @@
|
|||||||
};
|
};
|
||||||
const longLabelCol = {
|
const longLabelCol = {
|
||||||
xs: {span: 24},
|
xs: {span: 24},
|
||||||
sm: {span: 5},
|
sm: {span: 4},
|
||||||
};
|
};
|
||||||
const longWrapperCol = {
|
const longWrapperCol = {
|
||||||
xs: {span: 24},
|
xs: {span: 24},
|
||||||
sm: {span: 16},
|
sm: {span: 20},
|
||||||
};
|
};
|
||||||
const halfLabelCol = {
|
const halfLabelCol = {
|
||||||
xs: {span: 24},
|
xs: {span: 24},
|
||||||
sm: {span: 5},
|
sm: {span: 8},
|
||||||
};
|
};
|
||||||
const halfWrapperCol = {
|
const halfWrapperCol = {
|
||||||
xs: {span: 24},
|
xs: {span: 24},
|
||||||
sm: {span: 18},
|
sm: {span: 16},
|
||||||
};
|
};
|
||||||
|
|
||||||
const disabled = computed(()=>{
|
const disabled = computed(()=>{
|
||||||
@@ -230,8 +230,8 @@
|
|||||||
return props.formDisabled;
|
return props.formDisabled;
|
||||||
});
|
});
|
||||||
|
|
||||||
// 普通新增没有业务 ID,不展示评分和投票子表;已有数据及流程表单正常展示。
|
// 子表由流程节点维护,普通新增、编辑和详情弹窗均不展示,避免误改评分或投票数据。
|
||||||
const showSubTables = computed(() => Boolean(formData.id || props.formData?.dataId));
|
const showSubTables = computed(() => props.formBpm === true && Boolean(formData.id || props.formData?.dataId));
|
||||||
|
|
||||||
function getCurrentDate() {
|
function getCurrentDate() {
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
@@ -330,12 +330,6 @@
|
|||||||
improvementDeptScoreTable.dataSource = [...improvementDeptScoreDataList];
|
improvementDeptScoreTable.dataSource = [...improvementDeptScoreDataList];
|
||||||
const improvementInstituteVoteDataList = await queryImprovementInstituteVoteListByMainId(row['id']);
|
const improvementInstituteVoteDataList = await queryImprovementInstituteVoteListByMainId(row['id']);
|
||||||
improvementInstituteVoteTable.dataSource = [...improvementInstituteVoteDataList];
|
improvementInstituteVoteTable.dataSource = [...improvementInstituteVoteDataList];
|
||||||
// 加载改善前/后图片文件列表
|
|
||||||
await nextTick();
|
|
||||||
if (formData.id) {
|
|
||||||
beforeFileRef.value?.loadFileList();
|
|
||||||
afterFileRef.value?.loadFileList();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -360,11 +354,9 @@
|
|||||||
async function edit(row) {
|
async function edit(row) {
|
||||||
//主表数据
|
//主表数据
|
||||||
await queryMainData(row.id);
|
await queryMainData(row.id);
|
||||||
//子表数据
|
// 普通编辑不加载子表,并清理弹窗复用时可能残留的表格数据。
|
||||||
const improvementDeptScoreDataList = await queryImprovementDeptScoreListByMainId(row['id']);
|
improvementDeptScoreTable.dataSource = [];
|
||||||
improvementDeptScoreTable.dataSource = [...improvementDeptScoreDataList];
|
improvementInstituteVoteTable.dataSource = [];
|
||||||
const improvementInstituteVoteDataList = await queryImprovementInstituteVoteListByMainId(row['id']);
|
|
||||||
improvementInstituteVoteTable.dataSource = [...improvementInstituteVoteDataList];
|
|
||||||
// 加载改善前/后图片文件列表
|
// 加载改善前/后图片文件列表
|
||||||
await nextTick();
|
await nextTick();
|
||||||
if (formData.id) {
|
if (formData.id) {
|
||||||
@@ -411,8 +403,8 @@
|
|||||||
const mainData = await getFormData();
|
const mainData = await getFormData();
|
||||||
const isUpdate = Boolean(mainData.id);
|
const isUpdate = Boolean(mainData.id);
|
||||||
const values = Object.assign({}, dbData, mainData);
|
const values = Object.assign({}, dbData, mainData);
|
||||||
// 新增提案只保存主表;已有提案编辑或流程提交时才采集子表数据。
|
// 仅流程表单提交子表,普通编辑不能覆盖后续流程维护的评分和投票记录。
|
||||||
if (isUpdate) {
|
if (isUpdate && showSubTables.value) {
|
||||||
const subData = await getSubFormAndTableData();
|
const subData = await getSubFormAndTableData();
|
||||||
Object.assign(values, subData);
|
Object.assign(values, subData);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user