Compare commits

...

12 Commits

Author SHA1 Message Date
xielei 6d0a3017f6 页面搭建 2024-09-27 10:17:59 +08:00
xielei 2c86feeebb Merge branch 'master' of http://10.0.41.100:3000/lishenfeng/tsg-web 2024-09-27 10:16:02 +08:00
xielei b15ec4556a 页面搭建 2024-09-27 10:15:58 +08:00
李神峰 6d50f9594a Merge branch 'lsf-dev' 2024-09-27 09:36:25 +08:00
李神峰 6f00c9c540 feat(): 库容曲线迁移 2024-09-27 09:35:41 +08:00
xielei e47436eda8 页面搭建 2024-09-26 18:08:38 +08:00
xielei ab317c8321 页面搭建 2024-09-26 17:59:26 +08:00
秦子超 25e5417cdd Merge branch 'qzc-dev' 2024-09-26 17:52:52 +08:00
李神峰 aef883b6c5 Merge branch 'lsf-dev' 2024-09-26 17:48:52 +08:00
李神峰 cdd8cc9473 feat():广播预警开发 2024-09-26 17:45:57 +08:00
李神峰 ceb3e8da4a Merge branch 'master' into lsf-dev 2024-09-24 17:47:45 +08:00
李神峰 2a3c2fcf3c feat(): 接口调试 2024-09-24 17:47:24 +08:00
66 changed files with 2970 additions and 1219 deletions

91
package-lock.json generated
View File

@ -38,6 +38,7 @@
"gsap": "^3.11.5", "gsap": "^3.11.5",
"http-proxy-middleware": "^2.0.6", "http-proxy-middleware": "^2.0.6",
"js-md5": "^0.8.3", "js-md5": "^0.8.3",
"konva": "^8.3.14",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"moment": "^2.29.4", "moment": "^2.29.4",
"ol": "^7.4.0", "ol": "^7.4.0",
@ -48,6 +49,7 @@
"react-audio-player": "^0.17.0", "react-audio-player": "^0.17.0",
"react-cookies": "^0.1.1", "react-cookies": "^0.1.1",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-konva": "^18.2.3",
"react-pdf": "^7.3.3", "react-pdf": "^7.3.3",
"react-redux": "^8.0.2", "react-redux": "^8.0.2",
"react-rnd": "^10.4.11", "react-rnd": "^10.4.11",
@ -6593,6 +6595,14 @@
"@types/react": "*" "@types/react": "*"
} }
}, },
"node_modules/@types/react-reconciler": {
"version": "0.28.8",
"resolved": "https://registry.npmmirror.com/@types/react-reconciler/-/react-reconciler-0.28.8.tgz",
"integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==",
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/resolve": { "node_modules/@types/resolve": {
"version": "1.17.1", "version": "1.17.1",
"resolved": "https://registry.npmmirror.com/@types/resolve/-/resolve-1.17.1.tgz", "resolved": "https://registry.npmmirror.com/@types/resolve/-/resolve-1.17.1.tgz",
@ -13004,6 +13014,17 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/its-fine": {
"version": "1.2.5",
"resolved": "https://registry.npmmirror.com/its-fine/-/its-fine-1.2.5.tgz",
"integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==",
"dependencies": {
"@types/react-reconciler": "^0.28.0"
},
"peerDependencies": {
"react": ">=18.0"
}
},
"node_modules/jake": { "node_modules/jake": {
"version": "10.8.5", "version": "10.8.5",
"resolved": "https://registry.npmmirror.com/jake/-/jake-10.8.5.tgz", "resolved": "https://registry.npmmirror.com/jake/-/jake-10.8.5.tgz",
@ -15065,6 +15086,25 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/konva": {
"version": "8.4.3",
"resolved": "https://registry.npmmirror.com/konva/-/konva-8.4.3.tgz",
"integrity": "sha512-ARqdgAbdNIougRlOKvkQwHlGhXPRBV4KvhCP+qoPpGoVQwwiJe4Hkdu4HHdRPb9rGUp04jDTAxBzEwBsE272pg==",
"funding": [
{
"type": "patreon",
"url": "https://www.patreon.com/lavrton"
},
{
"type": "opencollective",
"url": "https://opencollective.com/konva"
},
{
"type": "github",
"url": "https://github.com/sponsors/lavrton"
}
]
},
"node_modules/l7-tiny-sdf": { "node_modules/l7-tiny-sdf": {
"version": "0.0.4", "version": "0.0.4",
"resolved": "https://registry.npmjs.org/l7-tiny-sdf/-/l7-tiny-sdf-0.0.4.tgz", "resolved": "https://registry.npmjs.org/l7-tiny-sdf/-/l7-tiny-sdf-0.0.4.tgz",
@ -18793,6 +18833,51 @@
"resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz", "resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
}, },
"node_modules/react-konva": {
"version": "18.2.10",
"resolved": "https://registry.npmmirror.com/react-konva/-/react-konva-18.2.10.tgz",
"integrity": "sha512-ohcX1BJINL43m4ynjZ24MxFI1syjBdrXhqVxYVDw2rKgr3yuS0x/6m1Y2Z4sl4T/gKhfreBx8KHisd0XC6OT1g==",
"funding": [
{
"type": "patreon",
"url": "https://www.patreon.com/lavrton"
},
{
"type": "opencollective",
"url": "https://opencollective.com/konva"
},
{
"type": "github",
"url": "https://github.com/sponsors/lavrton"
}
],
"dependencies": {
"@types/react-reconciler": "^0.28.2",
"its-fine": "^1.1.1",
"react-reconciler": "~0.29.0",
"scheduler": "^0.23.0"
},
"peerDependencies": {
"konva": "^8.0.1 || ^7.2.5 || ^9.0.0",
"react": ">=18.0.0",
"react-dom": ">=18.0.0"
}
},
"node_modules/react-konva/node_modules/react-reconciler": {
"version": "0.29.2",
"resolved": "https://registry.npmmirror.com/react-reconciler/-/react-reconciler-0.29.2.tgz",
"integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==",
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.2"
},
"engines": {
"node": ">=0.10.0"
},
"peerDependencies": {
"react": "^18.3.1"
}
},
"node_modules/react-lifecycles-compat": { "node_modules/react-lifecycles-compat": {
"version": "3.0.4", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
@ -19603,9 +19688,9 @@
} }
}, },
"node_modules/scheduler": { "node_modules/scheduler": {
"version": "0.23.0", "version": "0.23.2",
"resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.0.tgz", "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz",
"integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
"dependencies": { "dependencies": {
"loose-envify": "^1.1.0" "loose-envify": "^1.1.0"
} }

View File

@ -45,7 +45,7 @@ const SiderMenu: React.FC<{
},[menuIndexes[1]]) },[menuIndexes[1]])
const onOpenChange = (keys:any) => { const onOpenChange = (keys: any) => {
let openLength = 0 let openLength = 0
if(openKeys===undefined){ if(openKeys===undefined){
openLength = 0 openLength = 0

View File

@ -53,7 +53,7 @@ class BasicCrudModal extends React.Component {
} }
onEdit = (path,values) => { onEdit = (path,values) => {
createCrudService(path).edit1(values).then((result) => { createCrudService(path).edit(values).then((result) => {
if (result?.code === 200) { if (result?.code === 200) {
message.success('修改成功'); message.success('修改成功');
this.setState({ open: false }); this.setState({ open: false });

View File

@ -209,3 +209,11 @@ code {
.flex-end{ .flex-end{
justify-content: flex-end; justify-content: flex-end;
} }
.align-center{
align-items: center;
}
.ellipsis1 {
overflow:hidden;/*内容超出后隐藏*/
text-overflow:ellipsis;/*超出内容显示为省略号*/
white-space:nowrap;/*文本不进行换行*/
}

View File

@ -193,6 +193,41 @@ export async function loadMenu(): Promise<MenuItem[]> {
const id = idgen() const id = idgen()
return [ return [
{ id: id(), title: '水库一张图', path: '/mgr/home', icon: 'jbqk' }, { id: id(), title: '水库一张图', path: '/mgr/home', icon: 'jbqk' },
{
id: id(), title: '四全', redirect: '/mgr/sq/qfg/zcdjxx', icon: 'fxzb',
children: [
{
id: id(), title: '全覆盖', redirect: '/mgr/sq/qfg/zcdjxx',
children: [
{ id: id(), title: '注册登记信息', path: '/mgr/sq/qfg/zcdjxx' },
]
},
{
id: id(), title: '全要素', redirect: '/mgr/sq/qys/kqys',
children: [
{ id: id(), title: '库区要素', path: '/mgr/sq/qys/kqys' },
{ id: id(), title: '工程要素', path: '/mgr/sq/qys/gcys' },
{ id: id(), title: '下游要素', path: '/mgr/sq/qys/xyys' },
]
},
{ id: id(), title: '全周期', redirect: '/mgr/sq/qzq/gcdsj',
children: [
{ id: id(), title: '工程大事记', path: '/mgr/sq/qzq/gcdsj'},
{ id: id(), title: '全周期档案', path: '/mgr/sq/qys/qzqda'},
]
},
{ id: id(), title: '全天候', redirect: '/mgr/sq/qth/sksq',
children: [
{ id: id(), title: '水库水情', path: '/mgr/sq/qth/sksq'},
{ id: id(), title: '河道水情', path: '/mgr/sq/qth/hdsq'},
{ id: id(), title: '实时雨情', path: '/mgr/sq/qth/ssyq'},
{ id: id(), title: '大坝安全监测', path: '/mgr/sq/qth/dbaqjc'},
{ id: id(), title: '视频监控', path: '/mgr/sq/qth/spjk'},
]
},
]
},
{ {
id: id(), title: '四制', redirect: '/mgr/sz/gltx/zzjgck', icon: 'jbqk', id: id(), title: '四制', redirect: '/mgr/sz/gltx/zzjgck', icon: 'jbqk',
children: [ children: [
@ -207,6 +242,19 @@ export async function loadMenu(): Promise<MenuItem[]> {
} }
] ]
}, },
{
id: id(), title: '培训管理', redirect: '/mgr/sz/pxgl/pxjhgl',
children: [
{
id: id(), title: '培训计划管理', path: '/mgr/sz/pxgl/pxjhgl',
},
{
id: id(), title: '培训记录管理', path: '/mgr/sz/pxgl/pxjlgl',
},
]
},
{ {
id: id(), title: '水政执法', redirect: '/mgr/sz/szzf/ajdj', id: id(), title: '水政执法', redirect: '/mgr/sz/szzf/ajdj',
children: [ children: [
@ -308,6 +356,9 @@ export async function loadMenu(): Promise<MenuItem[]> {
{ {
id: id(), title: '维修养护', path: '/mgr/sg/wxyh', id: id(), title: '维修养护', path: '/mgr/sg/wxyh',
}, },
{
id: id(), title: '库容管理', path: '/mgr/sg/krgl',
},
{ {
id: id(), title: '值班管理', redirect: '/mgr/sg/zbgl/zbb', id: id(), title: '值班管理', redirect: '/mgr/sg/zbgl/zbb',
children: [ children: [
@ -365,41 +416,7 @@ export async function loadMenu(): Promise<MenuItem[]> {
}, },
], ],
}, },
{
id: id(), title: '四全', redirect: '/mgr/sq/qfg/zcdjxx',
children: [
{
id: id(), title: '全覆盖', redirect: '/mgr/sq/qfg/zcdjxx',
children: [
{ id: id(), title: '注册登记信息', path: '/mgr/sq/qfg/zcdjxx' },
]
},
{
id: id(), title: '全要素', redirect: '/mgr/sq/qys/kqys',
children: [
{ id: id(), title: '库区要素', path: '/mgr/sq/qys/kqys' },
{ id: id(), title: '工程要素', path: '/mgr/sq/qys/gcys' },
{ id: id(), title: '下游要素', path: '/mgr/sq/qys/xyys' },
]
},
{ id: id(), title: '全周期', redirect: '/mgr/sq/qzq/gcdsj',
children: [
{ id: id(), title: '工程大事记', path: '/mgr/sq/qzq/gcdsj'},
{ id: id(), title: '全周期档案', path: '/mgr/sq/qys/qzqda'},
]
},
{ id: id(), title: '全天候', redirect: '/mgr/sq/qth/sksq',
children: [
{ id: id(), title: '水库水情', path: '/mgr/sq/qth/sksq'},
{ id: id(), title: '河道水情', path: '/mgr/sq/qth/hdsq'},
{ id: id(), title: '实时雨情', path: '/mgr/sq/qth/ssyq'},
{ id: id(), title: '大坝安全监测', path: '/mgr/sq/qth/dbaqjc'},
{ id: id(), title: '视频监控', path: '/mgr/sq/qth/spjk'},
]
},
]
},
// { id: id(), title: '基本情况', path: '/mgr/home', icon: 'jbqk' }, // { id: id(), title: '基本情况', path: '/mgr/home', icon: 'jbqk' },

View File

@ -8,6 +8,44 @@ const service_fxdd = '/gunshiApp/tsg'
const service_xyt = '/gunshiApp/tsg'//登陆先用小玉潭 const service_xyt = '/gunshiApp/tsg'//登陆先用小玉潭
const service_shzh = '/shzh' const service_shzh = '/shzh'
const apiurl = { const apiurl = {
krline: {
list: service_fxdd + "/stZvarlB/list",
save: service_fxdd + "/stZvarlB/insert",
update: service_fxdd + "/stZvarlB/update",
delete: service_fxdd + "/stZvarlB/del"
},
gbyj: {
list: service_fxdd + "/broadcastStation/list", //广播站
page: service_fxdd + "/broadcastWarn/page",
mblist: service_fxdd + "/broadcastTemplate/list",
bb: service_fxdd + "/broadcastWarn/insert",
mbsave: service_fxdd + "/broadcastTemplate/insert",
mbDel:service_fxdd + "/broadcastTemplate/del"
},
zrrgl: {
page: service_fxdd + "/resPerson/page",
edit: service_fxdd + "/resPerson/update",
delete: service_fxdd + "/resPerson/del",
save:service_fxdd + "/resPerson/insert",
},
pxjh: {
page: service_fxdd + "/personnelPlan/page",
edit: service_fxdd + "/personnelPlan/update",
delete: service_fxdd + "/personnelPlan/del",
save: service_fxdd + "/personnelPlan/insert",
import: service_fxdd + '/personnelPlan/template',
export:service_fxdd + "/personnelPlan/download"
},
pxjl: {
page: service_fxdd + "/personnelPlanLog/page",
edit: service_fxdd + "/personnelPlanLog/update",
delete: service_fxdd + "/personnelPlanLog/del",
save: service_fxdd + "/personnelPlanLog/insert",
sta: service_fxdd + "/personnelPlanLog/statistics",
list: service_fxdd + "/personnelPlan/list",
getFile:service_fxdd + "/personnelPlanLog/get"
},
fxya: { fxya: {
page: service_fxdd + "/resPlanB/list", page: service_fxdd + "/resPlanB/list",
update: service_fxdd + "/resPlanB/update", update: service_fxdd + "/resPlanB/update",
@ -828,6 +866,7 @@ const apiurl = {
// //
//实时雨情 //实时雨情
ssyq: { ssyq: {
maxDrp:service_fxdd + "/attResBase/maxRain",
status: service_fxdd + '/xfProjectRun/has/read', status: service_fxdd + '/xfProjectRun/has/read',
basNameList: service_fxdd + '/real/rain/basNameList', //流域选择 basNameList: service_fxdd + '/real/rain/basNameList', //流域选择
adnmList: service_fxdd + '/real/rain/adnmList', //行政选择 adnmList: service_fxdd + '/real/rain/adnmList', //行政选择
@ -1051,8 +1090,49 @@ const apiurl = {
// 全周期 // 全周期
gcdsj:{ gcdsj:{
qzqda:{ qzqda:{
list:service_fxdd + '/projectEvents/doc/page' list:service_fxdd + '/projectEvents/doc/page',
export: service_fxdd + '/projectEvents/export'
} }
},
szzf:{
ajdj:{
list:service_fxdd + '/szCase/page',
add:service_fxdd + '/szCase/insert',
edit:service_fxdd + '/szCase/update',
del:service_fxdd + '/szCase/del/',
upload:service_fxdd + '/szCase/file/upload/singleSimple',
download:service_fxdd + '/szCase/file/download/',
detail:service_fxdd + '/szCase/get/'
},
ajtj:{
// 统计类型 0:案件来源,1:案件类型,2:执行类型
info:service_fxdd + '/szCase/statistics/',
//趋势
qs:service_fxdd + '/szCase/statisticsNum/'
},
clyj:{
tree:service_fxdd + '/szTreatmentBasis/get/tree',
edit:service_fxdd + '/szTreatmentBasis/update',
add:service_fxdd + '/szTreatmentBasis/insert',
del:service_fxdd + '/szTreatmentBasis/del/',
detail:service_fxdd + '/szTreatmentBasis/get/'
}
},
flfg:{
edit:service_fxdd + '/SzRuleByLaw/update',
add:service_fxdd + '/SzRuleByLaw/insert',
del:service_fxdd + '/SzRuleByLaw/del/',
upload:service_fxdd + '/SzRuleByLaw/file/upload/singleSimple',
download:service_fxdd + '/SzRuleByLaw/file/download/',
list:service_fxdd + '/SzRuleByLaw/page'
},
zdgl:{
edit:service_fxdd + '/SzRegulatoryFramework/update',
add:service_fxdd + '/SzRegulatoryFramework/insert',
del:service_fxdd + '/SzRegulatoryFramework/del/',
upload:service_fxdd + '/SzRegulatoryFramework/file/upload/singleSimple',
download:service_fxdd + '/SzRegulatoryFramework/file/download/',
list:service_fxdd + '/SzRegulatoryFramework/page'
} }
} }

View File

@ -131,6 +131,17 @@ export async function StcdAndStartTimeAndEndTimeHour(params) {
return data; return data;
} }
export async function maxDrpUrl(params) {
params.startTime=moment(params.startTime).format("YYYY-MM-DD HH:mm:ss")
params.endTime=moment(params.endTime).format("YYYY-MM-DD HH:mm:ss")
const { data, code, msg } = await httppost(apiurl.ssyq.maxDrp,params) || {};
if (code !== 200) {
message.error(msg || '请求失败');
}
return data;
}
//实时雨情-弹框详情-测站编码查详细雨量 //实时雨情-弹框详情-测站编码查详细雨量
export async function queryStPptnDetails(stcd) { export async function queryStPptnDetails(stcd) {
const { data, code, msg } = await httpget(apiurl.ssyq.queryStPptnDetails,{stcd}) || {}; const { data, code, msg } = await httpget(apiurl.ssyq.queryStPptnDetails,{stcd}) || {};

View File

@ -6,7 +6,7 @@ module.exports = function (app) {
'/gunshiApp', '/gunshiApp',
createProxyMiddleware({ createProxyMiddleware({
target: 'http://local.gunshiiot.com:18083/',//测试 target: 'http://local.gunshiiot.com:18083/',//测试
// target: 'http://36.139.207.50:18083/',//正式 // target: 'http://192.168.66.199:24105/',//正式
// target: 'http://36.139.207.50:18083/',//移动云 // target: 'http://36.139.207.50:18083/',//移动云
changeOrigin: true, changeOrigin: true,
}) })

View File

@ -435,6 +435,20 @@ export function httpPostFile(url, data = {}) {
// return sendFile(url, options); // return sendFile(url, options);
// } // }
export function httppostAddfile(url, data = {},key,fileKey) {
const form = new FormData();
let json=new Blob([JSON.stringify(data)],{ type: "application/json" })
// form.append(key, json);
if(data.file){
form.append("file", data.file.originFileObj??data.file);
}
const options = {
method: 'POST',
body: form,
};
return send(url, options);
}
async function sendFile(url, options) { async function sendFile(url, options) {
try { try {
const res = await request(url, options,'blob'); const res = await request(url, options,'blob');

View File

@ -79,6 +79,8 @@ import Gstjfx from "./gxsl/gstjfx"
// 视频监控 // 视频监控
import Spjk from "./video" import Spjk from "./video"
import AiWarn from "./spjk/aiWarn" import AiWarn from "./spjk/aiWarn"
// 广播预警
import Gbyj from "./gbyj/index"
// 四全 // 四全
@ -107,6 +109,9 @@ import Ajdj from './sz/szzf/ajdj'
import Ajtj from './sz/szzf/ajtj' import Ajtj from './sz/szzf/ajtj'
import Clyj from './sz/szzf/clyj' import Clyj from './sz/szzf/clyj'
import Krgl from './KrLine'
const HomePage = lazy(() => import('./Home')) const HomePage = lazy(() => import('./Home'))
@ -202,6 +207,7 @@ const AppRouters: React.FC = () => {
{ path: 'sg/aqgl/aqsgdj', element: <Aqsgdj /> }, { path: 'sg/aqgl/aqsgdj', element: <Aqsgdj /> },
{ path: 'sg/gcdsj', element: <Gcdsj /> }, { path: 'sg/gcdsj', element: <Gcdsj /> },
{ path: 'sg/szzb', element: <Szzb /> }, { path: 'sg/szzb', element: <Szzb /> },
{ path: 'sg/krgl', element: <Krgl /> },
{ path: 'rcgl/stlljc', element: <Stlljc /> }, { path: 'rcgl/stlljc', element: <Stlljc /> },
{ path: 'sg/zbgl/zbb', element: <Zbb /> }, { path: 'sg/zbgl/zbb', element: <Zbb /> },
{ path: 'sg/zbgl/zbrz', element: <Zbrz /> }, { path: 'sg/zbgl/zbrz', element: <Zbrz /> },
@ -224,6 +230,7 @@ const AppRouters: React.FC = () => {
// 视频监控 // 视频监控
{ path: 'sq/qth/spjk', element: <Spjk /> }, { path: 'sq/qth/spjk', element: <Spjk /> },
{ path: 'sg/gjgl/aigj', element: <AiWarn /> }, { path: 'sg/gjgl/aigj', element: <AiWarn /> },
{ path: 'sg/gjgl/gbyj', element: <Gbyj /> },
// { path: 'fxzb/zbb', element: <Zbb /> }, // { path: 'fxzb/zbb', element: <Zbb /> },
// { path: 'fxzb/txl', element: <Txl /> }, // { path: 'fxzb/txl', element: <Txl /> },

View File

@ -6,7 +6,7 @@ import clsx from "clsx";
import './index.less' import './index.less'
import TableData from './TableData' import TableData from './TableData'
import drpOption from './drpOption'; import drpOption from './drpOption';
import {StcdAndStartTimeAndEndTime,StcdAndStartTimeAndEndTimeHour,queryStPptnDetails,queryStStbprpPerDayChart,queryStStbprpPerHourChart} from '../../../../../service/ssyq' import {StcdAndStartTimeAndEndTime,StcdAndStartTimeAndEndTimeHour,queryStPptnDetails,queryStStbprpPerDayChart,queryStStbprpPerHourChart,maxDrpUrl} from '../../../../../service/ssyq'
const {RangePicker} = DatePicker; const {RangePicker} = DatePicker;
@ -22,7 +22,7 @@ function DrpSearch({record}) {
const [echartData, setEchartData] = useState({}); const [echartData, setEchartData] = useState({});
const [current, setCurrent] = useState(0); const [current, setCurrent] = useState(0);
const [detail, setDetail] = useState({}); const [detail, setDetail] = useState({});
const [maxDrp, setMaxDrp] = useState({})
const option = useMemo(() => { const option = useMemo(() => {
return drpOption({echartData}); return drpOption({echartData});
@ -45,9 +45,11 @@ function DrpSearch({record}) {
console.log("params",params); console.log("params",params);
if(current==0){ if(current==0){
setData(await StcdAndStartTimeAndEndTimeHour(params)); setData(await StcdAndStartTimeAndEndTimeHour(params));
setMaxDrp(await maxDrpUrl(params));
setEchartData(await queryStStbprpPerHourChart(params)); setEchartData(await queryStStbprpPerHourChart(params));
}else{ }else{
setData(await StcdAndStartTimeAndEndTime(params)); setData(await StcdAndStartTimeAndEndTime(params));
setMaxDrp(await maxDrpUrl(params));
setEchartData(await queryStStbprpPerDayChart(params)); setEchartData(await queryStStbprpPerDayChart(params));
} }
setDetail(await queryStPptnDetails(record?.stcd)) setDetail(await queryStPptnDetails(record?.stcd))
@ -130,35 +132,35 @@ function DrpSearch({record}) {
<div className="footer" style={record?.height?{fontSize:15}:{}}> <div className="footer" style={record?.height?{fontSize:15}:{}}>
<div className="footer-row"> <div className="footer-row">
<div className="footer-item"> <div className="footer-item">
<div className="footer-name">1h雨量(mm)</div> <div className="footer-name">最大1h雨量(mm)</div>
<div className="footer-num">{detail?.h1||0}</div> <div className="footer-num">{maxDrp?.h1||0}</div>
</div> </div>
<div className="footer-item"> <div className="footer-item">
<div className="footer-name">3h雨量(mm)</div> <div className="footer-name">最大3h雨量(mm)</div>
<div className="footer-num">{detail?.h3||0}</div> <div className="footer-num">{maxDrp?.h3||0}</div>
</div> </div>
<div className="footer-item"> <div className="footer-item">
<div className="footer-name">6h雨量(mm)</div> <div className="footer-name">最大6h雨量(mm)</div>
<div className="footer-num">{detail?.h6||0}</div> <div className="footer-num">{maxDrp?.h6||0}</div>
</div> </div>
<div className="footer-item"> <div className="footer-item">
<div className="footer-name">12h雨量(mm)</div> <div className="footer-name">最大12h雨量(mm)</div>
<div className="footer-num">{detail?.h12||0}</div> <div className="footer-num">{maxDrp?.h12||0}</div>
</div> </div>
<div className="footer-item"> {/* <div className="footer-item">
<div className="footer-name">近24h雨量(mm)</div> <div className="footer-name">近24h雨量(mm)</div>
<div className="footer-num">{detail?.h24||0}</div> <div className="footer-num">{detail?.h24||0}</div>
</div> </div> */}
<div className="footer-item"> <div className="footer-item">
<div className="footer-name">本年降雨天数</div> <div className="footer-name">本年降雨天数</div>
<div className="footer-num"><span style={{color:"#E69224"}}>{detail?.yearDrpDay}</span>/{days}</div> <div className="footer-num"><span style={{color:"#E69224"}}>{detail?.yearDrpDay}</span>/{days}</div>
</div> </div>
</div> </div>
<div className="footer-row"> <div className="footer-row">
<div className="footer-item"> {/* <div className="footer-item">
<div className="footer-name">近48h雨量(mm)</div> <div className="footer-name">近48h雨量(mm)</div>
<div className="footer-num">{detail?.h48||0}</div> <div className="footer-num">{detail?.h48||0}</div>
</div> </div> */}
<div className="footer-item"> <div className="footer-item">
<div className="footer-name">今日雨量(mm)</div> <div className="footer-name">今日雨量(mm)</div>
<div className="footer-num">{detail.today}</div> <div className="footer-num">{detail.today}</div>

View File

@ -0,0 +1,97 @@
import echarts from 'echarts/lib/echarts';
import { GetInterval } from '../../utils/tools'
export default function drpOption({data}) {
const maxVal = Math.ceil(Math.max(...data.map(obj => obj.rz)))
const minVal = Math.floor(Math.min(...data.map(obj => obj.rz)))
const maxValX = Math.max(...data.map(obj => obj.w))
const minValX = Math.min(...data.map(obj => obj.w))
let arr =[]
data.forEach(item=>{
console.log(data);
arr.push([item.w,item.rz])
})
// console.log(GetInterval(minValX,maxValX),'jhsdjkashdjkahjk');
return {
toolbox: {
show: true,
feature: {
saveAsImage: {
show: true,
excludeComponents: ['toolbox'],
pixelRatio: 2,
name:"库容曲线图"
}
},
right: "14%",
top:"5%"
},
title: {
text: "库容曲线图",
left: "40%",
},
tooltip: {
trigger: 'axis',
},
grid: [
{
top: "10%",
left: "15%",
right: "15%",
bottom: "8%"
},
],
xAxis: [
{
name: "库容(万m³)",
nameGap: 5,
type: 'value',
min:Math.floor(minValX / 5) *5,
max:Math.ceil(maxValX / 5) *5,
interval:GetInterval(minValX,maxValX),
data: data.map(o => o.w),
splitLine: {
show: false
},
}
],
yAxis: [
{
type: 'value',
name: "库水位(m)",
minInterval:1,
splitLine: {
show: true,
lineStyle: {
color: '#07a6ff',
width: 0.25,
type: 'dotted'
}
},
axisLabel: {
color: '#333',
fontSize: 12,
},
axisLine: {
show: true
},
axisTick: {
show: true,
},
min: minVal,
max: maxVal
}
],
series: [
{
type: 'line',
color: "#007AFD",
data: arr,
smooth: true
},
]
};
}

79
src/views/KrLine/form.js Normal file
View File

@ -0,0 +1,79 @@
import React,{useEffect,useState,useRef} from 'react';
import { Form, Button, Input, Row, Col} from 'antd';
import { formItemLayout, btnItemLayout } from '../../components/crud/FormLayoutProps';
import apiurl from '../../service/apiurl';
const ModalForm = ({ mode, record,onEdit,onSave,onCrudSuccess }) => {
const [form] = Form.useForm();
const onFinish = async (values) => {
values.resCode = "42120250085"
values.id = record?.id
if (mode === 'edit') {
const params = {
...record,
rz: Number(values?.rz),
w: Number(values?.w),
}
onEdit(apiurl.krline.update,params)
}
if (mode === 'save') {
onSave(apiurl.krline.save,values)
}
}
return (
<>
<Form
form={form}
// {...formItemLayout}
onFinish={onFinish}
initialValues={record}>
<Row>
<Col span={24}>
<Form.Item
label="水位(m)"
name="rz"
labelCol={{ span: 5, offset: 0 }}
wrapperCol={{span:19,offset:0}}
rules={[{ required: true }]}
>
<Input
style={{ width: '100%' }}
allowClear
/>
</Form.Item>
</Col>
</Row>
<Row>
<Col span={24}>
<Form.Item
label="库容(万m³)"
name="w"
labelCol={{ span: 5, offset: 0 }}
wrapperCol={{span:19,offset:0}}
rules={[{ required: true }]}
>
<Input
style={{ width: '100%' }}
allowClear
/>
</Form.Item>
</Col>
</Row>
{
mode==='view'?null:(
<>
<Form.Item {...btnItemLayout}>
<Button type="primary" htmlType="submit">
{mode === 'save' ? '提交' : '修改'}
</Button>
</Form.Item>
</>
)
}
</Form>
</>
);
}
export default ModalForm;

88
src/views/KrLine/index.js Normal file
View File

@ -0,0 +1,88 @@
import React,{useEffect,useState,useRef,useMemo} from 'react'
import { Table, Button } from 'antd'
import ModalForm from './form';
import ReactEcharts from 'echarts-for-react';
import drpOption from './drpOption'
import apiurl from '../../service/apiurl';
import { httppost2 } from '../../utils/request';
import { CrudOpRender_text } from '../../components/crud/CrudOpRender';
import BasicCrudModal from '../../components/crud/BasicCrudModal2';
export default function Zrtx() {
const refModal = useRef();
const columns = [
{
title: '序号', dataIndex: 'index', key: 'index', align: "center",
render: (r, c,i) => <span>{i + 1}</span>
},
{ title: '水位(m)', dataIndex: 'rz', key: 'rz',align:"center" },
{ title: '库容(万m³)', dataIndex: 'w', key: 'w',align:"center" },
{
title: '操作', dataIndex: 'op', key: 'op', align: "center",width:200,
render: (value, row, index) => (<CrudOpRender_text del={true} edit={true} command={(cmd) => () => command(cmd)(row)} />)
},
];
const [data, setData] = useState([])
const option = useMemo(() => {
return drpOption({data});
}, [data])
const getData = async () => {
try {
const res = await httppost2(apiurl.krline.list)
setData(res.data.map((item,i) => ({...item,inx:i + 1})))
} catch (error) {
console.log(error);
}
}
const command = (type) => (params) => {
if (type === 'save') {
refModal.current.showSave({});
} else if (type === 'edit') {
refModal.current.showEdit(params)
} else if (type === 'view') {
refModal.current.showView(params);
} else if (type === 'del') {
refModal.current.onDeletePost(apiurl.krline.delete,params);
}
}
useEffect(() => {
getData();
}, [])
return (
<div className='content-root clearFloat xybm' style={{ paddingRight: "0", paddingBottom: "0" }}>
<h1><Button type='primary' onClick={() => {refModal.current.showSave({})}}>新增</Button></h1>
<div style={{display:"flex",columnGap:10,width:"100%",height:"calc(100% - 36px)"}}>
<div style={{width:500,height:"100%"}}>
<Table
rowKey="inx"
columns={columns}
dataSource={data}
pagination={false}
scroll={{ y:"calc( 100vh - 300px )"}}
/>
</div>
<div className='right-echarts' style={{ flex: 1,height:"100%" }}>
{
data.length > 0 ?
<ReactEcharts
option={option}
style={{width: "100%", height: '100%'}}
/> : <div style={{textAlign: "center", margin: "10%"}}>
<img src={`${process.env.PUBLIC_URL}/assets/noData.png`} alt=""/>
</div>
}
</div>
</div>
<BasicCrudModal
width={550}
ref={refModal}
title=""
component={ModalForm}
onCrudSuccess={getData}
/>
</div>
)
}

View File

@ -87,7 +87,7 @@ const ModalForm = ({ mode, record,onEdit,onSave,onSimilarSave }) => {
} }
if (mode === 'save') { if (mode === 'save') {
values.fileIds = fileIds values.fileIds = fileIds
debugger // debugger
onSave(apiurl.fxzb.qswl.zq.save,values) onSave(apiurl.fxzb.qswl.zq.save,values)
} }
if (mode === "similarSave") { if (mode === "similarSave") {

266
src/views/gbyj/index.js Normal file
View File

@ -0,0 +1,266 @@
import React, { useState, useEffect, useMemo,useRef } from 'react'
import usePageTable from '../../components/crud/usePageTable2';
import { createCrudService } from '../../components/crud/_';
import apiurl from '../../service/apiurl';
import { httppost2,httpget2 } from '../../utils/request';
import CryptoJS from 'crypto-js';
import { Card,Table,Button,Radio,Input,Select,Modal,message } from "antd"
import ToolBar from "./toolbar"
import "./index.less"
export default function Gbyj() {
const [searchValue, setSearchVal] = useState()
const [switchVisible, setSwitchVisible] = useState(false);
const [bbParams, setBbParams] = useState({})
const [addOpen, setAddOpen] = useState(false)
const [mbParams, setMbParams] = useState({})
const columns = [
{ title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" },
{ title: '广播站名称', key: 'name', dataIndex: 'name', width: 200, ellipsis: true },
{
title: '告警内容', key: 'warnContent', dataIndex: 'warnContent', width: 300,ellipsis: true
},
{ title: '播报时间', key: 'createTime', dataIndex: 'createTime', width: 200 },
{
title: '播报人员', key: 'createUserName', dataIndex: 'createUserName', width: 200,ellipsis: true
},
];
const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]);
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.gbyj.page).find_noCode);
//广播站
const [jh, setJh] = useState([])
const getJhList = async () => {
try {
const res = await httppost2(apiurl.gbyj.list)
if (res.code == 200) {
setJh(res.data.map(item => ({label:item.name,value:item.id})))
}
} catch (error) {
console.log(error);
}
}
const [mbList, setMbList] = useState([])
const getMbList = async () => {
try {
const res = await httppost2(apiurl.gbyj.mblist);
if(res.code === 200){
setMbList(res.data.map(item=>({label:item.content, value:item.id})));
}
} catch (error) {
console.log(error);
}
}
// 右边添加模版
const addMb = async () => {
try {
const res = await httppost2(apiurl.gbyj.mbsave, { content: bbParams.warnContent });
if (res.code == 200) {
message.success('添加成功');
getMbList();
}
} catch (error) {
console.log(error);
}
}
// 左边添加模版
const saveMb = async () => {
try {
const res = await httppost2(apiurl.gbyj.mbsave, mbParams);
if (res.code == 200) {
message.success('添加成功');
getMbList();
setAddOpen(false)
}
} catch (error) {
console.log(error);
}
}
// 删除模版
const delMb = async () => {
try {
const res = await httpget2(apiurl.gbyj.mbDel + `/${bbParams.checkId}`);
if (res.code == 200) {
message.success('删除成功');
getMbList();
setBbParams({...bbParams,warnContent:'' })
}
} catch (error) {
console.log(error);
}
}
const handleCheck = (e) => {
const text = mbList.find(item => item.value == e.target.value)?.label
setBbParams({ ...bbParams, warnContent:text,checkId:e.target.value })
}
const gbzChange = (e) => {
setBbParams({...bbParams,stationIds:e})
}
const textChange = (e) => {
setBbParams({ ...bbParams, warnContent: e.target.value })
}
// 播报
const playGb = () => {
setSwitchVisible(true);
}
//md5加密
const encryptData = (data) => {
const encryptedData = CryptoJS.MD5(data).toString();
return encryptedData;
}
// 确认播报
const confirmBb = async () => {
const name = localStorage.getItem('userName')
const id = localStorage.getItem('userId')
const params = {
...bbParams,
ctrlPass: encryptData(bbParams?.ctrlPass),
createUserId: id,
createUserName: name
}
try {
const res = await httppost2(apiurl.gbyj.bb,params);
if (res.code == 200) {
setSwitchVisible(false);
message.success('播报成功');
refresh()
}
} catch (error) {
console.log(error);
}
}
useEffect(()=>{
const params = {
search: {
...searchValue,
}
};
search(params)
}, [searchValue])
useEffect(() => {
getMbList()
getJhList()
}, [])
return (
<div className='content-root clearFloat xybm' style={{ paddingRight: "0", paddingBottom: "0" }}>
<div className='gb-top'>
<div className='gb-top-title'>
<span className='gb-top-icon'></span>
<span style={{fontSize:18}}>广播预警信息查询</span>
</div>
<Card className='nonebox'>
<ToolBar
setSearchVal={setSearchVal}
jh={jh}
/>
</Card>
<div className="ant-card-body" style={{padding:"20px 10px 0 0"}}>
<Table columns={columns} rowKey="inx" {...tableProps} scroll={{ x: width , y: "calc( 100vh - 700px )"}}/>
</div>
</div>
<div className='gb-bottom'>
<div className='gb-bottom-left'>
<div className='gb-top-title'>
<span className='gb-top-icon'></span>
<span style={{fontSize:18,marginRight:20}}>广播模板</span>
<Button type="primary" onClick={() => setAddOpen(true)}>添加</Button>
<Button type="primary" onClick={delMb}>删除</Button>
</div>
<div className='mb-content'>
<Radio.Group
style={{display: 'flex', flexDirection: 'column'}}
options={mbList}
onChange={handleCheck}
/>
</div>
</div>
<div className='gb-bottom-right'>
<div className='gb-top-title'>
<span className='gb-top-icon'></span>
<span style={{fontSize:18,marginRight:20}}>编辑播报内容</span>
<Button type="primary" onClick={addMb}>添加为模板</Button>
</div>
<div className='right-content'>
<div style={{marginRight:10}}>
<Input.TextArea
style={{ width: '100%', minHeight: '150px' }}
allowClear
placeholder='请输入播报内容,或者选择广播模板'
value={bbParams.warnContent}
onChange={textChange}
/>
</div>
<div style={{ marginTop: 20 }}>
<div className='gb-top-title'>
<span className='gb-top-icon'></span>
<span style={{fontSize:18,marginRight:20}}>选择广播预警站</span>
</div>
<div className='station-content'>
<span>已选择</span>
<Select
mode="tags"
style={{
width: '70%',
}}
onChange={gbzChange}
options={jh}
/>
<Button type="primary" style={{width:"16%"}} onClick={playGb}>播报</Button>
</div>
</div>
</div>
</div>
</div>
{/* 校验密码 */}
<Modal
open={switchVisible}
width={500}
title="输入校验密码"
onCancel={()=>{setSwitchVisible(false);}}
destroyOnClose
onOk={confirmBb}
>
<div>
<div style={{marginBottom:"10px"}}>请输入二次校验密码</div>
<div>
<Input.Password placeholder='请输入密码' allowClear onChange={(e)=>{setBbParams({...bbParams,ctrlPass:e.target.value})
}} />
</div>
</div>
</Modal>
{/* 添加模版 */}
<Modal
open={addOpen}
width={500}
title="新增"
onCancel={()=>{setAddOpen(false);}}
destroyOnClose
onOk={saveMb}
>
<div>
<div style={{marginBottom:"10px"}}>请输入模版</div>
<div>
<Input allowClear onChange={(e)=>{setMbParams({...mbParams,content:e.target.value})
}} />
</div>
</div>
</Modal>
</div>
)
}

43
src/views/gbyj/index.less Normal file
View File

@ -0,0 +1,43 @@
.gb-top-title{
display: flex;
align-items: center;
column-gap: 10px;
margin-bottom: 20px;
.gb-top-icon{
width: 5px;
height: 20px;
background-color: #0079fe;
}
}
.gb-bottom{
display: flex;
// align-items: center;
column-gap: 20px;
margin-top: 20px;
.gb-bottom-left{
flex: 1;
.mb-content{
width: 100%;
margin-top: 10px;
padding: 10px;
height: 300px;
overflow-y: auto;
border: 1px solid #dfdfdf;
.ant-radio-wrapper{
margin-bottom: 10px;
}
}
}
.gb-bottom-right{
flex: 1;
.right-content{
.station-content{
display: flex;
align-items: center;
column-gap: 10px;
margin-top: 25px;
}
}
}
}

54
src/views/gbyj/toolbar.js Normal file
View File

@ -0,0 +1,54 @@
import React, { useEffect,useState } from 'react';
import { Form, Upload, Button,Row, Col, Input, DatePicker, message,Modal } from 'antd';
import apiurl from '../../service/apiurl';
import { httppost2 } from '../../utils/request';
import moment from 'moment';
import NormalSelect from '../../components/Form/NormalSelect';
const { RangePicker } = DatePicker;
const ToolBar = ({ setSearchVal,jh}) => {
const [form] = Form.useForm();
const onFinish = (values) => {
let timeRangeSo;
if (values.tm) {
timeRangeSo = {
start: moment(values.tm[0]).format('YYYY-MM-DD HH:mm:ss'),
end: moment(values.tm[1]).format('YYYY-MM-DD HH:mm:ss')
}
}
delete values.tm
setSearchVal({...values, timeRangeSo});
}
return (
<>
<div style={{display:'flex',justifyContent:'space-between'}}>
<Form form={form} className='toolbarBox' layout="inline" onFinish={onFinish}>
<Form.Item label="告警内容" name="warnContent">
<Input allowClear style={{width:'180px'}}/>
</Form.Item>
<Form.Item label="告警时间" name="tm">
<RangePicker
allowClear
showTime
style={{ width: "350px" }}
format={"YYYY-MM-DD HH:mm:ss" }
/>
</Form.Item>
<Form.Item label="广播站名称" name="stationId">
<NormalSelect allowClear style={{ width: '150px' }} options={jh} />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit">查询</Button>
</Form.Item>
<Form.Item>
<Button onClick={() => form.resetFields()}>重置</Button>
</Form.Item>
</Form>
</div>
</>
);
}
export default ToolBar;

View File

@ -112,7 +112,7 @@ export default function Xmzlmb() {
stationCodes: code, stationCodes: code,
...searchVal ...searchVal
} }
debugger // debugger
getTableData(params) getTableData(params)
getTable2Data(params) getTable2Data(params)
} }

View File

@ -76,7 +76,7 @@ console.log("record",record);
let oldFiles = fileList.map(item => ({fileId:item.response?.data?.fileId}) ) let oldFiles = fileList.map(item => ({fileId:item.response?.data?.fileId}) )
if (mode === 'zg') { if (mode === 'zg') {
values.rectifyFiles = oldFiles; values.rectifyFiles = oldFiles;
debugger // debugger
onUpdate(apiurl.rcgl.jdkh.khwtzg.finish,{...record,...values}) onUpdate(apiurl.rcgl.jdkh.khwtzg.finish,{...record,...values})
} }

View File

@ -22,7 +22,7 @@ export default function Sksq() {
setSwTableData(await zqrl(stcd)); setSwTableData(await zqrl(stcd));
}; };
useEffect(() => { useEffect(() => {
getData({args: "",sources: ["SH", "SW"],}) getData({args: "",sources: ["SH", "SW"]})
}, []) }, [])
return ( return (
<div className='lf' style={{ height: 'calc(100vh - 168px)', width: "100%" }}> <div className='lf' style={{ height: 'calc(100vh - 168px)', width: "100%" }}>

View File

@ -5,7 +5,6 @@ import apiurl from '../../../../../service/apiurl';
const ModalForm = ({ mode, record,onEdit,onSave,onCrudSuccess }) => { const ModalForm = ({ mode, record,onEdit,onSave,onCrudSuccess }) => {
const [form] = Form.useForm(); const [form] = Form.useForm();
const onFinish = async (values) => { const onFinish = async (values) => {
values.resCode = "42120250085"
values.id = record?.id values.id = record?.id
if (mode === 'edit') { if (mode === 'edit') {
const params = { const params = {
@ -16,7 +15,11 @@ const ModalForm = ({ mode, record,onEdit,onSave,onCrudSuccess }) => {
onEdit(apiurl.dataResourcesCenter.projectAndWater.kr.update,params) onEdit(apiurl.dataResourcesCenter.projectAndWater.kr.update,params)
} }
if (mode === 'save') { if (mode === 'save') {
onSave(apiurl.dataResourcesCenter.projectAndWater.kr.save,values) const params = {
...values,
resCode:record.resCode
}
onSave(apiurl.dataResourcesCenter.projectAndWater.kr.save,params)
} }
} }

View File

@ -7,7 +7,7 @@ import apiurl from '../../../../../service/apiurl';
import { httppost2 } from '../../../../../utils/request'; import { httppost2 } from '../../../../../utils/request';
import { CrudOpRender_text } from '../../../../../components/crud/CrudOpRender'; import { CrudOpRender_text } from '../../../../../components/crud/CrudOpRender';
import BasicCrudModal from '../../../../../components/crud/BasicCrudModal2'; import BasicCrudModal from '../../../../../components/crud/BasicCrudModal2';
export default function Zrtx() { export default function Zrtx({dataInfo}) {
const refModal = useRef(); const refModal = useRef();
const columns = [ const columns = [
{ {
@ -36,8 +36,9 @@ export default function Zrtx() {
} }
const command = (type) => (params) => { const command = (type) => (params) => {
// debugger;
if (type === 'save') { if (type === 'save') {
refModal.current.showSave({}); refModal.current.showSave(dataInfo);
} else if (type === 'edit') { } else if (type === 'edit') {
refModal.current.showEdit(params) refModal.current.showEdit(params)
} else if (type === 'view') { } else if (type === 'view') {
@ -46,13 +47,15 @@ export default function Zrtx() {
refModal.current.onDeletePost(apiurl.dataResourcesCenter.projectAndWater.kr.delete,params); refModal.current.onDeletePost(apiurl.dataResourcesCenter.projectAndWater.kr.delete,params);
} }
} }
useEffect(() => { useEffect(() => {
getData(); getData();
}, []) }, [])
return ( return (
<div> <div>
<h1><Button type='primary' onClick={() => {refModal.current.showSave({})}}>新增</Button></h1> <h1><Button type='primary' onClick={() => {refModal.current.showSave(dataInfo)}}>新增</Button></h1>
<div style={{display:"flex",columnGap:10,width:"100%"}}> <div style={{display:"flex",columnGap:10,width:"100%"}}>
<div style={{width:500}}> <div style={{width:500}}>
<Table <Table

View File

@ -1,11 +1,29 @@
import React, { useState } from 'react' import React, { useEffect, useState } from 'react'
import ProjectBasciInfo from './projectBasicInfo' import ProjectBasciInfo from './projectBasicInfo'
import TzParams from './tzParams' import TzParams from './tzParams'
import KrLine from './KrLine' import KrLine from './KrLine'
import MonthLl from './monthLl' import MonthLl from './monthLl'
import apiurl from '../../../../service/apiurl';
import { httpget2, httppost2 } from '../../../../utils/request';
import "./index.less" import "./index.less"
export default function ShuikuBasicInfo() { export default function ShuikuBasicInfo() {
const [tabVal, setTabVal] = useState('1') const [tabVal, setTabVal] = useState('1')
const [data,setData] =useState('')
const getDataIfo = async () => {
try {
const res = await httppost2(apiurl.dataResourcesCenter.projectAndWater.shuikuBasicinfo.detail)
// debugger;
if (res.code == 200) {
setData(res.data[0])
}
} catch (error) {
console.log(error);
}
}
useEffect(()=>{
getDataIfo()
},[])
return ( return (
<div className='shuiku-content-root'> <div className='shuiku-content-root'>
<div className='fxdd_hsybjs_toolbar'> <div className='fxdd_hsybjs_toolbar'>
@ -32,8 +50,8 @@ export default function ShuikuBasicInfo() {
> >
{tabVal === "1" ? <ProjectBasciInfo /> : null} {tabVal === "1" ? <ProjectBasciInfo /> : null}
{tabVal === "2" ? <TzParams /> : null} {tabVal === "2" ? <TzParams /> : null}
{tabVal === "3" ? <KrLine /> : null} {tabVal === "3" ? <KrLine dataInfo={data}/> : null}
{tabVal === "5" ? <MonthLl /> : null} {tabVal === "5" ? <MonthLl dataInfo={data}/> : null}
</div> </div>
</div> </div>

View File

@ -165,7 +165,7 @@ export default function ProjectBasciInfo() {
name="resCode" name="resCode"
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<Input allowClear style={{width:'300px'}} disabled={skdisabled}/> <Input allowClear style={{width:'300px'}} disabled/>
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
@ -182,7 +182,7 @@ export default function ProjectBasciInfo() {
<Form.Item <Form.Item
label="注册登记时间" label="注册登记时间"
name="regTime" name="regTime"
getValueFromEvent={(e, dateString) => dateString} getValueFromEvent={(e, dateString) => moment(dateString).format('YYYY-MM-DD HH:mm:ss')}
getValueProps={value => ({ getValueProps={value => ({
value: value ? moment(value) : undefined value: value ? moment(value) : undefined
})} })}
@ -284,7 +284,7 @@ export default function ProjectBasciInfo() {
<Form.Item <Form.Item
label="开工日期" label="开工日期"
name="startDate" name="startDate"
getValueFromEvent={(e, dateString) => dateString} getValueFromEvent={(e, dateString) => moment(dateString).format('YYYY-MM-DD HH:mm:ss')}
getValueProps={value => ({ getValueProps={value => ({
value: value ? moment(value) : undefined value: value ? moment(value) : undefined
})} })}
@ -296,7 +296,7 @@ export default function ProjectBasciInfo() {
<Form.Item <Form.Item
label="竣工日期" label="竣工日期"
name="compDate" name="compDate"
getValueFromEvent={(e, dateString) => dateString} getValueFromEvent={(e, dateString) => moment(dateString).format('YYYY-MM-DD HH:mm:ss')}
getValueProps={value => ({ getValueProps={value => ({
value: value ? moment(value) : undefined value: value ? moment(value) : undefined
})} })}

View File

@ -1,27 +1,30 @@
import { Image } from "antd" import { Image } from "antd"
import zd from '../../../../assets/img/u7.png' import zd from '../../../../assets/img/u7.png'
import title from '../../../../assets/img/titleRight.png' import title from '../../../../assets/img/titleRight.png'
import './index.less' import styles from './index.module.less'
const Page = () => { const Page = () => {
return ( return (
<div style={{ display: 'flex',height:'100%' }}> <div style={{ display: 'flex',height:'100%' }}>
<div style={{ backgroundColor: '#ffffff',width:390,height:'100%',marginRight:10,padding:10 }}> <div style={{ backgroundColor: '#ffffff',width:390,height:'100%',marginRight:10,padding:10 }}>
<div className="title"> <div className={styles.title}>
<Image src={title} />保护对象 <Image src={title} />保护对象
</div> </div>
<div className="content"> <div className={styles.content}>
水库防洪标准按50年一遇设计1000年一遇校核设计洪水位111.51校核洪水位 112.75 ,水库担负着红安县城七里坪杏花城关等城镇以及京九铁路汉麻连络线省道S234国道G230,京九铁路汉麻联络线等交通设施安全的防洪重任防洪保护人口32万 水库防洪标准按50年一遇设计1000年一遇校核设计洪水位111.51校核洪水位 112.75 ,水库担负着红安县城七里坪杏花城关等城镇以及京九铁路汉麻连络线省道S234国道G230,京九铁路汉麻联络线等交通设施安全的防洪重任防洪保护人口32万
保护耕地 15 万亩 保护耕地 15 万亩
</div> </div>
</div> </div>
<div style={{ backgroundColor: '#ffffff',flex:1,padding:10}}> <div style={{ backgroundColor: '#ffffff',flex:1,padding:10}}>
<div className="title"> <div className={styles.title}>
<Image src={title} />转移路线示意图 <Image src={title} />转移路线示意图
</div> </div>
<div style={{display:'flex',justifyContent:'center'}}>
<Image src={zd} width='80%' preview={false} /> <Image src={zd} width='80%' preview={false} />
</div> </div>
</div>
</div> </div>
) )
} }

View File

@ -30,7 +30,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
*/ */
const download = (params) => { const download = (params) => {
let downloadLink = document.createElement("a"); let downloadLink = document.createElement("a");
downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/xyt/projectEvents/file/download/${params}`; downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/tsg/projectEvents/file/download/${params}`;
downloadLink.download = `${params.fileName}`; downloadLink.download = `${params.fileName}`;
downloadLink.style.display = "none"; downloadLink.style.display = "none";
// 将链接添加到页面中 // 将链接添加到页面中
@ -187,7 +187,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Dragger <Dragger
name='file' name='file'
// multiple // multiple
action="/gunshiApp/xyt/projectEvents/file/upload/singleSimple" action="/gunshiApp/tsg/projectEvents/file/upload/singleSimple"
onChange={fileChange} onChange={fileChange}
onDrop={(info) => { console.log(info.dataTransfer.files); }} onDrop={(info) => { console.log(info.dataTransfer.files); }}
fileList={fileList} fileList={fileList}
@ -286,7 +286,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
border: 0, border: 0,
marginTop: 20, marginTop: 20,
}} }}
src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/xyt/projectEvents/file/download/${iframeSrc}`)}`} src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/tsg/projectEvents/file/download/${iframeSrc}`)}`}
/> />
</Modal> </Modal>
</> </>

View File

@ -61,7 +61,7 @@ const Page = () => {
const download = (params) => { const download = (params) => {
let downloadLink = document.createElement("a"); let downloadLink = document.createElement("a");
downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/xyt/projectEvents/file/download/${params}`; downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/tsg/projectEvents/file/download/${params}`;
downloadLink.download = `${params.fileName}`; downloadLink.download = `${params.fileName}`;
downloadLink.style.display = "none"; downloadLink.style.display = "none";
// 将链接添加到页面中 // 将链接添加到页面中
@ -87,6 +87,7 @@ const viewPdf = (params) => {
setPdfViewOPen(true) setPdfViewOPen(true)
} }
useEffect(()=>{ useEffect(()=>{
const params = { const params = {
search: { search: {
...searchVal, ...searchVal,
@ -213,7 +214,7 @@ const viewPdf = (params) => {
border: 0, border: 0,
marginTop: 20, marginTop: 20,
}} }}
src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/xyt/projectEvents/file/download/${iframeSrc}`)}`} src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/tsg/projectEvents/file/download/${iframeSrc}`)}`}
/> />
</Modal> </Modal>
</> </>

View File

@ -9,6 +9,8 @@ import usePageTable from '../../../../components/crud/usePageTable2';
import { createCrudService } from '../../../../components/crud/_'; import { createCrudService } from '../../../../components/crud/_';
import {CrudOpRender_text} from '../../../../components/crud/CrudOpRender'; import {CrudOpRender_text} from '../../../../components/crud/CrudOpRender';
import './index.less' import './index.less'
import { httppost5 } from '../../../../utils/request';
import { exportFile } from '../../../../utils/tools';
const url = "http://223.75.53.141:9102/test.by-lyf.tmp" const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
const Page = () => { const Page = () => {
@ -19,6 +21,8 @@ const Page = () => {
const refModal = useRef(); const refModal = useRef();
const [searchVal, setSearchVal] = useState(false) const [searchVal, setSearchVal] = useState(false)
const [isFetch, setIsFetch] = useState(false) const [isFetch, setIsFetch] = useState(false)
const [iframeSrc, setIframeSrc] = useState('')
const [pdfViewOPen, setPdfViewOPen] = useState(false)
const command = (type) => (params) => { const command = (type) => (params) => {
if (type === 'save') { if (type === 'save') {
@ -34,7 +38,7 @@ const Page = () => {
const download = (params) => { const download = (params) => {
let downloadLink = document.createElement("a"); let downloadLink = document.createElement("a");
downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/xyt/projectEvents/file/download/${params}`; downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/tsg/projectEvents/file/download/${params}`;
downloadLink.download = `${params.fileName}`; downloadLink.download = `${params.fileName}`;
downloadLink.style.display = "none"; downloadLink.style.display = "none";
// 将链接添加到页面中 // 将链接添加到页面中
@ -46,11 +50,22 @@ const Page = () => {
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.gcdsj.qzqda.list).find_noCode); const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.gcdsj.qzqda.list).find_noCode);
/**
* @description pdf文件预览
* @param {String} params 文件预览url
*/
const viewPdf = (params) => {
setIframeSrc(params)
setPdfViewOPen(true)
}
const onExport = () => {
const viewPdf = (params) => { let params = {
// setIframeSrc(params) ...searchVal,
// setPdfViewOPen(true) }
httppost5(apiurl.gcdsj.qzqda.export, params).then(res => {
exportFile(`全周期档案.xlsx`,res.data)
})
} }
useEffect(()=>{ useEffect(()=>{
const params = { const params = {
@ -69,7 +84,7 @@ const viewPdf = (params) => {
<Card className='nonebox'> <Card className='nonebox'>
<ToolBar <ToolBar
setSearchVal={setSearchVal} setSearchVal={setSearchVal}
onSave={command('save')} onExport={onExport}
role={role} role={role}
/> />
</Card> </Card>
@ -145,7 +160,26 @@ const viewPdf = (params) => {
</div> </div>
</div> </div>
</div> </div>
<Modal
open={pdfViewOPen}
width={1000}
title=""
footer={null}
style={{marginTop:"-5%"}}
onCancel={() => {
setPdfViewOPen(false)
}}
>
<iframe
style={{
height: '80vh',
width: '100%',
border: 0,
marginTop: 20,
}}
src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/tsg/projectEvents/file/download/${iframeSrc}`)}`}
/>
</Modal>
</> </>
); );
} }

View File

@ -3,7 +3,7 @@ import { Form, Input, Button, DatePicker } from 'antd';
import moment from 'moment'; import moment from 'moment';
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
const ToolBar = ({ setSearchVal, onSave, storeData, role }) => { const ToolBar = ({ setSearchVal, onExport, storeData, role }) => {
const addBtn = role?.rule?.find(item => item.menuName == "新增"); const addBtn = role?.rule?.find(item => item.menuName == "新增");
const searchBtn = role?.rule?.find(item => item.menuName == "查询"); const searchBtn = role?.rule?.find(item => item.menuName == "查询");
const [form] = Form.useForm(); const [form] = Form.useForm();
@ -36,15 +36,15 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role }) => {
format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"
/> />
</Form.Item> </Form.Item>
{searchBtn ? <Form.Item> <Form.Item>
<Button type="primary" htmlType="submit">查询</Button> <Button type="primary" htmlType="submit">查询</Button>
</Form.Item> : null} </Form.Item>
<Form.Item> <Form.Item>
<Button onClick={() => form.resetFields()}>重置</Button> <Button onClick={() => form.resetFields()}>重置</Button>
</Form.Item> </Form.Item>
<Form.Item> <Form.Item>
<Button type="primary" onClick={onSave}>导出</Button> <Button type="primary" onClick={onExport}>导出</Button>
</Form.Item> </Form.Item>
</Form> </Form>
</div> </div>

View File

@ -13,13 +13,13 @@ const { RangePicker } = DatePicker
const { Dragger } = Upload; const { Dragger } = Upload;
const url = "http://223.75.53.141:9102/test.by-lyf.tmp" const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
const opntios=[ const opntios = [
{label:'宪法',value:'宪法'}, { label: '宪法', value: '宪法' },
{label:'法律',value:'法律'}, { label: '法律', value: '法律' },
{label:'行政法规',value:'行政法规'}, { label: '行政法规', value: '行政法规' },
{label:'督察法规',value:'督察法规'}, { label: '督察法规', value: '督察法规' },
{label:'司法解释',value:'司法解释'}, { label: '司法解释', value: '司法解释' },
{label:'地方性法规',value:'地方性法规'}, { label: '地方性法规', value: '地方性法规' },
] ]
const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => { const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
@ -37,7 +37,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
*/ */
const download = (params) => { const download = (params) => {
let downloadLink = document.createElement("a"); let downloadLink = document.createElement("a");
downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/xyt/projectEvents/file/download/${params}`; downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/xyt/SzRuleByLaw/file/download/${params}`;
downloadLink.download = `${params.fileName}`; downloadLink.download = `${params.fileName}`;
downloadLink.style.display = "none"; downloadLink.style.display = "none";
// 将链接添加到页面中 // 将链接添加到页面中
@ -78,16 +78,15 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
const onfinish = (values) => { const onfinish = (values) => {
values.eventsDate = values.eventsDate ? moment(values.eventsDate).format("YYYY-MM-DD 00:00:00") : '' values.files = fileList.map(item => item.response?.data??item);
let oldFiles = fileList.map(item => ({ fileId: item.response?.data?.fileId }))
// values.eventsDate = values.eventsDate ? moment(values.eventsDate).format("YYYY-MM-DD 00:00:00") : ''
if (mode === 'edit') { if (mode === 'edit') {
values.files = oldFiles;
values.id = record.id; onEdit(apiurl.flfg.edit, {...record,...values})
onEdit(apiurl.rcgl.gcdsj.edit, values)
} }
if (mode === 'save') { if (mode === 'save') {
values.files = oldFiles onSave(apiurl.flfg.add, values)
onSave(apiurl.rcgl.gcdsj.save, values)
} }
} }
@ -102,16 +101,16 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
} }
useEffect(() => { useEffect(() => {
if (mode != 'save') { if (mode != 'save') {
const imgFile = record?.files?.map(o => ({ // const imgFile = record?.files?.map(o => ({
name: o.fileName, // name: o.name,
response: { // response: {
data: { // data: {
filePath: o.filePath, // filePath: o.filePath,
fileId: o.fileId // fileId: o.fileId
} // }
}, // },
})) // }))
setFileList(imgFile) setFileList(record?.files)
} }
}, [record, mode]) }, [record, mode])
@ -138,51 +137,66 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="制定机关" label="制定机关"
name="name" name="fillUnit"
rules={[{ required: true }]}
> >
<Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear /> <Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item label="制定机关" name="name"> <Form.Item label="法律性质" name="type" rules={[{ required: true }]}>
<Select allowClear style={{ width: '150px' }} options={opntios} /> <Select allowClear style={{ width: '100%' }} options={[
{ label: '宪法', value: 0 },
{ label: '法律', value: 1 },
{ label: '行政法规', value: 2 },
{ label: '督察法规', value: 3 },
{ label: '司法解释', value: 4 },
{ label: '地方性法规', value: 5 },
]} disabled={mode === 'view'} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> {/* <Col span={12}>
<Form.Item label="失效性" name="name"> <Form.Item label="法律性质" name="timeliness">
<Select allowClear style={{ width: '150px' }} options={opntios} /> <Select allowClear style={{ width: '150px' }} options={opntios} />
</Form.Item> </Form.Item>
</Col> </Col> */}
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="公布日期" label="时效性"
name="eventsDate" name="timeliness"
getValueFromEvent={(e, dateString) => dateString}
getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
rules={[ rules={[
{ {
required: true, required: true,
}, },
]} ]}
> >
<DatePicker disabled={mode === 'view'} format={'YYYY-MM-DD'} style={{ width: '100%' }} allowClear /> <Select allowClear style={{ width: '100%' }} options={[
{ label: '尚未生效', value: 0 },
{ label: '有效', value: 1 },
{ label: '已修改', value: 2 },
{ label: '已废止', value: 3 },
]} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="施行日期" label="施行日期"
name="eventsDate" name="announcementDate"
getValueFromEvent={(e, dateString) => dateString} getValueFromEvent={(e, dateString) => dateString}
getValueProps={(value) => ({ value: value ? moment(value) : undefined })} getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
rules={[
{
required: true,
},
]}
> >
<DatePicker disabled={mode === 'view'} format={'YYYY-MM-DD'} style={{ width: '100%' }} allowClear /> <DatePicker disabled={mode === 'view'} format={'YYYY-MM-DD HH:mm:ss'} style={{ width: '100%' }} allowClear />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="公布日期"
name="implementationDate"
getValueFromEvent={(e, dateString) => dateString}
getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
>
<DatePicker disabled={mode === 'view'} format={'YYYY-MM-DD HH:mm:ss'} style={{ width: '100%' }} allowClear />
</Form.Item> </Form.Item>
</Col> </Col>
</Row> </Row>
@ -191,15 +205,20 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="附件" label="附件"
name="fieldId" name="files"
labelCol={{ span: 3 }} labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }} wrapperCol={{ span: 19 }}
// rules={[
// {
// required: true,
// },
// ]}
> >
{mode !== "view" && {mode !== "view" &&
<Dragger <Dragger
name='file' name='file'
// multiple // multiple
action="/gunshiApp/xyt/projectEvents/file/upload/singleSimple" action="/gunshiApp/tsg/SzRuleByLaw/file/upload/singleSimple"
onChange={fileChange} onChange={fileChange}
onDrop={(info) => { console.log(info.dataTransfer.files); }} onDrop={(info) => { console.log(info.dataTransfer.files); }}
fileList={fileList} fileList={fileList}
@ -217,11 +236,11 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
fileList.length > 0 && fileList.map(file => { fileList.length > 0 && fileList.map(file => {
return ( return (
<Col span={12}> <Col span={12}>
<div className="file-item" style={{ width: "75%" }}> <div className="file-item" style={{ width: "75%",marginTop:5 }}>
<div className='file-description'> <div className='file-description'>
{file.name.indexOf('.docx') > -1 ? {file?.fileName?.indexOf('.docx') > -1 ?
<div <div
onClick={() => { download(file.response?.data?.fileId) }} onClick={() => { download(file.fileId) }}
style={{ cursor: 'pointer' }} style={{ cursor: 'pointer' }}
> >
<FileWordOutlined <FileWordOutlined
@ -229,35 +248,35 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
/> />
</div> </div>
: :
file.name.indexOf('.pdf') > -1 ? file?.fileName?.indexOf('.pdf') > -1 ?
<div <div
onClick={() => { viewPdf(file.response?.data?.fileId) }} onClick={() => { viewPdf(file.fileId) }}
style={{ cursor: 'pointer' }} style={{ cursor: 'pointer' }}
> >
<FilePdfOutlined style={{ fontSize: 40 }} /> <FilePdfOutlined style={{ fontSize: 40 }} />
</div> </div>
: :
file.name.indexOf('.zip') > -1 ? file?.fileName?.indexOf('.zip') > -1 ?
<div <div
onClick={() => { download(file.response?.data?.fileId) }} onClick={() => { download(file.fileId) }}
style={{ cursor: 'pointer' }} style={{ cursor: 'pointer' }}
> >
<FileZipOutlined style={{ fontSize: 40 }} /> <FileZipOutlined style={{ fontSize: 40 }} />
</div> </div>
: :
file.name.indexOf('.xlsx') > -1 ? file?.fileName?.indexOf('.xlsx') > -1 ?
<div <div
onClick={() => { download(file.response?.data?.fileId) }} onClick={() => { download(file.fileId) }}
style={{ cursor: 'pointer' }} style={{ cursor: 'pointer' }}
> >
<FileExcelOutlined style={{ fontSize: 40 }} /> <FileExcelOutlined style={{ fontSize: 40 }} />
</div> </div>
: :
<Image width={60} src={url + file.response?.data?.filePath} alt='' /> <Image width={60} src={url + file.filePath} alt='' />
} }
<span>{file.name}</span> <span>{file?.fileName}</span>
</div> </div>
<div className={mode == "view" ? 'delete-icon disable-icon' : 'delete-icon'} onClick={() => deleteFile(file.response?.data?.fileId)}> <div className={mode == "view" ? 'delete-icon disable-icon' : 'delete-icon'} onClick={() => deleteFile(file.fileId)}>
<DeleteOutlined /> <DeleteOutlined />
</div> </div>
</div> </div>
@ -273,7 +292,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
mode === 'view' ? null : ( mode === 'view' ? null : (
<> <>
<Form.Item {...btnItemLayout}> <Form.Item {...btnItemLayout}>
<Button type="primary" htmlType="submit"> <Button type="primary" htmlType="submit" loading={loading}>
{mode === 'save' ? '提交' : '修改'} {mode === 'save' ? '提交' : '修改'}
</Button> </Button>
</Form.Item> </Form.Item>
@ -298,7 +317,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
border: 0, border: 0,
marginTop: 20, marginTop: 20,
}} }}
src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/xyt/projectEvents/file/download/${iframeSrc}`)}`} src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/tsg/projectEvents/file/download/${iframeSrc}`)}`}
/> />
</Modal> </Modal>
</> </>

View File

@ -9,8 +9,11 @@ import apiurl from '../../../service/apiurl';
import usePageTable from '../../../components/crud/usePageTable2'; import usePageTable from '../../../components/crud/usePageTable2';
import { createCrudService } from '../../../components/crud/_'; import { createCrudService } from '../../../components/crud/_';
import { CrudOpRender_text } from '../../../components/crud/CrudOpRender'; import { CrudOpRender_text } from '../../../components/crud/CrudOpRender';
import { render } from 'react-dom';
const url = "http://223.75.53.141:9102/test.by-lyf.tmp" const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
const typeOb={0:'宪法',1:'法律',2:'行政法规',3:'督察法规',4:'司法解释',5:'地方性法规'}
const timelinessOb = {0:'尚未生效',1:'有效',2:'已修改',3:'已废止'}
const Page = () => { const Page = () => {
const role = useSelector(state => state.auth.role); const role = useSelector(state => state.auth.role);
const editBtn = role?.rule?.find(item => item.menuName == "编辑"); const editBtn = role?.rule?.find(item => item.menuName == "编辑");
@ -25,26 +28,28 @@ const Page = () => {
{ title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center" }, { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center" },
{ title: '标题', key: 'name', dataIndex: 'name', width: 250, ellipsis: true }, { title: '标题', key: 'name', dataIndex: 'name', width: 250, ellipsis: true },
{ {
title: '制定机关', key: 'eventsDate', dataIndex: 'eventsDate', width: 140, title: '制定机关', key: 'fillUnit', dataIndex: 'fillUnit', width: 140,
}, },
{ {
title: '法律性质', key: 'eventsType', dataIndex: 'eventsType', width: 140, title: '法律性质', key: 'type', dataIndex: 'type', width: 140,
render: (value) => <span>{value == 1 ? "综合大事记" : value == 2 ? "专题大事记" : ''}</span>, render: (value) => <span>{typeOb[value]}</span>,
}, },
{ {
title: '时效性', key: 'eventsDesc', dataIndex: 'eventsDesc', width: 300 title: '时效性', key: 'timeliness', dataIndex: 'timeliness', width: 300,render:(v)=><>
{timelinessOb[v]}
</>
}, },
{ {
title: '公布日期', key: 'eventsDesc', dataIndex: 'eventsDesc', width: 300 title: '公布日期', key: 'announcementDate', dataIndex: 'announcementDate', width: 300
}, },
{ {
title: '施行日期', key: 'eventsDesc', dataIndex: 'eventsDesc', width: 300 title: '施行日期', key: 'implementationDate', dataIndex: 'implementationDate', width: 300
}, },
{ {
title: '上传时间', key: 'eventsDesc', dataIndex: 'eventsDesc', width: 300 title: '上传时间', key: 'eventsDesc', dataIndex: 'eventsDesc', width: 300
}, },
{ {
title: '附件', key: 'fileName', dataIndex: 'fileName', width: 300,render:(v,r)=><a onClick={()=>viewPdf(r.fileId)}>{v}</a> title: '附件', key: 'files', dataIndex: 'files', width: 300,render:(v,r)=><a onClick={()=>viewPdf(v[0].fileId)}>{v[0]?.fileName}</a>
}, },
{ {
title: '操作', key: 'operation', width: 240, fixed: 'right', align: 'center', title: '操作', key: 'operation', width: 240, fixed: 'right', align: 'center',
@ -52,7 +57,7 @@ const Page = () => {
<CrudOpRender_text <CrudOpRender_text
edit={true} edit={true}
del={true} del={true}
view={true} // view={true}
command={(cmd) => () => command(cmd)(row)} />) command={(cmd) => () => command(cmd)(row)} />)
}, },
]; ];
@ -68,12 +73,12 @@ const Page = () => {
} else if (type === 'view') { } else if (type === 'view') {
refModal.current.showView(params); refModal.current.showView(params);
} else if (type === 'del') { } else if (type === 'del') {
refModal.current.onDeleteGet(apiurl.rcgl.gcdsj.delete + `/${params.id}`); refModal.current.onDeleteGet(apiurl.flfg.del + `/${params.id}`);
} }
} }
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.rcgl.gcdsj.page).find_noCode); const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.flfg.list).find_noCode);
/** /**
* @description 处理成功的回调 * @description 处理成功的回调

View File

@ -18,16 +18,22 @@ const ToolBar = ({ setSearchVal, onSave, storeData,role }) => {
} }
} }
delete values.tm delete values.tm
setSearchVal({...values, dataSo}); setSearchVal({...values});
} }
const opntios=[ const opntios=[
{label:'宪法',value:'宪法'}, {label:'宪法',value:0},
{label:'法律',value:'法律'}, {label:'法律',value:1},
{label:'行政法规',value:'行政法规'}, {label:'行政法规',value:2},
{label:'督察法规',value:'督察法规'}, {label:'督察法规',value:3},
{label:'司法解释',value:'司法解释'}, {label:'司法解释',value:4},
{label:'地方性法规',value:'地方性法规'}, {label:'地方性法规',value:5},
]
const opntios1=[
{label:'尚未生效',value:0},
{label:'有效',value:1},
{label:'已修改',value:2},
{label:'已废止',value:3},
] ]
const styles={ const styles={
fontFamily: '微软雅黑 Bold", "微软雅黑 Regular", 微软雅黑, sans-serif', fontFamily: '微软雅黑 Bold", "微软雅黑 Regular", 微软雅黑, sans-serif',
@ -43,10 +49,10 @@ const ToolBar = ({ setSearchVal, onSave, storeData,role }) => {
<Form.Item label="标题" name="name"> <Form.Item label="标题" name="name">
<Input allowClear style={{width:'150px'}}/> <Input allowClear style={{width:'150px'}}/>
</Form.Item> </Form.Item>
<Form.Item label="制定机关" name="name"> <Form.Item label="制定机关" name="fillUnit">
<Input allowClear style={{width:'150px'}}/> <Input allowClear style={{width:'150px'}}/>
</Form.Item> </Form.Item>
<Form.Item label="制定机关" name="name"> <Form.Item label="法律性质" name="type">
<Select allowClear style={{width:'150px'}} options={opntios}/> <Select allowClear style={{width:'150px'}} options={opntios}/>
</Form.Item> </Form.Item>
<Form.Item> <Form.Item>
@ -69,13 +75,13 @@ const ToolBar = ({ setSearchVal, onSave, storeData,role }) => {
</Form.Item> </Form.Item>
</div> </div>
{showGj&&<div style={{display:'flex'}}> {showGj&&<div style={{display:'flex'}}>
<Form.Item label="时效性" name="name"> <Form.Item label="时效性" name="timeliness">
<Select allowClear style={{width:'150px'}} options={opntios}/> <Select allowClear style={{width:'150px'}} options={opntios1}/>
</Form.Item> </Form.Item>
<Form.Item label="公布日期" name="name"> <Form.Item label="公布日期" name="announcementDate">
<RangePicker allowClear /> <RangePicker allowClear />
</Form.Item> </Form.Item>
<Form.Item label="施行日期" name="name"> <Form.Item label="施行日期" name="implementationDate">
<RangePicker allowClear /> <RangePicker allowClear />
</Form.Item> </Form.Item>
<Form.Item label="上传时间" name="name"> <Form.Item label="上传时间" name="name">

View File

@ -7,6 +7,8 @@ import NormalSelect from '../../../components/Form/NormalSelect';
import "./index.less" import "./index.less"
import moment from 'moment'; import moment from 'moment';
import { createCrudService } from '../../../components/crud/_'; import { createCrudService } from '../../../components/crud/_';
import { httpget2, httppost2 } from '../../../utils/request';
const { RangePicker } = DatePicker const { RangePicker } = DatePicker
const { Dragger } = Upload; const { Dragger } = Upload;
const url = "http://223.75.53.141:9102/test.by-lyf.tmp" const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
@ -91,7 +93,18 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
setPdfViewOPen(true) setPdfViewOPen(true)
} }
const [jh, setJh] = useState([])
const getJhList = async () => {
try {
const res = await httppost2(apiurl.pxjl.list)
if (res.code == 200) {
setJh(res.data.map(item => ({label:item.name,value:item.id})))
}
} catch (error) {
console.log(error);
}
}
@ -102,17 +115,22 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
}, [record]) }, [record])
useEffect(() => { useEffect(() => {
if (mode !== "save") { getJhList()
let dataSo = [ }, [])
record.validStartDate? moment(record.validStartDate):'',
record.validEndDate? moment(record.validEndDate): ''
]
form.setFieldsValue({...record,dateRangeSo:dataSo})
} // useEffect(() => {
// if (mode !== "save") {
// let dataSo = [
// record.validStartDate? moment(record.validStartDate):'',
// record.validEndDate? moment(record.validEndDate): ''
// ]
}, [record,mode]) // form.setFieldsValue({...record,dateRangeSo:dataSo})
// }
// }, [record,mode])
return ( return (
<div style={{height:"65vh",overflowY:"auto"}}> <div style={{height:"65vh",overflowY:"auto"}}>
@ -121,21 +139,21 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Form <Form
form={form} form={form}
{...formItemLayout} {...formItemLayout}
// initialValues={record} initialValues={record}
> >
<Row> <Row>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训计划" label="培训计划"
name="teamName" name="planId"
> >
<Input disabled={true} style={{width:'100%'}} allowClear /> <NormalSelect disabled={mode==='view'} style={{width:'100%'}} allowClear options={jh}/>
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训分类" label="培训分类"
name="teamName" name="type"
> >
<NormalSelect disabled={true} style={{ width: '100%' }} allowClear options={types} /> <NormalSelect disabled={true} style={{ width: '100%' }} allowClear options={types} />
</Form.Item> </Form.Item>
@ -145,7 +163,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训日期" label="培训日期"
name="startDate" name="planDate"
rules={[{ required: true }]} rules={[{ required: true }]}
getValueFromEvent={(e,dateString) => dateString} getValueFromEvent={(e,dateString) => dateString}
getValueProps={(value) => ({ value: value ? moment(value) : undefined })} getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
@ -157,7 +175,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="标题名称" label="标题名称"
name="teamName" name="name"
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<Input disabled={true} style={{width:'100%'}} allowClear /> <Input disabled={true} style={{width:'100%'}} allowClear />
@ -169,17 +187,24 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训时段" label="培训时段"
name="address" name="tm"
> >
<Input disabled={true} style={{width:'100%'}} allowClear /> <TimePicker.RangePicker
disabled={mode === 'view'}
style={{ width: '100%' }}
allowClear
format={"HH:mm:ss"}
// value={timeValue}
// onChange={(e) => setTimeValue(e)}
/>
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训时长(小时)" label="培训时长(小时)"
name="address" name="hour"
> >
<Input disabled={true} style={{width:'100%'}} allowClear /> <InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
</Col> </Col>
</Row> </Row>
@ -187,19 +212,19 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训地点" label="培训地点"
name="remark" name="addr"
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<Input disabled={true} style={{width:'100%'}} allowClear /> <Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="主办单位" label="主办单位"
name="remark"
rules={[{ required: true }]} rules={[{ required: true }]}
name="unit"
> >
<Input disabled={true} style={{width:'100%'}} allowClear /> <Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
</Col> </Col>
</Row> </Row>
@ -207,12 +232,12 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="培训内容" label="培训内容"
name="remark" name="content"
labelCol={{ span: 3 }} labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }} wrapperCol={{ span: 19 }}
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<Input.TextArea disabled={true} style={{width:'100%',minHeight:'50px'}} allowClear /> <Input.TextArea disabled={mode==='view'} style={{width:'100%',minHeight:'50px'}} allowClear />
</Form.Item> </Form.Item>
</Col> </Col>
</Row> </Row>
@ -220,7 +245,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="培训范围" label="培训范围"
name="remark" name="scope"
labelCol={{ span: 3 }} labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }} wrapperCol={{ span: 19 }}
@ -233,17 +258,18 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="参训人员" label="参训人员"
name="remark" name="trainees"
> >
<Input min={0} disabled={true} style={{width:'100%'}} allowClear /> <InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="参加人数" label="参训人数"
name="address" name="numPeople"
rules={[{ required: true }]}
> >
<Input disabled={true} style={{width:'100%'}} allowClear /> <InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
</Col> </Col>
</Row> </Row>
@ -252,20 +278,19 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="填报人" label="填报人"
name="address"
rules={[{ required: true }]} rules={[{ required: true }]}
name="applicant"
> >
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear /> <Input disabled={true} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="登记日期" label="登记日期"
name="startDate" name="regDate"
rules={[{ required: true }]} rules={[{ required: true }]}
getValueFromEvent={(e,dateString) => dateString} getValueFromEvent={(e,dateString) => dateString}
getValueProps={(value) => ({ value: value ? moment(value) : undefined })} getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
> >
<DatePicker disabled={true} format={'YYYY-MM-DD'} style={{width:'100%'}} allowClear /> <DatePicker disabled={true} format={'YYYY-MM-DD'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>

View File

@ -47,40 +47,14 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
const [pdfViewOPen, setPdfViewOPen] = useState(false) const [pdfViewOPen, setPdfViewOPen] = useState(false)
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
/**
* @description 获取查看时文件
* @param {*} type
* @returns
*/
const getFileInfo = (params) => {
createCrudService(apiurl.fxzb.qsdw.zq.getFile).delGet({ teamId: params.teamId }).then(res => {
if (res.code === 200) {
let fileArr = res.data?.files.map(item => {
return {
name: item.fileName,
response: {
data: {
filePath: item.filePath,
fileId:item.fileId
}
},
}
})
setFileList(fileArr)
const result = res.data?.details.map(item => ({ ...item, key: item.detailId }))
console.log("resss",result);
setDetails(result)
}
})
}
/** /**
* @description 文件下载 * @description 文件下载
* @param {String} params 文件fileId * @param {String} params 文件fileId
*/ */
const download = (params) => { const download = (params) => {
let downloadLink = document.createElement("a"); let downloadLink = document.createElement("a");
downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/xyt/rescue/team/file/download/${params}`; downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/tsg/personnelPlan/file/download/${params}`;
downloadLink.download = `${params.fileName}`; downloadLink.download = `${params.fileName}`;
downloadLink.style.display = "none"; downloadLink.style.display = "none";
// 将链接添加到页面中 // 将链接添加到页面中
@ -120,20 +94,18 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
} }
const onfinish = () => { const onfinish = (values) => {
let values = form.getFieldsValue(); values.regDate = moment(values.regDate).format('YYYY-MM-DD')
values.details = details; let oldFiles = fileList.map(item => ({fileId:item.response?.data?.fileId }))
values.validStartDate = values.dateRangeSo&&moment(values.dateRangeSo[0]).format("YYYY-MM-DD") values.files = oldFiles;
values.validEndDate = values.dateRangeSo&&moment(values.dateRangeSo[1]).format("YYYY-MM-DD")
if (mode === 'edit') { if (mode === 'edit') {
let oldFiles = fileList.map(item => item.response?.data?.fileId ) onEdit(apiurl.pxjh.edit,{...record,...values})
values.fileIds = oldFiles;
values.teamId = record.teamId;
onEdit(apiurl.fxzb.qsdw.zq.edit,values)
} }
if (mode === 'save') { if (mode === 'save') {
values.fileIds = fileIds onSave(apiurl.pxjh.save,values)
onSave(apiurl.fxzb.qsdw.zq.save,values) }
if (mode === "similarSave") {
onSave(apiurl.pxjh.save,values)
} }
} }
@ -146,24 +118,31 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
let filterFile = fileList.filter(item => item.response?.data?.fileId !== fileId); let filterFile = fileList.filter(item => item.response?.data?.fileId !== fileId);
setFileList(filterFile) setFileList(filterFile)
} }
useEffect(()=>{
if (record.teamId ) {
getFileInfo(record)
}
}, [record])
useEffect(() => { useEffect(() => {
if (mode !== "save") { if (mode!== "save") {
let dataSo = [ let fileArr = record?.files.map(item => {
record.validStartDate? moment(record.validStartDate):'', return {
record.validEndDate? moment(record.validEndDate): '' name: item.fileName,
] response: {
data: {
form.setFieldsValue({...record,dateRangeSo:dataSo}) filePath: item.filePath,
fileId:item.fileId
} }
},
}
})
setFileList(fileArr)
}
}, [mode, record])
useEffect(() => {
const userName = localStorage.getItem('userName')
form.setFieldValue("regDate", moment())
form.setFieldValue("applicant",userName)
}, [])
}, [record,mode])
return ( return (
<div style={{height:"65vh",overflowY:"auto"}}> <div style={{height:"65vh",overflowY:"auto"}}>
@ -172,13 +151,14 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Form <Form
form={form} form={form}
{...formItemLayout} {...formItemLayout}
// initialValues={record} initialValues={record}
onFinish={onfinish}
> >
<Row> <Row>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训班名称" label="培训班名称"
name="teamName" name="name"
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear /> <Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
@ -187,7 +167,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训班分类" label="培训班分类"
name="teamName" name="type"
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<NormalSelect disabled={mode === 'view'} style={{ width: '100%' }} allowClear options={types} /> <NormalSelect disabled={mode === 'view'} style={{ width: '100%' }} allowClear options={types} />
@ -198,7 +178,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="主办单位" label="主办单位"
name="remark" name="unit"
labelCol={{ span: 3 }} labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }} wrapperCol={{ span: 19 }}
rules={[{ required: true }]} rules={[{ required: true }]}
@ -211,7 +191,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="开始培训日期" label="开始培训日期"
name="startDate" name="stm"
rules={[{ required: true }]} rules={[{ required: true }]}
getValueFromEvent={(e,dateString) => dateString} getValueFromEvent={(e,dateString) => dateString}
getValueProps={(value) => ({ value: value ? moment(value) : undefined })} getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
@ -223,7 +203,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="结束培训日期" label="结束培训日期"
name="startDate" name="etm"
rules={[{ required: true }]} rules={[{ required: true }]}
getValueFromEvent={(e,dateString) => dateString} getValueFromEvent={(e,dateString) => dateString}
getValueProps={(value) => ({ value: value ? moment(value) : undefined })} getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
@ -238,7 +218,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训天数(天)" label="培训天数(天)"
name="address" name="day"
> >
<InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear /> <InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
@ -246,7 +226,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训期数(期)" label="培训期数(期)"
name="address" name="num"
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear /> <InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
@ -257,7 +237,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="培训地点" label="培训地点"
name="remark" name="addr"
labelCol={{ span: 3 }} labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }} wrapperCol={{ span: 19 }}
rules={[{ required: true }]} rules={[{ required: true }]}
@ -270,12 +250,12 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="培训内容" label="培训内容"
name="remark" name="content"
labelCol={{ span: 3 }} labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }} wrapperCol={{ span: 19 }}
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<Input.TextArea disabled={mode==='view'} style={{width:'100%',minHeight:'50px'}} allowClear /> <Input.TextArea disabled={mode==='view'} style={{width:'100%',minHeight:'100px'}} allowClear />
</Form.Item> </Form.Item>
</Col> </Col>
</Row> </Row>
@ -283,7 +263,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="培训范围" label="培训范围"
name="remark" name="scope"
labelCol={{ span: 3 }} labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }} wrapperCol={{ span: 19 }}
rules={[{ required: true }]} rules={[{ required: true }]}
@ -296,7 +276,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="参训人员" label="参训人员"
name="remark" name="trainees"
labelCol={{ span: 3 }} labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }} wrapperCol={{ span: 19 }}
> >
@ -308,7 +288,8 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="参训人数(人)" label="参训人数(人)"
name="address" name="numPeople"
rules={[{ required: true }]}
> >
<InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear /> <InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
@ -316,7 +297,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="联系人" label="联系人"
name="address" name="contacts"
> >
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear /> <Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
@ -326,7 +307,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="联系电话" label="联系电话"
name="address" name="contactNumber"
> >
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear /> <Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
@ -334,7 +315,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="填报人" label="填报人"
name="address" name="applicant"
> >
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear /> <Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
@ -344,7 +325,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="状态" label="状态"
name="address" name="status"
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<NormalSelect disabled={mode==='view'} style={{width:'100%'}} allowClear options={[{label:"有效",value:1},{label:"无效",value:2}]} /> <NormalSelect disabled={mode==='view'} style={{width:'100%'}} allowClear options={[{label:"有效",value:1},{label:"无效",value:2}]} />
@ -353,7 +334,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="登记日期" label="登记日期"
name="startDate" name="regDate"
rules={[{ required: true }]} rules={[{ required: true }]}
getValueFromEvent={(e,dateString) => dateString} getValueFromEvent={(e,dateString) => dateString}
getValueProps={(value) => ({ value: value ? moment(value) : undefined })} getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
@ -378,7 +359,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Dragger <Dragger
name='file' name='file'
// multiple // multiple
action="/gunshiApp/xyt/rescue/team/file/upload/singleSimple" action="/gunshiApp/tsg/personnelPlan/file/upload/singleSimple"
onChange={fileChange} onChange={fileChange}
onDrop={(info) => { console.log(info.dataTransfer.files); }} onDrop={(info) => { console.log(info.dataTransfer.files); }}
fileList={fileList} fileList={fileList}
@ -480,7 +461,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
border: 0, border: 0,
marginTop: 20, marginTop: 20,
}} }}
src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/xyt/rescue/goods/file/download/${iframeSrc}`)}`} src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/tsg/personnelPlan/file/download/${iframeSrc}`)}`}
/> />
</Modal> </Modal>
</div> </div>

View File

@ -4,13 +4,13 @@ import BasicCrudModal from '../../../components/crud/BasicCrudModal';
import { Table, Card,Modal,Image,Input,Button,Row,Col,message } from 'antd'; import { Table, Card,Modal,Image,Input,Button,Row,Col,message } from 'antd';
import ToolBar from './toolbar'; import ToolBar from './toolbar';
import ModalForm from './form'; import ModalForm from './form';
import RecordDetails from "./RecordForm" import RecordDetails from "../pxjlgl/form"
import apiurl from '../../../service/apiurl'; import apiurl from '../../../service/apiurl';
import usePageTable from '../../../components/crud/usePageTable2'; import usePageTable from '../../../components/crud/usePageTable2';
import { createCrudService } from '../../../components/crud/_'; import { createCrudService } from '../../../components/crud/_';
import { CrudOpRender_text } from '../../../components/crud/CrudOpRender'; import { CrudOpRender_text } from '../../../components/crud/CrudOpRender';
import { exportFile } from '../../../utils/tools.js'; import { exportFile } from '../../../utils/tools.js';
import { httppost5 } from '../../../utils/request'; import { httppost5,httpget2 } from '../../../utils/request';
const Page = () => { const Page = () => {
const url = "http://223.75.53.141:9102/test.by-lyf.tmp" const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
@ -21,18 +21,21 @@ const Page = () => {
const refModal = useRef(); const refModal = useRef();
const [searchVal, setSearchVal] = useState(false) const [searchVal, setSearchVal] = useState(false)
const [pxRecordOpen, setPxRecordOpen] = useState(false) const [pxRecordOpen, setPxRecordOpen] = useState(false)
const [qdItem, setQdItem] = useState()
const columns = [ const columns = [
{ title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" }, { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" },
{ title: '培训班名称', key: 'teamName', dataIndex: 'teamName', width: 200, ellipsis: true }, { title: '培训班名称', key: 'name', dataIndex: 'name', width: 200, ellipsis: true },
{ {
title: '计划培训周期', key: 'personCount', dataIndex: 'personCount', width: 200, title: '计划培训周期', key: 'num1', dataIndex: 'num1', width: 200,
render: (value, record) => <span>{(record?.stm && record?.etm) ? `${record?.stm}${record?.etm}` : ''}</span>,
}, },
{ title: '主办单位', key: 'address', dataIndex: 'address', width: 200 }, { title: '主办单位', key: 'unit', dataIndex: 'unit', width: 200 },
{ {
title: '培训内容', key: 'managementUnit', dataIndex: 'managementUnit', width: 200,ellipsis: true title: '培训内容', key: 'content', dataIndex: 'content', width: 200,ellipsis: true
}, },
{ title: '培训地点', key: 'teamLeader', dataIndex: 'teamLeader', width: 150, ellipsis: true }, { title: '培训地点', key: 'addr', dataIndex: 'addr', width: 150, ellipsis: true },
{ title: '填报人', key: 'phone', dataIndex: 'phone', width: 150, ellipsis: true }, { title: '填报人', key: 'applicant', dataIndex: 'applicant', width: 150, ellipsis: true },
{ {
title: '操作', key: 'operation', width: 300, fixed: 'right',align: 'center', title: '操作', key: 'operation', width: 300, fixed: 'right',align: 'center',
@ -48,23 +51,24 @@ const Page = () => {
]; ];
const columns1 = [ const columns1 = [
{ title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" }, { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" },
{ title: '培训日期', key: 'teamName', dataIndex: 'teamName', width: 150, ellipsis: true }, { title: '培训日期', key: 'planDate', dataIndex: 'planDate', width: 150, ellipsis: true },
{ {
title: '培训时段', key: 'personCount', dataIndex: 'personCount', width: 150, title: '培训时段', key: 'personCount', dataIndex: 'personCount', width: 150,
render: (value, record) => <span>{(record?.stm && record?.etm) ? `${record?.stm}${record?.etm}` : ''}</span>,
}, },
{ title: '参加人数', key: 'address', dataIndex: 'address', width: 100 }, { title: '参加人数', key: 'trainees', dataIndex: 'trainees', width: 100 },
{ {
title: '参训人员', key: 'managementUnit', dataIndex: 'managementUnit', width: 200,ellipsis: true title: '参训人员', key: 'numPeople', dataIndex: 'numPeople', width: 200,ellipsis: true
}, },
{ {
title: '培训签到表', key: 'teamLeader', dataIndex: 'teamLeader', width: 150, title: '培训签到表', key: 'teamLeader', dataIndex: 'teamLeader', width: 150,
render: (value) => <div>{value ? <a onClick={()=>reviewPic(value)}> {value} </a>: ''}</div> render: (value,record) => <div><a onClick={()=>reviewPic(record.files1)}> {record?.files1[0]?.fileName} </a></div>
}, },
{ {
title: '操作', key: 'operation', width: 100, fixed: 'right',align: 'center', title: '操作', key: 'operation', width: 100, fixed: 'right',align: 'center',
render: (value, row, index) => ( render: (value, row, index) => (
<a onClick={() => {setPxRecordOpen(true)}}>查看</a> <a onClick={() => { setPxRecordOpen(true); setQdItem(row)}}>查看</a>
) )
}, },
]; ];
@ -74,6 +78,10 @@ const Page = () => {
const [pxOpen, setPxOpen] = useState(false) const [pxOpen, setPxOpen] = useState(false)
const [imgVisible, setImgVisible] = useState(false) const [imgVisible, setImgVisible] = useState(false)
const [imgList, setImgList] = useState([]) const [imgList, setImgList] = useState([])
const [fileList1, setFileList1] = useState([]) //上传文件列表
const [fileList2, setFileList2] = useState([]) //上传文件列表
const reviewPic = (arrPic) => { const reviewPic = (arrPic) => {
if (arrPic.length > 0) { if (arrPic.length > 0) {
setImgVisible(true) setImgVisible(true)
@ -88,19 +96,26 @@ const Page = () => {
} else if (type === 'view') { } else if (type === 'view') {
refModal.current.showView(params); refModal.current.showView(params);
} else if (type === 'del') { } else if (type === 'del') {
refModal.current.onDeleteGet(apiurl.fxzb.qsdw.zq.delete + `/${params.teamId}`); refModal.current.onDeleteGet(apiurl.pxjh.delete + `/${params.id}`);
}else if (type === 'similarAdd') { }else if (type === 'similarAdd') {
refModal.current.showSimilarSave(params); refModal.current.showSimilarSave(params);
} else { } else {
// 培训记录 // 培训记录
const params1 = {
search: {
...searchVal,
planId:params.id
}
};
setPxOpen(true); setPxOpen(true);
// setPxItem search1(params1)
// getFileInfo(params)
} }
} }
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.fxzb.qsdw.zq.page).find_noCode); const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.pxjh.page).find_noCode);
const { tableProps:tableProps1, search:search1 } = usePageTable(createCrudService(apiurl.fxzb.qsdw.zq.page).find_noCode); const { tableProps:tableProps1, search:search1 } = usePageTable(createCrudService(apiurl.pxjl.page).find_noCode);
/** /**
* @description 处理成功的回调 * @description 处理成功的回调
@ -110,14 +125,51 @@ const Page = () => {
} }
// const getFileInfo = async (params) => {
// try {
// const res = await httpget2(apiurl.pxjl.getFile + `/${params.id}`)
// if (res.code === 200) {
// if (res.data?.files1) {
// let fileArr1 = res.data?.files1.map(item => {
// return {
// name: item.fileName,
// response: {
// data: {
// filePath: item.filePath,
// fileId: item.fileId
// }
// },
// }
// })
// setFileList1(fileArr1)
// }
// if (res.data?.files2) {
// let fileArr2 = res.data?.files2.map(item => {
// return {
// name: item.fileName,
// response: {
// data: {
// filePath: item.filePath,
// fileId: item.fileId
// }
// },
// }
// })
// setFileList2(fileArr2)
// }
// }
// } catch (error) {
// console.log(error);
// }
// }
// 导出 // 导出
const exportExcel = () => { const exportExcel = () => {
let params = { let params = {
...searchVal, ...searchVal,
id:1
} }
httppost5(apiurl.gcaqjc.gcaqfx.jrx.export, params).then(res => { httppost5(apiurl.pxjh.export, params).then(res => {
exportFile(`培训计划管理.xlsx`,res.data) exportFile(`培训计划管理.xlsx`,res.data)
}) })
} }
@ -130,6 +182,18 @@ const Page = () => {
search(params) search(params)
}, [searchVal]) }, [searchVal])
// const dataSource = useMemo(() => {
// if (tableProps1.dataSource.length > 0) {
// return tableProps1.dataSource.map(item => ({
// ...item,
// files1: fileList1,
// files2: fileList2,
// }))
// } else {
// return []
// }
// },[tableProps1.dataSource,fileList1,fileList2])
return ( return (
<> <>
@ -141,7 +205,7 @@ const Page = () => {
onSave={command('save')} onSave={command('save')}
role={role} role={role}
callback={refresh} callback={refresh}
exportFile={exportExcel} exportFile1={exportExcel}
/> />
</Card> </Card>
<div className="ant-card-body" style={{padding:"20px 0 0 0"}}> <div className="ant-card-body" style={{padding:"20px 0 0 0"}}>
@ -155,7 +219,6 @@ const Page = () => {
title="" title=""
component={ModalForm} component={ModalForm}
onCrudSuccess={successCallback} onCrudSuccess={successCallback}
// onCrudSuccess={()=>{refresh({addvcd:localStorage.getItem('ADCD6')})}}
/> />
</div> </div>
{/* 培训记录 */} {/* 培训记录 */}
@ -173,7 +236,7 @@ const Page = () => {
columns={columns1} columns={columns1}
rowKey="inx" rowKey="inx"
{...tableProps1} {...tableProps1}
dataSource={[{teamName:1}]} // dataSource={dataSource}
scroll={{ x: width1, y: "calc( 100vh - 400px )" }} /> scroll={{ x: width1, y: "calc( 100vh - 400px )" }} />
</Modal> </Modal>
@ -189,7 +252,7 @@ const Page = () => {
setPxRecordOpen(false); setPxRecordOpen(false);
}} }}
> >
<RecordDetails mode={"view"} record={{}} /> <RecordDetails mode={"view"} record={qdItem} />
</Modal> </Modal>
<div style={{ display: "none" }}> <div style={{ display: "none" }}>
<Image.PreviewGroup <Image.PreviewGroup

View File

@ -3,12 +3,12 @@ import { Form, Upload, Button,Row, Col, Input, DatePicker, message,Modal } from
import {RightOutlined,LeftOutlined,FileExcelOutlined,DeleteOutlined} from '@ant-design/icons'; import {RightOutlined,LeftOutlined,FileExcelOutlined,DeleteOutlined} from '@ant-design/icons';
import { createCrudService } from '../../../components/crud/_'; import { createCrudService } from '../../../components/crud/_';
import apiurl from '../../../service/apiurl'; import apiurl from '../../../service/apiurl';
import { httppost5 } from '../../../utils/request'; import { httpgetExport, httppost5 } from '../../../utils/request';
import { exportFile } from '../../../utils/tools'; import { exportFile } from '../../../utils/tools';
import moment from 'moment'; import moment from 'moment';
const { Dragger } = Upload; const { Dragger } = Upload;
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
const ToolBar = ({ setSearchVal, onSave, storeData, role = [],callback,exportFile }) => { const ToolBar = ({ setSearchVal, onSave, storeData, role = [],callback,exportFile1 }) => {
const [form] = Form.useForm(); const [form] = Form.useForm();
const addBtn = role?.rule?.find(item => item.menuName == "新增")|| true; const addBtn = role?.rule?.find(item => item.menuName == "新增")|| true;
const searchBtn = role?.rule?.find(item => item.menuName == "查询") || true; const searchBtn = role?.rule?.find(item => item.menuName == "查询") || true;
@ -20,12 +20,12 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role = [],callback,exportFil
let dateSo; let dateSo;
if (values.tm) { if (values.tm) {
dateSo = { dateSo = {
start: moment(values.tm[0]).format('YYYY'), stm: moment(values.tm[0]).format('YYYY'),
end: moment(values.tm[1]).format('YYYY') etm: moment(values.tm[1]).format('YYYY')
} }
} }
delete values.tm delete values.tm
setSearchVal({...values, dateSo}); setSearchVal({...values, ...dateSo});
} }
const beforeUpload = (file) => { const beforeUpload = (file) => {
@ -58,7 +58,7 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role = [],callback,exportFil
} }
const downTemplate = ()=>{ const downTemplate = ()=>{
httppost5(apiurl.rcgl.zbgl.zbb.import, {}).then(res => { httpgetExport(apiurl.pxjh.import, {}).then(res => {
exportFile(`培训计划管理.xlsx`,res.data) exportFile(`培训计划管理.xlsx`,res.data)
}) })
} }
@ -76,10 +76,10 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role = [],callback,exportFil
picker='year' picker='year'
/> />
</Form.Item> </Form.Item>
<Form.Item label="填报人" name="teamName"> <Form.Item label="填报人" name="applicant">
<Input allowClear style={{width:'150px'}}/> <Input allowClear style={{width:'150px'}}/>
</Form.Item> </Form.Item>
<Form.Item label="培训班名称" name="teamName"> <Form.Item label="培训班名称" name="name">
<Input allowClear style={{width:'150px'}}/> <Input allowClear style={{width:'150px'}}/>
</Form.Item> </Form.Item>
{searchBtn ? <Form.Item> {searchBtn ? <Form.Item>
@ -99,7 +99,7 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role = [],callback,exportFil
<Form.Item> <Form.Item>
<Button onClick={() => {setExportOPen(true)}}>导入</Button> <Button onClick={() => {setExportOPen(true)}}>导入</Button>
</Form.Item><Form.Item> </Form.Item><Form.Item>
<Button onClick={()=>exportFile()}>导出</Button> <Button onClick={()=>exportFile1()}>导出</Button>
</Form.Item> </Form.Item>
</Form> </Form>
</div> </div>
@ -117,7 +117,7 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role = [],callback,exportFil
<Dragger <Dragger
name='file' name='file'
// multiple // multiple
action="/gunshiApp/xyt/rota/importData" action="/gunshiApp/tsg/personnelPlan/upload"
onChange={fileChange} onChange={fileChange}
beforeUpload={beforeUpload} beforeUpload={beforeUpload}
onDrop={(info) => { console.log(info); }} onDrop={(info) => { console.log(info); }}

View File

@ -1,6 +1,7 @@
import React, { useEffect,useState } from 'react'; import React, { useEffect,useState } from 'react';
import { Form, Upload, Button,Row, Col, Input, DatePicker, message,Modal } from 'antd'; import { Form, Upload, Button,Row, Col, Input, DatePicker, message,Modal } from 'antd';
import NormalSelect from '../../../components/Form/NormalSelect'; import NormalSelect from '../../../components/Form/NormalSelect';
import moment from 'moment';
const ToolBar = ({ setSearchVal }) => { const ToolBar = ({ setSearchVal }) => {
const [form] = Form.useForm(); const [form] = Form.useForm();
@ -14,15 +15,24 @@ const ToolBar = ({ setSearchVal }) => {
value: 2 value: 2
}, },
] ]
const valuesChange = (e,allvalue) => {
setSearchVal({ ...allvalue,year:moment(allvalue.year).format("YYYY") })
}
useEffect(() => {
const value = {teamName:1,year:moment()}
form.setFieldsValue(value)
setSearchVal({...value,year:moment().format("YYYY")})
}, [])
return ( return (
<> <>
<div style={{display:'flex',justifyContent:'space-between'}}> <div style={{display:'flex',justifyContent:'space-between'}}>
<Form form={form} className='toolbarBox' layout="inline" onValuesChange={(e) => {setSearchVal(e)}}> <Form form={form} className='toolbarBox' layout="inline" onValuesChange={valuesChange}>
<Form.Item label="统计维度" name="teamName"> <Form.Item label="统计维度" name="teamName">
<NormalSelect allowClear style={{ width: '150px' }} options={types} /> <NormalSelect allowClear style={{ width: '150px' }} options={types} />
</Form.Item> </Form.Item>
<Form.Item label="选择年份" name="tm"> <Form.Item label="选择年份" name="year">
<DatePicker <DatePicker
allowClear allowClear
showTime showTime

View File

@ -1,12 +1,14 @@
import React,{useEffect,useState,useMemo,useRef} from 'react'; import React,{useEffect,useState,useMemo,useRef} from 'react';
import { Form, Button, Input, Row,Upload, Col, Table, DatePicker, InputNumber,message,Image,Modal,Typography ,Popconfirm } from 'antd'; import { Form, Button, Input, Row,Upload, Col, TimePicker, DatePicker, InputNumber,message,Image,Modal,Typography ,Popconfirm } from 'antd';
import { DeleteOutlined,FileWordOutlined,FilePdfOutlined,FileZipOutlined,FileExcelOutlined } from '@ant-design/icons'; import { DeleteOutlined,FileWordOutlined,FilePdfOutlined,FileZipOutlined,FileExcelOutlined } from '@ant-design/icons';
import { formItemLayout, btnItemLayout } from '../../../components/crud/FormLayoutProps'; import { formItemLayout, btnItemLayout } from '../../../components/crud/FormLayoutProps';
import apiurl from '../../../service/apiurl'; import apiurl from '../../../service/apiurl';
import NormalSelect from '../../../components/Form/NormalSelect'; import NormalSelect from '../../../components/Form/NormalSelect';
import "./index.less" import "./index.less"
import moment from 'moment'; import moment from 'moment';
import dayjs from "dayjs"
import { createCrudService } from '../../../components/crud/_'; import { createCrudService } from '../../../components/crud/_';
import { httpget2, httppost2 } from '../../../utils/request';
const { RangePicker } = DatePicker const { RangePicker } = DatePicker
const { Dragger } = Upload; const { Dragger } = Upload;
const url = "http://223.75.53.141:9102/test.by-lyf.tmp" const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
@ -32,22 +34,6 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
value:5 value:5
}, },
] ]
const jh = [
{
label: "工程测量业务知识",
value:1
},
{
label: "工程管理标准化业务知识",
value:2
},{
label: "消防安全知识培训",
value:3
},{
label: "水雨情测报培训",
value:4
}
]
const [details, setDetails] = useState([]) const [details, setDetails] = useState([])
@ -73,27 +59,43 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
* @param {*} type * @param {*} type
* @returns * @returns
*/ */
const getFileInfo = (params) => { const getFileInfo = async (params) => {
createCrudService(apiurl.fxzb.qsdw.zq.getFile).delGet({ teamId: params.teamId }).then(res => { try {
const res = await httpget2(apiurl.pxjl.getFile + `/${params.id}`)
if (res.code === 200) { if (res.code === 200) {
let fileArr = res.data?.files.map(item => { if (res.data?.files1) {
let fileArr1 = res.data?.files1.map(item => {
return { return {
name: item.fileName, name: item.fileName,
response: { response: {
data: { data: {
filePath: item.filePath, filePath: item.filePath,
fileId:item.fileId fileId: item.fileId
}
},
}
})
setFileList1(fileArr1)
}
if (res.data?.files2) {
let fileArr = res.data?.files2.map(item => {
return {
name: item.fileName,
response: {
data: {
filePath: item.filePath,
fileId: item.fileId
} }
}, },
} }
}) })
setFileList(fileArr) setFileList(fileArr)
const result = res.data?.details.map(item => ({ ...item, key: item.detailId }))
console.log("resss",result);
setDetails(result)
} }
}) }
} catch (error) {
console.log(error);
}
} }
/** /**
* @description 文件下载 * @description 文件下载
@ -101,7 +103,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
*/ */
const download = (params) => { const download = (params) => {
let downloadLink = document.createElement("a"); let downloadLink = document.createElement("a");
downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/xyt/rescue/team/file/download/${params}`; downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/tsg/personnelPlanLog/file/download/${params}`;
downloadLink.download = `${params.fileName}`; downloadLink.download = `${params.fileName}`;
downloadLink.style.display = "none"; downloadLink.style.display = "none";
// 将链接添加到页面中 // 将链接添加到页面中
@ -113,7 +115,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
const download1 = (params) => { const download1 = (params) => {
let downloadLink = document.createElement("a"); let downloadLink = document.createElement("a");
downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/xyt/rescue/team/file/download/${params}`; downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/tsg/personnelPlanLog/file/download/${params}`;
downloadLink.download = `${params.fileName}`; downloadLink.download = `${params.fileName}`;
downloadLink.style.display = "none"; downloadLink.style.display = "none";
// 将链接添加到页面中 // 将链接添加到页面中
@ -160,6 +162,8 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
}) })
setFileIds1(fileIds) setFileIds1(fileIds)
setFileList1(info.fileList) setFileList1(info.fileList)
console.log(info.fileList);
} }
/** /**
* @description pdf文件预览 * @description pdf文件预览
@ -174,20 +178,19 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
setIframeSrc1(params) setIframeSrc1(params)
setPdfViewOPen1(true) setPdfViewOPen1(true)
} }
const onfinish = () => { const onfinish = (values) => {
let values = form.getFieldsValue(); values.stm = values.tm ? values.tm[0].format("HH:mm:ss") : ''
values.details = details; values.etm = values.tm ? values.tm[1].format("HH:mm:ss") : ''
values.validStartDate = values.dateRangeSo&&moment(values.dateRangeSo[0]).format("YYYY-MM-DD") values.regDate = moment(values.regDate).format('YYYY-MM-DD')
values.validEndDate = values.dateRangeSo&&moment(values.dateRangeSo[1]).format("YYYY-MM-DD") const files1 = fileList1.map(item => ({fileId:item.response?.data?.fileId }));
const files = fileList.map(item => ({ fileId: item.response?.data?.fileId }));
values.files1 = files1;
values.files2 = files;
if (mode === 'edit') { if (mode === 'edit') {
let oldFiles = fileList.map(item => item.response?.data?.fileId ) onEdit(apiurl.pxjl.edit,{...record,...values});
values.fileIds = oldFiles;
values.teamId = record.teamId;
onEdit(apiurl.fxzb.qsdw.zq.edit,values)
} }
if (mode === 'save') { if (mode === 'save') {
values.fileIds = fileIds onSave(apiurl.pxjl.save,values)
onSave(apiurl.fxzb.qsdw.zq.save,values)
} }
} }
@ -206,24 +209,51 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
let filterFile = fileList1.filter(item => item.response?.data?.fileId !== fileId); let filterFile = fileList1.filter(item => item.response?.data?.fileId !== fileId);
setFileList1(filterFile) setFileList1(filterFile)
} }
useEffect(()=>{ const [jh, setJh] = useState([])
if (record.teamId ) { const getJhList = async () => {
getFileInfo(record) try {
const res = await httppost2(apiurl.pxjl.list)
if (res.code == 200) {
setJh(res.data.map(item => ({label:item.name,value:item.id})))
} }
}, [record]) } catch (error) {
console.log(error);
}
}
const imgbeforeUpload = (file) => {
const isJpgOrPng =
file.type === 'image/jpeg' ||
file.type === 'image/jpg' ||
file.type === 'image/png';
if (!isJpgOrPng) {
message.error('请上传图片格式的文件!');
}
const isLt2M = file.size / 1024 / 1024 < 5;
if (!isLt2M) {
message.error('图片大小需小于5M!');
}
return isJpgOrPng && isLt2M ? true : Upload.LIST_IGNORE;
};
useEffect(()=>{
if (mode !== "save") {
getFileInfo(record)
const momentArr = (record?.stm && record.etm) ? [dayjs("2024-05-06" + record.stm), dayjs("2024-05-06" +record.etm)] : ''
form.setFieldValue("tm",momentArr)
}
}, [record,mode])
useEffect(() => { useEffect(() => {
if (mode !== "save") { const userName = localStorage.getItem('userName')
let dataSo = [ form.setFieldValue("regDate", moment())
record.validStartDate? moment(record.validStartDate):'', form.setFieldValue("applicant",userName)
record.validEndDate? moment(record.validEndDate): '' getJhList()
] }, [])
form.setFieldsValue({...record,dateRangeSo:dataSo})
}
}, [record,mode])
return ( return (
<div style={{height:"65vh",overflowY:"auto"}}> <div style={{height:"65vh",overflowY:"auto"}}>
@ -232,13 +262,14 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Form <Form
form={form} form={form}
{...formItemLayout} {...formItemLayout}
// initialValues={record} initialValues={record}
onFinish={onfinish}
> >
<Row> <Row>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训计划" label="培训计划"
name="teamName" name="planId"
> >
<NormalSelect disabled={mode==='view'} style={{width:'100%'}} allowClear options={jh}/> <NormalSelect disabled={mode==='view'} style={{width:'100%'}} allowClear options={jh}/>
</Form.Item> </Form.Item>
@ -246,7 +277,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训分类" label="培训分类"
name="teamName" name="type"
> >
<NormalSelect disabled={mode === 'view'} style={{ width: '100%' }} allowClear options={types} /> <NormalSelect disabled={mode === 'view'} style={{ width: '100%' }} allowClear options={types} />
</Form.Item> </Form.Item>
@ -256,7 +287,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训日期" label="培训日期"
name="startDate" name="planDate"
rules={[{ required: true }]} rules={[{ required: true }]}
getValueFromEvent={(e,dateString) => dateString} getValueFromEvent={(e,dateString) => dateString}
getValueProps={(value) => ({ value: value ? moment(value) : undefined })} getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
@ -267,7 +298,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="标题名称" label="标题名称"
name="teamName" name="name"
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<Input disabled={mode === 'view'} style={{width:'100%'}} allowClear /> <Input disabled={mode === 'view'} style={{width:'100%'}} allowClear />
@ -279,15 +310,22 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训时段" label="培训时段"
name="address" name="tm"
> >
<Input disabled={mode === 'view'} style={{width:'100%'}} allowClear /> <TimePicker.RangePicker
disabled={mode === 'view'}
style={{ width: '100%' }}
allowClear
format={"HH:mm:ss"}
// value={timeValue}
// onChange={(e) => setTimeValue(e)}
/>
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训时长(小时)" label="培训时长(小时)"
name="address" name="hour"
> >
<InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear /> <InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
@ -297,7 +335,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="培训地点" label="培训地点"
name="remark" name="addr"
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear /> <Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
@ -307,7 +345,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Form.Item <Form.Item
label="主办单位" label="主办单位"
rules={[{ required: true }]} rules={[{ required: true }]}
name="remark" name="unit"
> >
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear /> <Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
@ -317,7 +355,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="培训内容" label="培训内容"
name="remark" name="content"
labelCol={{ span: 3 }} labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }} wrapperCol={{ span: 19 }}
rules={[{ required: true }]} rules={[{ required: true }]}
@ -327,31 +365,21 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
</Col> </Col>
</Row> </Row>
<Row> <Row>
<Col span={24}>
<Form.Item
label="培训范围"
name="remark"
labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }}
rules={[{ required: true }]}
>
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item>
</Col>
</Row> </Row>
<Row> <Row>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="参训人员" label="参训人员"
name="remark" name="trainees"
> >
<InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear /> <InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="参加人数" label="参训人数"
name="address" name="numPeople"
rules={[{ required: true }]}
> >
<InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear /> <InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
@ -363,15 +391,15 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Form.Item <Form.Item
label="填报人" label="填报人"
rules={[{ required: true }]} rules={[{ required: true }]}
name="address" name="applicant"
> >
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear /> <Input disabled={true} style={{width:'100%'}} allowClear />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="登记日期" label="登记日期"
name="startDate" name="regDate"
rules={[{ required: true }]} rules={[{ required: true }]}
getValueFromEvent={(e,dateString) => dateString} getValueFromEvent={(e,dateString) => dateString}
getValueProps={(value) => ({ value: value ? moment(value) : undefined })} getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
@ -384,24 +412,25 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="培训签到表" label="培训签到表"
name="fieldId" name="fieldId1"
labelCol={{ span: 3 }} labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }} wrapperCol={{ span: 19 }}
> >
{mode !== "view" && {mode !== "view" &&
<Dragger <Dragger
name='file' name='file'
// multiple beforeUpload={imgbeforeUpload}
action="/gunshiApp/xyt/rescue/team/file/upload/singleSimple" action="/gunshiApp/tsg/personnelPlanLog/file/upload/singleSimple"
onChange={fileChange1} onChange={fileChange1}
onDrop={(info) => { console.log(info.dataTransfer.files); }} onDrop={(info) => { console.log(info.dataTransfer.files); }}
fileList={fileList1} fileList={fileList1}
disabled={loading1} disabled={loading1}
maxCount={1}
// onSuccess={handleSuccess} // onSuccess={handleSuccess}
> >
<p className="ant-upload-text">点击或拖拽文件到此区域上传</p> <p className="ant-upload-text">点击或拖拽文件到此区域上传</p>
<p className="ant-upload-hint"> <p className="ant-upload-hint">
支持扩展名.rar .zip .doc .docx .pdf .jpg .png .ppt 支持扩展名.jpg .png
</p> </p>
</Dragger> </Dragger>
} }
@ -450,7 +479,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
} }
<span>{file.name}</span> <span>{file.name}</span>
</div> </div>
<div className={mode == "view" ? 'delete-icon disable-icon' : 'delete-icon'} onClick={() => deleteFile(file.response?.data?.fileId)}> <div className={mode == "view" ? 'delete-icon disable-icon' : 'delete-icon'} onClick={() => deleteFile1(file.response?.data?.fileId)}>
<DeleteOutlined /> <DeleteOutlined />
</div> </div>
</div> </div>
@ -477,7 +506,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Dragger <Dragger
name='file' name='file'
// multiple // multiple
action="/gunshiApp/xyt/rescue/team/file/upload/singleSimple" action="/gunshiApp/tsg/personnelPlanLog/file/upload/singleSimple"
onChange={fileChange} onChange={fileChange}
onDrop={(info) => { console.log(info.dataTransfer.files); }} onDrop={(info) => { console.log(info.dataTransfer.files); }}
fileList={fileList} fileList={fileList}
@ -579,7 +608,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
border: 0, border: 0,
marginTop: 20, marginTop: 20,
}} }}
src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/xyt/rescue/goods/file/download/${iframeSrc}`)}`} src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/tsg/personnelPlanLog/file/download/${iframeSrc}`)}`}
/> />
</Modal> </Modal>
@ -600,7 +629,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
border: 0, border: 0,
marginTop: 20, marginTop: 20,
}} }}
src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/xyt/rescue/goods/file/download/${iframeSrc1}`)}`} src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/tsg/personnelPlanLog/file/download/${iframeSrc1}`)}`}
/> />
</Modal> </Modal>
</div> </div>

View File

@ -12,6 +12,8 @@ import usePageTable from '../../../components/crud/usePageTable2';
import { createCrudService } from '../../../components/crud/_'; import { createCrudService } from '../../../components/crud/_';
import { CrudOpRender_text } from '../../../components/crud/CrudOpRender'; import { CrudOpRender_text } from '../../../components/crud/CrudOpRender';
import "./index.less" import "./index.less"
import { httpget2 } from '../../../utils/request';
import moment from 'moment';
const Page = () => { const Page = () => {
const role = useSelector(state => state.auth.role); const role = useSelector(state => state.auth.role);
@ -23,18 +25,18 @@ const Page = () => {
const [searchChartVal, setSearchChartVal] = useState(false) const [searchChartVal, setSearchChartVal] = useState(false)
const columns = [ const columns = [
{ title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" }, { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" },
{ title: '培训日期', key: 'teamName', dataIndex: 'teamName', width: 200, ellipsis: true }, { title: '培训日期', key: 'planDate', dataIndex: 'planDate', width: 200, ellipsis: true },
{ {
title: '标题', key: 'personCount', dataIndex: 'personCount', width: 200,ellipsis: true title: '标题', key: 'name', dataIndex: 'name', width: 200,ellipsis: true
}, },
{ title: '主办单位', key: 'address', dataIndex: 'address', width: 150 }, { title: '主办单位', key: 'unit', dataIndex: 'unit', width: 150 },
{ {
title: '培训内容', key: 'managementUnit', dataIndex: 'managementUnit', width: 200,ellipsis: true title: '培训内容', key: 'content', dataIndex: 'content', width: 200,ellipsis: true
}, },
{ title: '参训人员', key: 'teamName', dataIndex: 'teamName', width: 200, ellipsis: true }, { title: '参训人员', key: 'trainees', dataIndex: 'trainees', width: 200, ellipsis: true },
{ title: '培训地点', key: 'teamLeader', dataIndex: 'teamLeader', width: 150, ellipsis: true }, { title: '培训地点', key: 'addr', dataIndex: 'addr', width: 150, ellipsis: true },
{ title: '填报人', key: 'phone', dataIndex: 'phone', width: 150, ellipsis: true }, { title: '填报人', key: 'applicant', dataIndex: 'applicant', width: 150, ellipsis: true },
{ title: '登记日期', key: 'teamLeader', dataIndex: 'teamLeader', width: 150, ellipsis: true }, { title: '登记日期', key: 'regDate', dataIndex: 'regDate', width: 150, ellipsis: true },
{ {
title: '操作', key: 'operation', width: 200, fixed: 'right',align: 'center', title: '操作', key: 'operation', width: 200, fixed: 'right',align: 'center',
@ -48,9 +50,7 @@ const Page = () => {
]; ];
const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]); const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]);
const pxOptions = useMemo(() => {
return options()
}, [])
const command = (type) => (params) => { const command = (type) => (params) => {
if (type === 'save') { if (type === 'save') {
refModal.current.showSave(); refModal.current.showSave();
@ -59,12 +59,12 @@ const Page = () => {
} else if (type === 'view') { } else if (type === 'view') {
refModal.current.showView(params); refModal.current.showView(params);
} else if (type === 'del') { } else if (type === 'del') {
refModal.current.onDeleteGet(apiurl.fxzb.qsdw.zq.delete + `/${params.teamId}`); refModal.current.onDeleteGet(apiurl.pxjl.delete + `/${params.id}`);
} }
} }
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.fxzb.qsdw.zq.page).find_noCode); const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.pxjl.page).find_noCode);
/** /**
* @description 处理成功的回调 * @description 处理成功的回调
@ -73,7 +73,29 @@ const Page = () => {
refresh() refresh()
} }
// 获取统计数据
const [staData, setStaData] = useState()
const pxOptions = useMemo(() => {
if (staData) {
return options(staData)
} else {
return options({})
}
}, [staData])
const getStaData = async (params) => {
try {
const res = await httpget2(apiurl.pxjl.sta + `/${params.year}`)
if (res.code == 200) {
if (params.teamName == 1) {
setStaData({...res.data,list:res.data.list1})
} else {
setStaData({...res.data,list:res.data.list2})
}
}
} catch (error) {
console.log(error);
}
}
useEffect(()=>{ useEffect(()=>{
const params = { const params = {
@ -84,6 +106,13 @@ const Page = () => {
search(params) search(params)
}, [searchVal]) }, [searchVal])
useEffect(() => {
if (searchChartVal) {
getStaData(searchChartVal)
}
}, [searchChartVal])
return ( return (
<> <>
@ -96,8 +125,8 @@ const Page = () => {
<div className='children-itm'> <div className='children-itm'>
<span>本年培训期数</span> <span>本年培训期数</span>
<span>计划/实际</span> <span>计划/实际</span>
<span><span style={{fontSize:22,fontWeight:"bold"}}>26</span>&nbsp;期/ <span><span style={{ fontSize: 22, fontWeight: "bold" }}>{ staData?.numberOfPeriods2 ?? 1}</span>&nbsp;期/
<span style={{fontSize:22,fontWeight:"bold"}}>26</span>&nbsp;</span> <span style={{fontSize:22,fontWeight:"bold"}}>{ staData?.numberOfPeriods1 ?? 1}</span>&nbsp;</span>
</div> </div>
</div> </div>
@ -106,15 +135,15 @@ const Page = () => {
<div className='children-itm'> <div className='children-itm'>
<span>本年培训期数</span> <span>本年培训期数</span>
<span>计划/实际</span> <span>计划/实际</span>
<span><span style={{fontSize:22,fontWeight:"bold"}}>26</span>&nbsp;人次/ <span><span style={{fontSize:22,fontWeight:"bold"}}>{ staData?.personNum2 ?? 1}</span>&nbsp;人次/
<span style={{fontSize:22,fontWeight:"bold"}}>26</span>&nbsp;</span> <span style={{fontSize:22,fontWeight:"bold"}}>{ staData?.personNum1 ?? 1}</span>&nbsp;</span>
</div> </div>
</div> </div>
</div> </div>
<div className='pxrecord-title-right'> <div className='pxrecord-title-right'>
<div className='chart-tool'> <div className='chart-tool'>
<ChartToolBar <ChartToolBar
setSearchVal={setSearchVal} setSearchVal={setSearchChartVal}
/> />
</div> </div>
<div className='chart-box'> <div className='chart-box'>

View File

@ -1,11 +1,25 @@
export default function options() { export default function options(data={}) {
var dataGDP = [900, 500, 1632.33, 1100, 400] const xAxisData = data?.list?.map(item => item.month + "月")
var dataGrowth = [2, 2.1, 3, 2.5, 2.1] const maxCount = data?.list ? Math.ceil(Math.max(...data?.list?.map(obj => [obj.num1,obj.num2]).flat())) : 0
var xAxisData = ['2019年', '2020年', '2021年', '2022年', '2023年'] const minCount = data?.list ? Math.floor(Math.min(...data?.list?.map(obj => [obj.num1, obj.num2]).flat())) : 100
const maxRate = data?.list ? Math.ceil(Math.max(...data?.list?.map(obj => obj.rate))) : 0
const minRate = data?.list ? Math.floor(Math.min(...data?.list?.map(obj => obj.rate))) : 100
return { return {
animation: true, animation: true,
tooltip: { tooltip: {
trigger: 'axis', trigger: 'axis',
formatter: function (params) {
var tooltipText = params[0].name + '<br/>';
params.forEach(function (item) {
if (item.seriesName === '完成率') {
tooltipText += item.marker + ' ' + item.seriesName + ': ' + item.value.toFixed(2) + '%<br/>';
} else {
tooltipText += item.marker + ' ' + item.seriesName + ': ' + item.value + '<br/>';
}
});
return tooltipText;
}
}, },
grid: { grid: {
top: '15%', top: '15%',
@ -32,13 +46,15 @@ export default function options() {
axisLabel: { axisLabel: {
show: true, show: true,
margin: 14, margin: 14,
// formatter: '{value}月'
} }
}, },
yAxis: [ yAxis: [
{ {
type: 'value', type: 'value',
offset: 10, offset: 10,
min: minCount,
max: maxCount,
axisTick: { axisTick: {
show: false show: false
}, },
@ -55,6 +71,9 @@ export default function options() {
{ {
type: 'value', type: 'value',
name: '(%)', name: '(%)',
min: minRate,
max: maxRate,
offset: 10, offset: 10,
nameTextStyle: { nameTextStyle: {
color: 'rgba(255,255,255,0.5)', color: 'rgba(255,255,255,0.5)',
@ -71,7 +90,6 @@ export default function options() {
fontSize: 18, fontSize: 18,
formatter: '{value}%' formatter: '{value}%'
} }
} }
], ],
series: [ series: [
@ -79,7 +97,7 @@ export default function options() {
name: '计划期数', name: '计划期数',
type: 'bar', type: 'bar',
barWidth: 25, barWidth: 25,
data: dataGDP, data: data?.list?.map(item =>item.num2),
itemStyle:{ itemStyle:{
color:"#6295fa" color:"#6295fa"
} }
@ -88,7 +106,7 @@ export default function options() {
name: '实际期数', name: '实际期数',
type: 'bar', type: 'bar',
barWidth: 25, barWidth: 25,
data: dataGDP, data: data?.list?.map(item =>item.num1),
itemStyle:{ itemStyle:{
color:"#62daab" color:"#62daab"
} }
@ -110,7 +128,7 @@ export default function options() {
borderColor: '#5d7092', borderColor: '#5d7092',
borderWidth: 2 borderWidth: 2
}, },
data: dataGrowth, data: data?.list?.map(item => item.rate),
} }
] ]
} }

View File

@ -36,12 +36,12 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role = [],callback,exportFil
let dateSo; let dateSo;
if (values.tm) { if (values.tm) {
dateSo = { dateSo = {
start: moment(values.tm[0]).format('YYYY'), stm: moment(values.tm[0]).format('YYYY'),
end: moment(values.tm[1]).format('YYYY') etm: moment(values.tm[1]).format('YYYY')
} }
} }
delete values.tm delete values.tm
setSearchVal({...values, dateSo}); setSearchVal({...values, ...dateSo});
} }
return ( return (
@ -57,13 +57,13 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role = [],callback,exportFil
format={"YYYY-MM-DD"} format={"YYYY-MM-DD"}
/> />
</Form.Item> </Form.Item>
<Form.Item label="参训人员" name="teamName"> <Form.Item label="参训人员" name="trainees">
<Input allowClear style={{width:'150px'}}/> <Input allowClear style={{width:'150px'}}/>
</Form.Item> </Form.Item>
<Form.Item label="主办单位" name="teamName"> <Form.Item label="主办单位" name="unit">
<Input allowClear style={{width:'150px'}}/> <Input allowClear style={{width:'150px'}}/>
</Form.Item> </Form.Item>
<Form.Item label="培训分类" name="teamName"> <Form.Item label="培训分类" name="type">
<NormalSelect allowClear style={{ width: '150px' }} options={types} /> <NormalSelect allowClear style={{ width: '150px' }} options={types} />
</Form.Item> </Form.Item>
{searchBtn ? <Form.Item> {searchBtn ? <Form.Item>

View File

@ -1,30 +1,64 @@
import { Space, Table, Radio, DatePicker, Form, Select, Button, message, Upload, Input, Row, Col, Switch, Image } from 'antd'; import { Space, Table, Radio, DatePicker, Form, Select, Button, message, Upload, Input, Row, Col, Switch, Image } from 'antd';
import { InboxOutlined, LinkOutlined, DeleteOutlined, LoadingOutlined,VerticalAlignBottomOutlined } from '@ant-design/icons' import { InboxOutlined, LinkOutlined, DeleteOutlined, LoadingOutlined, VerticalAlignBottomOutlined } from '@ant-design/icons'
import { useForm } from 'antd/lib/form/Form'; import { useForm } from 'antd/lib/form/Form';
import { useState } from 'react'; import { useEffect, useState } from 'react';
import { httpgetExport, httppostAddfile } from '../../../../utils/request';
import { exportFile } from '../../../../utils/tools';
const { Dragger } = Upload; const { Dragger } = Upload;
const list = [ const list = [
{ {
type:'立案' type: '立案',
key: 'files3'
}, },
{ {
type:'调查取证' type: '调查取证',
key: 'files4'
}, },
{ {
type:'审查处理' type: '审查处理',
key: 'files5'
}, },
{ {
type:'送达执行' type: '送达执行',
key: 'files6'
}, },
{ {
type:'结案' type: '结案',
key: 'files7'
} }
] ]
const Page = () => { const baseUrl = "http://223.75.53.141:9102/test.by-lyf.tmp"
const Page = ({ uploadUrl, downloadUrl, type, getFormInfo, formJsonData }) => {
const [form] = Form.useForm(); const [form] = Form.useForm();
const [fileList ,setFileList] =useState() const [fileList, setFileList] = useState([])
const props = { const [fileListHj, setFileHj] = useState({'files3': [],'files4': [],'files5': [],'files6': [],'files7': []})
const [url, setUrl] = useState('')
const [isModal, setIsModal] = useState(false)
const getInfo = () => {
form.validateFields().then((values) => {
getFormInfo({ ...values, ...fileListHj })
form.resetFields()
setFileList([])
}).catch((errorInfo) => {
console.log(errorInfo, 'error');
})
//
}
const cancel = () => {
getFormInfo(false)
form.resetFields()
setFileList([])
}
const deleteFile = (e,key) => {
fileListHj[key] = fileListHj[key].filter(item => item.fileId !== e)
setFileHj({ ...fileListHj })
}
const props = (keys) => {
return {
name: 'file', name: 'file',
multiple: true, multiple: true,
fileList: fileList, fileList: fileList,
@ -38,27 +72,79 @@ const Page = () => {
// return true; // return true;
// } // }
}, },
onChange(e) { customRequest(e) {
// httpPostFile(apiUrl.service.uploadFile.uploadUrl + "?group=" + typeUpload, e).then(res => {
// setFileList([...fileList, res.data]) httppostAddfile(uploadUrl, e).then(res => {
// }) if(fileListHj[keys]){
fileListHj[keys].push(res.data)
}else{
fileListHj[keys]=[]
fileListHj[keys].push(res.data)
}
setFileHj({ ...fileListHj })
})
}
} }
}; };
const onFinish = () =>{ function checkMediaType(url) {
// 创建URL对象
var link = url;
// 获取路径的最后一个点之后的内容作为文件扩展名
var extension = link?.split('.').pop().toLowerCase();
// 声明支持的图片和视频文件扩展名
var imageExtensions = ['jpg', 'jpeg', 'gif', 'png'];
var file = ['pdf', 'word', 'xslx', 'xsl', 'txt', "pptx"];
//
// 判断文件扩展名是否在图片扩展名数组中
if (imageExtensions.includes(extension)) {
return 'image';
}
// 判断文件扩展名是否在视频扩展名数组中
if (file.includes(extension)) {
return extension;
}
// 扩展名不在图片或视频数组中返回null表示无法确定媒体类型
return null;
}
const preView = (item) => {
if (checkMediaType(item.name) == 'pdf') {
// window.open(baseUrl + item.previewUrl)
setUrl(item.previewUrl)
setIsModal(true)
}
} }
/**
* @description 文件下载
* @param {String} params 文件fileId
*/
const download = (id, name) => {
httpgetExport(downloadUrl+id).then(res => {
exportFile(name,res.data)
})
}
const onFinish = () => {
}
useEffect(() => {
setFileHj(formJsonData)
}, [])
return ( return (
<Form form={form} onFinish={onFinish} > <Form form={form} onFinish={onFinish} >
<Row> <Row>
<Col span={2}> <Col span={2}>
<div style={{display:'flex',alignItems:'center'}}> <div style={{ display: 'flex', alignItems: 'center' }}>
<div style={{width:3,height:12,background:'#259def',marginRight:5}}></div> <div style={{ width: 3, height: 12, background: '#259def', marginRight: 5 }}></div>
案卷存档</div> 案卷存档</div>
</Col> </Col>
<Col span={10}> <Col span={10}>
<Form.Item <Form.Item
label='保管人员' label='保管人员'
name='name' name='custodian'
> >
<Input /> <Input />
</Form.Item> </Form.Item>
@ -66,33 +152,57 @@ const Page = () => {
<Col span={10}> <Col span={10}>
<Form.Item <Form.Item
label='保管地点' label='保管地点'
name='adress' name='storageLocation'
> >
<Input /> <Input />
</Form.Item> </Form.Item>
</Col> </Col>
</Row> </Row>
{list.map(item=>( {list.map(item1 => (
<Row> <Row>
<Col span={2}> <Col span={2}>
<div style={{display:'flex',alignItems:'center'}}> <div style={{ display: 'flex', alignItems: 'center' }}>
<div style={{width:3,height:12,background:'#259def',marginRight:5}}></div> <div style={{ width: 3, height: 12, background: '#259def', marginRight: 5 }}></div>
{item.type}</div> {item1.type}</div>
</Col> </Col>
<Col span={22}> <Col span={22}>
<Form.Item <Form.Item
label='附件' label='附件'
name='name' name='files'
> >
<Dragger {...props}> <Dragger {...props(item1.key)}>
<p className="ant-upload-drag-icon"> <p className="ant-upload-drag-icon">
<InboxOutlined /> <InboxOutlined />
</p> </p>
<p className="ant-upload-text">点击或将文件拖拽到这里上传 支持扩展名jpegpng</p> <p className="ant-upload-text">点击或将文件拖拽到这里上传 支持扩展名jpegpng</p>
</Dragger> </Dragger>
<div className='flex'>
{fileListHj?.[item1.key]?.map((item) => {
return <div className='flex align-center file-item' style={{marginTop:5,marginRight:'3%',width:'30%', minHeight: "50px", fontSize: 14, columnGap: 10, cursor: checkMediaType(item.fileName) == 'image' || checkMediaType(item.fileName) == 'pdf' ? 'pointer' : "not-allowed" }}>
<div style={{ width: 40, height: 40, display: "flex", alignItems: 'center' }}>
{checkMediaType(item.fileName) == 'image' && <Image
height={40}
src={baseUrl + item.filePath}
/>}
{
checkMediaType(item.fileName) !== 'image' &&
<span >{checkMediaType(item.fileName)?.toUpperCase()}</span>
}
</div>
<span onClick={() => preView(item)}>{item.fileName}</span>
{type !== 'view' && <DeleteOutlined onClick={() => deleteFile(item.fileId,item1.key)} />}
<VerticalAlignBottomOutlined onClick={() => download(item.fileId, item.fileName)} />
</div>
})}
</div>
</Form.Item> </Form.Item>
</Col> </Col>
</Row>))} </Row>))}
<div className="flex flex-end" style={{ marginTop: 10, justifyContent: "flex-end" }}>
<Button type="" style={{ marginRight: 10 }} onClick={cancel}>取消</Button>
<Button type="primary" onClick={getInfo}>确定</Button>
</div>
</Form > </Form >
) )

View File

@ -1,81 +1,111 @@
const basicData = [ const basicData = [
{ {
label: '填报人', label: '填报人',
key: 'name', key: 'createName',
type: 'input', type: 'input',
span: 12, span: 12,
disabled: true disabled: true
}, },
{ {
label: '填报时间', label: '填报时间',
key: 'name', key: 'createTime',
type: 'input', type: 'input',
span: 12, span: 12,
// required: true
disabled: true disabled: true
}, },
{ {
label: '案件编号', label: '案件编号',
key: 'name', key: 'caseId',
type: 'input', type: 'input',
span: 12 span: 12
}, },
{ {
label: '案件名称', label: '案件名称',
key: 'name', key: 'caseName',
type: 'input', type: 'input',
span: 12, span: 12,
required: true required: true
}, },
{ {
label: '案件类型', label: '案件类型',
key: 'name', key: 'caseType',
type: 'Select', type: 'Select',
span: 12 options: [
{ value: 0, label: '违建' },
{ value: 1, label: '毁林垦荒' },
{ value: 2, label: '筑坝拦汊' },
{ value: 3, label: '填占库容' },
{ value: 4, label: '违法取水' },
{ value: 5, label: '其他' }
],
span: 12,
required: true
},
{
label: '发现时间',
key: 'caseDate',
type: 'DatePicker',
span: 12,
required: true
}, },
{ {
label: '案发地点', label: '案发地点',
key: 'name', key: 'caseAddress',
type: 'input', type: 'input',
span: 12 span: 12,
required: true
}, },
{ {
label: '案件来源', label: '案件来源',
key: 'name', key: 'caseSource',
type: 'Radio', type: 'Select',
span: 12, span: 12,
required: true,
options: [ options: [
{ label: '自然人', value: 'Apple' }, { label: '巡查上报', value: 0 },
{ label: '法人或其他组织', value: 'Pear' }, { label: '自主发现', value: 1 },
{ label: '待定', value: 'Orange' }, { label: '公共举报', value: 2 },
{ label: '电话举报', value: 3 },
{ label: '其他', value: 4 },
] ]
}, },
{ {
label: '违法时间', label: '违法时间',
key: 'name', key: 'IllegalDate',
type: 'input', type: 'DatePicker',
span: 24 span: 12
}, },
{ {
label: '案件来源', label: '当事人类型',
key: 'name', key: 'partyType',
type: 'input', type: 'Radio',
required: true,
options: [
{ label: '自然人', value: 0 },
{ label: '法人或其他组织', value: 1 },
{ label: '待定', value: 2 },
],
span: 24 span: 24
}, },
{ {
label: '姓名', label: '姓名',
key: 'name', key: 'partyName',
type: 'input', type: 'input',
span: 12 span: 12
}, },
{ {
label: '身份证号', label: '身份证号',
key: 'name', key: 'idNumber',
type: 'input', type: 'input',
span: 12 span: 12
}, },
{ {
label: '住址', label: '住址',
key: 'name', key: 'partyAddr',
type: 'input', type: 'input',
span: 12 span: 12
}, },
@ -87,13 +117,13 @@ const basicData = [
}, },
{ {
label: '简要案情', label: '简要案情',
key: 'name', key: 'intro',
type: 'TextArea', type: 'TextArea',
span: 24 span: 24
}, },
{ {
label: '附件', label: '附件',
key: 'name', key: 'files1',
type: 'upload', type: 'upload',
span: 24 span: 24
}, },
@ -102,97 +132,106 @@ const basicData = [
const clqkData = [ const clqkData = [
{ {
label: '处理程序', label: '处理程序',
key: 'name', key: 'processor',
type: 'Select', type: 'Select',
options: [
{ label: '简易程序', value: 0 },
{ label: '一般程序', value: 1 },
],
span: 12, span: 12,
disabled: true
}, },
{ {
label: '处理依据', label: '处理依据',
key: 'name', key: 'treatmentBasis',
type: 'Select', type: 'input',
span: 12, span: 12,
disabled: true
}, },
{ {
label: '处理措施', label: '处理措施',
key: 'name', key: 'treatmentMeasure',
type: 'Select', type: 'Select',
span: 12 span: 12
}, },
{ {
label: '移送处理情况', label: '移送处理情况',
key: 'name', key: 'transfer',
type: 'Radio', type: 'Radio',
span: 24, span: 24,
options: [ options: [
{ label: '移送单位', value: 'Apple' }, { label: '移送单位', value: '1' },
{ label: '不移送', value: 'Pear' }, { label: '不移送', value: '0' },
], ],
required: true
}, },
{ {
label: '案件执行情况', label: '案件执行情况',
key: 'name', key: 'caseImplementation',
type: 'Radio', type: 'Radio',
options: [ options: [
{ label: '当事人自动履行', value: 'Apple' }, { label: '当事人自动履行', value: 0 },
{ label: '行政强制执行', value: 'Pear' }, { label: '行政强制执行', value: 1 },
], ],
span: 24 span: 24
}, },
{ {
label: '自动履行情况', label: '自动履行情况',
key: 'name', key: 'performance',
type: 'TextArea', type: 'TextArea',
span: 24 span: 24
}, },
{ {
label: '伤亡人数(人)', label: '伤亡人数(人)',
key: 'name', key: 'casualties',
type: 'input', type: 'input',
span: 12 span: 12
}, },
{ {
label: '直接损失金额(万元)', label: '直接损失金额(万元)',
key: 'name', key: 'directLossAmount',
type: 'input', type: 'input',
span: 12 span: 12
}, },
{ {
label: '结案情况', label: '结案情况',
key: 'name', key: 'closeStatus',
type: 'Select', type: 'Select',
options: [
{ label: '正常结案', value: 0 },
{ label: '其他方式结案', value: 1 },
{ label: '未结案', value: 2 },
],
span: 12 span: 12
}, },
{ {
label: '结案时间', label: '结案时间',
key: 'name', key: 'closeDate',
type: 'input', type: 'input',
span: 12 span: 12
}, },
{ {
label: '文件编号及名称', label: '文件编号及名称',
key: 'name', key: 'docNumName',
type: 'input', type: 'input',
span: 24 span: 24
}, },
{ {
label: '督办单位类型', label: '督办单位类型',
key: 'name', key: 'unitType',
type: 'Select', type: 'Select',
options: [
{ label: '上级督办', value: 0 },
{ label: '本级河长督办', value: 1 },
],
span: 12 span: 12
}, },
{ {
label: '督办单位名称', label: '督办单位名称',
key: 'name', key: 'unitName',
type: 'input', type: 'input',
span: 24 span: 24
}, },
{ {
label: '附件', label: '附件',
key: 'name', key: 'files2',
type: 'upload', type: 'upload',
span: 24 span: 24
}, },
@ -200,39 +239,37 @@ const clqkData = [
const xzfy = [ const xzfy = [
{ {
label: '处理程序', label: '行政复议情况',
key: 'name', key: 'administrativeReconsideration',
type: 'Select', type: 'Select',
span: 12, span: 12,
options:[ options: [
{ {
label:'维护' label: '维护', value: 0
}, },
{label:'变更'}, { label: '变更', value: 1 },
{label:'撤销'}, { label: '撤销', value: 2 },
{label:'和解'}, { label: '和解', value: 3 },
{label:'调解'}, { label: '调解', value: 4 },
], ],
disabled: true disabled: true
}, },
{ {
label: '处理依据', label: '行政应诉情况',
key: 'name', key: 'administrativeResponse',
type: 'Select', type: 'Select',
span: 12, span: 12,
disabled: true, disabled: true,
options:[ options: [
{ {
label:'驳回原告诉讼' label: '驳回原告诉讼', value: 0
}, },
{label:'变更'}, { label: '变更', value: 2 },
{label:'撤销'}, { label: '撤销', value: 1 },
{label:'确认违法'}, { label: '确认违法', value: 3 },
{label:'确认无效'}, { label: '确认无效', value: 4 },
{label:'其他'}, { label: '其他', value: 5 },
], ],
}, },
] ]

View File

@ -1,9 +1,12 @@
import React, { useState } from 'react'; import React, { useEffect, useState } from 'react';
import { Tabs } from 'antd'; import { message, Tabs } from 'antd';
import BascForm from '../form/index' import BascForm from '../form/index'
import { basicData,clqkData,xzfy} from './config' import { basicData, clqkData, xzfy } from './config'
import Bajz from './bajz' import Bajz from './bajz'
import Lsyx from './lsyx' import Lsyx from './lsyx'
import { httpget, httppost } from '../../../../utils/request';
import apiurl from '../../../../service/apiurl';
import dayjs from 'dayjs'
const items = [ const items = [
{ {
key: '1', key: '1',
@ -28,21 +31,75 @@ const items = [
]; ];
const Page = () => { const Page = ({ mode, onCrudSuccess,record,submit }) => {
const [key , setKeys] = useState('1') const [formData,setFormData] =useState({})
// debugger;
const [key, setKeys] = useState('1')
const onChange = (key) => { const onChange = (key) => {
console.log(key); console.log(key);
setKeys(key) setKeys(key)
}; };
const getFormInfo = (e) => {
if(!e){
submit()
return;
}
let params = {
...formData,
...e,
caseDate: dayjs(e.caseDate).format("YYYY-MM-DD HH:mm:ss"),
IllegalDate: e.IllegalDate ? dayjs(e.IllegalDate).format("YYYY-MM-DD HH:mm:ss") : e.IllegalDate,
}
if (mode == 'save') {
addBasic(params)
} else if (mode == 'edit') {
editBasic(params)
}
}
const addBasic = (params) => {
httppost(apiurl.szzf.ajdj.add, params).then(res => {
if (res.code == 200) {
message.success('新增成功')
submit()
} else {
message.error(res.description)
}
})
}
const editBasic = (params) => {
httppost(apiurl.szzf.ajdj.edit, params).then(res => {
if (res.code == 200) {
message.success('编辑成功')
submit()
} else {
message.error(res.description)
}
})
}
useEffect(()=>{
httpget(apiurl.szzf.ajdj.detail + record.id).then(res=>{
let obj = {
createName: localStorage.getItem('userName'),
createTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
createBy:localStorage.getItem('userId')
}
if(res.data.caseDate){
obj.caseDate=dayjs(res.data.caseDate)
}
setFormData({...res.data,...obj})
})
},[])
return ( return (
<> <>
<Tabs defaultActiveKey="1" items={items} onChange={onChange} /> <Tabs defaultActiveKey="1" items={items} onChange={onChange} />
<> <>
{key==1&& <BascForm formJson={basicData}></BascForm>} {key == 1 && <BascForm formJson={basicData} formJsonData={formData} fileKey='files1'type={mode} getFormInfo={getFormInfo} uploadUrl={apiurl.szzf.ajdj.upload} downloadUrl={apiurl.szzf.ajdj.download}></BascForm>}
{key==2&& <BascForm formJson={clqkData}></BascForm>} {key == 2 && <BascForm formJson={clqkData} fileKey='files2' formJsonData={formData} type={mode} getFormInfo={getFormInfo} uploadUrl={apiurl.szzf.ajdj.upload} downloadUrl={apiurl.szzf.ajdj.download}></BascForm>}
{key==3&& <BascForm formJson={xzfy}></BascForm>} {key == 3 && <BascForm formJson={xzfy} formJsonData={formData} type={mode} getFormInfo={getFormInfo} uploadUrl={apiurl.szzf.ajdj.upload} downloadUrl={apiurl.szzf.ajdj.download}></BascForm>}
{key==4&& <Bajz ></Bajz>} {key == 4 && <Bajz formJson={xzfy} formJsonData={formData} type={mode} getFormInfo={getFormInfo} uploadUrl={apiurl.szzf.ajdj.upload} downloadUrl={apiurl.szzf.ajdj.download}></Bajz>}
{key==5&& <Lsyx ></Lsyx>} {key == 5 && <Lsyx formJson={xzfy} formJsonData={formData} type={mode} getFormInfo={getFormInfo} uploadUrl={apiurl.szzf.ajdj.upload} downloadUrl={apiurl.szzf.ajdj.download}></Lsyx>}
</> </>
</> </>
) )

View File

@ -9,8 +9,15 @@ import apiurl from '../../../../service/apiurl';
import usePageTable from '../../../../components/crud/usePageTable2'; import usePageTable from '../../../../components/crud/usePageTable2';
import { createCrudService } from '../../../../components/crud/_'; import { createCrudService } from '../../../../components/crud/_';
import { CrudOpRender_text } from '../../../../components/crud/CrudOpRender'; import { CrudOpRender_text } from '../../../../components/crud/CrudOpRender';
import dayjs from 'dayjs'
const url = "http://223.75.53.141:9102/test.by-lyf.tmp" const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
const caseTypeOb = {
0: '违建', 1: '毁林垦荒', 2: '筑坝拦汊', 3: '填占库容', 4: '违法取水', 5: '其他'
}
const caseSourceOb = {
0: '巡查上报', 1: '自主发现', 2: '公共举报', 3: '电话举报', 4: '其他'
}
const Page = () => { const Page = () => {
const role = useSelector(state => state.auth.role); const role = useSelector(state => state.auth.role);
const editBtn = role?.rule?.find(item => item.menuName == "编辑"); const editBtn = role?.rule?.find(item => item.menuName == "编辑");
@ -23,28 +30,25 @@ const Page = () => {
const [isFetch, setIsFetch] = useState(false) const [isFetch, setIsFetch] = useState(false)
const columns = [ const columns = [
{ title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center" }, { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center" },
{ title: '标题', key: 'name', dataIndex: 'name', width: 250, ellipsis: true }, { title: '填报时间', key: 'createTime', dataIndex: 'createTime', width: 250, ellipsis: true },
{ {
title: '制定机关', key: 'eventsDate', dataIndex: 'eventsDate', width: 140, title: '案件名称', key: 'caseName', dataIndex: 'caseName', width: 140,
}, },
{ {
title: '法律性质', key: 'eventsType', dataIndex: 'eventsType', width: 140, title: '案件编号', key: 'caseId', dataIndex: 'caseId', width: 140,
render: (value) => <span>{value == 1 ? "综合大事记" : value == 2 ? "专题大事记" : ''}</span>,
}, },
{ {
title: '时效性', key: 'eventsDesc', dataIndex: 'eventsDesc', width: 300 title: '发现时间', key: 'caseDate', dataIndex: 'caseDate', width: 300,
}, },
{ {
title: '公布日期', key: 'eventsDesc', dataIndex: 'eventsDesc', width: 300 title: '案件类型', key: 'caseType', dataIndex: 'caseType', width: 300,
render: (value) => <span>{caseTypeOb[value]}</span>,
}, },
{ {
title: '施行日期', key: 'eventsDesc', dataIndex: 'eventsDesc', width: 300 title: '案件来源', key: 'caseSource', dataIndex: 'caseSource', width: 300,
}, render: (value) => <span>{caseSourceOb[value]}</span>,
{
title: '上传时间', key: 'eventsDesc', dataIndex: 'eventsDesc', width: 300
},
{
title: '附件', key: 'fileName', dataIndex: 'fileName', width: 300,render:(v,r)=><a onClick={()=>viewPdf(r.fileId)}>{v}</a>
}, },
{ {
title: '操作', key: 'operation', width: 240, fixed: 'right', align: 'center', title: '操作', key: 'operation', width: 240, fixed: 'right', align: 'center',
@ -62,18 +66,26 @@ const Page = () => {
const command = (type) => (params) => { const command = (type) => (params) => {
if (type === 'save') { if (type === 'save') {
refModal.current.showSave(); refModal.current.showSave();
} else if (type === 'edit') { } else if (type === 'edit') {
refModal.current.showEdit({ ...params }); let obj={}
if(params.caseDate){
obj.caseDate= dayjs(params.caseDate)
}
if(params.IllegalDate){
obj.IllegalDate= dayjs(params.IllegalDate)
}
refModal.current.showEdit({ ...params,...obj });
} else if (type === 'view') { } else if (type === 'view') {
refModal.current.showView(params); refModal.current.showView(params);
} else if (type === 'del') { } else if (type === 'del') {
refModal.current.onDeleteGet(apiurl.rcgl.gcdsj.delete + `/${params.id}`); refModal.current.onDeleteGet(apiurl.szzf.ajdj.del + `/${params.id}`);
} }
} }
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.rcgl.gcdsj.page).find_noCode); const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.szzf.ajdj.list).find_noCode);
/** /**
* @description 处理成功的回调 * @description 处理成功的回调
@ -109,7 +121,7 @@ const Page = () => {
/> />
</Card> </Card>
<div className="ant-card-body" style={{ padding: "20px 0 0 0" }}> <div className="ant-card-body" style={{ padding: "20px 0 0 0" }}>
<Table columns={columns} rowKey="inx" {...tableProps} scroll={{ x: width, y: "calc( 100vh - 400px )" }} dataSource={[{name:1}]}/> <Table columns={columns} rowKey="inx" {...tableProps} scroll={{ x: width, y: "calc( 100vh - 400px )" }} />
</div> </div>
</div> </div>

View File

@ -1,21 +1,53 @@
import { Space, Table, Radio, DatePicker, Form, Select, Button, message, Upload, Input, Row, Col, Switch, Image } from 'antd'; import { Space, Table, Radio, DatePicker, Form, Select, Button, message, Upload, Input, Row, Col, Switch, Image } from 'antd';
import { InboxOutlined, LinkOutlined, DeleteOutlined, LoadingOutlined,VerticalAlignBottomOutlined } from '@ant-design/icons' import { InboxOutlined, LinkOutlined, DeleteOutlined, LoadingOutlined, VerticalAlignBottomOutlined } from '@ant-design/icons'
import { useForm } from 'antd/lib/form/Form'; import { useForm } from 'antd/lib/form/Form';
import { useState } from 'react'; import { useEffect, useState } from 'react';
import { httpgetExport, httppostAddfile } from '../../../../utils/request';
import { exportFile } from '../../../../utils/tools';
const { Dragger } = Upload; const { Dragger } = Upload;
const list = [ const list = [
{ {
type:'整改前' type:'整改前',
key:'files8'
}, },
{ {
type:'整改后' type:'整改后',
} key:'files9'
},
] ]
const Page = () => { const baseUrl = "http://223.75.53.141:9102/test.by-lyf.tmp"
const Page = ({ uploadUrl, downloadUrl, type, getFormInfo, formJsonData }) => {
const [form] = Form.useForm(); const [form] = Form.useForm();
const [fileList ,setFileList] =useState() const [fileList, setFileList] = useState([])
const props = { const [fileListHj, setFileHj] = useState({'files3': [],'files4': [],'files5': [],'files6': [],'files7': []})
const [url, setUrl] = useState('')
const [isModal, setIsModal] = useState(false)
const getInfo = () => {
form.validateFields().then((values) => {
getFormInfo({ ...values, ...fileListHj })
form.resetFields()
setFileList([])
}).catch((errorInfo) => {
console.log(errorInfo, 'error');
})
//
}
const cancel = () => {
getFormInfo(false)
form.resetFields()
setFileList([])
}
const deleteFile = (e,key) => {
fileListHj[key] = fileListHj[key].filter(item => item.fileId !== e)
setFileHj({ ...fileListHj })
}
const props = (keys) => {
return {
name: 'file', name: 'file',
multiple: true, multiple: true,
fileList: fileList, fileList: fileList,
@ -29,38 +61,114 @@ const Page = () => {
// return true; // return true;
// } // }
}, },
onChange(e) { customRequest(e) {
// httpPostFile(apiUrl.service.uploadFile.uploadUrl + "?group=" + typeUpload, e).then(res => {
// setFileList([...fileList, res.data]) httppostAddfile(uploadUrl, e).then(res => {
// }) if(fileListHj[keys]){
fileListHj[keys].push(res.data)
}else{
fileListHj[keys]=[]
fileListHj[keys].push(res.data)
}
setFileHj({ ...fileListHj })
})
}
} }
}; };
const onFinish = () =>{ function checkMediaType(url) {
// 创建URL对象
var link = url;
// 获取路径的最后一个点之后的内容作为文件扩展名
var extension = link?.split('.').pop().toLowerCase();
// 声明支持的图片和视频文件扩展名
var imageExtensions = ['jpg', 'jpeg', 'gif', 'png'];
var file = ['pdf', 'word', 'xslx', 'xsl', 'txt', "pptx"];
//
// 判断文件扩展名是否在图片扩展名数组中
if (imageExtensions.includes(extension)) {
return 'image';
}
// 判断文件扩展名是否在视频扩展名数组中
if (file.includes(extension)) {
return extension;
}
// 扩展名不在图片或视频数组中返回null表示无法确定媒体类型
return null;
}
const preView = (item) => {
if (checkMediaType(item.name) == 'pdf') {
// window.open(baseUrl + item.previewUrl)
setUrl(item.previewUrl)
setIsModal(true)
}
} }
/**
* @description 文件下载
* @param {String} params 文件fileId
*/
const download = (id, name) => {
httpgetExport(downloadUrl+id).then(res => {
exportFile(name,res.data)
})
}
const onFinish = () => {
}
useEffect(() => {
setFileHj(formJsonData)
}, [])
return ( return (
<Form form={form} onFinish={onFinish} > <Form form={form} onFinish={onFinish} >
{list.map(item=>( {list.map(item1 => (
<Row> <Row>
<Col span={2}> <Col span={2}>
<div style={{display:'flex',alignItems:'center'}}> <div style={{ display: 'flex', alignItems: 'center' }}>
<div style={{width:3,height:12,background:'#259def',marginRight:5}}></div> <div style={{ width: 3, height: 12, background: '#259def', marginRight: 5 }}></div>
{item.type}</div> {item1.type}</div>
</Col> </Col>
<Col span={22}> <Col span={22}>
<Form.Item <Form.Item
label='附件' label='附件'
name='name' name='files'
> >
<Dragger {...props}> <Dragger {...props(item1.key)}>
<p className="ant-upload-drag-icon"> <p className="ant-upload-drag-icon">
<InboxOutlined /> <InboxOutlined />
</p> </p>
<p className="ant-upload-text">点击或将文件拖拽到这里上传 支持扩展名jpegpng</p> <p className="ant-upload-text">点击或将文件拖拽到这里上传 支持扩展名jpegpng</p>
</Dragger> </Dragger>
<div className='flex'>
{fileListHj?.[item1.key]?.map((item) => {
return <div className='flex align-center file-item' style={{marginTop:5,marginRight:'3%',width:'30%', minHeight: "50px", fontSize: 14, columnGap: 10, cursor: checkMediaType(item.fileName) == 'image' || checkMediaType(item.fileName) == 'pdf' ? 'pointer' : "not-allowed" }}>
<div style={{ width: 40, height: 40, display: "flex", alignItems: 'center' }}>
{checkMediaType(item.fileName) == 'image' && <Image
height={40}
src={baseUrl + item.filePath}
/>}
{
checkMediaType(item.fileName) !== 'image' &&
<span >{checkMediaType(item.fileName)?.toUpperCase()}</span>
}
</div>
<span onClick={() => preView(item)}>{item.fileName}</span>
{type !== 'view' && <DeleteOutlined onClick={() => deleteFile(item.fileId,item1.key)} />}
<VerticalAlignBottomOutlined onClick={() => download(item.fileId, item.fileName)} />
</div>
})}
</div>
</Form.Item> </Form.Item>
</Col> </Col>
</Row>))} </Row>))}
<div className="flex flex-end" style={{ marginTop: 10, justifyContent: "flex-end" }}>
<Button type="" style={{ marginRight: 10 }} onClick={cancel}>取消</Button>
<Button type="primary" onClick={getInfo}>确定</Button>
</div>
</Form > </Form >
) )

View File

@ -1,14 +1,14 @@
import React, { useEffect,useState } from 'react'; import React, { useEffect, useState } from 'react';
import { Form, Input, Button, DatePicker, Select } from 'antd'; import { Form, Input, Button, DatePicker, Select } from 'antd';
import { DownOutlined, UpOutlined } from '@ant-design/icons' import { DownOutlined, UpOutlined } from '@ant-design/icons'
import moment from 'moment'; import moment from 'moment';
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
const ToolBar = ({ setSearchVal, onSave, storeData,role }) => { const ToolBar = ({ setSearchVal, onSave, storeData, role }) => {
const addBtn = role?.rule?.find(item => item.menuName == "新增"); const addBtn = role?.rule?.find(item => item.menuName == "新增");
const searchBtn = role?.rule?.find(item => item.menuName == "查询"); const searchBtn = role?.rule?.find(item => item.menuName == "查询");
const [form] = Form.useForm(); const [form] = Form.useForm();
const [showGj , setShowGj] =useState(false) const [showGj, setShowGj] = useState(false)
const onFinish = (values) => { const onFinish = (values) => {
let dataSo; let dataSo;
if (values.tm) { if (values.tm) {
@ -18,18 +18,27 @@ const ToolBar = ({ setSearchVal, onSave, storeData,role }) => {
} }
} }
delete values.tm delete values.tm
setSearchVal({...values, dataSo}); setSearchVal({ ...values, dataSo });
} }
const opntios=[ const opntios = [
{label:'宪法',value:'宪法'}, { label: '宪法', value: '宪法' },
{label:'法律',value:'法律'}, { label: '法律', value: '法律' },
{label:'行政法规',value:'行政法规'}, { label: '行政法规', value: '行政法规' },
{label:'督察法规',value:'督察法规'}, { label: '督察法规', value: '督察法规' },
{label:'司法解释',value:'司法解释'}, { label: '司法解释', value: '司法解释' },
{label:'地方性法规',value:'地方性法规'}, { label: '地方性法规', value: '地方性法规' },
] ]
const styles={
const caseTypeOption = [
{ label: '违建', value: 0 },
{ label: '毁林垦荒', value: 1 },
{ label: '筑坝拦汊', value: 2 },
{ label: '填占库容', value: 3 },
{ label: '违法取水', value: 4 },
{ label: '其他', value: 5 },
]
const styles = {
fontFamily: '微软雅黑 Bold", "微软雅黑 Regular", 微软雅黑, sans-serif', fontFamily: '微软雅黑 Bold", "微软雅黑 Regular", 微软雅黑, sans-serif',
fontWeight: '700', fontWeight: '700',
fontStyle: 'normal', fontStyle: 'normal',
@ -37,34 +46,35 @@ const ToolBar = ({ setSearchVal, onSave, storeData,role }) => {
} }
return ( return (
<> <>
<div style={{display:'flex',justifyContent:'space-between'}}> <div style={{ display: 'flex', justifyContent: 'space-between' }}>
<Form form={form} className='toolbarBox' layout="inline" onFinish={onFinish}> <Form form={form} className='toolbarBox' layout="inline" onFinish={onFinish}>
<div style={{display:'flex'}}> <div style={{ display: 'flex' }}>
<Form.Item label="标题" name="name"> <Form.Item label="案件类型" name="caseType">
<Input allowClear style={{width:'150px'}}/> <Select allowClear style={{ width: '150px' }} options={caseTypeOption} />
</Form.Item> </Form.Item>
<Form.Item label="制定机关" name="name"> <Form.Item label="时间" name="createTime">
<Input allowClear style={{width:'150px'}}/> <RangePicker allowClear />
</Form.Item> </Form.Item>
<Form.Item label="制定机关" name="name"> <Form.Item label="案件名称" name="caseName">
<Select allowClear style={{width:'150px'}} options={opntios}/> <Input allowClear style={{ width: '150px' }} />
</Form.Item>
<Form.Item label="案件编号" name="caseId">
<Input allowClear style={{ width: '150px' }} />
</Form.Item> </Form.Item>
<Form.Item> <Form.Item>
<Button type="primary" htmlType="submit">查询</Button> <Button type="primary" htmlType="submit">查询</Button>
</Form.Item> </Form.Item>
<Form.Item> <Form.Item>
<Button onClick={() => form.resetFields()}>重置</Button> <Button onClick={() => form.resetFields()}>重置</Button>
</Form.Item> </Form.Item>
{ {
(onSave) ? (onSave) ?
<Form.Item> <Form.Item>
<Button onClick={onSave}>新增</Button> <Button onClick={onSave}>新增</Button>
</Form.Item> </Form.Item>
:null : null
} }
<Form.Item> {/* <Form.Item>
<div style={styles} onClick={()=>setShowGj(!showGj)}>高级搜索 {!showGj&&<DownOutlined />} {showGj&&<UpOutlined />}</div> <div style={styles} onClick={()=>setShowGj(!showGj)}>高级搜索 {!showGj&&<DownOutlined />} {showGj&&<UpOutlined />}</div>
</Form.Item> </Form.Item>
</div> </div>
@ -80,8 +90,8 @@ const ToolBar = ({ setSearchVal, onSave, storeData,role }) => {
</Form.Item> </Form.Item>
<Form.Item label="上传时间" name="name"> <Form.Item label="上传时间" name="name">
<RangePicker allowClear /> <RangePicker allowClear />
</Form.Item> </Form.Item>*/}
</div>} </div>
</Form> </Form>
</div> </div>
</> </>

View File

@ -2,12 +2,17 @@ import dayjs from 'dayjs';
import { Space, Table, Tag, DatePicker, Form, Select, Button, Card } from 'antd'; import { Space, Table, Tag, DatePicker, Form, Select, Button, Card } from 'antd';
import ReactECharts from 'echarts-for-react'; import ReactECharts from 'echarts-for-react';
import { useEffect, useState, useMemo } from 'react'; import { useEffect, useState, useMemo } from 'react';
import { httppost } from '../../../../utils/request';
import apiurl from '../../../../service/apiurl';
let obj= { 0:'当事人自动履行',1: '行政强制执行'}
const Page = ({ title = '标题' }) => { const Page = ({ title = '标题' }) => {
const [echart2, setEchart2] = useState(Object()) const [echart2, setEchart2] = useState(Object())
const [inspectordata, setInspectorData] = useState([{}]) const [inspectordata, setInspectorData] = useState([{}])
const [plandata, setPlanData] = useState(Object()) const [plandata, setPlanData] = useState(Object())
const [problemdata, setProblemData] = useState(Object()) const [problemdata, setProblemData] = useState(Object())
const [sumTotal, setSum] = useState(0)
const getPlanOption = useMemo((name, data) => { const getPlanOption = useMemo((name, data) => {
// let total = 0 // let total = 0
// for (let i = 0; i < data.length; i++) { // for (let i = 0; i < data.length; i++) {
@ -16,18 +21,18 @@ const Page = ({ title = '标题' }) => {
return { return {
title: {}, title: {},
tooltip: {}, tooltip: {},
// legend: { legend: {
// data: name data: Object.values(obj)
// }, },
graphic: { graphic: {
type: 'text', type: 'text',
top: 'center', top: 'center',
left: 'center', left: 'center',
style: { style: {
text: `总计\n${0}`, text: `总计\n${sumTotal}`,
fontSize: 20, fontSize: 20,
fontWeight: 'bold', fontWeight: 'bold',
// textAlign: 'center' textAlign: 'center'
} }
}, },
series: { series: {
@ -54,28 +59,41 @@ const Page = ({ title = '标题' }) => {
const onOk = (event, index) => { const onOk = (event, index) => {
if (event !== null) { if (event !== null) {
let params = { let params = {
stm: dayjs(new Date(event[0])).format('YYYY-MM-DD'), stm: dayjs(new Date(event[0])).format('YYYY-MM-DD HH:mm:ss'),
etm: dayjs(new Date(event[1])).format('YYYY-MM-DD'), etm: dayjs(new Date(event[1])).format('YYYY-MM-DD HH:mm:ss'),
} }
// getStm(params, index) // getStm(params, index)
getInfo(params)
} }
} }
const getInfo=(params)=>{
let obj1=[]
let sum=0
httppost(apiurl.szzf.ajtj.info+2,params).then(res=>{
res.data.map(item=>{
obj1.push({value:item.count,name:obj[item.type]})
sum=sum+item.count
})
// debugger;
setPlanData(obj1)
setSum(sum)
})
}
useEffect(() => { useEffect(() => {
let data = [ let params = {
{ value: 1048, name: 'Search Engine' }, stm: dayjs().startOf("year").format('YYYY-MM-DD HH:mm:ss'),
{ value: 735, name: 'Direct' }, etm: dayjs().format('YYYY-MM-DD HH:mm:ss'),
{ value: 580, name: 'Email' }, }
{ value: 484, name: 'Union Ads' }, getInfo(params)
{ value: 300, name: 'Video Ads' }
] },[])
setPlanData(data)
})
return ( return (
<> <>
<div className='top' style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between' }}> <div className='top' style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between' }}>
<div style={{ fontSize: 20, fontWeight: 'bold', display: 'flex', alignItems: 'center' }}> <div style={{ fontSize: 20, fontWeight: 'bold', display: 'flex', alignItems: 'center' }}>
<div style={{ width: 5, height: 25, backgroundColor: '#259def', marginRight: 10 }}></div> <div style={{ width: 5, height: 25, backgroundColor: '#259def', marginRight: 10 }}></div>
{title} 执行情况
</div> </div>
<DatePicker.RangePicker <DatePicker.RangePicker
style={{ width: 220, }} style={{ width: 220, }}

View File

@ -1,13 +1,31 @@
import dayjs from 'dayjs';
import { Space, Table, Tag, DatePicker, Form, Select, Button, Card } from 'antd'; import { Space, Table, Tag, DatePicker, Form, Select, Button, Card } from 'antd';
import ReactECharts from 'echarts-for-react'; import ReactECharts from 'echarts-for-react';
import { useEffect, useState, useMemo } from 'react'; import { useEffect, useState, useMemo } from 'react';
import { httpget, httppost } from '../../../../utils/request';
import apiurl from '../../../../service/apiurl';
import dayjs from 'dayjs';
import advancedFormat from 'dayjs/plugin/advancedFormat'
import customParseFormat from 'dayjs/plugin/customParseFormat'
import localeData from 'dayjs/plugin/localeData'
import weekday from 'dayjs/plugin/weekday'
import weekOfYear from 'dayjs/plugin/weekOfYear'
import weekYear from 'dayjs/plugin/weekYear'
dayjs.extend(customParseFormat)
dayjs.extend(advancedFormat)
dayjs.extend(weekday)
dayjs.extend(localeData)
dayjs.extend(weekOfYear)
dayjs.extend(weekYear)
let obj={0:'巡查上报',1:'自主发现',2:'公共举报',3:'电话举报',4:'其他'}
const Page = ({ title = '标题' }) => { const Page = ({ title = '标题' }) => {
const [echart2, setEchart2] = useState(Object()) const [echart2, setEchart2] = useState(Object())
const [inspectordata, setInspectorData] = useState([{}]) const [inspectordata, setInspectorData] = useState([{}])
const [plandata, setPlanData] = useState(Object()) const [plandata, setPlanData] = useState(Object())
const [problemdata, setProblemData] = useState(Object()) const [problemdata, setProblemData] = useState(Object())
const [sumTotal, setSum] = useState(0)
const getPlanOption = useMemo((name, data) => { const getPlanOption = useMemo((name, data) => {
// let total = 0 // let total = 0
// for (let i = 0; i < data.length; i++) { // for (let i = 0; i < data.length; i++) {
@ -16,18 +34,18 @@ const Page = ({ title = '标题' }) => {
return { return {
title: {}, title: {},
tooltip: {}, tooltip: {},
// legend: { legend: {
// data: name data:Object.values(obj)
// }, },
graphic: { graphic: {
type: 'text', type: 'text',
top: 'center', top: 'center',
left: 'center', left: 'center',
style: { style: {
text: `总计\n${0}`, text: `总计\n${sumTotal}`,
fontSize: 20, fontSize: 20,
fontWeight: 'bold', fontWeight: 'bold',
// textAlign: 'center' textAlign: 'center'
} }
}, },
series: { series: {
@ -54,28 +72,41 @@ const Page = ({ title = '标题' }) => {
const onOk = (event, index) => { const onOk = (event, index) => {
if (event !== null) { if (event !== null) {
let params = { let params = {
stm: dayjs(new Date(event[0])).format('YYYY-MM-DD'), stm: dayjs(new Date(event[0])).format('YYYY-MM-DD HH:mm:ss'),
etm: dayjs(new Date(event[1])).format('YYYY-MM-DD'), etm: dayjs(new Date(event[1])).format('YYYY-MM-DD HH:mm:ss'),
} }
// getStm(params, index) // getStm(params, index)
getInfo(params)
} }
} }
const getInfo=(params)=>{
let obj1=[]
let sum=0
httppost(apiurl.szzf.ajtj.info+0,params).then(res=>{
res.data.map(item=>{
obj1.push({value:item.count,name:obj[item.type]})
sum=sum+item.count
})
// debugger;
setPlanData(obj1)
setSum(sum)
})
}
useEffect(() => { useEffect(() => {
let data = [ let params = {
{ value: 1048, name: 'Search Engine' }, stm: dayjs().startOf("year").format('YYYY-MM-DD HH:mm:ss'),
{ value: 735, name: 'Direct' }, etm: dayjs().format('YYYY-MM-DD HH:mm:ss'),
{ value: 580, name: 'Email' }, }
{ value: 484, name: 'Union Ads' }, getInfo(params)
{ value: 300, name: 'Video Ads' }
] },[])
setPlanData(data)
})
return ( return (
<> <>
<div className='top' style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between' }}> <div className='top' style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between' }}>
<div style={{ fontSize: 20, fontWeight: 'bold', display: 'flex', alignItems: 'center' }}> <div style={{ fontSize: 20, fontWeight: 'bold', display: 'flex', alignItems: 'center' }}>
<div style={{ width: 5, height: 25, backgroundColor: '#259def', marginRight: 10 }}></div> <div style={{ width: 5, height: 25, backgroundColor: '#259def', marginRight: 10 }}></div>
{title} 案件来源
</div> </div>
<DatePicker.RangePicker <DatePicker.RangePicker
style={{ width: 220, }} style={{ width: 220, }}

View File

@ -2,48 +2,65 @@ import dayjs from 'dayjs';
import { Space, Table, Tag, DatePicker, Form, Select, Button, Card } from 'antd'; import { Space, Table, Tag, DatePicker, Form, Select, Button, Card } from 'antd';
import ReactECharts from 'echarts-for-react'; import ReactECharts from 'echarts-for-react';
import { useEffect, useState, useMemo } from 'react'; import { useEffect, useState, useMemo } from 'react';
import { httppost } from '../../../../utils/request';
import apiurl from '../../../../service/apiurl';
let obj =
{
0: '违建',
1: '毁林垦荒',
2: '筑坝拦汊',
3: '填占库容',
4: '违法取水',
5: '其他'
}
const Page = ({ title = '标题' }) => { const Page = ({ title = '标题' }) => {
const [echart2, setEchart2] = useState(Object()) const [echart2, setEchart2] = useState(Object())
const [inspectordata, setInspectorData] = useState([{}]) const [inspectordata, setInspectorData] = useState([{}])
const [plandata, setPlanData] = useState(Object()) const [plandata, setPlanData] = useState(Object())
const [problemdata, setProblemData] = useState(Object()) const [problemdata, setProblemData] = useState(Object())
const [sumTotal, setSum] = useState(0)
const getPlanOption = useMemo((name, data) => { const getPlanOption = useMemo((name, data) => {
// let total = 0 // let total = 0
// for (let i = 0; i < data.length; i++) { // for (let i = 0; i < data.length; i++) {
// total = total + Number(data[i].value) // total = total + Number(data[i].value)
// } // }
return { return {
legend: {
data: Object.values(obj)
},
angleAxis: { angleAxis: {
type: 'category', type: 'category',
data: ['应用服务中心', '技术管理', '综合管理', '进度管理', '质量管理', '安全管理', '其它'] data: Object.values(obj)
}, },
radar: [ // radar: [
{ // {
indicator: [ // indicator: [
{ text: '' }, // { text: '' },
{ text: '' }, // { text: '' },
{ text: '' }, // { text: '' },
{ text: '' }, // { text: '' },
{ text: '' }, // { text: '' },
{ text: '' }, // { text: '' },
{ text: '' }, // { text: '' },
], // ],
radius: '80%', // radius: '80%',
splitNumber: 12, // splitNumber: 12,
shape: 'circle', // shape: 'circle',
splitArea: { // splitArea: {
areaStyle: { // areaStyle: {
color: '#fff', // color: '#fff',
} // }
}, // },
axisLine: { // axisLine: {
lineStyle: { // lineStyle: {
color: '#d4d4d4' // color: '#d4d4d4'
} // }
}, // },
}, // },
], // ],
radiusAxis: { radiusAxis: {
min: 0, min: 0,
max: 20, max: 20,
@ -78,15 +95,7 @@ const Page = ({ title = '标题' }) => {
borderRadius: 8 borderRadius: 8
}, },
}, },
data: [ data: plandata
{ value: 40, name: '应用服务中心' },
{ value: 32, name: '技术管理' },
{ value: 30, name: '综合管理' },
{ value: 30, name: '进度管理' },
{ value: 28, name: '质量管理' },
{ value: 28, name: '安全管理' },
{ value: 18, name: '其它' },
]
} }
] ]
} }
@ -96,28 +105,41 @@ const Page = ({ title = '标题' }) => {
const onOk = (event, index) => { const onOk = (event, index) => {
if (event !== null) { if (event !== null) {
let params = { let params = {
stm: dayjs(new Date(event[0])).format('YYYY-MM-DD'), stm: dayjs(new Date(event[0])).format('YYYY-MM-DD HH:mm:ss'),
etm: dayjs(new Date(event[1])).format('YYYY-MM-DD'), etm: dayjs(new Date(event[1])).format('YYYY-MM-DD HH:mm:ss'),
} }
// getStm(params, index) // getStm(params, index)
getInfo(params)
} }
} }
const getInfo = (params) => {
let obj1 = []
let sum = 0
httppost(apiurl.szzf.ajtj.info + 1, params).then(res => {
res.data.map(item => {
obj1.push({ value: item.count, name: obj[item.type] })
sum = sum + item.count
})
// debugger;
setPlanData(obj1)
setSum(sum)
})
}
useEffect(() => { useEffect(() => {
let data = [ let params = {
{ value: 1048, name: 'Search Engine' }, stm: dayjs().startOf("year").format('YYYY-MM-DD HH:mm:ss'),
{ value: 735, name: 'Direct' }, etm: dayjs().format('YYYY-MM-DD HH:mm:ss'),
{ value: 580, name: 'Email' }, }
{ value: 484, name: 'Union Ads' }, getInfo(params)
{ value: 300, name: 'Video Ads' }
] }, [])
setPlanData(data)
})
return ( return (
<> <>
<div className='top' style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between' }}> <div className='top' style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between' }}>
<div style={{ fontSize: 20, fontWeight: 'bold', display: 'flex', alignItems: 'center' }}> <div style={{ fontSize: 20, fontWeight: 'bold', display: 'flex', alignItems: 'center' }}>
<div style={{ width: 5, height: 25, backgroundColor: '#259def', marginRight: 10 }}></div> <div style={{ width: 5, height: 25, backgroundColor: '#259def', marginRight: 10 }}></div>
{title} 案件类型
</div> </div>
<DatePicker.RangePicker <DatePicker.RangePicker
style={{ width: 220, }} style={{ width: 220, }}

View File

@ -3,6 +3,8 @@ import { Space, Table, Tag, DatePicker, Form, Select, Button, Card } from 'antd'
import ReactECharts from 'echarts-for-react'; import ReactECharts from 'echarts-for-react';
import { useEffect, useState, useMemo } from 'react'; import { useEffect, useState, useMemo } from 'react';
import { encode } from 'punycode'; import { encode } from 'punycode';
import { httpget } from '../../../../utils/request';
import apiurl from '../../../../service/apiurl';
const Page = ({ title = '标题' }) => { const Page = ({ title = '标题' }) => {
const [echart2, setEchart2] = useState(Object()) const [echart2, setEchart2] = useState(Object())
@ -14,12 +16,12 @@ const Page = ({ title = '标题' }) => {
tooltip: { tooltip: {
trigger: 'axis', trigger: 'axis',
position: ['20%', '50%'], position: ['20%', '50%'],
formatter:function(value){
console.log(value);
return `<div>${value[0].value.month+"月份"}</div><div>数量:${value[0].value.count}</div>`;
}
}, },
legend: {
data: ['运行调度指令'],
},
dataset: [ dataset: [
{ source: plandata }, { source: plandata },
] ]
@ -27,22 +29,30 @@ const Page = ({ title = '标题' }) => {
xAxis: xAxis:
{ {
type: 'category', type: 'category',
axisLabel: {
show: true,
textStyle: {
color: '#595C61'
},
formatter:function(value){
return value+'月';
}
}
} }
, ,
yAxis: [ yAxis: [
{ {
name: 'mm',
type: 'value' type: 'value'
} }
], ],
series: [ series: [
{ {
name: '2量', name:'数量',
type: 'line', type: 'line',
datasetIndex: 0, datasetIndex: 0,
encode: { encode: {
x: 'name', x: 'month',
y: 'value' y: 'count'
}, },
itemStyle: { itemStyle: {
color: 'skyblue' color: 'skyblue'
@ -55,34 +65,33 @@ const Page = ({ title = '标题' }) => {
const onOk = (event, index) => { const onOk = (event, index) => {
if (event !== null) { if (event !== null) {
let params = { let params = dayjs(event).format('YYYY')
stm: dayjs(new Date(event[0])).format('YYYY-MM-DD'), getInfo(params)
etm: dayjs(new Date(event[1])).format('YYYY-MM-DD'),
} }
} }
const getInfo = (params) => {
httpget(apiurl.szzf.ajtj.qs+ params).then(res => {
setPlanData(res.data)
})
} }
useEffect(() => { useEffect(() => {
let data = [ let params = dayjs().format('YYYY')
{ value: 1048, name: 'Search Engine' },
{ value: 735, name: 'Direct' }, getInfo(params)
{ value: 580, name: 'Email' }, }, [])
{ value: 484, name: 'Union Ads' },
{ value: 300, name: 'Video Ads' }
]
setPlanData(data)
})
return ( return (
<> <>
<div className='top' style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between' }}> <div className='top' style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between' }}>
<div style={{ fontSize: 20, fontWeight: 'bold', display: 'flex', alignItems: 'center' }}> <div style={{ fontSize: 20, fontWeight: 'bold', display: 'flex', alignItems: 'center' }}>
<div style={{ width: 5, height: 25, backgroundColor: '#259def', marginRight: 10 }}></div> <div style={{ width: 5, height: 25, backgroundColor: '#259def', marginRight: 10 }}></div>
{title} 案件趋势
</div> </div>
<DatePicker.RangePicker <DatePicker
style={{ width: 220, }} style={{ width: 220, }}
onChange={(e, index) => onOk(e, 2)} onChange={(e, index) => onOk(e, 2)}
defaultValue={[dayjs().startOf("year"), dayjs()]} defaultValue={dayjs()}
></DatePicker.RangePicker> picker='year'
></DatePicker>
</div> </div>
<ReactECharts <ReactECharts
ref={(e) => setEchart2(e)} ref={(e) => setEchart2(e)}

View File

@ -3,14 +3,17 @@ import { Button } from 'antd'
import ModalForm from './form'; import ModalForm from './form';
import BasicCrudModal from '../../../../components/crud/BasicCrudModal'; import BasicCrudModal from '../../../../components/crud/BasicCrudModal';
import React, { Fragment, useRef, useMemo, useEffect, useState } from 'react'; import React, { Fragment, useRef, useMemo, useEffect, useState } from 'react';
const Page = ({ data }) => { import { httpget } from '../../../../utils/request';
import apiurl from '../../../../service/apiurl';
const Page = ({ treeSelect }) => {
const refModal = useRef(); const refModal = useRef();
const [data,setData] = useState({})
/** /**
* @description 处理成功的回调 * @description 处理成功的回调
*/ */
const successCallback = () => { const successCallback = () => {
// refresh() getInfo()
// setIsFetch(!isFetch) // setIsFetch(!isFetch)
} }
const dataPahe = { const dataPahe = {
@ -18,27 +21,37 @@ const Page = ({ data }) => {
zhunag: '1' zhunag: '1'
} }
const edit = () => { const edit = () => {
refModal.current.showEdit({}); refModal.current.showEdit({...data});
} }
const getInfo=()=>{
httpget(apiurl.szzf.clyj.detail+treeSelect?.key).then(res=>{
setData({...res.data,name:treeSelect.name})
})
}
useEffect(()=>{
if(treeSelect){
getInfo()
}
},[treeSelect])
return ( return (
<> <>
<div className={styles.list} style={{ padding: '0 10px', marginBottom: 5 }}>{dataPahe.title}<Button type="primary" onClick={edit}>编辑</Button></div> <div className={styles.list} style={{ padding: '0 10px', marginBottom: 5 }}>{treeSelect?.name}<Button type="primary" onClick={edit}>编辑</Button></div>
<div className={styles.listborder} style={{ padding: '0 10px', }}>{dataPahe.title}</div> <div className={styles.listborder} style={{ padding: '0 10px', }}>状态</div>
<div className={styles.listborder} style={{ padding: '0 10px', marginBottom: 5 }}>{dataPahe.title}</div> <div className={styles.listborder} style={{ padding: '0 10px', marginBottom: 5 }}>{data?.status?'启用':'禁用'}</div>
<div className={styles.contentBor} style={{ padding: '0 10px', marginBottom: 5, height: '35%' }}> <div className={styles.contentBor} style={{ padding: '0 10px', marginBottom: 5, height: '35%' }}>
<div className={styles.listborder} style={{ padding: '0 10px', height: '30%' }}>{dataPahe.title}</div> <div className={styles.listborder} style={{ padding: '0 10px', height: '30%' }}>法律依据</div>
{dataPahe.title ?? '无内容请添加'} {data?.legalName ?? '无内容请添加'}
</div> </div>
<div style={{ display: 'flex', height: '33%' }}> <div style={{ display: 'flex', height: '33%' }}>
<div className={styles.contentBor} style={{ flex: 1, marginRight: 5 }}> <div className={styles.contentBor} style={{ flex: 1, marginRight: 5 }}>
<div className={styles.listborder} style={{ height: '30%', padding: '0 10px', }}>{dataPahe.title}</div> <div className={styles.listborder} style={{ height: '30%', padding: '0 10px', }}>违法行为描述</div>
<div style={{ padding: '0 10px' }}>{dataPahe.title ?? '无内容请添加'}</div> <div style={{ padding: '0 10px' }}>{data?.violationDesc ?? '无内容请添加'}</div>
</div> </div>
<div className={styles.contentBor} style={{ flex: 1 }}> <div className={styles.contentBor} style={{ flex: 1 }}>
<div className={styles.listborder} style={{ height: '30%', padding: '0 10px', }}>{dataPahe.title}</div> <div className={styles.listborder} style={{ height: '30%', padding: '0 10px', }}>处罚措施</div>
<div style={{ padding: '0 10px' }}>{dataPahe.title ?? '无内容请添加'}</div> <div style={{ padding: '0 10px' }}>{data?.penalties ?? '无内容请添加'}</div>
</div> </div>
</div> </div>

View File

@ -5,6 +5,7 @@
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
background-color: #fff; background-color: #fff;
font-size: 16px;
} }
.listborder{ .listborder{
@ -15,9 +16,13 @@
justify-content: space-between; justify-content: space-between;
background-color: #fff; background-color: #fff;
border-bottom: 1px solid #f0f0f0; border-bottom: 1px solid #f0f0f0;
font-size: 16px;
} }
.contentBor{ .contentBor{
background-color: #fff; background-color: #fff;
border-bottom: 1px solid #f0f0f0; border-bottom: 1px solid #f0f0f0;
font-size: 16px;
} }

View File

@ -10,10 +10,10 @@ import moment from 'moment';
const { TextArea } = Input; const { TextArea } = Input;
const options=[ const options=[
{label:'禁用'}, {label:'禁用',value:0},
{label:'启用'} {label:'启用',value:1}
] ]
const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => { const ModalForm = ({ mode, record, onEdit, onSave, onCrudSuccess }) => {
const [form] = Form.useForm(); const [form] = Form.useForm();
const [fileList, setFileList] = useState([]) //上传文件列表 const [fileList, setFileList] = useState([]) //上传文件列表
@ -24,30 +24,11 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
const onfinish = (values) => { const onfinish = (values) => {
values.eventsDate = values.eventsDate ? moment(values.eventsDate).format("YYYY-MM-DD 00:00:00") : '' onEdit(apiurl.szzf.clyj.edit, {...record,...values})
let oldFiles = fileList.map(item => ({ fileId: item.response?.data?.fileId }))
if (mode === 'edit') {
values.files = oldFiles;
values.id = record.id;
onEdit(apiurl.rcgl.gcdsj.edit, values)
}
if (mode === 'save') {
values.files = oldFiles
onSave(apiurl.rcgl.gcdsj.save, values)
}
} }
useEffect(() => { useEffect(() => {
if (mode != 'save') { if(record){
const imgFile = record?.files?.map(o => ({ form.setFieldsValue(record)
name: o.fileName,
response: {
data: {
filePath: o.filePath,
fileId: o.fileId
}
},
}))
setFileList(imgFile)
} }
}, [record, mode]) }, [record, mode])
@ -74,7 +55,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="状态" label="状态"
name="name" name="status"
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<Radio.Group options={options}/> <Radio.Group options={options}/>
@ -83,7 +64,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="法律名称" label="法律名称"
name="name" name="legalName"
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<Input style={{ width: '100%' }} allowClear /> <Input style={{ width: '100%' }} allowClear />
@ -92,7 +73,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="法条内容" label="法条内容"
name="name" name="legalContent"
> >
<Input style={{ width: '100%' }} allowClear /> <Input style={{ width: '100%' }} allowClear />
</Form.Item> </Form.Item>
@ -101,7 +82,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="违法行为描述" label="违法行为描述"
name="name" name="violationDesc"
> >
<TextArea rows={4} /> <TextArea rows={4} />
</Form.Item> </Form.Item>
@ -109,7 +90,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="处罚措施" label="处罚措施"
name="name" name="penalties"
> >
<TextArea rows={4} /> <TextArea rows={4} />
</Form.Item> </Form.Item>

View File

@ -2,17 +2,22 @@ import { Card } from 'antd'
import TreeSelectZdy from './treeSelectZdy' import TreeSelectZdy from './treeSelectZdy'
import ContentPage from './content' import ContentPage from './content'
import { useEffect, useState } from 'react'
const Page = () => { const Page = () => {
const [treeSelect ,setTreeSelect] =useState({})
useEffect(()=>{
console.log(treeSelect,'1111');
},[treeSelect])
return ( return (
<div style={{display:'flex',height: '100%'}}> <div style={{display:'flex',height: '100%'}}>
<div style={{ width: 320, backgroundColor: '#fff', padding: 10 }}> <div style={{ width: 320, backgroundColor: '#fff', padding: 10 }}>
<TreeSelectZdy /> <TreeSelectZdy setTreeSelect={setTreeSelect}/>
</div> </div>
<div style={{ flex:1 ,marginLeft:10}}> <div style={{ flex:1 ,marginLeft:10}}>
<ContentPage /> <ContentPage treeSelect={treeSelect[0]}/>
</div> </div>
</div> </div>

View File

@ -1,57 +1,64 @@
import React, { useState, useMemo } from 'react'; import React, { useState, useMemo, useEffect, useRef } from 'react';
import { Tree, Input } from 'antd'; import { Tree, Input, Tooltip } from 'antd';
import { httpget } from '../../../../utils/request';
import apiurl from '../../../../service/apiurl';
const { Search } = Input; const { Search } = Input;
const data = [ // const data = [
{ // {
key: 'parent 1', // key: 'parent 1',
title: '违反水利工程建设与管理类行为', // title: '违反水利工程建设与管理类行为',
children: [ // children: [
{ // {
value: 'parent 1-0', // value: 'parent 1-0',
title: '侵占、毁坏水法规定相关设施', // title: '侵占、毁坏水法规定相关设施',
children: [ // children: [
{ // {
key: 'leaf1', // key: 'leaf1',
title: '侵占、毁坏水工程及堤防、护岸...', // title: '侵占、毁坏水工程及堤防、护岸...',
}, // },
{ // {
key: 'leaf2', // key: 'leaf2',
title: '毁坏防汛、水文监测、水文地质...', // title: '毁坏防汛、水文监测、水文地质...',
}, // },
{ // {
key: 'leaf3', // key: 'leaf3',
title: '在水工程保护范围内,从事影响..', // title: '在水工程保护范围内,从事影响..',
} // }
], // ],
}, // },
{ // {
key: 'parent 1-1', // key: 'parent 1-1',
title: '破坏大坝管理设施、妨碍大坝', // title: '破坏大坝管理设施、妨碍大坝',
children: [ // children: [
{ // {
key: 'leaf4', // key: 'leaf4',
title: '毁坏大坝及其管理设施', // title: '毁坏大坝及其管理设施',
}, // },
{ // {
key: 'leaf5', // key: 'leaf5',
title: '危害大坝安全或破坏大坝正常运行', // title: '危害大坝安全或破坏大坝正常运行',
}, // },
{ // {
key: 'leaf6', // key: 'leaf6',
title: '在岸区或坝体从事生产活动', // title: '在岸区或坝体从事生产活动',
}, // },
], // ],
}, // },
], // ],
}, // },
]; // ];
let dataList = []; let dataList = [];
const Page = () => { const Page = ({ setTreeSelect }) => {
const [expandedKeys, setExpandedKeys] = useState([]); const [expandedKeys, setExpandedKeys] = useState([]);
const [searchValue, setSearchValue] = useState(''); const [searchValue, setSearchValue] = useState();
const [autoExpandParent, setAutoExpandParent] = useState(true); const [autoExpandParent, setAutoExpandParent] = useState(true);
const [selectNode, setSelect] = useState(true);
const [data, setData] = useState([]);
const treeRef = useRef();
const onExpand = (newExpandedKeys) => { const onExpand = (newExpandedKeys) => {
@ -60,15 +67,7 @@ const Page = () => {
}; };
const onSearch = (value) => { const onSearch = (value) => {
// const newExpandedKeys = dataList // debugger;
// .map((item) => {
// if (item.title.indexOf(value) > -1) {
// return getParentKey(item.key, data);
// }
// return null;
// })
// .filter((item, i, self) => !!(item && self.indexOf(item) === i));
// setExpandedKeys(newExpandedKeys);
setSearchValue(value); setSearchValue(value);
setAutoExpandParent(true); setAutoExpandParent(true);
@ -76,44 +75,120 @@ const Page = () => {
const treeData = useMemo(() => { const treeData = useMemo(() => {
const loop = (data) => const loop = (data) =>
data.map((item) => { data.map((item) => {
const strTitle = item.title; const strTitle = item.legalName;
const index = strTitle?.indexOf(searchValue); const index = strTitle?.indexOf(searchValue);
const beforeStr = strTitle.substring(0, index); const beforeStr = strTitle.substring(0, index);
const afterStr = strTitle.slice(index + searchValue.length); const afterStr = strTitle.slice(index + searchValue?.length);
const title = const title =
index > -1 ? ( index > -1 ? (
<span key={item.key}> <span key={item.id}>
{beforeStr} {beforeStr}
<span className="site-tree-search-value" style={{ color: 'red' }}>{searchValue}</span> <span className="site-tree-search-value" style={{ color: 'red' }}>{searchValue}</span>
{afterStr} {afterStr}
</span> </span>
) : ( ) : (
<span key={item.key}>{strTitle}</span> <span key={item.id}>{strTitle}</span>
); );
if (item.children) { if (item.children) {
return { title, key: item.key, children: loop(item.children) }; return { title: title, key: item.id, children: loop(item.children), name: strTitle };
} }
if (index > -1) { if (index > -1) {
dataList.push(item.key)
console.log(index, strTitle, searchValue);
dataList.push(item.id)
setExpandedKeys(dataList); setExpandedKeys(dataList);
if (dataList.length < 2) {
treeRef.current.scrollTo({ key: dataList[0].id });
}
} }
return { return {
title, title: title,
key: item.key, key: item.id,
name: strTitle
}; };
}); });
return loop(data); return loop(data);
}, [searchValue]); }, [searchValue, data]);
const getFirstChild=(val)=> {
let res = {};
if (JSON.stringify(res) != "{}") {
return;//如果res不再是空对象退出递归
} else {
//遍历数组
for (let i = 0; i < val.length; i++) {
//如果当前的isleaf是true,说明是叶子节点把当前对象赋值给res,并return终止循环
if (!val[i].children) {
res = val[i];
break;
}else {//否则的话递归当前节点的children
getFirstChild(val[i].children);
}
}
return res
}
}
useEffect(() => {
httpget(apiurl.szzf.clyj.tree).then(res => {
setData(res.data)
// setTreeSelect(
// [{
// key: res.data[0].id,
// name: res.data[0].legalName,
// }]
// )
// setSelect([res.data[0].id])
// getFirstChild(res.data)
setSelect([getFirstChild(res.data).id]);
setTreeSelect(
[{
key: getFirstChild(res.data).id,
name: getFirstChild(res.data).legalName,
}]
)
})
}, [])
return ( return (
<> <>
<div style={{ margin: '10px 0' }}><Search onSearch={onSearch} /></div> <div style={{ margin: '10px 0' }}><Search onSearch={onSearch} /></div>
<Tree <Tree
onExpand={onExpand} onExpand={onExpand}
ref={treeRef}
expandedKeys={expandedKeys} expandedKeys={expandedKeys}
treeData={treeData} treeData={treeData}
autoExpandParent={autoExpandParent} autoExpandParent={autoExpandParent}
selectedKeys={selectNode}
titleRender={(data) => {
return (
<div style={{ color: data.children ? '#c8c8c8' : '', cursor: data.children ? 'not-allowed' : '' }} >
<Tooltip title={data.name}>
<div className='ellipsis1' style={{ width: 200 }}>
{data.title}
</div>
</Tooltip>
</div>)
}}
onSelect={(e, node) => {
if (node.selectedNodes[0].children) {
return;
}
setSelect(e)
setTreeSelect(
node.selectedNodes
)
}}
height={800}
/> />
</> </>
@ -121,3 +196,4 @@ const Page = () => {
}; };
export default Page; export default Page;

View File

@ -1,34 +1,38 @@
import React, { useEffect, useState, useRef } from 'react'; import React, { useEffect, useState, useRef } from 'react';
import { Space, Table, Radio, DatePicker, Form, Select, Button, message, Upload, Input, Row, Col, Switch, Image } from 'antd'; import { TreeSelect, Table, Tag, DatePicker, Form, Select, Button, message, Upload, Input, Row, Col, Switch, Image,Radio } from 'antd';
import './ddForm.less' import './ddForm.less'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { InboxOutlined, LinkOutlined, DeleteOutlined, LoadingOutlined,VerticalAlignBottomOutlined } from '@ant-design/icons' import { InboxOutlined, LinkOutlined, DeleteOutlined, LoadingOutlined, VerticalAlignBottomOutlined } from '@ant-design/icons'
import { httpPostFile } from '../../../../utils/request'; import apiurl from '../../../../service/apiurl';
import apiUrl from '../../../../service/apiurl' import { httpgetExport, httppostAddfile } from '../../../../utils/request';
import { exportFile } from '../../../../utils/tools';
// import apiUrl from '../../service/apiurl'
import PdfView from './pdfView' import PdfView from './pdfView'
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
const { TextArea } = Input; const { TextArea } = Input;
const baseUrl = "http://local.gunshiiot.com:18083/gunshiApp/xintankou" const baseUrl = "http://223.75.53.141:9102/test.by-lyf.tmp"
const FormZdy = ({ typeName = "ddForm", formJson, getFormInfo, type, formJsonData, typeUpload = 'dispatch', isModalOpen,fileType,footer=true }) => { const FormZdy = ({ fileKey,typeName = "ddForm", formJson, getFormInfo, type, formJsonData, typeUpload = 'dispatch', isModalOpen, fileType, footer = true, uploadUrl,TableZdyProps,downloadUrl,
onSave }) => {
const [fileList, setFileList] = useState([]) const [fileList, setFileList] = useState([])
const [fileListUp, setFileLisUp] = useState([]) const [fileListUp, setFileLisUp] = useState([])
const [url, setUrl] = useState('') const [url, setUrl] = useState('')
const [isModal, setIsModal] = useState(false) const [isModal, setIsModal] = useState(false)
// debugger; //
const [form] = Form.useForm(); const [form] = Form.useForm();
// function onDocumentLoadSuccess({ numPages }) { // function onDocumentLoadSuccess({ numPages }) {
// setRenderNumPages(numPages); // setRenderNumPages(numPages);
// } // }
const onFinish = (e) => { const onFinish = (e) => {
} }
const getInfo = () => { const getInfo = () => {
form.validateFields().then((values) => { form.validateFields().then((values) => {
getFormInfo({ ...values, files: fileList, fileIds: fileList.map(item => item.id) }) getFormInfo({ ...values, [fileKey]: fileList, fileIds: fileList.map(item => item.fileId) })
form.resetFields() form.resetFields()
setFileList([]) setFileList([])
}).catch((errorInfo) => { }).catch((errorInfo) => {
@ -47,7 +51,8 @@ const FormZdy = ({ typeName = "ddForm", formJson, getFormInfo, type, formJsonDat
// window.open('http://local.gunshiiot.com:18083/xintankou/api/file/preview/104') // window.open('http://local.gunshiiot.com:18083/xintankou/api/file/preview/104')
// } // }
const deleteFile = (e) => { const deleteFile = (e) => {
let arr = fileList.filter(item => item.id !== e) // debugger;
let arr = fileList.filter(item => item.fileId !== e)
setFileList(arr) setFileList(arr)
} }
const props = { const props = {
@ -64,9 +69,9 @@ const FormZdy = ({ typeName = "ddForm", formJson, getFormInfo, type, formJsonDat
return true; return true;
} }
}, },
onChange(e) { customRequest(e) {
setFileLisUp([...fileListUp, e.file]) setFileLisUp([...fileListUp, e.file])
httpPostFile(apiUrl.service.uploadFile.uploadUrl + "?group=" + typeUpload, e).then(res => { httppostAddfile(uploadUrl, e).then(res => {
setFileList([...fileList, res.data]) setFileList([...fileList, res.data])
}) })
} }
@ -76,12 +81,12 @@ const FormZdy = ({ typeName = "ddForm", formJson, getFormInfo, type, formJsonDat
// 创建URL对象 // 创建URL对象
var link = url; var link = url;
// 获取路径的最后一个点之后的内容作为文件扩展名 // 获取路径的最后一个点之后的内容作为文件扩展名
var extension = link.split('.').pop().toLowerCase(); var extension = link?.split('.').pop().toLowerCase();
// 声明支持的图片和视频文件扩展名 // 声明支持的图片和视频文件扩展名
var imageExtensions = ['jpg', 'jpeg', 'gif', 'png']; var imageExtensions = ['jpg', 'jpeg', 'gif', 'png'];
var file = ['pdf', 'word', 'xslx', 'xsl', 'txt',"pptx"]; var file = ['pdf', 'word', 'xslx', 'xsl', 'txt', "pptx"];
//
// 判断文件扩展名是否在图片扩展名数组中 // 判断文件扩展名是否在图片扩展名数组中
if (imageExtensions.includes(extension)) { if (imageExtensions.includes(extension)) {
return 'image'; return 'image';
@ -98,7 +103,7 @@ const FormZdy = ({ typeName = "ddForm", formJson, getFormInfo, type, formJsonDat
const preView = (item) => { const preView = (item) => {
if (checkMediaType(item.name) == 'pdf') { if (checkMediaType(item.name) == 'pdf') {
// window.open(baseUrl + item.previewUrl) // window.open(baseUrl + item.previewUrl)
setUrl(`${`http://local.gunshiiot.com:18083/xintankou`}/static/pdf/web/viewer.html?file=${encodeURIComponent(`http://local.gunshiiot.com:18083/gunshiApp/xintankou/${item.previewUrl}`)}`) setUrl(item.previewUrl)
setIsModal(true) setIsModal(true)
} }
@ -108,37 +113,35 @@ const FormZdy = ({ typeName = "ddForm", formJson, getFormInfo, type, formJsonDat
* @description 文件下载 * @description 文件下载
* @param {String} params 文件fileId * @param {String} params 文件fileId
*/ */
const download = (id,name) => { const download = async(id, name) => {
let downloadLink = document.createElement("a"); var extension = name?.split('.').pop().toLowerCase();
downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/xintankou/api/file/download/${id}`; httpgetExport(downloadUrl+id).then(res => {
downloadLink.download = `${name}`; exportFile(name,res.data)
downloadLink.style.display = "none"; })
// 将链接添加到页面中
document.body.appendChild(downloadLink);
// 模拟点击事件,开始下载
downloadLink.click();
} }
useEffect(() => { useEffect(() => {
form.resetFields() // form.resetFields()
let formType = type let formType = type
if(type='edit'){ if (type = 'edit') {
formType=2 formType = 2
} }
if(type == 'view'){ if (type == 'view') {
formType =1 formType = 1
} }
if(type=='save'){ if (type == 'save') {
formType =0 formType = 0
} }
if (formType == 1 || formType == 2 || formType == 3) { if (formType == 1 || formType == 2 || formType == 3) {
form.setFieldsValue(formJsonData) form.setFieldsValue(formJsonData)
if (formJsonData?.files) { if (formJsonData?.[fileKey]) {
setFileList(formJsonData.files) setFileList(formJsonData[fileKey])
} }
console.log(formJsonData, formJson);
//
} }
return () => { return () => {
setFileList([]) setFileList([])
} }
@ -148,72 +151,161 @@ const FormZdy = ({ typeName = "ddForm", formJson, getFormInfo, type, formJsonDat
return ( return (
<div style={{ backgroundColor: '#fff' }}> <div style={{ backgroundColor: '#fff', marginTop: 10 }}>
<Form form={form} name="searchTabel" onFinish={onFinish} className={typeName}> <Form form={form} name="searchTabel" onFinish={onFinish} className={typeName}>
<Row> <Row>
{formJson.map(item => { {formJson?.map(item => {
return ( return (
<Col span={item.span} > <Col span={item.span} >
{item.type == "input" &&
<Form.Item <Form.Item
label={item.label} label={item.label}
name={item.key} name={item.key}
rules={[{ required: item.required, message: '请输入' + item.label }]} rules={[{ required: item.required, message: '请输入' + item.label }]}
className={item.type == 'empty'?'empty':'noempty'}
> >
{item.type == "input" && <Input disabled={type == 1 || item.disabled} placeholder={item.placeholder} />} <Input disabled={type == 'view' || item.disabled} placeholder={item.placeholder} />
{item.type == "Select" && <Select disabled={type == 1} options={item.options} />} </Form.Item>}
{item.type == "empty" && <Input disabled={item.type == "empty" ? true : false} />} {item.type == "title" &&
{item.type == "Switch" && <Switch defaultChecked onChange={onChange} disabled={type == 1} />} <Form.Item
{item.type == "DatePicker" && <DatePicker disabled={type == 1} style={{width:"100%"}} />} label={item.label}
{item.type == "TextArea" && <TextArea rows={4} disabled={type == 1} />} name={item.key}
{item.type == "Radio" &&<Radio.Group options={item.options} />} rules={[{ required: item.required, message: '请输入' + item.label }]}
{item.type == "RangePicker" && >
<RangePicker disabled={type=='view'} />}
{item.type == "upload" && <div className='title'>
<div className='titleRight'></div>
{item.content}
</div>
</Form.Item>}
{item.type == "Select" && <Form.Item
label={item.label}
name={item.key}
rules={[{ required: item.required, message: '请输入' + item.label }]}
>
<Select disabled={type == 'view'} options={item.options} fieldNames={item.fieldNames} />
</Form.Item>}
{item.type == "Radio" && <Form.Item
label={item.label}
name={item.key}
rules={[{ required: item.required, message: '请输入' + item.label }]}
>
<Radio.Group disabled={type == 'view'} options={item.options}/>
</Form.Item>}
{/* {item.type == "Select" && <Select disabled={type == 1} options={item.options} />} */}
{item.type == "Switch" && <Form.Item
label={item.label}
name={item.key}
rules={[{ required: item.required, message: '请输入' + item.label }]}
>
<Switch defaultChecked onChange={onChange} disabled={type == 'view'} />
</Form.Item>}
{/* {item.type == "Switch" && <Switch defaultChecked onChange={onChange} disabled={type == 1} />} */}
{item.type == "DatePicker" && <Form.Item
label={item.label}
name={item.key}
rules={[{ required: item.required, message: '请输入' + item.label }]}
>
{/* {formJsonData[item.key]} */}
<DatePicker disabled={type == 'view'} style={{ width: "100%" }} picker={item.picker}/>
</Form.Item>}
{/* {item.type == "DatePicker" && <DatePicker disabled={type == 1} style={{ width: "100%" }} />} */}
{item.type == "TextArea" && <Form.Item
label={item.label}
name={item.key}
rules={[{ required: item.required, message: '请输入' + item.label }]}
>
<TextArea rows={4} disabled={type == 'view'} />
</Form.Item>}
{/* {item.type == "TextArea" && <TextArea rows={4} disabled={type == 1} />} */}
{item.type == "RangePicker" && <Form.Item
label={item.label}
name={item.key}
rules={[{ required: item.required, message: '请输入' + item.label }]}
>
<RangePicker disabled={type == 'view'} />
</Form.Item>}
{item.type == "TreeSelect" && <Form.Item
label={item.label}
name={item.key}
rules={[{ required: item.required, message: '请输入' + item.label }]}
>
<TreeSelect
showSearch
style={{ width: '100%' }}
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
placeholder="Please select"
allowClear
fieldNames={item.fieldNames}
treeData={item.treeData}
treeCheckable={item.multiple}
/>
</Form.Item>}
{/* {item.type == "RangePicker" &&
<RangePicker disabled={type == 'view'} />} */}
{item.type == "upload" && <Form.Item
label={item.label}
name={item.key}
rules={[{ required: item.required, message: '请输入' + item.label }]}
>
<> <>
{type !== 1 && <Dragger {...props}> {type !== 'view' && <Dragger {...props}>
<p className="ant-upload-drag-icon"> <p className="ant-upload-drag-icon">
<InboxOutlined /> <InboxOutlined />
</p> </p>
{fileType == "pic" ? <p className="ant-upload-text">点击或将文件拖拽到这里上传 支持扩展名jpegpng</p>: <p className="ant-upload-text"></p>} {fileType == "pic" ? <p className="ant-upload-text">点击或将文件拖拽到这里上传 支持扩展名jpegpng</p> : <p className="ant-upload-text"></p>}
</Dragger>} </Dragger>}
<div> <div className='flex' >
{fileList?.map((item) => { {fileList?.map((item) => {
return <div className='flex align-center' style={{ minHeight: "50px", fontSize: 14,columnGap:10, cursor: checkMediaType(item.name) == 'image' || checkMediaType(item.name) == 'pdf'?'pointer':"not-allowed" }}> return <div className='flex align-center file-item' style={{marginTop:5, marginRight:'3%',width:'30%',minHeight: "50px", fontSize: 14, columnGap: 10, cursor: checkMediaType(item.fileName) == 'image' || checkMediaType(item.fileName) == 'pdf' ? 'pointer' : "not-allowed" }}>
<div style={{width:40,height:40,display:"flex",alignItems:'center'}}> <div style={{ width: 40, height: 40, display: "flex", alignItems: 'center' }}>
{checkMediaType(item.name) == 'image' && <Image {checkMediaType(item.fileName) == 'image' && <Image
height={40} height={40}
src={baseUrl + item.previewUrl} src={baseUrl + item.filePath}
/>} />}
{ {
checkMediaType(item.name) !== 'image' && checkMediaType(item.fileName) !== 'image' &&
<span >{checkMediaType(item.name)?.toUpperCase()}</span> <span >{checkMediaType(item.fileName)?.toUpperCase()}</span>
} }
</div> </div>
<span onClick={() => preView(item)}>{item.name}</span> <span onClick={() => preView(item)}>{item.fileName}</span>
{type==2&&<DeleteOutlined onClick={() => deleteFile(item.id)} />} {type !== 'view' && <DeleteOutlined onClick={() => deleteFile(item.fileId)} />}
<VerticalAlignBottomOutlined onClick={() => download(item.id,item.name)} /> <VerticalAlignBottomOutlined onClick={() => download(item.fileId, item.fileName)} />
</div> </div>
})} })}
</div> </div>
</>} </>
</Form.Item> </Form.Item>}
</Col> </Col>
) )
})} })}
</Row> </Row>
</Form > </Form >
{type !== 1 &&<div className="flex flex-end" style={{ marginTop: 10 }}> {TableZdyProps}
{
type !== 'view' && <div className="flex flex-end" style={{ marginTop: 10, justifyContent: "flex-end" }}>
<Button type="" style={{ marginRight: 10 }} onClick={cancel}>取消</Button> <Button type="" style={{ marginRight: 10 }} onClick={cancel}>取消</Button>
<Button type="primary" onClick={getInfo}>确定</Button> <Button type="primary" onClick={getInfo}>确定</Button>
</div>}
<PdfView url={url} isModal={isModal} setModalN={(e)=>setIsModal(e)}/>
</div> </div>
}
<PdfView url={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/xyt/rescue/goods/file/download/${url}`)}`} isModal={isModal} setModalN={(e)=>setIsModal(e)}/>
</div >
); );
} }

View File

@ -14,12 +14,13 @@ const { Dragger } = Upload;
const url = "http://223.75.53.141:9102/test.by-lyf.tmp" const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
const opntios=[ const opntios=[
{label:'宪法',value:'宪法'}, {value:0,label:'党支部工作制度'},
{label:'法律',value:'法律'}, {value:1,label:'行政工作制度'},
{label:'行政法规',value:'行政法规'}, {value:2,label:'部门工作制度'},
{label:'督察法规',value:'督察法规'}, {value:3,label:'安全管理制度'},
{label:'司法解释',value:'司法解释'}, {value:4,label:'工程管理制度'},
{label:'地方性法规',value:'地方性法规'}, {value:5,label:'技术规程'},
{value:6,label:'岗位责任制'}
] ]
const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => { const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
@ -37,7 +38,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
*/ */
const download = (params) => { const download = (params) => {
let downloadLink = document.createElement("a"); let downloadLink = document.createElement("a");
downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/xyt/projectEvents/file/download/${params}`; downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/tsg/projectEvents/file/download/${params}`;
downloadLink.download = `${params.fileName}`; downloadLink.download = `${params.fileName}`;
downloadLink.style.display = "none"; downloadLink.style.display = "none";
// 将链接添加到页面中 // 将链接添加到页面中
@ -78,16 +79,16 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
const onfinish = (values) => { const onfinish = (values) => {
values.eventsDate = values.eventsDate ? moment(values.eventsDate).format("YYYY-MM-DD 00:00:00") : '' let oldFiles = fileList.map(item => (item.response?.data??item))
let oldFiles = fileList.map(item => ({ fileId: item.response?.data?.fileId })) // debugger
if (mode === 'edit') { if (mode === 'edit') {
values.files = oldFiles; values.files = oldFiles;
values.id = record.id; values.id = record.id;
onEdit(apiurl.rcgl.gcdsj.edit, values) onEdit(apiurl.zdgl.edit, {...record,...values})
} }
if (mode === 'save') { if (mode === 'save') {
values.files = oldFiles values.files = oldFiles
onSave(apiurl.rcgl.gcdsj.save, values) onSave(apiurl.zdgl.add, values)
} }
} }
@ -136,30 +137,24 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item label="制度类型" name="name"> <Form.Item label="制度类型" name="type" rules={[{ required: true }]}>
<Select allowClear style={{ width: '150px' }} options={opntios} /> <Select allowClear style={{ width: '100%' }} options={opntios} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="公布日期" label="公布日期"
name="eventsDate" name="releaseDate"
getValueFromEvent={(e, dateString) => dateString} getValueFromEvent={(e, dateString) => dateString}
getValueProps={(value) => ({ value: value ? moment(value) : undefined })} getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
rules={[
{
required: true,
},
]}
> >
<DatePicker disabled={mode === 'view'} format={'YYYY-MM-DD'} style={{ width: '100%' }} allowClear /> <DatePicker disabled={mode === 'view'} format={'YYYY-MM-DD HH:mm:ss'} style={{ width: '100%' }} allowClear />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="发布单位" label="发布单位"
name="name" name="fillUnit"
rules={[{ required: true }]}
> >
<Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear /> <Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear />
</Form.Item> </Form.Item>
@ -170,7 +165,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="附件" label="附件"
name="fieldId" name="files"
labelCol={{ span: 3 }} labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }} wrapperCol={{ span: 19 }}
> >
@ -178,7 +173,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Dragger <Dragger
name='file' name='file'
// multiple // multiple
action="/gunshiApp/xyt/projectEvents/file/upload/singleSimple" action="/gunshiApp/tsg/SzRegulatoryFramework/file/upload/singleSimple"
onChange={fileChange} onChange={fileChange}
onDrop={(info) => { console.log(info.dataTransfer.files); }} onDrop={(info) => { console.log(info.dataTransfer.files); }}
fileList={fileList} fileList={fileList}
@ -196,7 +191,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
fileList.length > 0 && fileList.map(file => { fileList.length > 0 && fileList.map(file => {
return ( return (
<Col span={12}> <Col span={12}>
<div className="file-item" style={{ width: "75%" }}> <div className="file-item" style={{ width: "75%",marginTop:5 }}>
<div className='file-description'> <div className='file-description'>
{file.name.indexOf('.docx') > -1 ? {file.name.indexOf('.docx') > -1 ?
<div <div
@ -252,7 +247,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
mode === 'view' ? null : ( mode === 'view' ? null : (
<> <>
<Form.Item {...btnItemLayout}> <Form.Item {...btnItemLayout}>
<Button type="primary" htmlType="submit"> <Button type="primary" htmlType="submit" loading={loading}>
{mode === 'save' ? '提交' : '修改'} {mode === 'save' ? '提交' : '修改'}
</Button> </Button>
</Form.Item> </Form.Item>

View File

@ -11,6 +11,7 @@ import { createCrudService } from '../../../components/crud/_';
import { CrudOpRender_text } from '../../../components/crud/CrudOpRender'; import { CrudOpRender_text } from '../../../components/crud/CrudOpRender';
const url = "http://223.75.53.141:9102/test.by-lyf.tmp" const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
const obj={0:"党支部工作制度",1:"行政工作制度",2:"部门工作制度",3:"安全管理制度",4:"工程管理制度",5:"技术规程",6:"岗位责任制"}
const Page = () => { const Page = () => {
const role = useSelector(state => state.auth.role); const role = useSelector(state => state.auth.role);
const editBtn = role?.rule?.find(item => item.menuName == "编辑"); const editBtn = role?.rule?.find(item => item.menuName == "编辑");
@ -25,19 +26,19 @@ const Page = () => {
{ title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center" }, { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center" },
{ title: '标题', key: 'name', dataIndex: 'name', width: 250, ellipsis: true }, { title: '标题', key: 'name', dataIndex: 'name', width: 250, ellipsis: true },
{ {
title: '制度类型', key: 'eventsDate', dataIndex: 'eventsDate', width: 140, title: '制度类型', key: 'type', dataIndex: 'type', width: 140,render:(v)=><>{obj[v]}</>
}, },
{ {
title: '发布日期', key: 'eventsDesc', dataIndex: 'eventsDesc', width: 300 title: '发布日期', key: 'releaseDate', dataIndex: 'releaseDate', width: 300
}, },
{ {
title: '发布单位', key: 'eventsDesc', dataIndex: 'eventsDesc', width: 300 title: '发布单位', key: 'fillUnit', dataIndex: 'fillUnit', width: 300
}, },
{ {
title: '上传时间', key: 'eventsDesc', dataIndex: 'eventsDesc', width: 300 title: '上传时间', key: 'uploadDate', dataIndex: 'uploadDate', width: 300
}, },
{ {
title: '附件', key: 'fileName', dataIndex: 'fileName', width: 300,render:(v,r)=><a onClick={()=>viewPdf(r.fileId)}>{v}</a> title: '附件', key: 'files', dataIndex: 'files', width: 300,render:(v,r)=><a onClick={()=>viewPdf(v[0].fileId)}>{v[0]?.fileName}</a>
}, },
{ {
title: '操作', key: 'operation', width: 240, fixed: 'right', align: 'center', title: '操作', key: 'operation', width: 240, fixed: 'right', align: 'center',
@ -45,7 +46,7 @@ const Page = () => {
<CrudOpRender_text <CrudOpRender_text
edit={true} edit={true}
del={true} del={true}
view={true} // view={true}
command={(cmd) => () => command(cmd)(row)} />) command={(cmd) => () => command(cmd)(row)} />)
}, },
]; ];
@ -61,12 +62,12 @@ const Page = () => {
} else if (type === 'view') { } else if (type === 'view') {
refModal.current.showView(params); refModal.current.showView(params);
} else if (type === 'del') { } else if (type === 'del') {
refModal.current.onDeleteGet(apiurl.rcgl.gcdsj.delete + `/${params.id}`); refModal.current.onDeleteGet(apiurl.zdgl.del + `/${params.id}`);
} }
} }
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.rcgl.gcdsj.page).find_noCode); const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.zdgl.list).find_noCode);
/** /**
* @description 处理成功的回调 * @description 处理成功的回调
@ -133,7 +134,7 @@ const Page = () => {
border: 0, border: 0,
marginTop: 20, marginTop: 20,
}} }}
src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/xyt/projectEvents/file/download/${iframeSrc}`)}`} src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/tsg/projectEvents/file/download/${iframeSrc}`)}`}
/> />
</Modal> </Modal>
</> </>

View File

@ -22,12 +22,13 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role }) => {
} }
const opntios = [ const opntios = [
{ label: '宪法', value: '宪法' }, {value:0,label:'党支部工作制度'},
{ label: '法律', value: '法律' }, {value:1,label:'行政工作制度'},
{ label: '行政法规', value: '行政法规' }, {value:2,label:'部门工作制度'},
{ label: '督察法规', value: '督察法规' }, {value:3,label:'安全管理制度'},
{ label: '司法解释', value: '司法解释' }, {value:4,label:'工程管理制度'},
{ label: '地方性法规', value: '地方性法规' }, {value:5,label:'技术规程'},
{value:6,label:'岗位责任制'}
] ]
const styles = { const styles = {
fontFamily: '微软雅黑 Bold", "微软雅黑 Regular", 微软雅黑, sans-serif', fontFamily: '微软雅黑 Bold", "微软雅黑 Regular", 微软雅黑, sans-serif',
@ -42,13 +43,13 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role }) => {
<Form.Item label="标题" name="name"> <Form.Item label="标题" name="name">
<Input allowClear style={{ width: '150px' }} /> <Input allowClear style={{ width: '150px' }} />
</Form.Item> </Form.Item>
<Form.Item label="制度类型" name="name"> <Form.Item label="制度类型" name="type">
<Select allowClear style={{ width: '150px' }} options={opntios} /> <Select allowClear style={{ width: '150px' }} options={opntios} />
</Form.Item> </Form.Item>
<Form.Item label="发布日期" name="name"> <Form.Item label="发布日期" name="releaseDate">
<RangePicker allowClear /> <RangePicker allowClear />
</Form.Item> </Form.Item>
<Form.Item label="发布单位" name="name"> <Form.Item label="发布单位" name="fillUnit">
<Input allowClear style={{ width: '150px' }} /> <Input allowClear style={{ width: '150px' }} />
</Form.Item> </Form.Item>
<Form.Item> <Form.Item>

View File

@ -27,13 +27,12 @@ const ModalForm = ({ mode, record, onEdit, onSave }) => {
}, },
] ]
const onFinish = (values) => { const onFinish = (values) => {
if (mode === 'edit') { if (mode === 'edit') {
values.id = record.id values.id = record.id
onEdit(apiurl.fxzb.sxfd.fxtj.edit, values) onEdit(apiurl.zrrgl.edit, values)
} }
if (mode === 'save') { if (mode === 'save') {
onSave(apiurl.fxzb.sxfd.fxtj.save, values) onSave(apiurl.zrrgl.save, values)
} }
} }
@ -45,7 +44,7 @@ const ModalForm = ({ mode, record, onEdit, onSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="责任类型" label="责任类型"
name="title" name="type"
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<NormalSelect allowClear style={{ width: '100%' }} options={types} /> <NormalSelect allowClear style={{ width: '100%' }} options={types} />
@ -54,7 +53,7 @@ const ModalForm = ({ mode, record, onEdit, onSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="姓名" label="姓名"
name="period" name="name"
rules={[{ required: true }]} rules={[{ required: true }]}
> >
<Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear /> <Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear />
@ -65,7 +64,7 @@ const ModalForm = ({ mode, record, onEdit, onSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="单位" label="单位"
name="org" name="unit"
> >
<Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear /> <Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear />
</Form.Item> </Form.Item>
@ -73,7 +72,7 @@ const ModalForm = ({ mode, record, onEdit, onSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="职务" label="职务"
name="tmPred" name="duty"
> >
<Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear /> <Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear />
</Form.Item> </Form.Item>
@ -83,7 +82,7 @@ const ModalForm = ({ mode, record, onEdit, onSave }) => {
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
label="联系方式" label="联系方式"
name="tmPred" name="contactInfo"
> >
<Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear /> <Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear />
</Form.Item> </Form.Item>
@ -92,8 +91,8 @@ const ModalForm = ({ mode, record, onEdit, onSave }) => {
<Row> <Row>
<Col span={24}> <Col span={24}>
<Form.Item <Form.Item
label="接收时间" label="主要职责"
name="tmRecv" name="dutyBound"
labelCol={{ span: 3 }} labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }} wrapperCol={{ span: 19 }}

View File

@ -24,14 +24,14 @@ const Page = () => {
const columns = [ const columns = [
{ title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center" }, { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center" },
{ {
title: '责任类型', key: 'title', dataIndex: 'title', width: 200, title: '责任类型', key: 'type', dataIndex: 'type', width: 200,
render: (value) => <span>{types[value]}</span> render: (value) => <span>{types[value]}</span>
}, },
{ title: '姓名', key: 'period', dataIndex: 'period', width: 140 }, { title: '姓名', key: 'name', dataIndex: 'name', width: 140 },
{ title: '单位', key: 'org', dataIndex: 'org', width: 200}, { title: '单位', key: 'unit', dataIndex: 'unit', width: 200},
{ title: '职务', key: 'tmPred', dataIndex: 'tmPred', width: 150, }, { title: '职务', key: 'duty', dataIndex: 'duty', width: 150, },
{ title: '联系方式', key: 'tmRecv', dataIndex: 'tmRecv', width: 150, }, { title: '联系方式', key: 'contactInfo', dataIndex: 'contactInfo', width: 150, },
{ title: '主要职责', key: 'tmRecv', dataIndex: 'tmRecv', width: 250,ellipsis: true}, { title: '主要职责', key: 'dutyBound', dataIndex: 'dutyBound', width: 250,ellipsis: true},
{ {
title: '操作', key: 'operation', width: 150, fixed: 'right',align: 'center', title: '操作', key: 'operation', width: 150, fixed: 'right',align: 'center',
render: (value, row, index) => (<CrudOpRender_text edit={true} del={true} command={(cmd) => () => command(cmd)(row)} />) render: (value, row, index) => (<CrudOpRender_text edit={true} del={true} command={(cmd) => () => command(cmd)(row)} />)
@ -48,19 +48,17 @@ const Page = () => {
} else if (type === 'view') { } else if (type === 'view') {
refModal.current.showView(params); refModal.current.showView(params);
} else if (type === 'del') { } else if (type === 'del') {
refModal.current.onDeleteGet(apiurl.fxzb.sxfd.fxtj.del + params.id); refModal.current.onDeleteGet(apiurl.zrrgl.delete + `/${params.id}`);
} }
} }
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.hsyb.skhs.page).find_noCode); const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.zrrgl.page).find_noCode);
useEffect(() => { useEffect(() => {
if (searchVal) { if (searchVal) {
const params = { const params = {
search: { search: {
title: searchVal.title || undefined, ...searchVal
dateTimeRangeSo: searchVal.dateTimeRangeSo || undefined,
tp:2
} }
}; };
console.log(searchVal); console.log(searchVal);
@ -85,7 +83,7 @@ const Page = () => {
ref={refModal} ref={refModal}
title="" title=""
component={ModalForm} component={ModalForm}
// onCrudSuccess={() => { refresh({ addvcd: localStorage.getItem('ADCD6') }) }} onCrudSuccess={refresh}
/> />
</div> </div>
</> </>

View File

@ -48,13 +48,13 @@ const ToolBar = ({ setSearchVal, onSave }) => {
<> <>
<div style={{ display: 'flex', justifyContent: 'space-between' }}> <div style={{ display: 'flex', justifyContent: 'space-between' }}>
<Form form={form} className='toolbarBox' layout="inline" onFinish={onFinish}> <Form form={form} className='toolbarBox' layout="inline" onFinish={onFinish}>
<Form.Item label="责任类型" name="title"> <Form.Item label="责任类型" name="type">
<NormalSelect allowClear style={{ width: '150px' }} options={types} /> <NormalSelect allowClear style={{ width: '150px' }} options={types} />
</Form.Item> </Form.Item>
<Form.Item label="姓名" name="title"> <Form.Item label="姓名" name="name">
<Input allowClear style={{ width: '150px' }} /> <Input allowClear style={{ width: '150px' }} />
</Form.Item> </Form.Item>
<Form.Item label="联系方式" name="title"> <Form.Item label="联系方式" name="contactInfo">
<Input allowClear style={{ width: '150px' }} /> <Input allowClear style={{ width: '150px' }} />
</Form.Item> </Form.Item>
<Form.Item> <Form.Item>

View File

@ -1,137 +1,210 @@
const getBackground = () => {
return {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: '#ffffff' // 0% 处的颜色
}, {
offset: 0.5, color: 'blue' // 100% 处的颜色
}, {
offset: 1, color: '#ffffff' // 100% 处的颜色
}],
global: false // 缺省为 false
}
}
const data = {
name: '销售部',
children: [{
name: '销售一部',
children: [{
name: '任务名称1',
itemStyle: { color: "#ff9800" },
},
{
name: '任务名称2',
itemStyle: { color: "#4d8dd9" },
},
{
name: '任务名称3',
itemStyle: { color: "#22b07b" },
},
{
name: '任务名称4'
},
{
name: '任务名称5'
},
{
name: '任务名称6'
},
{
name: '任务名称7'
},
{
name: '任务名称8'
}
]
},
{
name: '销售二部',
},
{
name: '销售三部',
children: [{
name: '任务3-1'
},
{
name: '任务3-2'
}
]
},
{
name: '销售四部',
children: [{
name: '任务4-1'
},
{
name: '任务4-2'
}
]
}
]
}
export default function jgOption() { export default function jgOption() {
return { return {
tooltip: { tooltip: {
trigger: "item", trigger: 'item',
triggerOn: "mousemove", triggerOn: 'mousemove'
color: "#fff",
backgroundColor: "skyblue",
borderColor: "skyblue",
}, },
animationDurationUpdate: 1500, series: [{
animationEasingUpdate: "quinticInOut", type: 'tree',
series: [ id: 0,
{ name: 'tree1',
type: "tree", data: [data],
symbolSize: 75, top: '10%',
symbol: "roundRect", left: '10%',
edgeShape: "polyline", bottom: '20%',
edgeForkPosition: "50%", right: '10%',
edgeSymbol: ["circle", "arrow"], avoidLabelOverlap: true,//防止标签重叠
edgeSymbolSize: [4, 10], roam: true, //移动+缩放 'scale' 或 'zoom':只能够缩放。 'move' 或 'pan':只能够平移。
edgeLabel: { scaleLimit:{ //缩放比例
normal: { min:0.7,//最小的缩放值
textStyle: { max:4,//最大的缩放值
fontSize: 18,
}, },
layout: 'orthogonal',//树图布局orthogonal水平垂直方向radial径向布局 是指以根节点为圆心,每一层节点为环,一层层向外
orient: 'TB', //树形方向 TB为上下结构 LR为左右结构
// nodePadding: 100,//结点间距 (发现没用)
//layerPadding: 30,//连接线长度 (发现没用)
symbol: 'circle', //图形形状 rect方形 roundRect圆角 emptyCircle圆形 circle实心圆
symbolSize: 14, //状态大小
edgeShape: 'polyline', //线条类型 curve曲线
initialTreeDepth: 1, //初始展开的层级
expandAndCollapse: true,//子树折叠和展开的交互,默认打开
lineStyle: {//结构线条样式
width: 0.7,
color: '#1E9FFF',
type: 'broken'
}, },
label: {
// 每个节点对应的文本标签样式
show: true, // 是否显示标签
distance: 8, // 文本距离图形元素的距离
position: ['50%', '50%'], // 标签位置
verticalAlign: 'middle', // 文字垂直对齐方式默认自动topmiddlebottom
align: 'center', // 文字水平对齐方式默认自动leftrightcenter
fontSize: 16, // 字体大小
color: '#333', // 字体颜色
// color: 'red', // 字体颜色
backgroundColor: '#F8F9FA', // 文字块的背景颜色
borderColor: '#CED4DA', // 文字块边框颜色
borderWidth: 1, // 文字块边框宽度
borderType: 'solid', // 文字块边框描边类型 solid dashed dotted
borderRadius: 2, // 文字块的圆角
padding: [6, 6], // 文字块内边距
shadowColor: 'rgba(0,121,221,0.3)', // 文字块的背景阴影颜色
shadowBlur: 6, // 文字块的背景阴影长度
formatter: (params) => {
let newName = ''
let len = params.data.name.length
let strLen = params.data.relationType === 0 ? 100 : 1 //一行显示几个字
let rowNum = Math.ceil(len / strLen)
if (len > strLen) {
for (let p = 0; p < rowNum; p++) {
let tempStr = ''
let start = p * strLen
let end = start + strLen
if (p == rowNum - 1) {
tempStr = params.data.name.substring(start, len)
} else {
tempStr = params.data.name.substring(start, end) + '\n'
}
newName += tempStr
}
} else {
newName = params.data.name
}
let n = newName
if (n.length > 16) {
n = n.slice(0, 16) + '...'
}
let str = `{name|${n}}`
let isMain = params.data.relationType === 0
str = isMain ? `{name|${n}} {current|本企业} {main|总部}` : str
return str
}, },
initialTreeDepth: 2, rich: {
orient: "vertical", name: {
fontSize: 14
itemStyle: {
color: "#FFC125",
borderColor: "#FFC125",
}, },
roam: true, // 可移动,可缩放 current: {
expandAndCollapse: true, fontSize: 12,
padding: 0,
color: '#07CA42',
fontWeight: 600,
backgroundColor: '#E5F7EA',
borderRadius: 2
},
main: {
color: '#0780ED',
fontSize: 12,
padding: 0,
fontWeight: 600,
backgroundColor: '#E6F2FD',
borderRadius: 2
}
}
},
leaves: { //叶子节点文本样式
label: {
//backgroundColor: '#81c5f7',
backgroundColor: '#fff',
color:'#333',
position: 'bottom',
rotate: 0,//标签旋转。
verticalAlign: 'middle',
align: 'center',
//文本框内文字超过6个字折行
/* formatter: function(val) {
let strs = val.name.split(''); //字符串数组
let str = ''
for(let i = 0, s; s = strs[i++];) { //遍历字符串数组
str += s;
if(!(i % 6)) str += '\n'; //按需要求余,目前是一个字换一行
}
return str
}, */
//或者
overflow:'break',//break为文字折行 truncate为文字超出部分省略号显示
lineOverflow:'truncate',//文字超出高度后 直接截取
}
},
expandAndCollapse: true, //默认展开树形结构
animationDuration: 550, animationDuration: 550,
animationDurationUpdate: 750, animationDurationUpdate: 750
//线条的颜色 }]
lineStyle: {
normal: {
opacity: 0.9,
color: "#93beff",
// type: "dashed",
width: 2,
},
},
label: {
show: true,
position: "inside",
textStyle: {
fontSize: 15,
color: "#fff",
},
},
leaves: {
label: {
position: "inside",
color: "#fff",
},
itemStyle: {
color: "#dfdfdf",
borderColor: "#dfdfdf",
},
},
data: [
{
name: "根节点",
url: "",
// 根节点样式设置
itemStyle: {
color: "#18a849",
borderColor: "#18a849",
},
children: [
{
name: "子节点1",
children: [
{
name: "叶子节点1",
itemStyle: {
color: "#5470C6",
borderColor: "#5470C6",
},
},
{
name: "叶子节点2",
itemStyle: {
color: "#5470C6",
borderColor: "#5470C6",
},
},
{
name: "叶子节点3",
itemStyle: {
color: "#5470C6",
borderColor: "#5470C6",
},
},
],
},
{
name: "子节点2",
children: [
{
name: "叶子节点4",
itemStyle: {
color: "#5470C6",
borderColor: "#5470C6",
},
},
{
name: "叶子节点5",
itemStyle: {
color: "#5470C6",
borderColor: "#5470C6",
},
},
{
name: "叶子节点6",
itemStyle: {
color: "#5470C6",
borderColor: "#5470C6",
},
},
],
},
],
},
],
},
],
}; };
} }