|
@@ -4,30 +4,36 @@
|
|
|
<t-collapse-panel disabled>
|
|
|
<template #expandIcon></template>
|
|
|
<template #header> SOP信息 </template>
|
|
|
- <t-form colon label-width="72px">
|
|
|
+ <t-form colon label-width="85px">
|
|
|
<t-row :gutter="[0, 4]">
|
|
|
<t-col :span="3">
|
|
|
- <t-form-item label="服务单元">{{ sop.serviceName }}</t-form-item>
|
|
|
+ <t-form-item label="服务单元">{{
|
|
|
+ sopInfo.serviceName
|
|
|
+ }}</t-form-item>
|
|
|
</t-col>
|
|
|
<t-col :span="3">
|
|
|
- <t-form-item label="SOP流水号">{{ sop.sopNo }}</t-form-item>
|
|
|
+ <t-form-item label="SOP流水号">{{ sopInfo.sopNo }}</t-form-item>
|
|
|
</t-col>
|
|
|
<t-col :span="3">
|
|
|
<t-form-item label="客户类型">{{
|
|
|
- sop.customManagerTypeStr
|
|
|
+ sopInfo.customManagerTypeStr
|
|
|
}}</t-form-item>
|
|
|
</t-col>
|
|
|
<t-col :span="3">
|
|
|
- <t-form-item label="客户名称">{{ sop.customName }}</t-form-item>
|
|
|
+ <t-form-item label="客户名称">{{
|
|
|
+ sopInfo.customName
|
|
|
+ }}</t-form-item>
|
|
|
</t-col>
|
|
|
<t-col :span="3">
|
|
|
- <t-form-item label="项目单号">{{ sop.crmNo }}</t-form-item>
|
|
|
+ <t-form-item label="项目单号">{{ sopInfo.crmNo }}</t-form-item>
|
|
|
</t-col>
|
|
|
<t-col :span="3">
|
|
|
- <t-form-item label="实施产品">{{ sop.productName }}</t-form-item>
|
|
|
+ <t-form-item label="实施产品">{{
|
|
|
+ sopInfo.productName
|
|
|
+ }}</t-form-item>
|
|
|
</t-col>
|
|
|
<t-col :span="6">
|
|
|
- <t-form-item label="项目名称">{{ sop.crmName }}</t-form-item>
|
|
|
+ <t-form-item label="项目名称">{{ sopInfo.crmName }}</t-form-item>
|
|
|
</t-col>
|
|
|
</t-row>
|
|
|
</t-form>
|
|
@@ -45,7 +51,6 @@
|
|
|
:key="item.taskKey"
|
|
|
:value="item.value"
|
|
|
:label="item.label"
|
|
|
- :disabled="item.disabled"
|
|
|
>
|
|
|
<t-form
|
|
|
ref="form"
|
|
@@ -78,19 +83,14 @@
|
|
|
</t-row>
|
|
|
</t-form>
|
|
|
<t-space class="sop-step-footer">
|
|
|
- <t-button
|
|
|
- v-if="IS_NEW_MODE"
|
|
|
- theme="primary"
|
|
|
- @click="submitHandle('START')"
|
|
|
- >提交</t-button
|
|
|
- >
|
|
|
-
|
|
|
- <t-button
|
|
|
- v-if="IS_NEW_MODE"
|
|
|
- theme="default"
|
|
|
- @click="submitHandle('DRAFT')"
|
|
|
- >保存草稿</t-button
|
|
|
- >
|
|
|
+ <template v-if="showAction">
|
|
|
+ <t-button theme="primary" @click="submitHandle('START')"
|
|
|
+ >提交</t-button
|
|
|
+ >
|
|
|
+ <t-button theme="default" @click="submitHandle('DRAFT')"
|
|
|
+ >保存草稿</t-button
|
|
|
+ >
|
|
|
+ </template>
|
|
|
</t-space>
|
|
|
</t-tab-panel>
|
|
|
</t-tabs>
|
|
@@ -98,12 +98,13 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup name="QualityIssue">
|
|
|
-import { ref, computed, watch } from 'vue';
|
|
|
+import { ref, computed, watch, reactive } from 'vue';
|
|
|
import { issuesFeedbackSaveApi } from '@/api/project-quality';
|
|
|
-import { flowFormPropertiesApi } from '@/api/sop';
|
|
|
+import { flowFormPropertiesApi, sopFlowViewApi } from '@/api/sop';
|
|
|
import { MessagePlugin } from 'tdesign-vue-next';
|
|
|
|
|
|
import DynamicFormItem from '../../components/dynamic-form-item/index.vue';
|
|
|
+import sop from '@/router/modules/sop';
|
|
|
|
|
|
const props = defineProps({
|
|
|
sop: {
|
|
@@ -122,12 +123,26 @@ const emit = defineEmits(['confirm']);
|
|
|
const IS_NEW_MODE = computed(() => {
|
|
|
return props.type === 'new';
|
|
|
});
|
|
|
+const IS_FILL_MODE = computed(() => {
|
|
|
+ return props.type === 'fill';
|
|
|
+});
|
|
|
+
|
|
|
+const sopInfo = reactive({
|
|
|
+ serviceName: props.sop.serviceName,
|
|
|
+ sopNo: props.sop.sopNo,
|
|
|
+ customManagerTypeStr: props.sop.customManagerTypeStr,
|
|
|
+ customName: props.sop.customName,
|
|
|
+ crmNo: props.sop.crmNo,
|
|
|
+ productName: props.sop.productName,
|
|
|
+ crmName: props.sop.crmName,
|
|
|
+});
|
|
|
|
|
|
const needValueCodes = [
|
|
|
'NUMBER', //新增
|
|
|
'TEXT',
|
|
|
'DATE',
|
|
|
- 'SELECT',
|
|
|
+ 'SINGLE_SELECT',
|
|
|
+ 'MULTIPLE_SELECT',
|
|
|
'CHECKBOX',
|
|
|
'TEXTAREA',
|
|
|
'TABLE',
|
|
@@ -152,10 +167,13 @@ const fullWidthCodes = ref([
|
|
|
'DEVICE_IN_TABLE',
|
|
|
]);
|
|
|
const form = ref(null);
|
|
|
-
|
|
|
const allSteps = ref([]);
|
|
|
const tabs = ref([]);
|
|
|
const curStep = ref('');
|
|
|
+const currFlowTaskResultSetup = ref(null);
|
|
|
+const curStepSetup = ref(1);
|
|
|
+const flowId = props.sop.flowId;
|
|
|
+const crmInfo = ref({});
|
|
|
|
|
|
const initNew = async () => {
|
|
|
loading.value = true;
|
|
@@ -169,31 +187,77 @@ const initNew = async () => {
|
|
|
return {
|
|
|
value: item.taskName,
|
|
|
label: item.taskName,
|
|
|
- disabled: false,
|
|
|
};
|
|
|
});
|
|
|
curStep.value = tabs.value.slice(-1)[0].value;
|
|
|
};
|
|
|
+const initFill = async () => {
|
|
|
+ loading.value = true;
|
|
|
+ const res = await sopFlowViewApi({ flowId });
|
|
|
+ crmInfo.value = res.crmInfo;
|
|
|
+ sopInfo.crmName = crmInfo.value.crmName;
|
|
|
+ sopInfo.productName = crmInfo.value.productName;
|
|
|
+ sopInfo.serviceName = crmInfo.value.serviceUnitName;
|
|
|
+
|
|
|
+ curStep.value = res.currFlowTaskResult.taskName;
|
|
|
+ currFlowTaskResultSetup.value = res.currFlowTaskResult.setup;
|
|
|
+ curStepSetup.value = res.currFlowTaskResult.setup;
|
|
|
+ res.flowTaskHistoryList = res.flowTaskHistoryList || [];
|
|
|
+ res.flowTaskHistoryList.forEach((item) => {
|
|
|
+ item.formProperty.forEach((v) => {
|
|
|
+ v.writable = false;
|
|
|
+ });
|
|
|
+ });
|
|
|
+ allSteps.value = [...res.flowTaskHistoryList, res.currFlowTaskResult];
|
|
|
+ tabs.value = [
|
|
|
+ ...res.flowTaskHistoryList.map((item) => {
|
|
|
+ return {
|
|
|
+ value: item.taskName,
|
|
|
+ label: item.taskName,
|
|
|
+ };
|
|
|
+ }),
|
|
|
+ {
|
|
|
+ value: res.currFlowTaskResult.taskName,
|
|
|
+ label: res.currFlowTaskResult.taskName,
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ allSteps.value.forEach((item) => {
|
|
|
+ item.formProperty.forEach((prop) => {
|
|
|
+ prop.value = prop.value ? JSON.parse(prop.value).value : null;
|
|
|
+ });
|
|
|
+ });
|
|
|
+ loading.value = false;
|
|
|
+};
|
|
|
+
|
|
|
const init = () => {
|
|
|
if (IS_NEW_MODE.value) {
|
|
|
// 发起流程
|
|
|
initNew();
|
|
|
} else {
|
|
|
- // initNew();
|
|
|
+ initFill();
|
|
|
}
|
|
|
};
|
|
|
init();
|
|
|
|
|
|
+const showAction = computed(() => {
|
|
|
+ if (IS_NEW_MODE.value) return true;
|
|
|
+
|
|
|
+ if (
|
|
|
+ IS_FILL_MODE.value &&
|
|
|
+ curStepSetup.value === currFlowTaskResultSetup.value
|
|
|
+ )
|
|
|
+ return true;
|
|
|
+
|
|
|
+ return false;
|
|
|
+});
|
|
|
+
|
|
|
const curFormConfig = computed(() => {
|
|
|
- const formProperty =
|
|
|
- allSteps.value.find((item) => item.taskName === curStep.value)
|
|
|
- ?.formProperty || [];
|
|
|
- formProperty.forEach((item) => {
|
|
|
- if (IS_NEW_MODE.value) {
|
|
|
- // item.value = item.value ? JSON.parse(item.value).value : null;
|
|
|
- item.value = null;
|
|
|
- }
|
|
|
- });
|
|
|
+ const stepData = allSteps.value.find(
|
|
|
+ (item) => item.taskName === curStep.value
|
|
|
+ );
|
|
|
+ if (!stepData) return [];
|
|
|
+
|
|
|
+ const formProperty = stepData.formProperty || [];
|
|
|
return formProperty;
|
|
|
});
|
|
|
watch(curFormConfig, (val) => {
|
|
@@ -221,9 +285,10 @@ watch(curFormConfig, (val) => {
|
|
|
});
|
|
|
|
|
|
const stepChange = () => {
|
|
|
- // if (IS_EDIT_MODE.value) {
|
|
|
- // allFormData.value = { ...allFormData.value, ...formData.value };
|
|
|
- // }
|
|
|
+ const curStepData = allSteps.value.find(
|
|
|
+ (item) => item.taskName === curStep.value
|
|
|
+ );
|
|
|
+ curStepSetup.value = curStepData.setup;
|
|
|
};
|
|
|
|
|
|
const itemValueChange = ({ prop, value }) => {
|
|
@@ -233,18 +298,16 @@ const itemValueChange = ({ prop, value }) => {
|
|
|
|
|
|
const getFormData = () => {
|
|
|
let data = {};
|
|
|
- if (IS_NEW_MODE.value) {
|
|
|
- const curStepData = allSteps.value.find(
|
|
|
- (item) => item.taskName === curStep.value
|
|
|
- );
|
|
|
- data = { ...curStepData };
|
|
|
- data.formProperty = data.formProperty.map((item) => {
|
|
|
- return {
|
|
|
- ...item,
|
|
|
- value: JSON.stringify({ value: formData.value[item.formName] || null }),
|
|
|
- };
|
|
|
- });
|
|
|
- }
|
|
|
+ const curStepData = allSteps.value.find(
|
|
|
+ (item) => item.taskName === curStep.value
|
|
|
+ );
|
|
|
+ data = { ...curStepData };
|
|
|
+ data.formProperty = data.formProperty.map((item) => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ value: JSON.stringify({ value: formData.value[item.formName] || null }),
|
|
|
+ };
|
|
|
+ });
|
|
|
|
|
|
return JSON.stringify(data);
|
|
|
};
|
|
@@ -254,9 +317,18 @@ const submitHandle = async (flowApprove = 'START') => {
|
|
|
if (flowApprove === 'START') {
|
|
|
const valid = await form.value[0].validate();
|
|
|
if (valid !== true) return;
|
|
|
+
|
|
|
+ approve = curStepSetup.value === 1 ? 'START' : 'PASS';
|
|
|
}
|
|
|
|
|
|
- if (IS_NEW_MODE.value) {
|
|
|
+ if (IS_FILL_MODE.value) {
|
|
|
+ const res = await issuesFeedbackApproveApi({
|
|
|
+ taskId: props.sop.taskId,
|
|
|
+ formProperties: getFormData(),
|
|
|
+ approve,
|
|
|
+ }).catch(() => {});
|
|
|
+ if (!res) return;
|
|
|
+ } else if (IS_NEW_MODE.value) {
|
|
|
const res = await issuesFeedbackSaveApi({
|
|
|
serviceId: props.sop.serviceId,
|
|
|
crmNo: props.sop.crmNo,
|