Просмотр исходного кода

feat(merge): merge xyh

fix(bug): #3875、3873、3870、3868、3867、3866
Lind 3 лет назад
Родитель
Сommit
f77015c028

+ 12 - 1
src/components/ProTableCard/CardItems/product.tsx

@@ -5,6 +5,9 @@ import { BadgeStatus } from '@/components';
 import { StatusColorEnum } from '@/components/BadgeStatus';
 import '@/style/common.less';
 import { useIntl } from '@@/plugin-locale/localeExports';
+import { getMenuPathByParams, MENUS_CODE } from '@/utils/menu';
+import { ModelEnum } from '@/pages/device/Product/Detail';
+import { Link } from '@umijs/preset-dumi/lib/theme';
 
 export interface ProductCardProps extends ProductItem {
   actions?: React.ReactNode[];
@@ -43,7 +46,15 @@ export default (props: ProductCardProps) => {
           </div>
           <div className={'card-item-content'}>
             <label>接入方式:</label>
-            <span className={'ellipsis'}>{props.transportProtocol || '--'}</span>
+            <span className={'ellipsis'}>
+              <Link
+                to={`${getMenuPathByParams(MENUS_CODE['device/Product/Detail'], props.id)}?type=${
+                  ModelEnum.access
+                }`}
+              >
+                {props.transportProtocol || '--'}
+              </Link>
+            </span>
           </div>
         </div>
       </div>

+ 48 - 16
src/pages/device/Product/Detail/index.tsx

@@ -28,9 +28,20 @@ import { QuestionCircleOutlined } from '@ant-design/icons';
 import { getMenuPathByCode, MENUS_CODE } from '@/utils/menu';
 import encodeQuery from '@/utils/encodeQuery';
 import SystemConst from '@/utils/const';
+import { useLocation } from 'umi';
+
+export const ModelEnum = {
+  base: 'base',
+  metadata: 'metadata',
+  access: 'access',
+};
 
 const ProductDetail = observer(() => {
   const intl = useIntl();
+  const [mode, setMode] = useState('base');
+  const param = useParams<{ id: string }>();
+  const [loading, setLoading] = useState<boolean>(false);
+  const location = useLocation();
 
   const statusMap = {
     1: {
@@ -62,7 +73,6 @@ const ProductDetail = observer(() => {
       ),
     },
   };
-  const param = useParams<{ id: string }>();
 
   const initMetadata = () => {
     service.getProductDetail(param?.id).subscribe((data) => {
@@ -79,6 +89,14 @@ const ProductDetail = observer(() => {
   };
 
   useEffect(() => {
+    const queryParam = new URLSearchParams(location.search);
+    const _mode = queryParam.get('type');
+    if (_mode) {
+      setMode(_mode);
+    }
+  }, []);
+
+  useEffect(() => {
     const subscription = Store.subscribe(SystemConst.GET_METADATA, () => {
       MetadataAction.clean();
       setTimeout(() => {
@@ -86,7 +104,7 @@ const ProductDetail = observer(() => {
         Store.set(SystemConst.REFRESH_METADATA_TABLE, true);
       }, 300);
     });
-    if (!productModel.current) {
+    if (!param.id) {
       history.goBack();
     } else {
       initMetadata();
@@ -97,8 +115,6 @@ const ProductDetail = observer(() => {
     };
   }, [param.id]);
 
-  const [loading, setLoading] = useState<boolean>(false);
-
   const changeDeploy = useCallback(
     (state: 'deploy' | 'undeploy') => {
       setLoading(true);
@@ -141,7 +157,13 @@ const ProductDetail = observer(() => {
         <Spin spinning={loading}>
           <Descriptions size="small" column={2}>
             <Descriptions.Item label={'设备数量'}>
-              <Link to={getMenuPathByCode(MENUS_CODE['device/Instance'])}>
+              <Link
+                to={
+                  getMenuPathByCode(MENUS_CODE['device/Instance']) +
+                  '?productId=' +
+                  productModel.current?.id
+                }
+              >
                 {' '}
                 {productModel.current?.count || 0}
               </Link>
@@ -151,15 +173,19 @@ const ProductDetail = observer(() => {
       }
       title={productModel.current?.name}
       subTitle={
-        <Switch
-          key={2}
-          checked={productModel.current?.state === 1}
-          checkedChildren="已发布"
-          unCheckedChildren="未发布"
-          onChange={() => {
+        <Popconfirm
+          title={productModel.current?.state === 1 ? '确认取消发布' : '确认发布'}
+          onConfirm={() => {
             changeDeploy(statusMap[productModel.current?.state || 0].action);
           }}
-        />
+        >
+          <Switch
+            key={2}
+            checked={productModel.current?.state === 1}
+            checkedChildren="已发布"
+            unCheckedChildren="未发布"
+          />
+        </Popconfirm>
       }
       extra={[
         <Popconfirm title={'确定应用配置?'} key="1" onConfirm={() => changeDeploy('deploy')}>
@@ -184,13 +210,19 @@ const ProductDetail = observer(() => {
       ]}
     >
       <Card>
-        <Tabs defaultActiveKey="base">
+        <Tabs
+          defaultActiveKey={ModelEnum.base}
+          activeKey={mode}
+          onChange={(key) => {
+            setMode(key);
+          }}
+        >
           <Tabs.TabPane
             tab={intl.formatMessage({
               id: 'pages.device.productDetail.base',
               defaultMessage: '配置信息',
             })}
-            key="base"
+            key={ModelEnum.base}
           >
             <BaseInfo />
           </Tabs.TabPane>
@@ -234,11 +266,11 @@ const ProductDetail = observer(() => {
                 </Tooltip>
               </>
             }
-            key="metadata"
+            key={ModelEnum.metadata}
           >
             <Metadata type="product" />
           </Tabs.TabPane>
-          <Tabs.TabPane tab={'设备接入'} key="access">
+          <Tabs.TabPane tab={'设备接入'} key={ModelEnum.access}>
             <Access />
           </Tabs.TabPane>
           {/* <Tabs.TabPane

+ 0 - 7
src/pages/system/Department/index.tsx

@@ -179,15 +179,8 @@ export default observer(() => {
       parentId: {
         type: 'string',
         title: '上级部门',
-        required: true,
         'x-decorator': 'FormItem',
         'x-component': 'TreeSelect',
-        'x-validator': [
-          {
-            required: true,
-            message: '请选择上级部门',
-          },
-        ],
         'x-component-props': {
           fieldNames: {
             label: 'name',

+ 2 - 1
src/utils/menu/index.ts

@@ -57,7 +57,7 @@ export const handleRoutes = (routes?: MenuItem[], level = 1): MenuItem[] => {
     ? routes.map((item) => {
         const detailComponent = findDetailRoute(item.code, item.url);
         if (detailComponent) {
-          item.children = item.children ? [...item.children, detailComponent] : [detailComponent];
+          item.children = item.children ? [detailComponent, ...item.children] : [detailComponent];
         }
         // eslint-disable-next-line @typescript-eslint/no-unused-vars
         if (item.children) {
@@ -92,6 +92,7 @@ const getRoutes = (extraRoutes: MenuItem[], level = 1): IRouteProps[] => {
             ...flatRoutes,
             {
               path: _route.path,
+              exact: true,
               redirect: redirect,
             },
           ]

+ 1 - 1
src/utils/menu/router.ts

@@ -91,7 +91,7 @@ export const MENUS_CODE = {
   'link/AccessConfig/Detail': 'link/AccessConfig/Detail',
   'system/Menu/Detail': 'system/Menu/Detail',
   'system/Department/Detail': 'system/Department/Detail',
-  '/link/Type/Detail': '/link/Type/Detail',
+  'link/Type/Detail': 'link/Type/Detail',
 };
 
 export const getDetailNameByCode = {