|
@@ -1,166 +1,260 @@
|
|
<template>
|
|
<template>
|
|
<div class="plan-change">
|
|
<div class="plan-change">
|
|
- <div class="page-wrap">
|
|
|
|
- <t-form ref="formRef" :data="formData" :labelWidth="180">
|
|
|
|
- <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 class="my-form-item" label="项目单号"
|
|
|
|
- >1111
|
|
|
|
- </t-form-item>
|
|
|
|
- </t-col>
|
|
|
|
- <t-col :span="6">
|
|
|
|
- <t-form-item class="my-form-item" label="项目名称">
|
|
|
|
- 1111
|
|
|
|
- </t-form-item>
|
|
|
|
- </t-col>
|
|
|
|
- <t-col :span="6">
|
|
|
|
- <t-form-item class="my-form-item" label="派单时间">
|
|
|
|
- 1111
|
|
|
|
- </t-form-item>
|
|
|
|
- </t-col>
|
|
|
|
- <t-col :span="6">
|
|
|
|
- <t-form-item class="my-form-item" label="客户经理">
|
|
|
|
- 1111
|
|
|
|
- </t-form-item>
|
|
|
|
- </t-col>
|
|
|
|
- <t-col :span="6">
|
|
|
|
- <t-form-item class="my-form-item" label="客户类型">
|
|
|
|
- 1111
|
|
|
|
- </t-form-item>
|
|
|
|
- </t-col>
|
|
|
|
- <t-col :span="6">
|
|
|
|
- <t-form-item class="my-form-item" label="客户名称">
|
|
|
|
- 1111
|
|
|
|
- </t-form-item>
|
|
|
|
- </t-col>
|
|
|
|
- <t-col :span="6">
|
|
|
|
- <t-form-item class="my-form-item" label="考试开始时间">
|
|
|
|
- 1111
|
|
|
|
- </t-form-item>
|
|
|
|
- </t-col>
|
|
|
|
- <t-col :span="6">
|
|
|
|
- <t-form-item class="my-form-item" label="考试结束时间">
|
|
|
|
- 1111
|
|
|
|
- </t-form-item>
|
|
|
|
- </t-col>
|
|
|
|
- <t-col :span="6">
|
|
|
|
- <t-form-item class="my-form-item" label="实施产品">
|
|
|
|
- 1111
|
|
|
|
- </t-form-item>
|
|
|
|
- </t-col>
|
|
|
|
- <t-col :span="6">
|
|
|
|
- <t-form-item class="my-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 class="my-form-item" label="报备申请人">
|
|
|
|
- 1111
|
|
|
|
- </t-form-item>
|
|
|
|
- </t-col>
|
|
|
|
- <t-col :span="6">
|
|
|
|
- <t-form-item class="my-form-item" label="报备申请时间">
|
|
|
|
- 1111
|
|
|
|
- </t-form-item>
|
|
|
|
- </t-col>
|
|
|
|
|
|
+ <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>
|
|
|
|
|
|
- <t-col :span="12">
|
|
|
|
- <t-form-item class="my-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.b">
|
|
|
|
- <t-radio value="1">项目信息及计划变更</t-radio>
|
|
|
|
- <t-radio value="2">项目取消</t-radio>
|
|
|
|
- </t-radio-group>
|
|
|
|
|
|
+ <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>
|
|
</div>
|
|
- </t-form-item>
|
|
|
|
|
|
+ <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">
|
|
|
|
+ <t-col :span="12">
|
|
|
|
+ <div class="form-group-title next"> 变更处理结果 </div>
|
|
</t-col>
|
|
</t-col>
|
|
<t-col :span="12">
|
|
<t-col :span="12">
|
|
- <t-form-item class="my-form-item" label="变更原因">
|
|
|
|
- <t-input v-model="formData.a" placeholder="50字以内"></t-input>
|
|
|
|
|
|
+ <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-form-item>
|
|
</t-col>
|
|
</t-col>
|
|
|
|
+
|
|
<t-col :span="12">
|
|
<t-col :span="12">
|
|
- <t-form-item class="my-form-item" label="项目信息及计划变更明细">
|
|
|
|
- <dynamic-table :columns="columns" ref="dTable"></dynamic-table>
|
|
|
|
|
|
+ <t-form-item label="变更备注" name="remark">
|
|
|
|
+ <t-textarea v-model="formData.remark"></t-textarea>
|
|
</t-form-item>
|
|
</t-form-item>
|
|
</t-col>
|
|
</t-col>
|
|
- </t-row>
|
|
|
|
- <s-button @cancel="router.back()" @confirm="save"></s-button>
|
|
|
|
- </t-form>
|
|
|
|
- </div>
|
|
|
|
|
|
+ </template>
|
|
|
|
+ </t-row>
|
|
|
|
+ <s-button
|
|
|
|
+ class="m-t-30px"
|
|
|
|
+ @cancel="router.back()"
|
|
|
|
+ confirm-text="保存"
|
|
|
|
+ @confirm="save"
|
|
|
|
+ ></s-button>
|
|
|
|
+ </t-form>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
<script setup name="PlanChange">
|
|
<script setup name="PlanChange">
|
|
-import { ref, computed } from 'vue';
|
|
|
|
-import { Input } from 'tdesign-vue-next';
|
|
|
|
-import { useRouter } from 'vue-router';
|
|
|
|
|
|
+import { ref, computed, reactive } from 'vue';
|
|
|
|
+import { Input, MessagePlugin } from 'tdesign-vue-next';
|
|
|
|
+import { useRouter, useRoute } from 'vue-router';
|
|
import dynamicTable from '@/components/common/dynamic-table';
|
|
import dynamicTable from '@/components/common/dynamic-table';
|
|
|
|
+import { dictToOptionList } from '@/utils/tool';
|
|
|
|
+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 dTable = ref();
|
|
const router = useRouter();
|
|
const router = useRouter();
|
|
|
|
+const route = useRoute();
|
|
|
|
+const readonly = computed(() => {
|
|
|
|
+ return !route.query.new;
|
|
|
|
+});
|
|
const columns = computed(() => [
|
|
const columns = computed(() => [
|
|
{
|
|
{
|
|
- colKey: 'a',
|
|
|
|
|
|
+ colKey: 'before',
|
|
title: '变更字段(全称)',
|
|
title: '变更字段(全称)',
|
|
edit: {
|
|
edit: {
|
|
component: Input,
|
|
component: Input,
|
|
props: {
|
|
props: {
|
|
clearable: true,
|
|
clearable: true,
|
|
|
|
+ disabled: readonly.value,
|
|
},
|
|
},
|
|
validateTrigger: 'change',
|
|
validateTrigger: 'change',
|
|
rules: [{ required: true, message: '不能为空' }],
|
|
rules: [{ required: true, message: '不能为空' }],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- colKey: 'b',
|
|
|
|
|
|
+ colKey: 'after',
|
|
title: '变更后内容',
|
|
title: '变更后内容',
|
|
edit: {
|
|
edit: {
|
|
component: Input,
|
|
component: Input,
|
|
props: {
|
|
props: {
|
|
clearable: true,
|
|
clearable: true,
|
|
|
|
+ disabled: readonly.value,
|
|
},
|
|
},
|
|
validateTrigger: 'change',
|
|
validateTrigger: 'change',
|
|
rules: [{ required: true, message: '不能为空' }],
|
|
rules: [{ required: true, message: '不能为空' }],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- colKey: 'c',
|
|
|
|
|
|
+ colKey: 'remark',
|
|
title: '备注',
|
|
title: '备注',
|
|
edit: {
|
|
edit: {
|
|
component: Input,
|
|
component: Input,
|
|
props: {
|
|
props: {
|
|
clearable: true,
|
|
clearable: true,
|
|
|
|
+ disabled: readonly.value,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
]);
|
|
]);
|
|
const formRef = ref(null);
|
|
const formRef = ref(null);
|
|
-const formData = ref({
|
|
|
|
- a: '',
|
|
|
|
- b: '',
|
|
|
|
|
|
+const formData = reactive({
|
|
|
|
+ serviceId: '',
|
|
|
|
+ sopNo: '',
|
|
|
|
+ crmNo: '',
|
|
|
|
+ type: 'PLAN',
|
|
|
|
+ reason: '',
|
|
|
|
+ projectExchangeApprove: 'FINISH',
|
|
|
|
+ remark: '',
|
|
|
|
+});
|
|
|
|
+const rules = computed(() => {
|
|
|
|
+ return {
|
|
|
|
+ reason: [
|
|
|
|
+ {
|
|
|
|
+ required: true,
|
|
|
|
+ message: '请填写变更原因',
|
|
|
|
+ type: 'error',
|
|
|
|
+ trigger: 'change',
|
|
|
|
+ },
|
|
|
|
+ ],
|
|
|
|
+ remark: [
|
|
|
|
+ {
|
|
|
|
+ validator: (val) => {
|
|
|
|
+ if (!val && formData.projectExchangeApprove !== 'FINISH') {
|
|
|
|
+ return {
|
|
|
|
+ result: false,
|
|
|
|
+ message: '请填写备注',
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ return {
|
|
|
|
+ result: true,
|
|
|
|
+ type: 'success',
|
|
|
|
+ };
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ ],
|
|
|
|
+ };
|
|
});
|
|
});
|
|
const save = () => {
|
|
const save = () => {
|
|
- dTable.value?.validate(() => {});
|
|
|
|
|
|
+ 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();
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
};
|
|
};
|
|
</script>
|
|
</script>
|
|
-<style lang="less" scoped></style>
|
|
|
|
|
|
+<style lang="less" scoped>
|
|
|
|
+.plan-change {
|
|
|
|
+ background-color: #fff;
|
|
|
|
+ padding: 16px;
|
|
|
|
+}
|
|
|
|
+</style>
|