UNPKG

@bos-alpha/progress

Version:

进度管理

408 lines (407 loc) 21.7 kB
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } return cooked; }; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useEffect, useState } from 'react'; import { Select, Row, Col, Button, message } from 'antd'; import { BOS3DViewer, prefixCls, cookieModelDb } from '@bos-alpha/common'; import * as services from '@bos-alpha/common/lib/services'; import { CptInfo } from './cpt-info'; import { getModelWithTag } from '../data'; import styled from '@emotion/styled'; var Option = Select.Option; // 可选择显示面板 var dataPanel = [ { label: '进度模型', value: 'model3d' }, { label: '进度模拟数据面板', value: 'tasks' }, { label: '进度模拟甘特图面板', value: 'gantt' } ]; // 模型状态选择按钮 var modelStatusBtns = [ { title: '正在进行', color: '#35ff12' }, { title: '计划已完成', color: '#5bfffc' }, { title: '提前完成', color: '#fffc08' }, { title: '延期完成', color: '#ff4097' }, { title: '延期未完成', color: '#ff0403' }, { title: '显示所有', color: '' } ]; export var Model3d = function (_a) { var tableData = _a.tableData, // 当前模拟时间 curSimuTime = _a.curSimuTime, onPanelChange = _a.onPanelChange; // 模块显隐 var _b = useState(['model3d', 'tasks', 'gantt']), modules = _b[0], setModules = _b[1]; var _c = useState([]), modelList = _c[0], setModelList = _c[1]; // 当前模型 var _d = useState([]), modelKey = _d[0], setModelKey = _d[1]; // 构件信息 点击构件的时候 解析构件信息 var _e = useState([]), cptInfo = _e[0], setCptInfo = _e[1]; // 选择的构件key var _f = useState(), cptKey = _f[0], setCptKey = _f[1]; // 所有任务已关联的构件信息 var _g = useState([]), cptLinkedList = _g[0], setCptLinkedList = _g[1]; // 模型加载完毕 var _h = useState(false), modelLoaded = _h[0], setModelLoaded = _h[1]; // 构件状态颜色值 var _j = useState(''), curStatusColor = _j[0], setCurStatusColor = _j[1]; // 当前模型所有构件key 在模型加载完毕以后获取 var _k = useState([]), modelCptKeys = _k[0], setModelCptKeys = _k[1]; // 正在获取构件信息 var _l = useState(false), fetching = _l[0], setFetching = _l[1]; useEffect(function () { fetchModels(); }, []); // eslint-disable-line react-hooks/exhaustive-deps // 获取所有模型 var fetchModels = function () { return __awaiter(void 0, void 0, void 0, function () { var models, modelKeys, modelDb, parseRes; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, getModelWithTag()]; case 1: models = _a.sent(); setModelList(models); if (!(models.length > 0 && models[0].modelKey)) return [3 /*break*/, 3]; modelKeys = [models[0].modelKey]; modelDb = cookieModelDb(); return [4 /*yield*/, services.queryResAnalysis(modelDb, { data: { models: modelKeys } })]; case 2: parseRes = _a.sent(); if (parseRes[0] && parseRes[0].status === '3') { setModelKey(modelKeys); } _a.label = 3; case 3: return [2 /*return*/]; } }); }); }; // 根据任务wbskey获取已关联的构件信息 useEffect(function () { if (tableData.length === 0) return; // 获取有实际开始时间的任务key var loop = function (list) { var keys = []; list.forEach(function (item) { // hasTags有关联构件信息 才去查啊 if (item.startTime && item.hasTags) { keys = __spreadArray(__spreadArray([], keys, true), [item.key], false); } if (item.children) { keys = __spreadArray(__spreadArray([], keys, true), loop(item.children), true); } }); return keys; }; loop(tableData); // 改为批量查询 services .linkedQuery({ data: { condition: [ { bosclass: 'wbses', alias: 'w' }, { bosclass: 'tags', alias: 't' }, { bosclass: 'irTagWbs', alias: 'wbs', type: 'relationship', from: 't', to: 'w' } ], select: { wbs: 'w', tag: 't', gcomponents: 'gcomponents' } } }) .then(function (res) { var cptList = res.data.map(function (item) { return __assign(__assign({}, item.tag), { key: item.tag._key, gcomponents: item.gcomponents, startTime: item.wbs.startTime || 0, endTime: item.wbs.endTime || 0, progress: item.wbs.progress || 0, planStartTime: item.wbs.planStartTime || 0, planEndTime: item.wbs.planEndTime || 0 }); }); setCptLinkedList(cptList); }); }, [tableData]); // 模型加载完毕 且 构件信息获取完毕 且 有任务当前时间 设置构件颜色 useEffect(function () { if (!modelLoaded) return; if (curSimuTime === 0) return; // 收集已经被染色的key 未被染色的部分要隐藏 var colorfulKey = []; if (cptLinkedList.length > 0) { var cptsWithStatus = cptLinkedList.map(function (item) { var curModelKey = (item.gcomponents[0] && item.gcomponents[0].modelKey) || ''; if (curModelKey && item.startTime > 0 && curModelKey === modelKey[0]) { var componentKeys = item.gcomponents.map(function (item) { return item.componentKey; }); var color = ''; // 正在进行 if (item.startTime <= curSimuTime) { color = '#35ff12'; } // 计划已完成(严格按计划完成) if (item.endTime === item.planEndTime && item.endTime <= curSimuTime) { color = '#5bfffc'; } // 提前完成 if (item.endTime > 0 && item.endTime < item.planEndTime && item.endTime <= curSimuTime) { color = '#fffc08'; } // 延期完成 if (item.endTime > item.planEndTime && item.endTime <= curSimuTime) { color = '#ff4097'; } // 延期未完成 if (item.startTime && !item.endTime && item.planEndTime < curSimuTime) { color = '#ff0403'; } // 未指定状态则根据时间轴显示不同状态的构件颜色 // 或 已指定状态则只设置当前状态的构件颜色 if ((!curStatusColor && color) || (curStatusColor && curStatusColor === color)) { colorfulKey.push.apply(colorfulKey, componentKeys); } item.color = color; item.componentKeys = componentKeys; } return item; }); // console.log('这些构件设置颜色', colorfulKey, color); cptsWithStatus.forEach(function (item) { if (item.color && item.componentKeys && item.componentKeys.length > 0) { // 重置透明度(不重置透明度设置颜色有点问题) window.viewer3D.closeTransparentComponentsByKey(item.componentKeys); // 设置构件颜色 window.viewer3D.colorfulComponentsByKey(item.componentKeys, item.color); } }); } // 从模型构件中获取所有构件key 找出未高亮的构件置灰(半透明) if (modelCptKeys.length > 0 && colorfulKey.length > 0) { var hideKeys = modelCptKeys.filter(function (cptkey) { return colorfulKey.indexOf(cptkey) < 0; }); // 未高亮(未到播放进度)的构件设置为隐藏 // console.log('这些构件置灰', hideKeys); window.viewer3D.setComponentsOpacityState(hideKeys, window.BOS3D.EnumTransparentState.TRANSLUCENT); } }, [modelLoaded, cptLinkedList, curSimuTime]); // eslint-disable-line react-hooks/exhaustive-deps // 点击构件 获取构件信息 var fetchCptInfo = function (obj) { return __awaiter(void 0, void 0, void 0, function () { var key, modelDb, res, attr_1, cpts, err_1; return __generator(this, function (_a) { switch (_a.label) { case 0: key = obj.selectedObjectId; if (!key) return [3 /*break*/, 5]; setCptKey(key); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); setFetching(true); modelDb = cookieModelDb(); return [4 /*yield*/, services.getCptInfo(modelDb, { params: { componentKey: key } })]; case 2: res = _a.sent(); attr_1 = res.attribute || {}; cpts = Object.keys(attr_1).map(function (title) { return { title: title, item: Object.keys(attr_1[title]).map(function (_key) { var _a; return (_a = { title: _key }, _a[_key] = typeof attr_1[title][_key] === 'object' ? JSON.stringify(attr_1[title][_key]) : attr_1[title][_key], _a); }) }; }); setCptInfo(cpts); setFetching(false); return [3 /*break*/, 4]; case 3: err_1 = _a.sent(); console.log('error: ', err_1); setFetching(false); return [3 /*break*/, 4]; case 4: return [3 /*break*/, 6]; case 5: setFetching(false); setCptKey(''); setCptInfo([]); _a.label = 6; case 6: return [2 /*return*/]; } }); }); }; // 获取所有构件key var getModelCptKeys = function (e) { var allCptKeys = window.viewer3D.getAllComponentsKey(); setModelCptKeys(allCptKeys); // window.viewer3D.setComponentsOpacityState( // allCptKeys, // window.BOS3D.EnumTransparentState.TRANSLUCENT // ); }; return (_jsxs(Container, { children: [_jsxs(SelectorCard, { children: [_jsx(Select, __assign({ className: "select-model-list", value: modelKey[0], showSearch: true, filterOption: function (input, option) { return option.label .toLowerCase() .includes(input.toLowerCase()); }, onChange: function (val) { return __awaiter(void 0, void 0, void 0, function () { var modelDb, res; return __generator(this, function (_a) { switch (_a.label) { case 0: modelDb = cookieModelDb(); return [4 /*yield*/, services.queryResAnalysis(modelDb, { data: { models: [val] } })]; case 1: res = _a.sent(); if (res[0] && res[0].status >= 0 && res[0].status < 3) { message.error('模型正在解析中'); } else if (res[0] && res[0].status === '-1') { message.error('模型解析失败'); } else if (res[0] && res[0].status === '3') { setCptKey(''); setCptInfo([]); setModelKey([val]); } return [2 /*return*/]; } }); }); } }, { children: modelList.map(function (option, index) { return (_jsx(Option, __assign({ title: option.modelName, value: option.modelKey }, { children: _jsxs(ModelOption, { children: [_jsx("span", __assign({ className: "model-name" }, { children: option.modelName }), void 0), _jsxs("span", { children: [option.folder, "/"] }, void 0)] }, void 0) }), index)); }) }), void 0), _jsx(Select, { className: "select-panel", mode: "multiple", defaultValue: modules, options: dataPanel, onChange: function (keys) { setModules(keys); onPanelChange(keys); } }, void 0)] }, void 0), _jsxs(Row, __assign({ className: "bos3d-cptinfo", style: { display: modules.indexOf('model3d') < 0 ? 'none' : '' } }, { children: [_jsx(Col, __assign({ span: 19 }, { children: _jsx(BOS3DViewer, { modelKey: modelKey, onLoadV3d: function (viewer3d) { console.log('onLoadV3d'); }, onLoadStart: function () { console.log('onLoadStart'); setModelLoaded(false); }, onLoadComplete: function (modelInfo) { console.log('onLoadComplete'); setModelLoaded(true); getModelCptKeys(modelInfo); }, onClickPick: function (obj) { return fetchCptInfo(obj); } }, void 0) }), void 0), _jsx(Col, __assign({ span: 5 }, { children: _jsx(CptInfo, { cptKey: cptKey, fetching: fetching, cptInfoList: cptInfo }, void 0) }), void 0)] }), void 0), _jsx(StatusBtns, { children: modelStatusBtns.map(function (item, index) { return (_jsx(Button, __assign({ className: item.color === curStatusColor ? 'active' : '', style: item.color ? { backgroundColor: item.color } : {}, onClick: function () { return setCurStatusColor(item.color); } }, { children: item.title }), index)); }) }, void 0)] }, void 0)); }; var Container = styled.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n .bos3d-cptinfo {\n padding: 20px 0;\n }\n"], ["\n .bos3d-cptinfo {\n padding: 20px 0;\n }\n"]))); var SelectorCard = styled.div(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n text-align: right;\n .select-model-list {\n text-align: left;\n width: 260px;\n margin-right: 10px;\n }\n .select-panel {\n width: 500px;\n }\n"], ["\n text-align: right;\n .select-model-list {\n text-align: left;\n width: 260px;\n margin-right: 10px;\n }\n .select-panel {\n width: 500px;\n }\n"]))); var StatusBtns = styled.div(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n display: flex;\n justify-content: flex-end;\n .", "-btn {\n border-radius: 20px;\n margin: 0 4px;\n }\n .active {\n color: var(--ant-primary-color-active);\n border-color: var(--ant-primary-color-active);\n }\n"], ["\n display: flex;\n justify-content: flex-end;\n .", "-btn {\n border-radius: 20px;\n margin: 0 4px;\n }\n .active {\n color: var(--ant-primary-color-active);\n border-color: var(--ant-primary-color-active);\n }\n"])), prefixCls); var ModelOption = styled.div(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n display: flex;\n justify-content: space-between;\n & > .model-name {\n display: inline-block;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n width: 250px;\n }\n"], ["\n display: flex;\n justify-content: space-between;\n & > .model-name {\n display: inline-block;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n width: 250px;\n }\n"]))); var templateObject_1, templateObject_2, templateObject_3, templateObject_4;