|
@@ -8,6 +8,7 @@ import { STATUS, SUB_STATUS } from './List';
|
|
|
import { async } from '@antv/x6/lib/registry/marker/async';
|
|
|
import { queryStatusHistory } from '@/services/approval';
|
|
|
import { UploadOutlined } from '@ant-design/icons';
|
|
|
+import { startExecution, startOperate, startQuality } from '@/services/approval';
|
|
|
|
|
|
const { Step } = Steps;
|
|
|
// 新建
|
|
@@ -22,6 +23,7 @@ function DetailModal(props) {
|
|
|
isEdit,
|
|
|
flowList = [],
|
|
|
disabled,
|
|
|
+ currentUser,
|
|
|
loading,
|
|
|
} = props;
|
|
|
const [codes, setCodes] = useState({
|
|
@@ -34,40 +36,6 @@ function DetailModal(props) {
|
|
|
const [params, setParams] = useState({});
|
|
|
const [statusList, setStatusHistory] = useState([]);
|
|
|
|
|
|
- const subSelectOptions = {
|
|
|
- 0: [
|
|
|
- { value: 1, label: '预算和方式' },
|
|
|
- { value: 7, label: '放弃' },
|
|
|
- { value: 8, label: '失败' },
|
|
|
- { value: 9, label: '关闭' },
|
|
|
- ],
|
|
|
- 1: [
|
|
|
- { value: 2, label: '招标' },
|
|
|
- { value: 7, label: '放弃' },
|
|
|
- { value: 8, label: '失败' },
|
|
|
- { value: 9, label: '关闭' },
|
|
|
- ],
|
|
|
- 2: [
|
|
|
- { value: 3, label: '中标' },
|
|
|
- { value: 8, label: '失败' },
|
|
|
- { value: 9, label: '关闭' },
|
|
|
- ],
|
|
|
- 3: [
|
|
|
- { value: 4, label: '转执行' },
|
|
|
- { value: 9, label: '关闭' },
|
|
|
- ],
|
|
|
- 4: [
|
|
|
- { value: 5, label: '转运营' },
|
|
|
- { value: 6, label: '转质保' },
|
|
|
- { value: 9, label: '关闭' },
|
|
|
- ],
|
|
|
- 5: [
|
|
|
- { value: 6, label: '转质保' },
|
|
|
- { value: 9, label: '关闭' },
|
|
|
- ],
|
|
|
- 6: [{ value: 9, label: '关闭' }],
|
|
|
- };
|
|
|
-
|
|
|
useEffect(() => {
|
|
|
if (!visible || !data.id) return;
|
|
|
setCodes({
|
|
@@ -79,11 +47,193 @@ function DetailModal(props) {
|
|
|
});
|
|
|
setParams({
|
|
|
project_status: data?.project_status,
|
|
|
- sub_status: data?.status,
|
|
|
+ // status: data?.status,
|
|
|
});
|
|
|
if (data?.id) initStatueHistory(data.id);
|
|
|
}, [data, visible]);
|
|
|
|
|
|
+ const canEdit = useMemo(() => {
|
|
|
+ if (!data || !currentUser) return false;
|
|
|
+ let { audit_status, project_status } = data;
|
|
|
+
|
|
|
+ if (currentUser.IsSuper) return true;
|
|
|
+ switch (audit_status) {
|
|
|
+ case 0:
|
|
|
+ return currentUser.ID == data.author;
|
|
|
+ case 1:
|
|
|
+ return false;
|
|
|
+ case 2:
|
|
|
+ if (project_status == 0) return currentUser.ID == data.author;
|
|
|
+ if (project_status == 1) return currentUser.ID == data.LeaderId;
|
|
|
+ return false;
|
|
|
+ case 3:
|
|
|
+ switch (project_status) {
|
|
|
+ case 0:
|
|
|
+ return currentUser.ID == data.author;
|
|
|
+ case 1:
|
|
|
+ return currentUser.ID == data.LeaderId;
|
|
|
+ case 2:
|
|
|
+ return currentUser.ID == data.LeaderId || currentUser.ID == data.opt_manager_id;
|
|
|
+ case 3:
|
|
|
+ return currentUser.ID == data.LeaderId || currentUser.ID == data.wty_manager_id;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }, [currentUser, data, isEdit]);
|
|
|
+ const promise = useMemo(() => {
|
|
|
+ if (!data || !currentUser) return false;
|
|
|
+ let { audit_status, project_status, type_id } = data;
|
|
|
+ console.log('============', data);
|
|
|
+ let permission = currentUser.Permission;
|
|
|
+ let showModifyManager = false;
|
|
|
+ let showEditBtn = false;
|
|
|
+ let showMember = false;
|
|
|
+ let showStatus = false;
|
|
|
+ let showExecution = false;
|
|
|
+ if (isEdit) {
|
|
|
+ if (
|
|
|
+ (project_status === 0 || project_status === 1) &&
|
|
|
+ (permission['func-01-point-pm-list-change'] || currentUser.IsSuper)
|
|
|
+ ) {
|
|
|
+ showModifyManager = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (audit_status) {
|
|
|
+ //审核拒绝
|
|
|
+ case 2:
|
|
|
+ if (project_status == 0 && canEdit) showEditBtn = true;
|
|
|
+ else if (project_status == 1 && canEdit) {
|
|
|
+ showMember = true;
|
|
|
+ showStatus = true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ //审核通过
|
|
|
+ case 3:
|
|
|
+ switch (project_status) {
|
|
|
+ //售前
|
|
|
+ case 0:
|
|
|
+ if (canEdit) {
|
|
|
+ showMember = true;
|
|
|
+ showExecution = true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ //转执行
|
|
|
+ case 1:
|
|
|
+ if (canEdit) {
|
|
|
+ showMember = true;
|
|
|
+ showStatus = true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ //转运营
|
|
|
+ case 2:
|
|
|
+ case 3:
|
|
|
+ if (canEdit) {
|
|
|
+ showMember = true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return { showModifyManager, showEditBtn, showMember, showStatus, showExecution };
|
|
|
+ }, [currentUser, data, isEdit]);
|
|
|
+ const statusOptions = useMemo(() => {
|
|
|
+ if (!data?.id) return [];
|
|
|
+ const { showStatus, showExecution } = promise;
|
|
|
+ const execution = showExecution ? { value: 11, label: '转执行' } : null;
|
|
|
+ const ops = showStatus ? { value: 21, label: '转运营' } : null;
|
|
|
+ const qualityOperate = showStatus ? { value: 31, label: '转质保' } : null;
|
|
|
+ let subSelectOptions = {
|
|
|
+ 0: [
|
|
|
+ { value: 1, label: '初步交流' },
|
|
|
+ { value: 42, label: '放弃' },
|
|
|
+ { value: 41, label: '失败' },
|
|
|
+ { value: 43, label: '关闭' },
|
|
|
+ ],
|
|
|
+ 1: [
|
|
|
+ { value: 2, label: '预算和方式' },
|
|
|
+ { value: 42, label: '放弃' },
|
|
|
+ { value: 41, label: '失败' },
|
|
|
+ { value: 43, label: '关闭' },
|
|
|
+ ],
|
|
|
+ 2: [
|
|
|
+ { value: 3, label: '招标' },
|
|
|
+ { value: 42, label: '放弃' },
|
|
|
+ { value: 41, label: '失败' },
|
|
|
+ { value: 43, label: '关闭' },
|
|
|
+ ],
|
|
|
+ 3: [
|
|
|
+ { value: 4, label: '中标' },
|
|
|
+ { value: 41, label: '失败' },
|
|
|
+ { value: 43, label: '关闭' },
|
|
|
+ ],
|
|
|
+ 4: [execution, { value: 43, label: '关闭' }],
|
|
|
+ // 11 转执行
|
|
|
+ 11: [ops, qualityOperate, { value: 43, label: '关闭' }],
|
|
|
+ // 21 转运营
|
|
|
+ 21: [qualityOperate, { value: 43, label: '关闭' }],
|
|
|
+ // 31 转质保
|
|
|
+ 31: [{ value: 43, label: '关闭' }],
|
|
|
+ // 41 失败
|
|
|
+ // 42 放弃
|
|
|
+ // 43 关闭
|
|
|
+ };
|
|
|
+
|
|
|
+ return (subSelectOptions[data.status] || []).filter(item => item); // 过滤无权限选项
|
|
|
+ }, [promise]);
|
|
|
+
|
|
|
+ const renderManage = () => {
|
|
|
+ let label = '';
|
|
|
+ if (params.status == 11) {
|
|
|
+ label = '项目经理';
|
|
|
+ } else if (params.status == 21) {
|
|
|
+ label = '运营经理';
|
|
|
+ } else if (params.status == 31) {
|
|
|
+ label = '质保经理';
|
|
|
+ }
|
|
|
+ if (!label) return null;
|
|
|
+ return (
|
|
|
+ <>
|
|
|
+ <Form.Item
|
|
|
+ label={label}
|
|
|
+ name="managerID"
|
|
|
+ rules={[{ required: true, message: `请选择${label}` }]}
|
|
|
+ >
|
|
|
+ <TreeSelect
|
|
|
+ showSearch
|
|
|
+ allowClear
|
|
|
+ style={{ width: '100%' }}
|
|
|
+ placeholder={`请选择${label}`}
|
|
|
+ multiple={false}
|
|
|
+ filterTreeNode={(input, option) => {
|
|
|
+ return option.props.title === input;
|
|
|
+ }}
|
|
|
+ treeData={depUserTree}
|
|
|
+ />
|
|
|
+ </Form.Item>
|
|
|
+ {params.status == 11 && (
|
|
|
+ <Form.Item
|
|
|
+ label="合同状态"
|
|
|
+ name="contractStatus"
|
|
|
+ rules={[{ required: true, message: '请选择合同状态' }]}
|
|
|
+ >
|
|
|
+ <Select style={{ width: '100%' }}>
|
|
|
+ <Option key={0}>无合同</Option>
|
|
|
+ <Option key={1}>有合同</Option>
|
|
|
+ </Select>
|
|
|
+ </Form.Item>
|
|
|
+ )}
|
|
|
+ </>
|
|
|
+ );
|
|
|
+ };
|
|
|
+
|
|
|
+ const showUpload = useMemo(() => {
|
|
|
+ if (!isEdit) return false;
|
|
|
+ if (params.status == 2 || params.status == 3 || params.status == 4 || params.status == 11)
|
|
|
+ return true;
|
|
|
+ }, [params, isEdit]);
|
|
|
+
|
|
|
const initStatueHistory = async id => {
|
|
|
const res = await queryStatusHistory({ id });
|
|
|
if (res.data) setStatusHistory(res.data);
|
|
@@ -91,7 +241,17 @@ function DetailModal(props) {
|
|
|
|
|
|
const handleSubChange = e => {
|
|
|
console.log(e);
|
|
|
- setParams({ ...params, sub_status: e });
|
|
|
+ setParams({ ...params, status: e });
|
|
|
+ };
|
|
|
+
|
|
|
+ const onSave = () => {
|
|
|
+ if (params.status == 11) {
|
|
|
+ // '项目经理'
|
|
|
+ } else if (params.status == 21) {
|
|
|
+ // '运营经理'
|
|
|
+ } else if (params.status == 31) {
|
|
|
+ // '质保经理'
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
const uploadProps = {
|
|
@@ -110,9 +270,8 @@ function DetailModal(props) {
|
|
|
},
|
|
|
};
|
|
|
|
|
|
- const renderDetail = () => (
|
|
|
- <>
|
|
|
- <div className={styles.subTitle}>项目详情</div>
|
|
|
+ const renderDetail = () => {
|
|
|
+ return (
|
|
|
<Form labelCol={{ span: 4 }} wrapperCol={{ span: 18 }}>
|
|
|
<Form.Item className={styles.formItem} label="项目名称">
|
|
|
{data.project_name}
|
|
@@ -141,9 +300,9 @@ function DetailModal(props) {
|
|
|
</Form.Item>
|
|
|
</>
|
|
|
)}
|
|
|
- <Form.Item className={styles.formItem} label="售前项目经理">
|
|
|
- {!isEdit && data.AuthorUser ? (
|
|
|
- data.AuthorUser.CName
|
|
|
+ <Form.Item className={styles.formItem} label="项目经理">
|
|
|
+ {!promise.showModifyManager ? (
|
|
|
+ data.AuthorUser?.CName
|
|
|
) : (
|
|
|
<TreeSelect
|
|
|
defaultValue={data.AuthorUser?.CName}
|
|
@@ -185,16 +344,18 @@ function DetailModal(props) {
|
|
|
<Form.Item className={styles.formItem} label="现阶段状态">
|
|
|
{isEdit ? (
|
|
|
<Select
|
|
|
- defaultValue={SUB_STATUS[0].label}
|
|
|
+ // defaultValue={SUB_STATUS[0].label}
|
|
|
+ placeholder={SUB_STATUS.find(item => item.value == data?.status)?.label}
|
|
|
style={{ width: '60%' }}
|
|
|
onChange={handleSubChange}
|
|
|
- options={data?.status || data?.status == 0 ? subSelectOptions[data?.status] : []}
|
|
|
+ options={statusOptions}
|
|
|
/>
|
|
|
) : (
|
|
|
SUB_STATUS.find(item => item.value == data?.status)?.label
|
|
|
)}
|
|
|
</Form.Item>
|
|
|
- {isEdit && data?.status >= 0 && data?.status <= 4 && (
|
|
|
+ {renderManage()}
|
|
|
+ {showUpload && (
|
|
|
<Form.Item className={styles.formItem} label="上传文件">
|
|
|
<Upload {...uploadProps}>
|
|
|
<Button icon={<UploadOutlined />}>上传文件</Button>
|
|
@@ -202,14 +363,16 @@ function DetailModal(props) {
|
|
|
</Form.Item>
|
|
|
)}
|
|
|
<Form.Item className={styles.formItem} label="项目规模">
|
|
|
- <TableRender
|
|
|
- onlyShow={true}
|
|
|
- value={'[{"type":"UF","scale":"10"},{"type":"RO","scale":"20"}]'}
|
|
|
- />
|
|
|
+ <TableRender onlyShow={true} value={data.process_info} />
|
|
|
+ </Form.Item>
|
|
|
+ <Form.Item>
|
|
|
+ <Button type="primary" onClick={onSave}>
|
|
|
+ 保存
|
|
|
+ </Button>
|
|
|
</Form.Item>
|
|
|
</Form>
|
|
|
- </>
|
|
|
- );
|
|
|
+ );
|
|
|
+ };
|
|
|
|
|
|
const flow = useMemo(() => {
|
|
|
if (!data.flow_id) return {};
|
|
@@ -253,7 +416,7 @@ function DetailModal(props) {
|
|
|
{/* {data.audit_status != 0 && renderAuth()} */}
|
|
|
<Tabs defaultActiveKey="1">
|
|
|
<Tabs.TabPane tab="成员管理" key="1">
|
|
|
- <MemberModal isEdit={isEdit} currentItem={data} />
|
|
|
+ <MemberModal isEdit={promise.showMember} currentItem={data} />
|
|
|
</Tabs.TabPane>
|
|
|
<Tabs.TabPane tab="审核详情" key="2">
|
|
|
{renderAuth()}
|