Jelajahi Sumber

fix:
1.数据集设计报错BUG、
2.指标库BUG
3.指标列表显示发布状态,
4.根据状态控制取消发布按钮,
5.修正发布状态筛选条件参数
6.业务限定回显

WanRuixiang 9 bulan lalu
induk
melakukan
4bd1a6d308

+ 4 - 4
src/app/components/LogicPanel.jsx

@@ -15,7 +15,7 @@ const component = forwardRef(({
     const display = ( index !== (count-1) )
     if (display){
       return <ProFormSegmented
-        name="condition"
+        name="relation"
         fieldProps={{style:{marginLeft:"50%"}}}
         initialValue="and"
         valueEnum={{
@@ -58,7 +58,7 @@ const component = forwardRef(({
     <Container ref={ref}>
       <CustomFromList
         min={1}
-        name="attributes"
+        name="filters"
         wrapperCol={{span:24}}
         creatorButtonProps={{
           creatorButtonText: t("operation.attributes")
@@ -75,14 +75,14 @@ const component = forwardRef(({
         <ProFormGroup key="group">
           <ProFormSelect
             width="sm"
-            name="fields"
+            name="bizName"
             placeholder={t("placeholder.fields")}
             rules={[{ required: true }]}
             options={fields}
           />
           <ProFormSelect
             width="sm"
-            name="logic"
+            name="operator"
             placeholder={t("placeholder.logic")}
             rules={[{ required: true }]}
             valueEnum={LOGIC_TYPE}

+ 4 - 0
src/app/components/WorkFlow/constants.jsx

@@ -77,6 +77,10 @@ export const ACTION_TYPES = {
       key: 'disPublish',
       label: "取消发布"
     },
+    {
+      key: 'publish',
+      label: "发布指标"
+    },
     {
       key: 'remove',
       label: "删除"

+ 5 - 0
src/app/constants.js

@@ -50,6 +50,11 @@ export const STATUS_TYPE = {
   1:"生效"
 }
 
+export const PUBLISH_TYPE = {
+  0:"未发布",
+  1:"已发布"
+}
+
 export const TYPE_ENUM ={
   METRIC:"METRIC",
   DIMENSION:"DIMENSION",

+ 1 - 1
src/app/hooks/useWorkFlow.js

@@ -88,7 +88,7 @@ export function useWorkFlow() {
   };
 
   // 数据集模型->节点回显
-  const modalToNodes = (data,len,checkList)=>{
+  const modalToNodes = (data,len,checkList=[])=>{
     const {id,name,dimensions,metrics} = data;
     const insertFields = [...metrics,...dimensions];
 

+ 25 - 14
src/app/pages/ConditionPage/BizConditionForm.jsx

@@ -1,4 +1,4 @@
-import {forwardRef, memo, useCallback, useState} from 'react'
+import {forwardRef, memo, useCallback, useEffect, useRef, useState} from 'react'
 import {
   ProCard,
   ProForm,
@@ -18,14 +18,23 @@ import useI18NPrefix from "../../hooks/useI18NPrefix";
 const formLayoutType = "horizontal";
 
 const component = forwardRef(({
+  data,
   onSubmit
 },ref) => {
   const t = useI18NPrefix('global');
   const dispatch = useAppDispatch();
   const domains = useAppSelector(selectDomains);
   const modals = useAppSelector(selectModals);
-  const [tab, setTab] = useState('tab1');
+  const [tab, setTab] = useState('logic');
   const [modalDetail, setModalDetail] = useState();
+  const editorRef = useRef(null);
+
+  useEffect(()=>{
+    if (data){
+      onDomainChange(data.domainId)
+      onModalChange(data.modelId)
+    }
+  },[data])
 
   const onDomainChange = useCallback((domainId) => {
     dispatch(getAllModals({domainId}))
@@ -40,17 +49,24 @@ const component = forwardRef(({
     }))
   },[])
 
-  const onFinish = useCallback((values)=>{
+  const onEditorChange=(str)=>{
+    editorRef.current=str
+  }
+
+  const onFinish = (values)=>{
     onSubmit({
+      id: data?.id,
+      type:tab,
       ...values,
-      defaultConfig:""
+      defaultConfig:editorRef.current
     })
-  },[])
+  }
 
   return (
     <>
       <ProForm
         formRef={ref}
+        initialValues={data}
         layout={formLayoutType}
         onFinish={onFinish}
         labelCol={{ span: 4 }}
@@ -63,11 +79,6 @@ const component = forwardRef(({
             label={t("formItem.ruleName")}
             rules={[{ required: true }]}
           />
-          <ProFormText
-            name="code"
-            label={t("formItem.ruleCode")}
-            rules={[{ required: true }]}
-          />
           <ProFormText
             name="english"
             label={t("formItem.english")}
@@ -78,7 +89,7 @@ const component = forwardRef(({
             label={t("formItem.description")}
             placeholder={t("placeholder.description")}
           />
-          <ProFormDatePicker name="startDate" label={t("formItem.startDate")} rules={[{ required: true }]} width="100%"/>
+          <ProFormDatePicker name="startDate" label={t("formItem.startDate")} rules={[{ required: true }]} width="100%" initialValue={new Date}/>
           <ProFormDatePicker name="stopDate" label={t("formItem.stopDate")} width="100%"/>
         </Card>
 
@@ -107,14 +118,14 @@ const component = forwardRef(({
                   activeKey: tab,
                   items: [
                     {
-                      key: 'tab1',
+                      key: 'logic',
                       label: t("operation.fieldsConfig"),
                       children: <LogicPanel options={modalDetail}/>,
                     },
                     {
-                      key: 'tab2',
+                      key: 'custom',
                       label: t("operation.customScript"),
-                      children: <CodeEditor value='123' onEditorChange={console.log} width="100%" height="480"/>,
+                      children: <CodeEditor value={data?.defaultConfig} onEditorChange={onEditorChange} width="100%" height="480"/>,
                     }
                   ],
                   onChange: (key) => {

+ 28 - 18
src/app/pages/ConditionPage/index.jsx

@@ -7,7 +7,7 @@ import {columnsFactory} from '../../../utils/columnsFactory.jsx';
 import {BizConditionForm} from './BizConditionForm';
 import {ProTableDefault, STATUS_TYPE} from '../../constants.js';
 import {useAppDispatch, useAppSelector} from "../../../redux/configureStore";
-import {createCondition, getConditions, getDomains} from "../MainPage/slice/thunks";
+import {createCondition, deleteCondition, getConditions, getDomains} from "../MainPage/slice/thunks";
 import {selectConditions} from "../MainPage/slice/selectors";
 import {bizConditionToSQL} from "../../../utils/listTools";
 import useI18NPrefix from "../../hooks/useI18NPrefix";
@@ -21,17 +21,11 @@ export const ConditionManage = () => {
     },
     {
       title: t("columns.bizRuleCode"),
-      dataIndex: 'code',
-    },
-    {
-      title: t("columns.status"),
-      dataIndex: 'status',
-      valueType: 'select',
-      valueEnum: STATUS_TYPE,
+      dataIndex: 'defaultConfig',
     },
     {
       title: t("columns.bizRuleDesc"),
-      dataIndex: 'desc',
+      dataIndex: 'description',
     },
     {
       title: t("columns.english"),
@@ -40,7 +34,13 @@ export const ConditionManage = () => {
     {
       title: t("columns.index_s"),
       dataIndex: 'index_s',
-    }
+    },
+    {
+      title: t("columns.status"),
+      dataIndex: 'status',
+      valueType: 'select',
+      valueEnum: STATUS_TYPE,
+    },
   ]
   const dispatch = useAppDispatch();
   const formRef = useRef();
@@ -66,7 +66,8 @@ export const ConditionManage = () => {
   const getColumns = () => {
     const columnInfo = columnsFactory({
       dataSource: baseColumns,
-      onEdit:handleEdit
+      onEdit:handleEdit,
+      onDelete:handleDelete
     })
     setColumns(columnInfo)
   };
@@ -77,18 +78,27 @@ export const ConditionManage = () => {
     setOpen(true)
   };
 
+  /** 打开 新增、编辑 对话框 */
+  const handleDelete=(row,reload)=>{
+    dispatch(deleteCondition({
+      id:row?.id,
+      resolve(){
+        message.success(t("validation.success"))
+        reload()
+      }
+    }))
+
+  };
+
   /** 提交表单 */
   const onSubmit = useCallback(
     (values)=> {
-      // 组织数据
-      const {attributes,name,domainId,modelId} = values;
-      const defaultConfig = bizConditionToSQL(attributes);
+      console.log(values)
+      const defaultConfig = values?.type==="logic" ? bizConditionToSQL(values?.filters) :values?.defaultConfig
       const params = {
+        ...values,
         status:1,
         defaultConfig,
-        name,
-        modelId,
-        domainId
       }
       dispatch(createCondition({
         params,
@@ -111,7 +121,7 @@ export const ConditionManage = () => {
           await dispatch(getConditions({params}))
         }}
         pagination={{
-          pageSize: 5,
+          pageSize: 20,
           onChange: (page) => console.log(page),
         }}
         toolBarRender={() => [

+ 1 - 1
src/app/pages/IndexDefine/components/IndexFilterForm.jsx

@@ -68,7 +68,7 @@ const component = forwardRef(({
         placeholder={t("formItem.status")}
       />
       <ProFormSelect
-        name="publish"
+        name="isPublish"
         valueEnum={PUBLISH_STATUS}
         placeholder={t("formItem.publish")}
       />

+ 40 - 13
src/app/pages/IndexDefine/index.jsx

@@ -12,7 +12,7 @@ import {IndexCreator} from "./components/IndexCreator";
 import {IndexDetail} from "./components/IndexDetail";
 import {DEFINE_TYPE, FORM_TYPE, SEN_COLOR_LEVEL, SENSITIVE, STATUS_COLOR_LEVEL} from "./constants";
 import {IndexFilterForm} from "./components/IndexFilterForm";
-import {AUTH_TYPE, STATUS_TYPE, TYPE_ENUM} from "../../constants";
+import {AUTH_TYPE, PUBLISH_TYPE, STATUS_TYPE, TYPE_ENUM} from "../../constants";
 import {ACTION_TYPES} from "../../components/WorkFlow/constants";
 import {AuthorizationPanel} from "./components/AuthorizationPanel";
 import {VolumeAuthPanel} from "./components/VolumeAuthPanel";
@@ -39,7 +39,7 @@ import {
 } from "../MainPage/slice/thunks";
 import useI18NPrefix from "../../hooks/useI18NPrefix";
 
-// TODO 模型的SQL预览
+// TODO 模型的SQL预览、复合指标工具栏、数据集基本信息修改
 
 export const IndexDefine = () => {
   const t = useI18NPrefix('global');
@@ -189,7 +189,6 @@ export const IndexDefine = () => {
 
   /** 筛选表单提交 */
   const onFilterFormFinish = useCallback((filter)=>{
-    console.log(filter)
     dispatch(getIndexByConditions({
       params:{
         domainIds: [commonRef.current.treeSelect.id],
@@ -400,6 +399,17 @@ export const IndexDefine = () => {
     setOpenDetail(false)
   },[]);
 
+  /** 查询指标 */
+  const getMetrics = (domainIds)=>{
+    dispatch(getIndexByConditions({
+      params:{
+        domainIds:[domainIds],
+        current:1,
+        pageSize:999
+      },
+    }))
+  }
+
 
   /** 卡片Extra选项回调 */
   const onExtraSelect =(event,item)=>{
@@ -479,17 +489,32 @@ export const IndexDefine = () => {
         params:{
           ids:[id],
           type:"DELETE",
-          // bizNames:[],
-          // modelIds:[],
-          // classifications:[],
-          // sensitiveLevel:0,
-          // status:0,
         },
-        resolve(data){
+        resolve(){
+          getMetrics(commonRef.current.treeSelect.id)
           message.success(t("validation.success"));
         }
       }))
     }
+
+    // 发布指标
+    if (event.key==="publish"){
+      dispatch(batchPublish({
+        params:{
+          ids:[id],
+          status:1,
+          type:"ADD",
+        },
+        resolve(data){
+          if (data){
+            getMetrics(commonRef.current.treeSelect.id)
+            message.success(t("validation.success"));
+          }else {
+            message.error(t("validation.failed"))
+          }
+        }
+      }))
+    }
   }
 
   /** 指标列表 */
@@ -501,7 +526,7 @@ export const IndexDefine = () => {
       extra:[
         <ActionIcon
           key={2}
-          items={ACTION_TYPES.CHECK}
+          items={ACTION_TYPES.CHECK.filter(opt=>item.isPublish?opt.key!=="publish":opt.key!=="disPublish")}
           onSelect={(event)=>onExtraSelect(event,item)}
         >
           <Button type="link" ><MoreOutlined rotate={90} style={{fontSize:25}}/></Button>
@@ -518,6 +543,7 @@ export const IndexDefine = () => {
           <Descriptions.Item label={t("formItem.director")}>{item.createdBy}</Descriptions.Item>
           <Descriptions.Item label={t("formItem.creator")}>{item.createdBy}</Descriptions.Item>
           <Descriptions.Item label={t("formItem.createDate")}>{moment(item.createdAt).format('YYYY-MM-DD hh:mm:ss')}</Descriptions.Item>
+          <Descriptions.Item label={t("formItem.isPublish")} contentStyle={{color:STATUS_COLOR_LEVEL[item.isPublish]}} children={PUBLISH_TYPE[item.isPublish]}/>
         </Descriptions>
       )
     })),[indexLib])
@@ -546,7 +572,7 @@ export const IndexDefine = () => {
   const onAuthConfigChange=useCallback((e)=>{},[])
   /** 批量发布按钮回调*/
   const onVolumePublish = useCallback(()=>{
-    const {indexChosen} = commonRef.current
+    const {indexChosen,treeSelect} = commonRef.current
     const params = {
       ids:indexChosen.map(item=>item.id),
       status:1,
@@ -556,6 +582,7 @@ export const IndexDefine = () => {
       params,
       resolve(data){
         if (data){
+          getMetrics(treeSelect.id)
           message.success(t("validation.success"));
         }else {
           message.error(t("validation.failed"))
@@ -671,9 +698,9 @@ export const IndexDefine = () => {
         bordered
         headerBordered
         colSpan="20%"
-        title={t("title.dataset")}
+        title={t("title.domain")}
         style={{height:'85vh'}}
-        extra={<ExtraLink onClick={handelDomainFormOpen}>+{t("button.domainCreate")}</ExtraLink>}
+        // extra={<ExtraLink onClick={handelDomainFormOpen}>+{t("button.domainCreate")}</ExtraLink>}
       >
         <TreeMenu
           onRightClick={onRightClick}

+ 4 - 3
src/app/pages/IndexLibraryPage/index.jsx

@@ -25,7 +25,7 @@ import {
 import {IndexDetail} from "../IndexDefine/components/IndexDetail";
 import useMount from "../../hooks/useMount";
 import {useWorkFlow} from "../../hooks/useWorkFlow";
-import {STATUS_TYPE} from "../../constants";
+import {PUBLISH_TYPE, STATUS_TYPE} from "../../constants";
 import CollectButton from "../../components/CollectButton";
 import {selectCurrentUser} from "../../slice/selectors";
 import useI18NPrefix from "../../hooks/useI18NPrefix";
@@ -120,7 +120,7 @@ export const IndexLibraryPage = () => {
 
   /** 指标列表 */
   const cardOption = useMemo(()=>
-    indexLib.map((item)=>({
+    (indexLib||[]).map((item)=>({
       title: item.name,
       tag:FORM_TYPE[item.type],
       value:item.id,
@@ -137,6 +137,7 @@ export const IndexLibraryPage = () => {
           <Descriptions.Item label={t("formItem.director")}>{item.createdBy}</Descriptions.Item>
           <Descriptions.Item label={t("formItem.creator")}>{item.createdBy}</Descriptions.Item>
           <Descriptions.Item label={t("formItem.createDate")}>{moment(item.createdAt).format('YYYY-MM-DD hh:mm:ss')}</Descriptions.Item>
+          <Descriptions.Item label={t("formItem.isPublish")} contentStyle={{color:STATUS_COLOR_LEVEL[item.isPublish]}} children={PUBLISH_TYPE[item.isPublish]}/>
         </Descriptions>
       )
     }))
@@ -178,7 +179,7 @@ export const IndexLibraryPage = () => {
         values={commonRef.current.indexDetail}
       />
       {/** 左侧的主题与目录 */}
-      <ProCard bordered headerBordered colSpan="20%" title={t("title.dataset")} style={{height:'85vh'}}>
+      <ProCard bordered headerBordered colSpan="20%" title={t("title.domain")} style={{height:'85vh'}}>
         <TreeMenu treeData={domains} onSearch={onSearch} onSelect={onSelect}/>
       </ProCard>
       {/** 主面板 */}

+ 1 - 1
src/app/pages/MainPage/constants.jsx

@@ -123,7 +123,7 @@ export const router = {
         },
         {
           path: 'basic',
-          name: '基础字典',
+          name: '授权管理',
           routes: [
             {
               path: 'user',

+ 14 - 0
src/app/pages/MainPage/slice/thunks.js

@@ -338,6 +338,19 @@ export const createCondition = createAsyncThunk(
   },
 );
 
+/** 删除业务限定 */
+export const deleteCondition = createAsyncThunk(
+  'main/deleteCondition',
+  async ({id,resolve}) => {
+    const {data} = await request({
+      url: `/semantic/condition/delete/`+id,
+      method:"POST",
+    })
+    resolve && resolve(data)
+    return data
+  },
+);
+
 /** 根据参数获取指标列表 */
 export const getConditions = createAsyncThunk(
   'main/getConditions',
@@ -369,6 +382,7 @@ export const createDataSet = createAsyncThunk(
   },
 );
 
+
 /** 获取数据集详情 */
 export const getDataSet = createAsyncThunk(
   'main/getDataSet',

+ 2 - 1
src/locales/en/translation.json

@@ -267,7 +267,8 @@
       "expr": "Expression",
       "invokeMethod": "Invoke Method",
       "dateFormat": "Date Format",
-      "relation": "Relation"
+      "relation": "Relation",
+      "isPublish": "Published"
     },
     "placeholder": {
       "input": "Please input",

+ 2 - 1
src/locales/ko/translation.json

@@ -267,7 +267,8 @@
       "expr": "표현식",
       "invokeMethod": "호출 방식",
       "dateFormat": "날짜 형식",
-      "relation": "연관 관계"
+      "relation": "연관 관계",
+      "isPublish": "发布状态"
     },
     "placeholder": {
       "input": "입력하세요",

+ 2 - 1
src/locales/zh/translation.json

@@ -267,7 +267,8 @@
       "expr": "表达式",
       "invokeMethod": "调用方式",
       "dateFormat": "日期格式",
-      "relation": "关联关系"
+      "relation": "关联关系",
+      "isPublish": "发布状态"
     },
     "placeholder": {
       "input": "请输入",

+ 8 - 8
src/utils/listTools.js

@@ -84,18 +84,18 @@ export function bizConditionToSQL(attributes) {
   let defaultConfig = "";
   if (attributes){
     for (let i = attributes.length - 1; i >= 0; i--) {
-      const {value,logic,fields,condition} = attributes[i];
-      if (fields && logic && value){
-        const cdt = attributes.length>1&&condition?condition:""
-        if (LOGIC_TYPE[logic]==="包含" || LOGIC_TYPE[logic]==="不包含"){
-          defaultConfig +=` ${cdt} ${fields} ${logic} '%${value}%'`
+      const {value,operator,bizName,relation} = attributes[i];
+      if (bizName && operator && value){
+        const cdt = attributes.length>1&&relation?relation:""
+        if (LOGIC_TYPE[operator]==="包含" || LOGIC_TYPE[operator]==="不包含"){
+          defaultConfig +=` ${cdt} ${bizName} ${operator} '%${value}%'`
           continue
         }
-        if (LOGIC_TYPE[logic]==="为空"||LOGIC_TYPE[logic]==="不为空"){
-          defaultConfig +=` ${cdt} ${fields} ${logic}`
+        if (LOGIC_TYPE[operator]==="为空"||LOGIC_TYPE[operator]==="不为空"){
+          defaultConfig +=` ${cdt} ${bizName} ${operator}`
           continue
         }
-        defaultConfig +=` ${cdt} ${fields} ${logic} ${value} `
+        defaultConfig +=` ${cdt} ${bizName} ${operator} ${value} `
       }
     }
   }