zlisen před 3 roky
rodič
revize
b34bd43dc5

+ 13
- 0
config/routes.js Zobrazit soubor

@@ -73,6 +73,12 @@ export default [
73 73
                 component: './building/Developers/Edit',
74 74
                 menuCode: '/building/Developers/Edit',
75 75
               },
76
+              {
77
+                path: '/building/log',
78
+                name: '编辑日志',
79
+                component: './building/log',
80
+                menuCode: '/building/Developers',
81
+              },
76 82
             ],
77 83
           },
78 84
           {
@@ -600,6 +606,13 @@ export default [
600 606
                 component: './carouselFigure/customImg/edit',
601 607
                 menuCode: '/carouselFigure/customImg/edit',
602 608
               },
609
+              {
610
+                path: '/system/city',
611
+                name: '城市管理',
612
+                // hideInMenu: true,
613
+                component: './system/city',
614
+                menuCode: '/carouselFigure/customImg/edit',
615
+              },
603 616
             ],
604 617
           },
605 618
           {

+ 2
- 2
src/pages/building/Edit/Apartment/Form.jsx Zobrazit soubor

@@ -112,9 +112,9 @@ const AMForm = props => {
112 112
         {getFieldDecorator('apartmentName', {
113 113
           rules: [
114 114
             { required: true, message: '请填写户型名称' },
115
-            { max: 10, message: '户型名称不超过10个字符' },
115
+            { max: 20, message: '户型名称不超过20个字符' },
116 116
           ],
117
-        })(<Input placeholder="户型名称不超过10个字符" />)}
117
+        })(<Input placeholder="户型名称不超过20个字符" />)}
118 118
       </Form.Item>
119 119
       <Form.Item label="销售状态">
120 120
         {getFieldDecorator('marketStatus', {

+ 55
- 0
src/pages/building/log/index.jsx Zobrazit soubor

@@ -0,0 +1,55 @@
1
+import React, { useMemo, useRef, useCallback, useState } from 'react';
2
+import apis from '@/services/apis';
3
+import request from '@/utils/request';
4
+import AuthButton from '@/components/AuthButton';
5
+import QueryTable from '@/components/QueryTable';
6
+import BuildingSelect from '@/components/SelectButton/BuildSelect';
7
+
8
+import { router } from 'umi';
9
+
10
+export default props => {
11
+  const ref = useRef();
12
+
13
+  const searchFields = [
14
+    {
15
+      name: 'buildingId',
16
+      label: '项目',
17
+      placeholder: '请选择项目',
18
+      render: () => <BuildingSelect style={{ width: 160 }} />,
19
+    },
20
+  ];
21
+
22
+  const tableColumns = [
23
+    {
24
+      title: '项目',
25
+      dataIndex: 'buildingName',
26
+      key: 'buildingName',
27
+      align: 'center',
28
+    },
29
+    {
30
+      title: '编辑人',
31
+      dataIndex: 'updateName',
32
+      key: 'updateName',
33
+      align: 'center',
34
+    },
35
+
36
+    {
37
+      title: '编辑时间',
38
+      dataIndex: 'updateTime',
39
+      key: 'updateTime',
40
+      align: 'center',
41
+    },
42
+  ];
43
+
44
+  return (
45
+    <>
46
+      <QueryTable
47
+        ref={ref}
48
+        rowKey="id"
49
+        api={apis.building.logs}
50
+        columns={tableColumns}
51
+        searchFields={searchFields}
52
+      />
53
+    </>
54
+  );
55
+};

+ 43
- 4
src/pages/news/list/compents/Basic.jsx Zobrazit soubor

@@ -8,10 +8,12 @@ import NewsTypeSelect from '@/components/SelectButton/NewTypeSelect';
8 8
 import XForm, { FieldTypes } from '@/components/XForm';
9 9
 import Wangedit from '@/components/Wangedit/Wangedit';
10 10
 import request from '@/utils/request';
11
-
11
+import CitySelect from '@/components/SelectButton/CitySelect2';
12
+import InstitutionSelect from '@/components/SelectButton/InstitutionSelect'
12 13
 const Basic = props => {
13 14
   const { newsId } = props;
14
-
15
+ 
16
+  const [isHaveBuilding, setIsHaveBuilding] = useState(true);
15 17
   const [dynamicData, setDynamicData] = useState({});
16 18
   const [changeBuildingId, setChangeBuildingIdData] = useState('');
17 19
   const [newsDetailType, setNewsDetailType] = useState(1);
@@ -27,8 +29,8 @@ const Basic = props => {
27 29
     request({ ...apis.news.get, urlData: { id: newsId } })
28 30
       .then(data => {
29 31
         setDynamicData(data);
30
-        console.log(data, 'sss');
31 32
         setNewsDetailType(Number(data.newsDetailType));
33
+        setIsHaveBuilding(data.buildingId)
32 34
       })
33 35
       .catch(err => {
34 36
         console.log(err);
@@ -42,13 +44,43 @@ const Basic = props => {
42 44
   };
43 45
 
44 46
   const fields = [
47
+    {
48
+      label: '是否关联项目',
49
+      name: 'isHaveBuilding',
50
+      type: FieldTypes.Switch,
51
+      value: isHaveBuilding,
52
+      hidden: () => newsId,
53
+      props: {
54
+        onChange: (e) => {
55
+          setIsHaveBuilding(e)
56
+        },
57
+      },
58
+      rules: [{ required: true, message: '是否城市活动' }],
59
+    },
45 60
     {
46 61
       label: '意向项目',
47 62
       name: 'buildingId',
63
+      hidden: () => !isHaveBuilding,
48 64
       render: <BuildSelect onChange={e => handleBuildingChange(e)} />,
49 65
       value: dynamicData.buildingId,
50 66
       rules: [{ required: true, message: '请选择所属项目' }],
51 67
     },
68
+    {
69
+      label: '城市',
70
+      name: 'cityId',
71
+      render: <CitySelect />,
72
+      hidden: () => isHaveBuilding,
73
+      value: dynamicData.cityId,
74
+      rules: [{ required: true, message: '请选择城市' }],
75
+    },
76
+    {
77
+      label: '组织机构',
78
+      name: 'institutionId',
79
+      render: <InstitutionSelect />,
80
+      hidden: () => isHaveBuilding,
81
+      value: dynamicData.institutionId,
82
+      rules: [{ required: true, message: '请选择组织机构' }],
83
+    },
52 84
     {
53 85
       label: '资讯列表图',
54 86
       name: 'newsImg',
@@ -133,7 +165,14 @@ const Basic = props => {
133 165
     router.go(-1);
134 166
   };
135 167
 
136
-  return <XForm onSubmit={handleSubmit} onCancel={cancelPage} fields={fields}></XForm>;
168
+  return (
169
+    <XForm
170
+      onSubmit={handleSubmit}
171
+      onCancel={cancelPage}
172
+      submitBtn={dynamicData.newsStatus !== 0}
173
+      fields={fields}
174
+    ></XForm>
175
+  );
137 176
 };
138 177
 
139 178
 export default Basic;

+ 219
- 0
src/pages/system/city/index.jsx Zobrazit soubor

@@ -0,0 +1,219 @@
1
+import React, { useState, useEffect } from 'react';
2
+import { Select, Card, Button, TreeSelect } from 'antd';
3
+import { Tree } from 'antd';
4
+
5
+const { TreeNode } = Tree;
6
+import request from '@/utils/request';
7
+const { SHOW_CHILD } = TreeSelect;
8
+const { Option } = Select;
9
+
10
+function parentTree(arr, id) {   //arr 所有的树数据 id 某个子节点的id 
11
+  console.log(arr, id,'sss')
12
+  let temp ;
13
+  let callback = function (nowArr, id) {     //先定义个函数寻找子节点位置 找到后 再找改节点父元素位置 以此类推
14
+    for (let i = 0; i < nowArr.length; i++) {
15
+      let item = nowArr[i];
16
+      if (item.value === id) {
17
+        // temp.push(item);
18
+        temp=item
19
+        // callback(arr, item.parentid);     //pid 父级ID
20
+        break;
21
+      } else {
22
+        if (item.children) {
23
+          callback(item.children, id); //menus 子节点字段名称
24
+        }
25
+      }
26
+    }
27
+  };
28
+  callback(arr, id);
29
+  return temp;  //最后返回
30
+}
31
+
32
+/**
33
+ *
34
+ *
35
+ * @param {*} props
36
+ * @returns
37
+ */
38
+const CitySelect = props => {
39
+  const [data, setData] = useState({});
40
+  const [submitting, setSubmitting] = useState(false);
41
+  // 初始化的值
42
+  const [tree, setTree] = useState([]);
43
+  // 城市的值
44
+  const [selectCityTree, setSelectCityTree] = useState([]);
45
+
46
+  // {
47
+  //   title: 'Node1',
48
+  //   value: '0-0',
49
+  //   key: '0-0',
50
+  //   children: [
51
+  //     {
52
+  //       title: 'Child Node1',
53
+  //       value: '0-0-0',
54
+  //       key: '0-0-0',
55
+  //     },
56
+  //   ],
57
+  // },
58
+  // {
59
+  //   title: 'Node2',
60
+  //   value: '0-1',
61
+  //   key: '0-1',
62
+  //   children: [
63
+  //     {
64
+
65
+  const getTree = data => {
66
+    return data?.map(x => {
67
+      if (x?.children?.length > 0) {
68
+        return {
69
+          title: x.name,
70
+          value: x.id,
71
+          key: x.id,
72
+          parentid:x.parentid,
73
+          selectable:false,
74
+          disableCheckbox:true,
75
+          children: getTree(x?.children),
76
+        };
77
+      } else {
78
+        return {
79
+          title: x.name,
80
+          value: x.id,
81
+          key: x.id,
82
+          parentid:x.parentid
83
+        };
84
+      }
85
+    });
86
+  };
87
+  const getAllCityList = e => {
88
+    request({
89
+      url: '/api/admin/taUser/city/tree',
90
+      method: 'GET',
91
+      //   params: { leveltype: 2, pageNum: 1, pageSize: 999 },
92
+      // action: 'select',
93
+    }).then(data => {
94
+      // console.log(getTree(data.tdCityList), 'data.tdCityList');
95
+      setTree(getTree(data.tdCityList));
96
+    });
97
+    // GET /api/admin/city/list
98
+    // request({
99
+    //   url: '/api/center/tdCity',
100
+    //   method: 'GET',
101
+    // //   params: { leveltype: 2, pageNum: 1, pageSize: 999 },
102
+    //   action: 'select',
103
+    // }).then(data => {
104
+    // //   setData(data);
105
+    // });
106
+  };
107
+
108
+  const getCityList = e => {
109
+    request({
110
+      url: '/api/admin/tdCityList/tdCity',
111
+      method: 'GET',
112
+      params: { leveltype: 2, pageNum: 1, pageSize: 999 },
113
+      action: 'select',
114
+    }).then(data => {
115
+      setSelectCityTree(
116
+        data.map(x => x.id),
117
+      );
118
+    });
119
+  };
120
+
121
+  const onSelect = (selectedKeys, info) => {
122
+    console.log('selected', selectedKeys, info);
123
+  };
124
+  // 选择城市
125
+  const onCheck = (checkedKeys, info) => {
126
+    setSelectCityTree(checkedKeys);
127
+    console.log('onCheck', checkedKeys, info);
128
+  };
129
+
130
+  // 选择城市
131
+  const onChange = (checkedKeys, label, extra) => {
132
+    const info = parentTree(tree,extra.triggerValue)
133
+    if (checkedKeys?.length > selectCityTree.length) {
134
+
135
+      
136
+
137
+      // console.log(parentTree(tree,extra.triggerValue))
138
+      // 新增
139
+      request({
140
+        url: '/api/admin/city/add',
141
+        method: 'POST',
142
+        data: { 
143
+          cityId:info.value,
144
+          name:info.title,
145
+          parentid:info.parentid,
146
+         },
147
+        // action: 'select',
148
+      }).then(data => {
149
+        // console.log(getTree(data.tdCityList), 'data.tdCityList');
150
+        // setTree(getTree(data.tdCityList));
151
+      });
152
+    }else{
153
+      request({
154
+        url: `/api/admin/org/city/${extra.triggerValue}`,
155
+        method: 'DELETE',
156
+        
157
+        // action: 'select',
158
+      }).then(data => {
159
+        // console.log(getTree(data.tdCityList), 'data.tdCityList');
160
+        // setTree(getTree(data.tdCityList));
161
+      });
162
+    }
163
+    setSelectCityTree(checkedKeys)
164
+    console.log('onCheck', checkedKeys, label, extra);
165
+  };
166
+ 
167
+  const tProps = {
168
+    treeData: tree,
169
+    value: selectCityTree,
170
+    // onSelect:onChange,
171
+    onChange: onChange,
172
+    treeCheckable: true,
173
+    // multiple:true,
174
+    showCheckedStrategy: SHOW_CHILD,
175
+    searchPlaceholder: '请选择',
176
+    // labelInValue: true,
177
+    style: {
178
+      width: '100%',
179
+    },
180
+  };
181
+
182
+  useEffect(() => {
183
+    getAllCityList();
184
+    getCityList();
185
+  }, []);
186
+
187
+  return (
188
+    <Card>
189
+      <div style={{ display: 'flex' }}>
190
+        <TreeSelect {...tProps} />
191
+      </div>
192
+
193
+      {/* <Tree
194
+        checkable
195
+        // 展开指定节点
196
+        // expandedKeys={selectProvinceTree}
197
+        // 选择节点,但同时会包含父节点
198
+        checkedKeys={selectCityTree}
199
+        //  defaultSelectedKeys={['420100']}
200
+        onSelect={onSelect}
201
+        onCheck={onCheck}
202
+      >
203
+        <TreeNode title="全部">
204
+          {tree.map(item => (
205
+            <TreeNode title={item.name} key={item.id}>
206
+              {item.children.map(itemCity => (
207
+                <TreeNode
208
+                  title={<span style={{ color: '#1890ff' }}>{itemCity.name}</span>}
209
+                  key={itemCity.id}
210
+                />
211
+              ))}
212
+            </TreeNode>
213
+          ))}
214
+        </TreeNode>
215
+      </Tree> */}
216
+    </Card>
217
+  );
218
+};
219
+export default CitySelect;

+ 6
- 0
src/services/apis.js Zobrazit soubor

@@ -219,7 +219,13 @@ export default {
219 219
         action: 'admin.building.channel.post',
220 220
       }
221 221
 
222
+    },
223
+    logs:{
224
+      url: `${prefix}/building/logs`,
225
+        method: 'GET',
226
+        action: 'admin.building.logs.get',
222 227
     }
228
+
223 229
   },
224 230
   buildingType: {
225 231
     getList: {