|
@@ -1,130 +1,152 @@
|
|
|
<template>
|
|
|
- <div class="plan-change">
|
|
|
- <t-form ref="formRef" :data="formData" :labelWidth="180" :rules="rules">
|
|
|
- <t-row :gutter="[0, 20]">
|
|
|
- <t-col :span="12">
|
|
|
- <div class="form-group-title" style="margin-bottom: 0">
|
|
|
- 项目派单信息(SOP流水单号:20230601001)
|
|
|
- </div>
|
|
|
- </t-col>
|
|
|
- <t-col :span="6">
|
|
|
- <t-form-item label="项目单号">1111 </t-form-item>
|
|
|
- </t-col>
|
|
|
- <t-col :span="6">
|
|
|
- <t-form-item label="项目名称"> 1111 </t-form-item>
|
|
|
- </t-col>
|
|
|
- <t-col :span="6">
|
|
|
- <t-form-item label="派单时间"> 1111 </t-form-item>
|
|
|
- </t-col>
|
|
|
- <t-col :span="6">
|
|
|
- <t-form-item label="客户经理"> 1111 </t-form-item>
|
|
|
- </t-col>
|
|
|
- <t-col :span="6">
|
|
|
- <t-form-item label="客户类型"> 1111 </t-form-item>
|
|
|
- </t-col>
|
|
|
- <t-col :span="6">
|
|
|
- <t-form-item label="客户名称"> 1111 </t-form-item>
|
|
|
- </t-col>
|
|
|
- <t-col :span="6">
|
|
|
- <t-form-item label="考试开始时间"> 1111 </t-form-item>
|
|
|
- </t-col>
|
|
|
- <t-col :span="6">
|
|
|
- <t-form-item label="考试结束时间"> 1111 </t-form-item>
|
|
|
- </t-col>
|
|
|
- <t-col :span="6">
|
|
|
- <t-form-item label="实施产品"> 1111 </t-form-item>
|
|
|
- </t-col>
|
|
|
- <t-col :span="6">
|
|
|
- <t-form-item label="服务单元"> 1111 </t-form-item>
|
|
|
- </t-col>
|
|
|
- <t-col :span="12">
|
|
|
- <div class="form-group-title"> SOP项目计划变更说明 </div>
|
|
|
- <div class="sub-title">
|
|
|
- <p :style="{ color: 'gray' }">
|
|
|
- SOP项目计划需要变更时,可手动发起一个或多个申请,质控专员审核后,在SOP流程中进行计划变更调整,完成变更后,申请流程结束并通知到发起申请人
|
|
|
- </p>
|
|
|
- </div>
|
|
|
- </t-col>
|
|
|
- <t-col :span="6">
|
|
|
- <t-form-item label="报备申请人"> 1111 </t-form-item>
|
|
|
- </t-col>
|
|
|
- <t-col :span="6">
|
|
|
- <t-form-item label="报备申请时间"> 1111 </t-form-item>
|
|
|
- </t-col>
|
|
|
+ <div class="plan-change sop-step">
|
|
|
+ <t-collapse class="sop-step-mid" defaultExpandAll>
|
|
|
+ <t-collapse-panel disabled>
|
|
|
+ <template #expandIcon></template>
|
|
|
+ <template #header>
|
|
|
+ 项目派单信息(SOP流水单号:{{ sop.sopNo }})
|
|
|
+ </template>
|
|
|
+ <t-form colon label-width="72px">
|
|
|
+ <t-row :gutter="[0, 4]">
|
|
|
+ <t-col :span="3">
|
|
|
+ <t-form-item label="项目单号">{{ sop.crmNo }}</t-form-item>
|
|
|
+ </t-col>
|
|
|
+ <t-col :span="3">
|
|
|
+ <t-form-item label="项目名称">{{ sop.crmName }}</t-form-item>
|
|
|
+ </t-col>
|
|
|
+ <t-col :span="3">
|
|
|
+ <t-form-item label="派单时间">{{ sop.beginTime }}</t-form-item>
|
|
|
+ </t-col>
|
|
|
+ <t-col :span="3">
|
|
|
+ <t-form-item label="客户经理">{{
|
|
|
+ sop.customManagerName
|
|
|
+ }}</t-form-item>
|
|
|
+ </t-col>
|
|
|
+ <t-col :span="3">
|
|
|
+ <t-form-item label="客户类型">{{
|
|
|
+ sop.customManagerTypeStr
|
|
|
+ }}</t-form-item>
|
|
|
+ </t-col>
|
|
|
+ <t-col :span="3">
|
|
|
+ <t-form-item label="客户名称">{{ sop.customName }}</t-form-item>
|
|
|
+ </t-col>
|
|
|
+ <t-col :span="3">
|
|
|
+ <t-form-item label="考试开始时间" label-width="100px">{{
|
|
|
+ sop.examStartTime
|
|
|
+ }}</t-form-item>
|
|
|
+ </t-col>
|
|
|
+ <t-col :span="3">
|
|
|
+ <t-form-item label="考试结束时间" label-width="100px">{{
|
|
|
+ sop.examEndTime
|
|
|
+ }}</t-form-item>
|
|
|
+ </t-col>
|
|
|
+ <t-col :span="3">
|
|
|
+ <t-form-item label="实施产品">{{ sop.productName }}</t-form-item>
|
|
|
+ </t-col>
|
|
|
+ <t-col :span="3">
|
|
|
+ <t-form-item label="服务单元">{{ sop.serviceName }}</t-form-item>
|
|
|
+ </t-col>
|
|
|
+ </t-row>
|
|
|
+ </t-form>
|
|
|
+ </t-collapse-panel>
|
|
|
+ </t-collapse>
|
|
|
+ <t-collapse class="sop-step-mid" defaultExpandAll>
|
|
|
+ <t-collapse-panel disabled>
|
|
|
+ <template #expandIcon></template>
|
|
|
+ <template #header> SOP项目计划变更说明 </template>
|
|
|
+ <p class="red">
|
|
|
+ SOP项目计划需要变更时,可手动发起一个或多个申请,质控专员审核后,在SOP流程中进行计划变更调整,完成变更后,申请流程结束并通知到发起申请人
|
|
|
+ </p>
|
|
|
+ </t-collapse-panel>
|
|
|
+ </t-collapse>
|
|
|
|
|
|
- <t-col :span="12">
|
|
|
- <t-form-item label="变更类型">
|
|
|
- <div>
|
|
|
- <div class="sub-title">
|
|
|
- <p :style="{ color: 'gray' }">
|
|
|
- 1.关键信息及计划变更:项目关键信息里填写的项目关键信息或时间计划内容调整;
|
|
|
- </p>
|
|
|
- <p :style="{ color: 'gray' }">
|
|
|
- 2.项目取消:若项目取消,则只需填写变更原因后提交。
|
|
|
- </p>
|
|
|
- </div>
|
|
|
- <t-radio-group v-model="formData.type">
|
|
|
- <t-radio
|
|
|
- :value="item.value"
|
|
|
- :key="item.value"
|
|
|
- v-for="item in dictToOptionList(PLAN_CHANGE_TYPE)"
|
|
|
- >{{ item.label }}</t-radio
|
|
|
- >
|
|
|
- </t-radio-group>
|
|
|
- </div>
|
|
|
- </t-form-item>
|
|
|
- </t-col>
|
|
|
- <t-col :span="12">
|
|
|
- <t-form-item label="变更原因" name="reason">
|
|
|
- <t-input
|
|
|
- :disabled="readonly"
|
|
|
- v-model="formData.reason"
|
|
|
- placeholder="50字以内"
|
|
|
- :maxlength="50"
|
|
|
- ></t-input>
|
|
|
- </t-form-item>
|
|
|
- </t-col>
|
|
|
- <t-col :span="12">
|
|
|
- <t-form-item label="项目信息及计划变更明细">
|
|
|
- <dynamic-table
|
|
|
- :columns="columns"
|
|
|
- ref="dTable"
|
|
|
- :readonly="readonly"
|
|
|
- ></dynamic-table>
|
|
|
- </t-form-item>
|
|
|
- </t-col>
|
|
|
- <template v-if="!route.new">
|
|
|
+ <div class="sop-step-list" style="flex-direction: column">
|
|
|
+ <t-form
|
|
|
+ class="sop-step-body"
|
|
|
+ ref="formRef"
|
|
|
+ :data="formData"
|
|
|
+ :labelWidth="180"
|
|
|
+ :rules="rules"
|
|
|
+ colon
|
|
|
+ >
|
|
|
+ <t-row :gutter="[0, 20]">
|
|
|
+ <template v-if="!IS_NEW_MODE">
|
|
|
+ <t-col :span="4">
|
|
|
+ <t-form-item label="报备申请人"> 1111 </t-form-item>
|
|
|
+ </t-col>
|
|
|
+ <t-col :span="4">
|
|
|
+ <t-form-item label="报备申请时间"> 1111 </t-form-item>
|
|
|
+ </t-col>
|
|
|
+ </template>
|
|
|
<t-col :span="12">
|
|
|
- <div class="form-group-title next"> 变更处理结果 </div>
|
|
|
+ <t-form-item label="变更类型" requiredMark>
|
|
|
+ <div style="padding-top: 3px">
|
|
|
+ <t-radio-group v-model="formData.type">
|
|
|
+ <t-radio
|
|
|
+ :value="item.value"
|
|
|
+ :key="item.value"
|
|
|
+ v-for="item in dictToOptionList(PLAN_CHANGE_TYPE)"
|
|
|
+ >{{ item.label }}</t-radio
|
|
|
+ >
|
|
|
+ </t-radio-group>
|
|
|
+ <div class="sub-title gray">
|
|
|
+ <p>
|
|
|
+ 1.关键信息及计划变更:项目关键信息里填写的项目关键信息或时间计划内容调整;
|
|
|
+ </p>
|
|
|
+ <p> 2.项目取消:若项目取消,则只需填写变更原因后提交。 </p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </t-form-item>
|
|
|
</t-col>
|
|
|
<t-col :span="12">
|
|
|
- <t-form-item label="处理结果">
|
|
|
- <t-radio-group v-model="formData.projectExchangeApprove">
|
|
|
- <t-radio value="FINISH">已完成</t-radio>
|
|
|
- <t-radio value="NOT_UPDATE"
|
|
|
- >经沟通,取消变更(原因请填写变更备注)</t-radio
|
|
|
- >
|
|
|
- <t-radio value="PARTIAL_UPDATE"
|
|
|
- >经沟通,部分变更(详情请填写变更备注)</t-radio
|
|
|
- >
|
|
|
- </t-radio-group>
|
|
|
+ <t-form-item label="变更原因" name="reason">
|
|
|
+ <t-input
|
|
|
+ :disabled="readonly"
|
|
|
+ v-model="formData.reason"
|
|
|
+ placeholder="50字以内"
|
|
|
+ :maxlength="50"
|
|
|
+ ></t-input>
|
|
|
</t-form-item>
|
|
|
</t-col>
|
|
|
-
|
|
|
<t-col :span="12">
|
|
|
- <t-form-item label="变更备注" name="remark">
|
|
|
- <t-textarea v-model="formData.remark"></t-textarea>
|
|
|
+ <t-form-item label="项目信息及计划变更明细">
|
|
|
+ <dynamic-table
|
|
|
+ :columns="columns"
|
|
|
+ ref="dTable"
|
|
|
+ :readonly="readonly"
|
|
|
+ ></dynamic-table>
|
|
|
</t-form-item>
|
|
|
</t-col>
|
|
|
- </template>
|
|
|
- </t-row>
|
|
|
- <s-button
|
|
|
- class="m-t-30px"
|
|
|
- @cancel="router.back()"
|
|
|
- confirm-text="保存"
|
|
|
- @confirm="save"
|
|
|
- ></s-button>
|
|
|
- </t-form>
|
|
|
+ <template v-if="!IS_NEW_MODE">
|
|
|
+ <t-col :span="12">
|
|
|
+ <div class="form-group-title next"> 变更处理结果 </div>
|
|
|
+ </t-col>
|
|
|
+ <t-col :span="12">
|
|
|
+ <t-form-item label="处理结果">
|
|
|
+ <t-radio-group v-model="formData.projectExchangeApprove">
|
|
|
+ <t-radio value="FINISH">已完成</t-radio>
|
|
|
+ <t-radio value="NOT_UPDATE"
|
|
|
+ >经沟通,取消变更(原因请填写变更备注)</t-radio
|
|
|
+ >
|
|
|
+ <t-radio value="PARTIAL_UPDATE"
|
|
|
+ >经沟通,部分变更(详情请填写变更备注)</t-radio
|
|
|
+ >
|
|
|
+ </t-radio-group>
|
|
|
+ </t-form-item>
|
|
|
+ </t-col>
|
|
|
+ <t-col :span="12">
|
|
|
+ <t-form-item label="变更备注" name="remark">
|
|
|
+ <t-textarea v-model="formData.remark"></t-textarea>
|
|
|
+ </t-form-item>
|
|
|
+ </t-col>
|
|
|
+ </template>
|
|
|
+ </t-row>
|
|
|
+ </t-form>
|
|
|
+ <t-space class="sop-step-footer">
|
|
|
+ <t-button theme="primary" @click="submitHandle">提交</t-button>
|
|
|
+ <t-button theme="default" @click="cancelHandle">取消</t-button>
|
|
|
+ </t-space>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script setup name="PlanChange">
|
|
@@ -137,46 +159,71 @@ import { PLAN_CHANGE_TYPE } from '@/config/constants';
|
|
|
import { createPlanChange, approvePlanChange } from '@/api/sop';
|
|
|
import { useAppStore } from '@/store';
|
|
|
import { omit } from 'lodash';
|
|
|
-const appStore = useAppStore();
|
|
|
+
|
|
|
const dTable = ref();
|
|
|
-const router = useRouter();
|
|
|
const route = useRoute();
|
|
|
+
|
|
|
+const props = defineProps({
|
|
|
+ sop: {
|
|
|
+ type: Object,
|
|
|
+ default() {
|
|
|
+ return {};
|
|
|
+ },
|
|
|
+ },
|
|
|
+ type: {
|
|
|
+ type: String,
|
|
|
+ default: 'new',
|
|
|
+ },
|
|
|
+});
|
|
|
+const emit = defineEmits(['confirm', 'cancel']);
|
|
|
+
|
|
|
+const IS_NEW_MODE = computed(() => {
|
|
|
+ return props.type === 'new';
|
|
|
+});
|
|
|
const readonly = computed(() => {
|
|
|
- return !route.query.new;
|
|
|
+ return !IS_NEW_MODE.value;
|
|
|
});
|
|
|
+
|
|
|
const columns = computed(() => [
|
|
|
{
|
|
|
colKey: 'before',
|
|
|
title: '变更字段(全称)',
|
|
|
- edit: {
|
|
|
- component: Input,
|
|
|
- props: {
|
|
|
+ comp: {
|
|
|
+ type: 'text',
|
|
|
+ attrs: {
|
|
|
clearable: true,
|
|
|
disabled: readonly.value,
|
|
|
},
|
|
|
- validateTrigger: 'change',
|
|
|
- rules: [{ required: true, message: '不能为空' }],
|
|
|
},
|
|
|
+ rules: [
|
|
|
+ { required: true, message: '不能为空', type: 'error', trigger: 'change' },
|
|
|
+ ],
|
|
|
},
|
|
|
{
|
|
|
colKey: 'after',
|
|
|
title: '变更后内容',
|
|
|
- edit: {
|
|
|
- component: Input,
|
|
|
- props: {
|
|
|
+ comp: {
|
|
|
+ type: 'text',
|
|
|
+ attrs: {
|
|
|
clearable: true,
|
|
|
disabled: readonly.value,
|
|
|
},
|
|
|
- validateTrigger: 'change',
|
|
|
- rules: [{ required: true, message: '不能为空' }],
|
|
|
},
|
|
|
+ rules: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '不能为空',
|
|
|
+ type: 'error',
|
|
|
+ trigger: 'change',
|
|
|
+ },
|
|
|
+ ],
|
|
|
},
|
|
|
{
|
|
|
colKey: 'remark',
|
|
|
title: '备注',
|
|
|
- edit: {
|
|
|
- component: Input,
|
|
|
- props: {
|
|
|
+ comp: {
|
|
|
+ type: 'text',
|
|
|
+ attrs: {
|
|
|
clearable: true,
|
|
|
disabled: readonly.value,
|
|
|
},
|
|
@@ -189,10 +236,23 @@ const formData = reactive({
|
|
|
sopNo: '',
|
|
|
crmNo: '',
|
|
|
type: 'PLAN',
|
|
|
+ flowDeploymentId: '',
|
|
|
reason: '',
|
|
|
+ contentJson: '',
|
|
|
projectExchangeApprove: 'FINISH',
|
|
|
remark: '',
|
|
|
});
|
|
|
+
|
|
|
+const initData = () => {
|
|
|
+ if (IS_NEW_MODE) {
|
|
|
+ formData.serviceId = props.sop.serviceId;
|
|
|
+ formData.sopNo = props.sop.sopNo;
|
|
|
+ formData.crmNo = props.sop.crmNo;
|
|
|
+ formData.flowDeploymentId = props.sop.flowDeploymentId;
|
|
|
+ }
|
|
|
+};
|
|
|
+initData();
|
|
|
+
|
|
|
const rules = computed(() => {
|
|
|
return {
|
|
|
reason: [
|
|
@@ -221,40 +281,37 @@ const rules = computed(() => {
|
|
|
],
|
|
|
};
|
|
|
});
|
|
|
-const save = () => {
|
|
|
- formRef.value.validate().then(async (result) => {
|
|
|
- if (result === true) {
|
|
|
- if (!readonly) {
|
|
|
- dTable.value?.validate(() => {
|
|
|
- let tableData = dTable.value.exportTableData();
|
|
|
- createPlanChange({
|
|
|
- ...omit(formData, ['projectExchangeApprove', 'remark']),
|
|
|
- contentJson: JSON.stringify(tableData),
|
|
|
- flowApprove: 'START',
|
|
|
- flowDeploymentId: appStore.getFlowDetailByType(
|
|
|
- 'PROJECT_EXCHANGE_FLOW'
|
|
|
- ).flowDeploymentId,
|
|
|
- });
|
|
|
- });
|
|
|
- } else {
|
|
|
- //流程审批
|
|
|
- approvePlanChange({
|
|
|
- flowApprove: 'PASS',
|
|
|
- projectExchangeApprove: formData.projectExchangeApprove,
|
|
|
- remark: formData.remark,
|
|
|
- taskId: route.query.taskId,
|
|
|
- }).then(() => {
|
|
|
- MessagePlugin.success('操作成功');
|
|
|
- router.back();
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
+
|
|
|
+const submitHandle = async () => {
|
|
|
+ const valid = await formRef.value.validate();
|
|
|
+ if (valid !== true) return;
|
|
|
+
|
|
|
+ if (IS_NEW_MODE.value) {
|
|
|
+ dTable.value?.validate(() => {});
|
|
|
+
|
|
|
+ let tableData = dTable.value.exportTableData();
|
|
|
+ const res = await createPlanChange({
|
|
|
+ ...omit(formData, ['projectExchangeApprove', 'remark']),
|
|
|
+ contentJson: JSON.stringify(tableData),
|
|
|
+ flowApprove: 'START',
|
|
|
+ }).catch(() => {});
|
|
|
+ if (!res) return;
|
|
|
+ } else {
|
|
|
+ // 流程审批
|
|
|
+ const res = await approvePlanChange({
|
|
|
+ flowApprove: 'PASS',
|
|
|
+ projectExchangeApprove: formData.projectExchangeApprove,
|
|
|
+ remark: formData.remark,
|
|
|
+ taskId: route.query.taskId,
|
|
|
+ }).catch(() => {});
|
|
|
+ if (!res) return;
|
|
|
+ }
|
|
|
+
|
|
|
+ MessagePlugin.success('保存成功');
|
|
|
+ emit('confirm');
|
|
|
+};
|
|
|
+
|
|
|
+const cancelHandle = () => {
|
|
|
+ emit('cancel');
|
|
|
};
|
|
|
</script>
|
|
|
-<style lang="less" scoped>
|
|
|
-.plan-change {
|
|
|
- background-color: #fff;
|
|
|
- padding: 16px;
|
|
|
-}
|
|
|
-</style>
|