提交 9c9d35e1 authored 作者: liuluyu's avatar liuluyu

更新tb6字段

上级 69ccea72
......@@ -26,938 +26,1023 @@ interface VxeColumn {
export const tableFormData = [
{
serialNumber: "1",
project: "网络安全责任制建立情况",
code: 'TB608',
content: [
{ type: "text", value: "建立并落实网络安全工作责任制" },
{ type: "radio-group", field: "C23A001", options: ["是", "否"] },
{ type: "br" },
{ type: "text", value: "网络安全第一责任人" },
{ type: "text", value: "姓名" },
{ type: "input", value: "", field: "C23A002" },
{ type: "text", value: "职务" },
{ type: "input", value: "", field: "C23A003" },
{ type: "br" },
{ type: "text", value: "网络安全直接责任人" },
{ type: "text", value: "姓名" },
{ type: "input", value: "", field: "C23A004" },
{ type: "text", value: "职务" },
{ type: "input", value: "", field: "C23A005" }
],
remarks: { field: "C23A006" }
},
{
serialNumber: "2",
project: "信息安全管理",
serialNumber: '1',
project: '信息安全管理',
code: 'TB601',
content: [
{ type: "text", value: "<strong>安全管理制度建设</strong>" },
{ type: "br" },
{ type: "text", value: "(1)正式发布信息安全总体方针和安全策略" },
{ type: "radio-group", field: "COL1", options: ["是", "否"] },
{ type: "br" },
{ type: "text", value: "(2)正式发布信息安全管理制度" },
{ type: "radio-group", field: "COL2", options: ["是", "否"] },
{ type: "brspace" },
{ type: "text", value: "已发布的信息安全管理制度涵盖" },
{ type: "br" },
{
type: "checkbox-group",
field: "COL3",
{ type: 'text', value: '<strong>网络安全责任制建立情况</strong>' },
{ type: 'br' },
{ type: 'text', value: '建立并落实网络安全工作责任制' },
{ type: 'radio-group', field: 'C23A001', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '网络安全第一责任人:' },
{ type: 'text', value: '姓名' },
{ type: 'input', value: '', field: 'C23A002' },
{ type: 'text', value: '职务' },
{ type: 'input', value: '', field: 'C23A003' },
{ type: 'br' },
{ type: 'text', value: '网络安全直接责任人' },
{ type: 'text', value: '姓名' },
{ type: 'input', value: '', field: 'C23A004' },
{ type: 'text', value: '职务' },
{ type: 'input', value: '', field: 'C23A005' },
{ type: 'br' },
{ type: 'text', value: '<strong>安全管理制度建设</strong>' },
{ type: 'br' },
{ type: 'text', value: '(1)正式发布信息安全总体方针和安全策略,明确本机构信息安全总体目标、范围、原则和策略:' },
{ type: 'radio-group', field: 'COL1', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '(2)正式发布信息安全管理制度' },
{ type: 'radio-group', field: 'COL2', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '已发布的信息安全管理制度涵盖' },
{ type: 'br' },
{
type: 'checkbox-group',
field: 'COL3',
options: [
"构成、办公区或移动设备管理",
"人员录用、离岗、培训、外勤人员访问等人员安全管理",
"系统开发和建设安全管理",
"网络、主机、应用等连续安全管理",
"数据安全管理",
"终端、介质等安全管理",
"安全事件处置及应急预案管理",
'机房、办公区域等物理安全管理',
'人员录用、离岗、培训、外部人员访问等人员安全管理',
'系统开发和建设安全管理',
'网络、主机、应用等运维安全管理',
'数据安全管理',
'终端、介质等安全管理',
'安全事件处置及应急预案管理',
],
otherOption:true,
otherField:"COL4",
},
{ type: "br" },
{ type: "text", value: "(3)建立信息安全管理制度定期评价及修订完善要求" },
{ type: "radio-group", field: "COL5", options: ["是", "否"] },
{ type: "brspace" },
{ type: "text", value: "本年度新增或修订信息安全管理制度" },
{ type: "radio-group", field: "COL6", options: ["是", "否"] },
{ type: "br" },
{ type: "text", value: "<strong>信息安全培训</strong>" },
{ type: "br" },
{ type: "text", value: "(1)本年度开展的信息安全培训次数" },
{ type: "number", value: "", field: "COL8" },
{ type: "text", value: "次,参加人次" },
{ type: "number", value: "", field: "COL9" },
{ type: "text", value: "人次" },
{ type: "brspace" },
{ type: "text", value: "其中,全辖范围的信息安全培训次数" },
{ type: "number", value: "", field: "COL10" },
{ type: "text", value: "次,参加人次" },
{ type: "number", value: "", field: "COL11" },
{ type: "text", value: "人次" },
{ type: "br" },
{ type: "text", value: "(2)本年度信息安全培训正式员工参与率" },
{ type: "number", value: "", unit: "%", field: "COL12" },
{ type: "brspace" },
{ type: "text", value: "本年度信息安全培训正式员工考核通过率" },
{ type: "number", value: "", unit: "%", field: "COL13" },
{ type: "br" },
{ type: "text", value: "<strong>信息安全检查</strong>" },
{ type: "br" },
{ type: "text", value: "(1)本年度信息安全检查总数" },
{ type: "number", value: "", field: "COL15" },
{ type: "text", value: "次" },
{ type: "brspace" },
{ type: "text", value: "总行(或总公司)组织的信息安全检查覆盖一级分支机构的比率" },
{ type: "number", value: "", unit: "%", field: "COL16" },
{ type: "br" },
{ type: "text", value: "(2)本年度开展渗透测试" },
{ type: "radio-group", field: "A20", options: ["是", "否"] },
{ type: "brspace" },
{ type: "text", value: "如是,渗透测试开展方式" },
{
type: "checkbox-group",
field: "COL17",
options: [ "内部人员自行测试","聘请外部专业机构测试"],
otherOption:true,
otherField:"COL18"
},
{ type: "br" },
{ type: "text", value: "(3)本年度按照等级保护有关要求将新上线重要信息系统向公安部门备案" },
{ type: "br" },
{
type: "radio-group",
field: "COL19",
options: [
"已备案",
"无新上线重要信息系统",
"上线但未备案"
]
},
{ type: "brspace" },
{ type: "text", value: "本年度对三级及以上级别信息系统开展等级保护测评" },
{
type: "radio-group-extraFields",
field: "COL20",
otherOption: true,
otherField: 'COL4',
},
{ type: 'br' },
{ type: 'text', value: '(3)建立信息安全管理制度定期评价及修订完善要求' },
{ type: 'radio-group', field: 'COL5', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '本年度新增或修订信息安全管理制度' },
{ type: 'radio-group', field: 'COL6', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '<strong>信息安全培训</strong>' },
{ type: 'br' },
{ type: 'text', value: '(1)本年度开展的信息安全培训次数' },
{ type: 'number', value: '', field: 'COL8' },
{ type: 'text', value: '次,参加人次' },
{ type: 'number', value: '', field: 'COL9' },
{ type: 'text', value: '人次' },
{ type: 'brspace' },
{ type: 'text', value: '其中,全辖范围的信息安全培训次数' },
{ type: 'number', value: '', field: 'COL10' },
{ type: 'text', value: '次,参加人次' },
{ type: 'number', value: '', field: 'COL11' },
{ type: 'text', value: '人次' },
{ type: 'br' },
{ type: 'text', value: '(2)本年度信息安全培训正式员工参与率' },
{ type: 'number', value: '', unit: '%', field: 'COL12' },
{ type: 'brspace' },
{ type: 'text', value: '本年度信息安全培训正式员工考核通过率' },
{ type: 'number', value: '', unit: '%', field: 'COL13' },
{ type: 'br' },
{ type: 'text', value: '<strong>信息安全检查</strong>' },
{ type: 'br' },
{ type: 'text', value: '(1)本年度信息安全检查总数' },
{ type: 'number', value: '', field: 'COL15' },
{ type: 'text', value: '次' },
{ type: 'brspace' },
{ type: 'text', value: '其中,总行(或总公司)组织的信息安全检查覆盖一级分支机构的比率' },
{ type: 'number', value: '', unit: '%', field: 'COL16' },
{ type: 'br' },
{ type: 'text', value: '(2)本年度开展渗透测试' },
{ type: 'radio-group', field: 'A20', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '如是,渗透测试开展方式' },
{
type: 'checkbox-group',
field: 'COL17',
options: ['内部人员自行测试', '聘请外部专业机构测试'],
otherOption: true,
otherField: 'COL18',
},
{ type: 'br' },
{ type: 'text', value: '(3)本年度按照等级保护有关要求将新上线重要信息系统向公安部门备案' },
{ type: 'br' },
{
type: 'radio-group',
field: 'COL19',
options: ['已备案', '无新上线重要信息系统', '上线但未备案'],
},
{ type: 'brspace' },
{ type: 'text', value: '本年度对三级及以上级别信息系统开展等级保护测评:' },
{
type: 'radio-group-extraFields',
field: 'COL20',
options: [
{ label: "是", value: "是", extraFields: [
{ label: "测评系统", field: "COL21" },
{ label: "安全建设整改", field: "COL22" }
]},
{ label: "否", value: "否" }
]
},
{ type: "br" },
{
serialNumber: "1003",
code:"TB60101",
type:"MultiColumnTable",
project: "信息安全检查明细",
{
label: '是',
value: '是',
extraFields: [
{ label: '测评系统', field: 'COL21', formType: 'number', unit: '个,' },
{ label: '安全建设整改', field: 'COL22', formType: 'number', unit: '个' },
],
},
{ label: '否', value: '否' },
],
},
{ type: 'br' },
{
serialNumber: '1003',
code: 'TB60101',
type: 'MultiColumnTable',
project: '信息安全检查明细',
content: [
{ name: "检查名称",formType:'input',field:"COL24" },
{ name: "检查形式",formType:'checkbox-group',field:"COL25",options: ["安全自查", "渗透测试",'等级保护测评','其他'] },
{ name: "检查日期起",formType:"date", field: "COL26" },
{ name: "检查日期止",formType:"date",field: "COL193" },
{ name: "实施部门",formType:"input",field: "COL27" },
{ name: "目标、范围和主要内容",formType:"input",field: "COL28" },
{ name: "发现问题数量(个)",formType: "number",field: "COL29"},
{ name: "已整改问题数量(个)",formType:'number',field:"COL30"},
{ name: "问题整改率(%)",formType:"number",field: "COL31" },
{ name: "备注",formType:"input",field: "COL32" },
{ name: '检查名称', formType: 'input', field: 'COL24' },
{ name: '检查形式', formType: 'checkbox-group', field: 'COL25', options: ['安全自查', '渗透测试', '等级保护测评', '其他'] },
{ name: '检查日期起', formType: 'date', field: 'COL26' },
{ name: '检查日期止', formType: 'date', field: 'COL193' },
{ name: '实施部门', formType: 'input', field: 'COL27' },
{ name: '目标、范围和主要内容', formType: 'input', field: 'COL28' },
{ name: '发现问题数量(个)', formType: 'number', field: 'COL29' },
{ name: '已整改问题数量(个)', formType: 'number', field: 'COL30' },
{ name: '问题整改率(%)', formType: 'number', field: 'COL31' },
{ name: '备注', formType: 'input', field: 'COL32' },
],
data: [{}]
},
{ type: "brspace" },
{ type: "text", value: "合计" },
{ type: "text", value: "发现问题数量" },
{ type: "number", value: "", field: "COL33" },
{ type: "text", value: "个,已整改问题数量" },
{ type: "number", value: "", field: "COL34" },
{ type: "text", value: "个,问题整改率" },
{ type: "number", value: "", unit: "%", field: "COL35" },
{ type: "br" }, { type: "br" },
{ type: "text", value: "<strong>重大网络和信息安全事件管理</strong>" },
{ type: "br" },
{ type: "text", value: "(1)本年度生产系统发生的重大网络和信息安全事件数量共计" },
{ type: "number", value: "", field: "COL37" },
{ type: "text", value: "次" },
{ type: "brspace" },
{
serialNumber: "2001",
project: "具体事件包括",
code:"TB601",
type:"AttachTable",
content:[
{
field: 'col1',title: '事件名称', width:'20%',
},{
field: 'col2',title: '攻击次数', width:'20%',slots: { default: 'form_default' },
},{
field: 'col3',title: '影响范围',slots: { default: 'form_default' },
data: [{}],
},
{ type: 'brspace' },
{ type: 'text', value: '合计' },
{ type: 'text', value: '发现问题数量' },
{ type: 'number', value: '', field: 'COL33' },
{ type: 'text', value: '个,已整改问题数量' },
{ type: 'number', value: '', field: 'COL34' },
{ type: 'text', value: '个,问题整改率' },
{ type: 'number', value: '', unit: '%', field: 'COL35' },
{ type: 'br' },
{ type: 'br' },
{ type: 'text', value: '<strong>重大网络和信息安全事件管理</strong>' },
{ type: 'br' },
{ type: 'text', value: '(1)本年度生产系统发生的重大网络和信息安全事件数量共计' },
{ type: 'number', value: '', field: 'COL37' },
{ type: 'text', value: '次' },
{ type: 'brspace' },
{
serialNumber: '2001',
project: '具体事件包括',
code: 'TB601',
type: 'AttachTable',
content: [
{
field: 'col1',
title: '事件名称',
width: '20%',
},
{
field: 'col2',
title: '攻击次数',
width: '20%',
slots: { default: 'form_default' },
},
{
field: 'col3',
title: '影响范围',
slots: { default: 'form_default' },
},
],
datas: [
{
col1: "拒绝服务攻击",
col2:{ formType:'number',field: "COL39"},
col3:{ formType:'input',field: "COL40"},
{
col1: '拒绝服务攻击',
col2: { formType: 'number', field: 'COL39' },
col3: { formType: 'input', field: 'COL40' },
},
{
col1: "病毒蠕虫感染",
col2:{ formType:'number',field: "COL41"},
col3:{ formType:'input',field: "COL42"},
{
col1: '病毒蠕虫感染',
col2: { formType: 'number', field: 'COL41' },
col3: { formType: 'input', field: 'COL42' },
},
{
col1: "系统漏洞入侵",
col2:{ formType:'number',field: "COL43"},
col3:{ formType:'input',field: "COL44"},
{
col1: '系统漏洞入侵',
col2: { formType: 'number', field: 'COL43' },
col3: { formType: 'input', field: 'COL44' },
},
{
col1: "应用设计缺陷利用",
col2:{ formType:'number',field: "COL45"},
col3:{ formType:'input',field: "COL46"},
{
col1: '应用设计缺陷利用',
col2: { formType: 'number', field: 'COL45' },
col3: { formType: 'input', field: 'COL46' },
},
{
col1: "数据的窃取或篡改",
col2:{ formType:'number',field: "COL47"},
col3:{ formType:'input',field: "COL48"},
{
col1: '数据的窃取或篡改',
col2: { formType: 'number', field: 'COL47' },
col3: { formType: 'input', field: 'COL48' },
},
{
col1: "社会工程",
col2:{ formType:'number',field: "COL49"},
col3:{ formType:'input',field: "COL50"},
{
col1: '社会工程',
col2: { formType: 'number', field: 'COL49' },
col3: { formType: 'input', field: 'COL50' },
},
{
col1: "其他",
col2:{ formType:'number',field: "COL51"},
col3:{ formType:'input',field: "COL52"},
{
col1: '其他',
col2: { formType: 'number', field: 'COL51' },
col3: { formType: 'input', field: 'COL52' },
},
],
},
{ type: "br" },
{ type: "text", value: "(2)本年度纳入案件的网络和信息安全事件" },
{ type: "brspace" },
{ type: "text", value: "报案" },
{ type: "number", value: "", field: "C20A001" },
{ type: "text", value: "个,立案" },
{ type: "number", value: "", field: "C20A002" },
{ type: "text", value: "个" },
{ type: "text", value: ",结案" },
{ type: "number", value: "", field: "C20A003" },
{ type: "text", value: "个,正在办理的案件" },
{ type: "number", value: "", field: "C20A004" },
{ type: "text", value: "个" }
{ type: 'br' },
{ type: 'text', value: '(2)本年度纳入案件的网络和信息安全事件' },
{ type: 'brspace' },
{ type: 'text', value: '报案' },
{ type: 'number', value: '', field: 'C20A001' },
{ type: 'text', value: '个,立案' },
{ type: 'number', value: '', field: 'C20A002' },
{ type: 'text', value: '个' },
{ type: 'text', value: ',结案' },
{ type: 'number', value: '', field: 'C20A003' },
{ type: 'text', value: '个,正在办理的案件' },
{ type: 'number', value: '', field: 'C20A004' },
{ type: 'text', value: '个' },
],
},
{
serialNumber: "3",
project: "网络安全",
serialNumber: '2',
project: '网络安全',
code: 'TB602',
content: [
{ type: "text", value: "<strong>网络基本情况</strong>" },
{ type: "br" },
{ type: "text", value: "(1)本机构网络分类" },
{
type: "checkbox-group",
field: "COL54",
options: ["生产网","开发网","测试网","办公网","外网"],
otherOption:true,
otherField:"COL55"
},
{ type: "br" },
{ type: "text", value: "(2)与生产网物理隔离的网络" },
{
type: "checkbox-group",
field: "COL56",
options: [
"开发网","测试网","办公网","外网","国际互联网"
],
otherOption:true,
otherField:"COL57"
},
{ type: "br" },
{ type: "text", value: "(3)与生产网逻辑隔离的网络" },
{
type: "checkbox-group",
field: "COL58",
options: [
"开发网","测试网","办公网","外网","国际互联网",
],
otherOption:true,
otherField:"COL59"
},
{ type: "br" },
{ type: "br" },
{ type: "text", value: "<strong>生产网、内部网网络安全域划分情况</strong>" },
{
serialNumber: "2001",
code:"TB60201",
type:"MultiColumnTable",
project: "生产网、内部网网络安全域划分",
{ type: 'text', value: '<strong>网络基本情况</strong>' },
{ type: 'br' },
{ type: 'text', value: '(1)本机构网络分类' },
{
type: 'checkbox-group',
field: 'COL54',
options: ['生产网', '开发网', '测试网', '办公网', '外网(访问国际互联网的局域网)'],
otherOption: true,
otherField: 'COL55',
},
{ type: 'br' },
{ type: 'text', value: '(2)与生产网物理隔离的网络' },
{
type: 'checkbox-group',
field: 'COL56',
options: ['开发网', '测试网', '办公网', '外网', '国际互联网'],
otherOption: true,
otherField: 'COL57',
},
{ type: 'br' },
{ type: 'text', value: '(3)与生产网逻辑隔离的网络' },
{
type: 'checkbox-group',
field: 'COL58',
options: ['开发网', '测试网', '办公网', '外网', '国际互联网'],
otherOption: true,
otherField: 'COL59',
},
{ type: 'br' },
{ type: 'br' },
{ type: 'text', value: '<strong>生产网、内部网网络安全域划分情况</strong>' },
{
serialNumber: '2001',
code: 'TB60201',
type: 'MultiColumnTable',
project: '生产网、内部网网络安全域划分',
content: [
{ name: "区域名称",formType:'input',field:"COL24" },
{ name: "用途及包含的重要信息系统",formType:'input',field:"COL25" },
{ name: "可访问哪些网络安全域",formType:"input", field: "COL26" },
{ name: "可被哪些网络安全域访问",formType:"input",field: "COL27" },
{ name: "隔离及防护措施",formType:'checkbox-group',field:"COL28",
options: ["防火墙","入侵防御系统(IPS)","入侵检测系统(IDS)","访问控制列表(ACL)","虚拟局域网(VLAN)","其他"]
{ name: '区域名称', formType: 'input', field: 'COL61' },
{ name: '用途及包含的重要信息系统', formType: 'input', field: 'COL62' },
{ name: '可访问哪些网络安全域', formType: 'input', field: 'COL63' },
{ name: '可被哪些网络安全域访问', formType: 'input', field: 'COL64' },
{
name: '隔离及防护措施',
formType: 'checkbox-group',
field: 'COL65',
options: ['防火墙', '入侵防御系统(IPS)', '入侵检测系统(IDS)', '访问控制列表(ACL)', '虚拟局域网(VLAN)', '其他'],
otherOption: true,
otherField: 'COL66',
},
{
name: '远程管理方式',
formType: 'checkbox-group',
field: 'COL67',
options: ['因特网', '局域网', 'VPN', '无线网络', '电话拨号', '堡垒机', '不允许', '其他'],
otherOption: true,
otherField: 'COL68',
},
{ name: "远程管理方式",formType:'checkbox-group',field:"COL29",options: ["因特网" ,"局域网","VPN","无线网络","电话拨号","堡垒机","不允许","其他"] },
],
data: []
data: [],
},
{ type: "br" },
{ type: "text", value: "<strong>重要网络边界控制</strong>" },
{ type: "br" },
{ type: "text", value: "生产网边界(生产网与内部开发、测试、办公等其他网络之间的边界)" },
{ type: "brspace" },
{
type: "checkbox-group",
field: "COL70",
{ type: 'br' },
{ type: 'text', value: '<strong>重要网络边界控制</strong>' },
{ type: 'br' },
{ type: 'text', value: '生产网边界(生产网与内部开发、测试、办公等其他网络之间的边界)' },
{ type: 'brspace' },
{
type: 'checkbox-group',
field: 'COL70',
options: [
"异构防火墙","热备防火墙","单防火墙","访问控制列表(ACL)","网络加密机","入侵控制系统(IDS)","入侵防御系统(IPS)","恶意代码过滤","安全审计设备"
'异构防火墙',
'热备防火墙',
'单防火墙',
'访问控制列表(ACL)',
'网络加密机',
'入侵控制系统(IDS)',
'入侵防御系统(IPS)',
'恶意代码过滤',
'安全审计设备',
],
otherOption:true,
otherField:"COL71"
otherOption: true,
otherField: 'COL71',
},
{ type: "br" },
{ type: "text", value: "外联网边界(生产网与第三方专用网络的边界)"},
{ type: "brspace" },
{
type: "checkbox-group",
field: "COL72",
{ type: 'br' },
{ type: 'text', value: '外联网边界(生产网与第三方专用网络的边界)' },
{ type: 'brspace' },
{
type: 'checkbox-group',
field: 'COL72',
options: [
"异构防火墙","热备防火墙","单防火墙","访问控制列表(ACL)","网络加密机","IPSec VPN","SSL VPN",
"入侵控制系统(IDS)","入侵防御系统(IPS)","恶意代码过滤","安全审计设备"
'异构防火墙',
'热备防火墙',
'单防火墙',
'访问控制列表(ACL)',
'网络加密机',
'IPSec VPN',
'SSL VPN',
'入侵控制系统(IDS)',
'入侵防御系统(IPS)',
'恶意代码过滤',
'安全审计设备',
],
otherOption:true,
otherField:"COL73"
},
{ type: "br" },
{ type: "text", value: "网上银行(网上保险)边界(网上银行(网上保险)与国际互联网之间的边界):"},
{ type: "brspace" },
{
type: "checkbox-group",
field: "COL74",
otherOption: true,
otherField: 'COL73',
},
{ type: 'br' },
{ type: 'text', value: '网上银行(网上保险)边界(网上银行(网上保险)与国际互联网之间的边界):' },
{ type: 'brspace' },
{
type: 'checkbox-group',
field: 'COL74',
options: [
"异构防火墙","热备防火墙","单防火墙","访问控制列表(ACL)","网络加密机","IPSec VPN","SSL VPN",
"Web应用防护系统","入侵检测系统","入侵防御系统(IPS/UTM","链路负载均衡","DDoS专用防护系统","电信运营商DDoS流量清洗服务",
"入侵控制系统(IDS)","入侵防御系统(IPS)","恶意代码过滤","安全审计设备"
'异构防火墙',
'热备防火墙',
'单防火墙',
'访问控制列表(ACL)',
'网络加密机',
'IPSec VPN',
'SSL VPN',
'Web应用防护系统',
'入侵检测系统',
'入侵防御系统(IPS/UTM)',
'恶意代码过滤',
'链路负载均衡',
'DDoS专用防护系统',
'电信运营商DDoS流量清洗服务',
'安全审计设备',
],
otherOption:true,
otherField:"COL75"
},
{ type: "br" },
{ type: "text", value: "互联网边界(外网与国际互联网之间的边界):"},
{ type: "brspace" },
{
type: "checkbox-group",
field: "COL76",
otherOption: true,
otherField: 'COL75',
},
{ type: 'br' },
{ type: 'text', value: '互联网边界(外网与国际互联网之间的边界):' },
{ type: 'brspace' },
{
type: 'checkbox-group',
field: 'COL76',
options: [
"异构防火墙","热备防火墙","单防火墙","访问控制列表(ACL)","网络加密机","IPSec VPN","SSL VPN",
"Web应用防护系统","入侵检测系统","入侵防御系统(IPS/UTM","链路负载均衡","DDoS专用防护系统","电信运营商DDoS流量清洗服务",
"入侵控制系统(IDS)","入侵防御系统(IPS)","恶意代码过滤","安全审计设备"
'异构防火墙',
'热备防火墙',
'单防火墙',
'访问控制列表(ACL)',
'网络加密机',
'IPSec VPN',
'SSL VPN',
'Web应用防护系统',
'入侵检测系统',
'入侵防御系统(IPS/UTM)',
'恶意代码过滤',
'链路负载均衡',
'DDoS专用防护系统',
'电信运营商DDoS流量清洗服务',
'安全审计设备',
],
otherOption:true,
otherField:"COL77"
},
{ type: "br" }, { type: "br" },
{ type: "text", value: "<strong>网络安全管理</strong>" },
{ type: "br" },
{ type: "text", value: "(1)允许从内部办公网访问国际互联网" },
{
type: "yesno", field: "COL82", extraField:"COL83",extraLabel:'审批部门'
},
{ type: "br" },
{ type: "text", value: "(2)建立终端设备接入网络审批机制" },
{
type: "yesno", field: "COL84"
},
{ type: "br" },
{ type: "text", value: "(3)国际互联网可访问内部网络" },
{
type: "yesno", field: "COL85",extraField:"COL86",extraLabel:'包括的应用系统'
},
{ type: "br" },
{ type: "text", value: "(4)在机构内部使用无线局域网络" },
{
type: "yesno",
field: "COL87",
otherOption: true,
otherField: 'COL77',
},
{ type: 'br' },
{ type: 'br' },
{ type: 'text', value: '<strong>网络安全管理</strong>' },
{ type: 'br' },
{ type: 'text', value: '(1)允许从内部办公网访问国际互联网:' },
{
type: 'radio-group',
field: 'COL82',
options: ['是', '否'],
},
{ type: 'brspace' },
{ type: 'text', value: '如是,审批部门:' },
{ type: 'input', field: 'COL83' },
{ type: 'br' },
{ type: 'text', value: '(2)建立终端设备接入网络审批机制,禁止未经授权的终端设备私自接入内部网络:' },
{
type: 'radio-group',
field: 'COL84',
options: ['是', '否'],
},
{ type: 'br' },
{ type: 'text', value: '(3)国际互联网可访问内部网络:' },
{
type: 'radio-group',
field: 'COL85',
options: ['是', '否'],
},
{ type: 'brspace' },
{ type: 'text', value: '如是,包括的应用系统(如网银、移动办公等):' },
{ type: 'input', field: 'COL86' },
{ type: 'br' },
{ type: 'text', value: '(4)在机构内部使用无线局域网络' },
{
type: 'yesno',
field: 'COL87',
extraFields: [
{ label: "采用协议和加密方式", formType:"input",field: "COL88" },
{ label: "无线局域网络所处网络区域", formType:"checkbox",field: "COL89",
options: ["生产网", "开发网", "测试网", "办公网", "外网"],
otherOption:true,
otherField:"COL90"
{ label: '采用协议和加密方式', formType: 'input', field: 'COL88' },
{
label: '无线局域网络所处网络区域',
formType: 'checkbox',
field: 'COL89',
options: ['生产网', '开发网', '测试网', '办公网', '外网', '其他'],
otherOption: true,
otherField: 'COL90',
},
{ label: "无线局域网络接入认证方式", formType:"checkbox", field: "COL91",
options: ["无", "仅接入设备认证", "仅用户认证", "设备和用户同时认证"],
otherOption:true,
otherField:"COL92"
{
label: '无线局域网络接入认证方式',
formType: 'radio',
field: 'COL91',
options: ['无', '仅接入设备认证', '仅用户认证', '设备和用户同时认证', '其他'],
otherOption: true,
otherField: 'COL92',
},
{ label: "无线局域网络使用缺省SSID", field: "C20A005", formType: "radio", options: ["是", "否"] }
]
},
{ type: "br" },
{ type: "text", value: "(5)制定并实施网络设备安全配置基线" },
{ type: "radio-group", field: "COL93", options: ["是", "否"] },
{ type: "brspace" },
{ type: "text", value: "建立网络设备版本和缺陷管理流程" },
{ type: "radio-group", field: "COL94", options: ["是", "否"] },
{ type: "br" },
{ type: "text", value: "(6)实时监测网络攻击行为并保存日志" },
{
type: "yesno",
field: "COL95",
extraFields: [
{ label: "日志定期审查周期", formType:"number",field: "C20A006",unit:'月' },
{ label: "网络安全设备日志保存时长", formType:"number",field: "C20A007",unit:'月'}
]
},
{ type: "br" },
{ type: "text", value: "(7)网络防病毒软件部署范围" },
{
type: "checkbox-group",
field: "COL96",
options: [
"生产网","开发网","测试网","办公网","外网",
{ label: '无线局域网络使用缺省SSID', field: 'C20A005', formType: 'radio', options: ['是', '否'] },
],
otherOption:true,
otherField:"COL97"
},
{ type: "br" },
{ type: "text", value: "(8)建立网络安全态势感知平台" },
{ type: "radio-group", field: "C23A007", options: ["是", "否"] },
{ type: "br" },
{ type: "text", value: "(9)定期对关键安全控制措施的有效性进行验证" },
{ type: "radio-group", field: "C24A001", options: ["是", "否"] },
{ type: "brspace" },
{ type: "text", value: "如是,最近一次检查时间"},
{ type: "date", field: "C24A002" },
},
{ type: 'br' },
{ type: 'text', value: '(5)制定并实施网络设备安全配置基线' },
{ type: 'radio-group', field: 'COL93', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '建立网络设备版本和缺陷管理流程' },
{ type: 'radio-group', field: 'COL94', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '(6)实时监测网络攻击行为并保存日志' },
{
type: 'radio-group',
field: 'COL95',
options: ['是', '否'],
},
{ type: 'brspace' },
{ type: 'text', value: '如是,日志定期审查周期:' },
{ type: 'input', formType: 'number', field: 'C20A006', unit: '月' },
{ type: 'brspace' },
{ type: 'text', value: '网络安全设备日志保存时长:' },
{ type: 'input', formType: 'number', field: 'C20A007', unit: '月' },
{ type: 'br' },
{ type: 'text', value: '(7)网络防病毒软件部署范围' },
{
type: 'checkbox-group',
field: 'COL96',
options: ['生产网', '开发网', '测试网', '办公网', '外网'],
otherOption: true,
otherField: 'COL97',
},
{ type: 'br' },
{ type: 'text', value: '(8)建立网络安全态势感知平台' },
{ type: 'radio-group', field: 'C23A007', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '(9)定期对关键安全控制措施的有效性进行验证' },
{ type: 'radio-group', field: 'C24A001', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '如是,最近一次检查时间' },
{ type: 'date', field: 'C24A002' },
],
},
{
serialNumber: "4",
project: "主机安全",
serialNumber: '3',
project: '主机安全',
code: 'TB603',
content: [
{ type: "text", value: "(1)制定并实施主机安全配置基线" },
{ type: "yesno", field: "COL99",},
{ type: "brspace" },
{ type: "text", value: "如是,主机安全配置基线覆盖范围" },
{
type: "checkbox-group",
field: "COL100",
options: [
"操作系统","数据库","中间件"
],
otherOption:true,
otherField:"COL101"
},
{ type: "br" },
{ type: "text", value: " (2)定期对主机系统漏洞进行检测" },
{ type: "yesno", field: "COL102",},
{ type: "brspace" },
{ type: "text", value: "如是,检测频率" },
{ type: "number", field: "COL110",unit:""},
{ type: "brspace" },
{ type: "text", value: "建立主机系统漏洞跟踪机制" },
{ type: "yesno", field: "COL103"},
{ type: "br" },
{ type: "text", value: "(3)建立主机系统补丁管理流程" },
{ type: "yesno", field: "COL104",},
{ type: "brspace" },
{ type: "text", value: "补丁升级前对补丁进行评估和测试" },
{ type: "yesno", field: "COL105"},
{ type: "br" },
{ type: "text", value: "(4)采取的主机系统安全管理措施主要包括" },
{ type: "brspace" },
{
type: "checkbox-group",
field: "COL106",
{ type: 'text', value: '(1)制定并实施主机安全配置基线' },
{ type: 'radio-group', field: 'COL99', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '如是,主机安全配置基线覆盖范围' },
{
type: 'checkbox-group',
field: 'COL100',
options: ['操作系统', '数据库', '中间件'],
otherOption: true,
otherField: 'COL101',
},
{ type: 'br' },
{ type: 'text', value: ' (2)定期对主机系统漏洞进行检测' },
{ type: 'radio-group', field: 'COL102', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '如是,检测频率' },
{ type: 'number', field: 'COL110', unit: '' },
{ type: 'brspace' },
{ type: 'text', value: '建立主机系统漏洞跟踪机制' },
{ type: 'radio-group', field: 'COL103', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '(3)建立主机系统补丁管理流程' },
{ type: 'radio-group', field: 'COL104', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '补丁升级前对补丁进行评估和测试' },
{ type: 'radio-group', field: 'COL105', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '(4)采取的主机系统安全管理措施主要包括' },
{ type: 'brspace' },
{
type: 'checkbox-group',
field: 'COL106',
options: [
"遵循最小授权原则分配系统管理用户权限",
"固定终端或限制登录终端IP地址",
"定期修改口令",
"口令满足一定复杂度要求",
"限制非法登录次数",
"对登录终端超时进行锁定或强制退出",
"系统远程管理采取加密措施",
"限制远程拨号访问",
"对系统重大管理操作行为进行日志审计",
"通过堡垒机进行集中管理",
"采用双因素认证登录"
'遵循最小授权原则分配系统管理用户权限',
'固定终端或限制登录终端IP地址',
'定期修改口令',
'口令满足一定复杂度要求',
'限制非法登录次数',
'对登录终端超时进行锁定或强制退出',
'系统远程管理采取加密措施',
'限制远程拨号访问',
'对系统重大管理操作行为进行日志审计',
'通过堡垒机进行集中管理',
'采用双因素认证登录',
],
otherOption:true,
otherField:"COL107"
otherOption: true,
otherField: 'COL107',
},
{ type: "br" },
{ type: "text", value: "(5)重要信息系统日志管理方式" },
{ type: "radio-group", field: "COL108",options:[
"集中存储","分散存储","不保存"
]},
{ type: "brspace" },
{ type: "text", value: "日志定期审查周期" },
{ type: "number", field: "COL109",unit:"月"},
{ type: 'br' },
{ type: "brspace" },
{ type: "text", value: "日志保存时长" },
{ type: "number", field: "COL110",unit:"月"},
{ type: 'text', value: '(5)重要信息系统日志管理方式' },
{ type: 'radio-group', field: 'COL108', options: ['集中存储', '分散存储', '不保存'] },
{ type: 'brspace' },
{ type: 'text', value: '日志定期审查周期' },
{ type: 'number', field: 'COL109', unit: '月' },
]
{ type: 'brspace' },
{ type: 'text', value: '日志保存时长' },
{ type: 'number', field: 'COL110', unit: '月' },
],
},
{
serialNumber: "5",
project: "终端安全",
serialNumber: '4',
project: '终端安全',
code: 'TB604',
content: [
{ type: "text", value: "(1)安装统一的防病毒软件" },
{ type: "yesno", field: "COL113",},
{ type: "brspace" },
{ type: "text", value: "终端防病毒软件安装覆盖率" },
{ type: "number", field: "COL114",unit:'%'},
{ type: "text", value: ",病毒库更新频度" },
{ type: "number", field: "C20A008",unit:'天/次'},
{ type: "br" },
{ type: "text", value: "(2)安装统一的终端安全管理软件" },
{ type: "yesno", field: "COL116",},
{ type: "brspace" },
{ type: "text", value: "若是,应用的主要安全策略包括" },
{ type: "checkbox-group", field: "COL117", options: [
"禁止非法外联","移动介质管控","违规日志审计","网络准入管理","补丁自动修补",
"软件分发","应用软件管理","资产管理","IP、MAC绑定","密码策略管理"
{ type: 'text', value: '(1)安装统一的防病毒软件' },
{ type: 'radio-group', field: 'COL113', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '终端防病毒软件安装覆盖率' },
{ type: 'number', field: 'COL114', unit: '%' },
{ type: 'text', value: ',病毒库更新频度' },
{ type: 'number', field: 'C20A008', unit: '天/次' },
{ type: 'br' },
{ type: 'text', value: '(2)安装统一的终端安全管理软件' },
{ type: 'radio-group', field: 'COL116', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '如是,应用的主要安全策略包括' },
{
type: 'checkbox-group',
field: 'COL117',
options: [
'禁止非法外联',
'移动介质管控',
'违规日志审计',
'网络准入管理',
'补丁自动修补',
'软件分发',
'应用软件管理',
'资产管理',
'IP、MAC绑定',
'密码策略管理',
],
otherOption:true,
otherField:"COL118"
},
{ type: "br" },
{ type: "text", value: "(3)终端口令定期强制修改" },
{ type: "yesno", field: "COL119",},
{ type: "brspace" },
{ type: "text", value: "修改周期" },
{ type: "number", field: "COL120",unit:'天'},
{ type: "brspace" },
{ type: "text", value: "终端口令复杂度要求" },
{ type: "yesno", field: "COL121",},
{ type: "br" },
{ type: "text", value: "(4)建立终端补丁管理流程" },
{ type: "yesno", field: "COL122",},
{ type: "brspace" },
{ type: "text", value: "使用自动化工具实现补丁的自动检测、分发和安装" },
{ type: "yesno", field: "COL123",},
{ type: "br" },
{ type: "text", value: "(5)建立移动设备(含笔记本电脑、移动存储介质、移动智能终端等)使用管理制度" },
{ type: "yesno", field: "COL124",},
{ type: "brspace" },
{ type: "text", value: "如是,则采取的移动设备管理措施主要包括" },
{ type: "brspace" },
{ type: "checkbox-group", field: "COL125",formType:"checkbox",
options:[
"对移动设备的领用进行登记",
"控制未授权移动设备接入,进行告警、阻断,并对操作行为进行记录",
"不允许移动设备在与外网和内网交叉使用",
"使用加密等手段防止移动设备使用不当或丢失造成敏感数据泄露",
"对移动设备的使用行为进行监督和记录",
"对使用移动设备的行为定期进行检查和审计"
otherOption: true,
otherField: 'COL118',
},
{ type: 'br' },
{ type: 'text', value: '(3)终端口令定期强制修改' },
{ type: 'radio-group', field: 'COL119', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '如是,修改周期' },
{ type: 'number', field: 'COL120', unit: '天' },
{ type: 'brspace' },
{ type: 'text', value: '终端口令复杂度要求' },
{ type: 'radio-group', field: 'COL121', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '(4)建立终端补丁管理流程' },
{ type: 'radio-group', field: 'COL122', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '使用自动化工具实现补丁的自动检测、分发和安装' },
{ type: 'radio-group', field: 'COL123', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '(5)建立移动设备(含笔记本电脑、移动存储介质、移动智能终端等)使用管理制度' },
{ type: 'radio-group', field: 'COL124', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '如是,则采取的移动设备管理措施主要包括' },
{ type: 'brspace' },
{
type: 'checkbox-group',
field: 'COL125',
formType: 'checkbox',
options: [
'对移动设备的领用进行登记',
'控制未授权移动设备接入,进行告警、阻断,并对操作行为进行记录',
'不允许移动设备在与外网和内网交叉使用',
'使用加密等手段防止移动设备使用不当或丢失造成敏感数据泄露',
'对移动设备的使用行为进行监督和记录',
'对使用移动设备的行为定期进行检查和审计',
],
otherOption:true,
otherField:"COL126"
otherOption: true,
otherField: 'COL126',
},
{ type: "br" },
{ type: "text", value:"备注" },
{ type: "textarea", field: "COL127",width:'50%',rows:1},
]
{ type: 'br' },
{ type: 'text', value: '备注' },
{ type: 'textarea', field: 'COL127', width: '50%', rows: 1 },
],
},
{
serialNumber: "6",
project: "应用安全",
serialNumber: '5',
project: '应用安全',
code: 'TB605',
content: [
{ type: "text", value: "(1)重要业务应用系统管理采取的主要措施包括:" },
{ type: "brspace" },
{ type: "checkbox-group", field: "COL128", options: [
"遵循最小授权原则分配系统管理用户权限","固定终端或限制登录终端IP地址","定期修改口令","口令满足一定复杂度要求",
"限制非法登录次数","对登录终端超时进行锁定或强制退出","系统远程管理采取加密措施","限制远程拨号访问",
"对系统重大管理操作行为进行日志审计","通过堡垒机进行集中管理","采用双因素认证登录"
{ type: 'text', value: '(1)重要业务应用系统管理采取的主要措施包括:' },
{ type: 'brspace' },
{
type: 'checkbox-group',
field: 'COL128',
options: [
'遵循最小授权原则分配系统管理用户权限',
'固定终端或限制登录终端IP地址',
'定期修改口令',
'口令满足一定复杂度要求',
'限制非法登录次数',
'对登录终端超时进行锁定或强制退出',
'系统远程管理采取加密措施',
'限制远程拨号访问',
'对系统重大管理操作行为进行日志审计',
'通过堡垒机进行集中管理',
'采用双因素认证登录',
],
otherOption:true,
otherField:"COL129"
},
{ type: "br" },
{ type: "text", value:"(2)制定密码设备管理要求,对密码设备的准入、维护、维修及报废进行规范管理" },
{ type: "yesno", field: "COL130",},
{ type: "brspace" },
{ type: "text", value: "制定机构全辖密钥管理要求,对密钥生命周期进行全面管理:" },
{ type: "number", field: "COL131",unit:'个'},
{ type: "brspace" },
{ type: "text", value: "已采用SM系列密码算法的应用系统数量:" },
{ type: "number", field: "C20A009",unit:'个'},
{ type: "brspace" },
{ type: "text", value: "已采用SM系列密码算法的加密机数量:" },
{ type: "number", field: "C20B027" ,unit:'个'},
{ type: "brspace" },
{ type: "text", value: "已采用SM系列密码算法的VPN设备数量:" },
{ type: "number", value: "", field: "C20B028" ,unit:'个'},
{ type: "br" },
{ type: "text", value:"(3)网上银行(网上保险)系统架构" },
{ type: "checkbox-group", field: "COL133",
options:[ "C/S架构","B/S架构", ],
otherOption:true,
otherField:"COL134"
},
{ type: "brspace" },
{ type: "text", value:"网上银行(网上保险)支持的多因素认证方式" },
{ type: "checkbox-group", field: "COL135",
options:["一代USB Key","二代USB Key","TOKEN","手机动态验证码"],
otherOption:true,
otherField:"COL136"
},
{ type: "brspace" },
{ type: "text", value:"如网上银行(网上保险)支持USB Key,USB Key是否通过第三方测评机构的安全检测" },
{ type: "yesno", field: "COL137",
extraFields:[
{ label:"测评机构名称", formType: "input",field: "COL138"},
{ label:"最近一次检测时间", formType: "date",field: "COL139"},
]
},
{ type: "brspace" },
{ type: "text", value:"已采用SM系列密码算法的USB Key 数量" },
{ type: "number", field: "C20B029", unit:'个' },
{ type: "brspace" },
{ type: "text", value:"已采用SM系列密码算法的TOKEN数量" },
{ type: "number", field: "C20B030", unit:'个' },
{ type: "br" },
{ type: "text", value:"(4)网上银行(网上保险)客户端运行环境检测" },
{ type: "yesno", field: "COL140",
extraFields:[
{ label:"主要检测项包括", formType: "checkbox",field: "COL141",
options:[
"病毒检测","恶意软件检测","签名控件","密码控件","防录屏","防钓鱼控件","Http代理检测","注册表检测、修复"
],
otherOption:true,
otherField:"COL142"
},
{ label:"已采用SM系列密码算法的密码控件数量", formType: "number",field:"C20B031",unit:"个"},
]
otherOption: true,
otherField: 'COL129',
},
{ type: "br" },
{ type: "text", value:"(5)网上银行(网上保险)客户证书签发机构" },
{ type: "radio-group", field: "COL143", options:["自建CA","第三方CA机构"] },
{ type: "brspace" },
{ type: "text", value:"机构名称" },
{ type: "input", field: "COL144",},
{ type: "brspace" },
{ type: "text", value:"已采用SM系列密码算法的自建数字证书认证系统数量" },
{ type: "number", field: "C20B032" ,unit:"个"},
{ type: "brspace" },
{ type: "text", value:"已采用SM系列密码算法的电子签章系统数量" },
{ type: "number", field: "C20B033",unit:"个"},
{ type: "brspace" },
{ type: "text", value:"已采用SM系列密码算法的时间戳服务器数量" },
{ type: "number", field: "C20B034",unit:"个"},
{ type: "brspace" },
{ type: "text", value:"已采用SM系列密码算法的签名验签服务器数量" },
{ type: "number", field: "C20B035",unit:"个"},
{ type: "br" },
{ type: "text", value:"(6)手机银行(手机APP)支持多因素认证方式" },
{ type: "brspace" },
{ type: "checkbox-group", field: "COL145",
options:["TOKEN","手机动态验证码","手势密码","软令牌","生物识别技术"],
otherOption:true,
otherField:"COL146"
{ type: 'br' },
{ type: 'text', value: '(2)制定密码设备管理要求,对密码设备的准入、维护、维修及报废进行规范管理' },
{ type: 'radio-group', field: 'COL130', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '制定机构全辖密钥管理要求,对密钥生命周期进行全面管理:' },
{ type: 'radio-group', field: 'COL131', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '已采用SM系列密码算法的应用系统数量:' },
{ type: 'number', field: 'C20A009', unit: '个' },
{ type: 'brspace' },
{ type: 'text', value: '已采用SM系列密码算法的加密机数量:' },
{ type: 'number', field: 'C20B027', unit: '个' },
{ type: 'brspace' },
{ type: 'text', value: '已采用SM系列密码算法的VPN设备数量:' },
{ type: 'number', value: '', field: 'C20B028', unit: '个' },
{ type: 'br' },
{ type: 'text', value: '(3)网上银行(网上保险)系统架构' },
{ type: 'checkbox-group', field: 'COL133', options: ['C/S架构', 'B/S架构'], otherOption: true, otherField: 'COL134' },
{ type: 'brspace' },
{ type: 'text', value: '网上银行(网上保险)支持的多因素认证方式' },
{
type: 'checkbox-group',
field: 'COL135',
options: ['一代USB Key', '二代USB Key', 'TOKEN', '手机动态验证码'],
otherOption: true,
otherField: 'COL136',
},
{ type: "brspace" },
{ type: "text", value:"建立手机银行(手机APP)和其他互联网APP更新管理流程,在APP升级前进行安全评估和测试" },
{ type: "yesno", field: "COL147"},
{ type: "br" },
{ type: "text", value:" (7)建立电子渠道业务用户异常交易行为自动化监测机制" },
{ type: "yesno", field: "COL148"},
{ type: "brspace" },
{ type: "text", value:"建立用户异常交易行为自动化控制机制" },
{ type: "yesno", field: "COL149"},
{ type: "br" },
{ type: "text", value:"(8)网上银行(网上保险)、手机银行(手机APP)的服务协议中包含安全风险提示内容" },
{ type: "yesno", field: "COL150"},
{ type: "brspace" },
{ type: "text", value:"加强客户安全教育的宣传渠道包括" },
{ type: "brspace" },
{ type: "checkbox-group", field: "COL151",
options:[
"客户端安全软件(控件、程序)默认打开正确的登录页面地址和客服电话号码",
"网上银行(网上保险)、手机银行(手机APP)使用过程中,向客户明确提示风险和注意事项",
"客户申请网上银行(网上保险)、手机银行(手机APP)时提供安全使用手册 ",
"网上银行(网上保险)、手机银行(手机APP)使用完毕后,提示安全退出操作步骤",
"在公众媒体刊登客户安全教育内容 □印刷客户安全教育宣传材料 □开展公众教育日活动"
{ type: 'brspace' },
{ type: 'text', value: '如网上银行(网上保险)支持USB Key,USB Key是否通过第三方测评机构的安全检测' },
{ type: 'radio-group', field: 'COL137', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '如是,测评机构名称:' },
{ type: 'input', field: 'COL138' },
{ type: 'brspace' },
{ type: 'text', value: '最近一次检测时间:' },
{ type: 'date', field: 'COL139' },
{ type: 'brspace' },
{ type: 'text', value: '已采用SM系列密码算法的USB Key 数量' },
{ type: 'number', field: 'C20B029', unit: '个' },
{ type: 'brspace' },
{ type: 'text', value: '已采用SM系列密码算法的TOKEN数量' },
{ type: 'number', field: 'C20B030', unit: '个' },
{ type: 'br' },
{ type: 'text', value: '(4)网上银行(网上保险)客户端运行环境检测' },
{ type: 'radio-group', field: 'COL140', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '如是,主要检测项包括' },
{
type: 'checkbox-group',
field: 'COL141',
options: ['病毒检测', '恶意软件检测', '签名控件', '密码控件', '防录屏', '防钓鱼控件', 'Http代理检测', '注册表检测、修复'],
otherOption: true,
otherField: 'COL142',
},
{ type: 'brspace' },
{ type: 'text', value: '已采用SM系列密码算法的密码控件数量' },
{ type: 'number', field: 'C20B031', unit: '个' },
{ type: 'br' },
{ type: 'text', value: '(5)网上银行(网上保险)客户证书签发机构' },
{ type: 'radio-group', field: 'COL143', options: ['自建CA', '第三方CA机构'] },
{ type: 'brspace' },
{ type: 'text', value: '机构名称' },
{ type: 'input', field: 'COL144' },
{ type: 'brspace' },
{ type: 'text', value: '已采用SM系列密码算法的自建数字证书认证系统数量' },
{ type: 'number', field: 'C20B032', unit: '个' },
{ type: 'brspace' },
{ type: 'text', value: '已采用SM系列密码算法的电子签章系统数量' },
{ type: 'number', field: 'C20B033', unit: '个' },
{ type: 'brspace' },
{ type: 'text', value: '已采用SM系列密码算法的时间戳服务器数量' },
{ type: 'number', field: 'C20B034', unit: '个' },
{ type: 'brspace' },
{ type: 'text', value: '已采用SM系列密码算法的签名验签服务器数量' },
{ type: 'number', field: 'C20B035', unit: '个' },
{ type: 'br' },
{ type: 'text', value: '(6)手机银行(手机APP)支持多因素认证方式' },
{ type: 'brspace' },
{
type: 'checkbox-group',
field: 'COL145',
options: ['TOKEN', '手机动态验证码', '手势密码', '软令牌', '生物识别技术'],
otherOption: true,
otherField: 'COL146',
},
{ type: 'brspace' },
{ type: 'text', value: '建立手机银行(手机APP)和其他互联网APP更新管理流程,在APP升级前进行安全评估和测试' },
{ type: 'radio-group', field: 'COL147', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: ' (7)建立电子渠道业务用户异常交易行为自动化监测机制' },
{ type: 'radio-group', field: 'COL148', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '建立用户异常交易行为自动化控制机制' },
{ type: 'radio-group', field: 'COL149', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '(8)网上银行(网上保险)、手机银行(手机APP)的服务协议中包含安全风险提示内容' },
{ type: 'radio-group', field: 'COL150', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '加强客户安全教育的宣传渠道包括' },
{ type: 'brspace' },
{
type: 'checkbox-group',
field: 'COL151',
options: [
'客户端安全软件(控件、程序)默认打开正确的登录页面地址和客服电话号码',
'网上银行(网上保险)、手机银行(手机APP)使用过程中,向客户明确提示风险和注意事项',
'客户申请网上银行(网上保险)、手机银行(手机APP)时提供安全使用手册 ',
'网上银行(网上保险)、手机银行(手机APP)使用完毕后,提示安全退出操作步骤',
'在公众媒体刊登客户安全教育内容',
'印刷客户安全教育宣传材料',
'开展公众教育日活动',
],
otherOption:true,
otherField:"COL152"
otherOption: true,
otherField: 'COL152',
},
{ type: "br" },
{ type: "text", value:"(9)互联网应用系统(含网站)采取物理或逻辑集中进行统一出口管理,采取统一安全防护措施" },
{ type: "yesno", field: "COL153"},
{ type: "brspace" },
{ type: "text", value:"互联网网站采取网页防篡改措" },
{ type: "yesno", field: "COL154"},
{ type: "brspace" },
{ type: "text", value:"建立网站信息发布审核制度" },
{ type: "yesno", field: "COL155"},
{ type: "br" },
{ type: "text", value:"(10)实施钓鱼网站监测" },
{ type: "yesno", field: "COL156",
extraFields:[
{ label:"监测方法", formType: "checkbox",field: "COL157",
options:["自监测","购买第三方服务"],
},
{ label:"本年度发现的钓鱼网站数量", formType: "number",field:"COL158",unit:"个"},
{ label:"本年度已关闭的钓鱼网站数量", formType: "number",field:"COL159",unit:"个"},
{ label:"钓鱼网站查封率", formType: "number",field:"COL160",unit:"%"},
]
},
{ type: "br" },
{ type: "text", value:"(11)实施仿冒APP监测" },
{ type: "yesno", field: "COL161",
extraFields:[
{ label:"监测方法", formType: "checkbox",field: "COL162",
options:["自监测","购买第三方服务"],
},
{ label:"本年度发现的仿冒APP数量", formType: "number",field:"COL163",unit:"个"},
{ label:"本年度强制下架的仿冒APP数量", formType: "number",field:"COL164",unit:"个"},
{ label:"仿冒App查封率", formType: "number",field:"COL165",unit:"%"},
]
{ type: 'br' },
{ type: 'text', value: '(9)互联网应用系统(含网站)采取物理或逻辑集中进行统一出口管理,采取统一安全防护措施' },
{ type: 'radio-group', field: 'COL153', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '互联网网站采取网页防篡改措' },
{ type: 'radio-group', field: 'COL154', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '建立网站信息发布审核制度' },
{ type: 'radio-group', field: 'COL155', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '(10)实施钓鱼网站监测' },
{ type: 'radio-group', field: 'COL156', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '如是,监测方法' },
{
type: 'checkbox-group',
field: 'COL157',
options: ['自监测', '购买第三方服务'],
},
{ type: "br"},
{ type: "text", value:"(12)建立开源软件以及其他第三方软件的准入和管理机制,采取必要的安全评估"},
{ type: "yesno", field: "C20A010",},
{ type: "brspace" },
{ type: "text", value:"建立开源软件以及其他第三方软件的缺陷跟踪机制,及时修复漏洞" },
{ type: "yesno", field: "C20A011"},
{ type: "br" },
{ type: "text", value:"备注" },
{ type: "textarea", field: "COL166",width:'50%',rows:1},
]
{ type: 'brspace' },
{ type: 'text', value: '本年度发现的钓鱼网站数量' },
{ type: 'number', field: 'COL158', unit: '个' },
{ type: 'brspace' },
{ type: 'text', value: '本年度已关闭的钓鱼网站数量' },
{ type: 'number', field: 'COL159', unit: '个' },
{ type: 'brspace' },
{ type: 'text', value: '钓鱼网站查封率' },
{ type: 'number', field: 'COL160', unit: '%' },
{ type: 'br' },
{ type: 'text', value: '(11)实施仿冒APP监测' },
{ type: 'radio-group', field: 'COL161', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '如是,监测方法' },
{
type: 'checkbox-group',
field: 'COL162',
options: ['自监测', '购买第三方服务'],
},
{ type: 'brspace' },
{ type: 'text', value: '本年度发现的仿冒APP数量' },
{ type: 'number', field: 'COL163', unit: '个' },
{ type: 'brspace' },
{ type: 'text', value: '本年度强制下架的仿冒APP数量' },
{ type: 'number', field: 'COL164', unit: '个' },
{ type: 'brspace' },
{ type: 'text', value: '仿冒App查封率' },
{ type: 'number', field: 'COL165', unit: '%' },
{ type: 'br' },
{ type: 'text', value: '(12)建立开源软件以及其他第三方软件的准入和管理机制,采取必要的安全评估' },
{ type: 'radio-group', field: 'C20A010', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '建立开源软件以及其他第三方软件的缺陷跟踪机制,及时修复漏洞' },
{ type: 'radio-group', field: 'C20A011', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '备注' },
{ type: 'textarea', field: 'COL166', width: '50%', rows: 1 },
],
},
{
serialNumber: "7",
project: "数据安全",
serialNumber: '6',
project: '数据安全',
code: 'TB606',
content: [
{ type: "text", value: "(1)制定数据管理制度和流程" },
{ type: "radio-group", field: "COL169", options: ["是", "否"] },
{ type: "brspace" },
{ type: "text", value: "如是,数据管理制度和流程覆盖范围" },
{ type: "br" },
{
type: "checkbox-group",
field: "COL170",
options: [
"数据采集","数据处理","数据存储","数据传输","数据分发","数据备份","数据恢复","数据清理","数据销毁"
]
},
{ type: "br" },
{ type: "text", value: "(2)建立数据分类分级管理标准" },
{
type: "yesno",
field: "COL171",
extraLabel:"数据分",
extraField:"C23A008",
unit:"级"
},
{ type: "br" },
{ type: "text", value: "(3)根据数据重要程度,分级建立数据备份与恢复策略" },
{ type: "radio-group", field: "COL172", options: ["是", "否"] },
{ type: "br" },
{ type: "text", value: "(4)建立生产数据恢复操作审批流程" },
{ type: "radio-group", field: "COL173", options: ["是", "否"] },
{ type: "brspace" },
{ type: "text", value: "建立备份数据抽检机制" },
{ type: "radio-group", field: "COL174", options: ["是", "否"] },
{ type: "br" },
{ type: "text", value: "(5)数据脱离生产环境使用须经过主管部门授权和审批" },
{ type: "radio-group", field: "COL175", options: ["是", "否"] },
{ type: "brspace" },
{ type: "text", value: "非生产环境使用生产数据时进行脱敏处理" },
{
type: "yesno",
field: "COL176",
extraLabel: "脱敏处理方式",
extraField: "COL177"
},
{ type: "brspace" },
{ type: "text", value: "非生产环境使用生产数据时,明确规定生产数据使用期限" },
{ type: "radio-group", field: "COL178", options: ["是", "否"] },
{ type: "brspace" },
{ type: "text", value: "非生产环境使用生产数据时,明确规定生产数据回收或清理措施" },
{ type: "radio-group", field: "COL179", options: ["是", "否"] },
{ type: "br" },
{ type: "text", value: "(6)重要信息系统建立数据清理策略" },
{ type: "radio-group", field: "COL180", options: ["是", "否"] },
{ type: "brspace" },
{ type: "text", value: "对已失效数据或已毁坏但包含重要数据的介质进行销毁" },
{
type: "yesno",
field: "COL181",
extraLabel: "销毁机构名称",
extraField: "COL182"
},
{ type: "br" },
{ type: "text", value: "(7)采取数据防泄露监测和控制技术措施" },
{
type: "yesno",
field: "C20A012",
extraLabel: "措施包括",
extraField: "C23A009"
},
{ type: "br" },
{ type: "text", value: "(8)本机构是否有数据出境场景" },
{
type: "yesno",
field: "C23A010",
{ type: 'text', value: '(1)制定数据管理制度和流程' },
{ type: 'radio-group', field: 'COL169', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '如是,数据管理制度和流程覆盖范围' },
{ type: 'br' },
{
type: 'checkbox-group',
field: 'COL170',
options: ['数据采集', '数据处理', '数据存储', '数据传输', '数据分发', '数据备份', '数据恢复', '数据清理', '数据销毁'],
},
{ type: 'br' },
{ type: 'text', value: '(2)建立数据分类分级管理标准' },
{
type: 'yesno',
field: 'COL171',
extraLabel: '数据分',
extraField: 'C23A008',
unit: '级',
},
{ type: 'br' },
{ type: 'text', value: '(3)根据数据重要程度,分级建立数据备份与恢复策略' },
{ type: 'radio-group', field: 'COL172', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '(4)建立生产数据恢复操作审批流程' },
{ type: 'radio-group', field: 'COL173', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '建立备份数据抽检机制,按计划检查备份数据的有效性' },
{ type: 'radio-group', field: 'COL174', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '(5)数据脱离生产环境使用须经过主管部门授权和审批' },
{ type: 'radio-group', field: 'COL175', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '非生产环境使用生产数据时进行脱敏处理' },
{
type: 'yesno',
field: 'COL176',
extraLabel: '脱敏处理方式',
extraField: 'COL177',
},
{ type: 'brspace' },
{ type: 'text', value: '非生产环境使用生产数据时,明确规定生产数据使用期限' },
{ type: 'radio-group', field: 'COL178', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '非生产环境使用生产数据时,明确规定生产数据回收或清理措施' },
{ type: 'radio-group', field: 'COL179', options: ['是', '否'] },
{ type: 'br' },
{ type: 'text', value: '(6)重要信息系统建立数据清理策略' },
{ type: 'radio-group', field: 'COL180', options: ['是', '否'] },
{ type: 'brspace' },
{ type: 'text', value: '对已失效数据或已毁坏但包含重要数据的介质进行销毁' },
{
type: 'yesno',
field: 'COL181',
extraLabel: '销毁机构名称',
extraField: 'COL182',
},
{ type: 'br' },
{ type: 'text', value: '(7)采取数据防泄露监测和控制技术措施' },
{
type: 'yesno',
field: 'C20A012',
extraLabel: '措施包括',
extraField: 'C23A009',
},
{ type: 'br' },
{ type: 'text', value: '(8)本机构是否有数据出境场景' },
{
type: 'yesno',
field: 'C23A010',
extraFields: [
{ label: "出境场景名称", field: "C23A011",formType:'input' },
{ label: "出境数据", field: "C23A012", formType: "checkbox",
options: ["核心数据", "重要数据", "敏感数据", "一般数据", "个人客户信息"]
{ label: '出境场景名称', field: 'C23A011', formType: 'input' },
{ label: '出境数据', field: 'C23A012', formType: 'checkbox', options: ['核心数据', '重要数据', '敏感数据', '一般数据', '个人客户信息'] },
{
label: '对符合国家数据出境安全评估条件的场景是否按照《数据出境安全评估办法》申请国家网信部门评估',
field: 'C23A013',
formType: 'radio',
options: ['是', '否'],
},
{ label: "是否申请国家网信部门评估", field: "C23A013", formType: "radio", options: ["是", "否"] },
{ label: "是否全部通过评估", field: "C23A014", formType: "radio", options: ["是", "否", "尚未反馈"] },
{ label: "场景名称", field: "C23A015",formType:'input' },
{ label: "是否签订标准合同", field: "C23A016", formType: "radio", options: ["是", "否"] }
]
{ label: '若是:是否全部通过评估', field: 'C23A014', formType: 'radio', options: ['是', '否', '尚未反馈'] },
{ label: '场景名称', field: 'C23A015', formType: 'input' },
{
label: '对符合国家个人信息出境签订标准合同的情形是否按《个人信息出境标准合同办法》与境外接收方签订合同',
field: 'C23A016',
formType: 'radio',
options: ['是', '否'],
},
],
},
{ type: "br" },
{ type: "text", value: "(9)数据安全备注" },
{ label: "备注", field: "COL183",type:'textarea',width:'50%',rows:1 },
{ type: 'br' },
{ type: 'text', value: '(9)数据安全备注' },
{ label: '备注', field: 'COL183', type: 'textarea', width: '50%', rows: 1 },
],
},
{
serialNumber: "8",
project: "附件",
serialNumber: '8',
project: '附件',
code: 'TB607',
type:"AttachTable",
content:[
{
field: 'col1',title: '名称', width:'20%',
},{
field: 'col2',title: '附件索引', width:'40%',slots: { default: 'form_default' },
},{
field: 'col3',title: '备注',slots: { default: 'form_default' },
type: 'AttachTable',
content: [
{
field: 'col1',
title: '名称',
width: '20%',
},
{
field: 'col2',
title: '附件索引',
width: '40%',
slots: { default: 'form_default' },
},
{
field: 'col3',
title: '备注',
slots: { default: 'form_default' },
},
],
datas: [
{
col1: "本年度信息安全检查报告",
col2:{ formType:'input',field: "COL184"},
col3:{ formType:'input',field: "COL188"},
},
{
col1: "重大网络和信息安全事件分析报告",
col2:{ formType:'input',field: "COL185"},
col3:{ formType:'input',field: "COL189"},
},
{
col1: "网络拓扑示意图及总体介绍",
col2:{ formType:'input',field: "COL186"},
col3:{ formType:'input',field: "COL190"},
},
{
col1: "数据管理情况明细报告",
col2:{ formType:'input',field: "COL187"},
col3:{ formType:'input',field: "COL191"},
},
{
col1: "数据分类分级管理标准",
col2:{ formType:'input',field: "C23A017"},
col3:{ formType:'input',field: "C23A018"},
},
{
col1: "数据出境安全评估情况说明",
col2:{ formType:'input',field: "C23A019"},
col3:{ formType:'input',field: "C23A020"},
},
{
col1: "个人信息出境签订标准合同情况说明",
col2:{ formType:'input',field: "C23A021"},
col3:{ formType:'input',field: "C23A022"},
{
col1: '本年度信息安全检查报告',
col2: { formType: 'input', field: 'COL184' },
col3: { formType: 'input', field: 'COL188' },
},
{
col1: '重大网络和信息安全事件分析报告',
col2: { formType: 'input', field: 'COL185' },
col3: { formType: 'input', field: 'COL189' },
},
{
col1: '网络拓扑示意图及总体介绍',
col2: { formType: 'input', field: 'COL186' },
col3: { formType: 'input', field: 'COL190' },
},
{
col1: '数据管理情况明细报告',
col2: { formType: 'input', field: 'COL187' },
col3: { formType: 'input', field: 'COL191' },
},
{
col1: '数据分类分级管理标准',
col2: { formType: 'input', field: 'C23A017' },
col3: { formType: 'input', field: 'C23A018' },
},
{
col1: '数据出境安全评估情况说明',
col2: { formType: 'input', field: 'C23A019' },
col3: { formType: 'input', field: 'C23A020' },
},
{
col1: '个人信息出境签订标准合同情况说明',
col2: { formType: 'input', field: 'C23A021' },
col3: { formType: 'input', field: 'C23A022' },
},
],
}
},
];
<template>
<div class="bank-report-table" style="height: 80vh;">
<div class="bank-report-table" style="height: 80vh">
<!-- 加载遮罩层 -->
<div v-if="loading" class="loading-overlay">
<div class="loading-spinner">
......@@ -10,27 +10,20 @@
<vxe-toolbar>
<template #button>
<div style="margin:10px">
<div style="margin: 10px">
<span style="font-weight: bold"> 填报任务:{{ queryParam?.taskName }} </span>
<span style="font-weight: bold;margin-left:20px"> 表格:{{ queryParam?.tplCode }} {{ queryParam?.tplName }}</span>
<span style="font-weight: bold; margin-left: 20px"> 表格:{{ queryParam?.tplCode }} {{ queryParam?.tplName }}</span>
</div>
</template>
<template #tools>
<vxe-button status="primary" icon="vxe-icon-edit" @click="handleOpenHistoryDrawer()" :disabled="loading">近5年数据填报</vxe-button>
<vxe-button status="primary" icon="vxe-icon-save" @click="checkData()">校验</vxe-button>
<vxe-button status="primary" icon="vxe-icon-save" @click="saveBatch()">保存</vxe-button>
<vxe-button status="primary" icon="vxe-icon-save" @click="checkData()">校验</vxe-button>
<vxe-button status="primary" icon="vxe-icon-save" @click="saveBatch()">保存</vxe-button>
</template>
</vxe-toolbar>
<!-- 校验结果抽屉 -->
<vxe-drawer
v-model="drawerVisible"
placement="right"
@show="handleValidationDrawerShow"
title="校验结果"
width="40%"
:footer="{ show: true }"
>
<vxe-drawer v-model="drawerVisible" placement="right" @show="handleValidationDrawerShow" title="校验结果" width="40%" :footer="{ show: true }">
<template #default>
<div class="validation-results">
<div class="result-summary">
......@@ -40,11 +33,11 @@
</div>
<div class="summary-item">
<span class="summary-label">通过:</span>
<span class="summary-value success">{{ validationResultsList.filter(item => item.isValid).length }}</span>
<span class="summary-value success">{{ validationResultsList.filter((item) => item.isValid).length }}</span>
</div>
<div class="summary-item">
<span class="summary-label">失败:</span>
<span class="summary-value error">{{ validationResultsList.filter(item => !item.isValid).length }}</span>
<span class="summary-value error">{{ validationResultsList.filter((item) => !item.isValid).length }}</span>
</div>
</div>
<div class="results-list">
......@@ -64,7 +57,7 @@
</div>
</template>
</vxe-drawer>
<vxe-table
border
ref="tableRef"
......@@ -78,12 +71,11 @@
<vxe-column field="serialNumber" title="序号" width="80"></vxe-column>
<vxe-column field="project" title="项目" width="200">
<template #default="{ row }">
<span style="font-weight: bold;size:20px">{{ row.project }}</span>
<span style="font-weight: bold; size: 20px">{{ row.project }}</span>
</template>
</vxe-column>
<vxe-column field="content" title="内容" row-resize>
<template #default="{ row }">
<template #default="{ row }">
<div class="content-cell">
<template v-if="row.type === 'MultiColumnTable'">
<MultiColumnTable
......@@ -91,7 +83,7 @@
:records="[]"
:fields="row.content"
:ref="(el) => setMultiColumnTableRef(el, row.code)"
style="margin:0px;padding:0px"
style="margin: 0px; padding: 0px"
/>
</template>
<template v-else-if="row.type === 'AttachTable'">
......@@ -103,7 +95,7 @@
:calcSum="row.calcSum"
:showFooter="row.showFooter"
:ref="(el) => setAttachTableRef(el, row.code)"
style="margin:0px;padding:0px"
style="margin: 0px; padding: 0px"
/>
</template>
<template v-else-if="row.type === 'VxeTable'">
......@@ -115,92 +107,166 @@
:footerData="row.footerData"
:showFooter="row.showFooter"
:ref="(el) => setMyVxeTableRef(el, row.code)"
style="margin:0px;padding:0px"
style="margin: 0px; padding: 0px"
/>
</template>
<template v-else>
<template v-for="(item, index) in row.content" :key="index">
<span v-if="item.type === 'text'" v-html="item.value" style="margin-right:10px"></span>
<span v-else-if="item.type === 'br'"><br></span>
<span v-if="item.type === 'text'" v-html="item.value" style="margin-right: 10px"></span>
<span v-else-if="item.type === 'br'"><br /></span>
<span v-else-if="item.type === 'brspace'">
<br>
<template v-for="i in item.value||1" :key="i">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</template>
<br />
<template v-for="i in item.value || 1" :key="i"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </template>
</span>
<template v-else-if="item.type === 'MultiColumnTable'">
<MultiColumnTable
:title="item.project"
:records="[]"
:fields="item.content"
:ref="(el) => setMultiColumnTableRef(el, item.code)"
style="margin:0px;padding:0px"
/>
</template>
<template v-else-if="row.type === 'AttachTable'">
<AttachTable
:title="row.project"
:records="item.datas"
:fields="item.content"
:pcode="row.code"
:calcSum="item.calcSum"
:showFooter="item.showFooter"
:ref="(el) => setAttachTableRef(el, row.code)"
style="margin:0px;padding:0px"
/>
</template>
<MultiColumnTable
:title="item.project"
:records="[]"
:fields="item.content"
:ref="(el) => setMultiColumnTableRef(el, item.code)"
style="margin: 0px; padding: 0px"
/>
</template>
<template v-else-if="item.type === 'AttachTable'">
<AttachTable
:title="item.project"
:records="item.datas"
:fields="item.content"
:pcode="item.code"
:calcSum="item.calcSum"
:showFooter="item.showFooter"
:ref="(el) => setAttachTableRef(el, item.code)"
style="margin: 0px; padding: 0px"
/>
</template>
<span v-else-if="item.type === 'radio-group'" class="radio-group">
<vxe-radio-group v-model="formData[row.code +'_'+ item.field]">
<vxe-radio
v-for="(opt, optIndex) in item.options"
:key="optIndex"
:label="opt"
>{{ opt }}</vxe-radio
>
<vxe-radio-group v-model="formData[row.code + '_' + item.field]">
<vxe-radio v-for="(opt, optIndex) in item.options" :key="optIndex" :label="opt">{{ opt }}</vxe-radio>
</vxe-radio-group>
</span>
<div v-else-if="item.type === 'checkbox-group'" class="checkbox-group">
<span class="checkbox-group" style="max-width:800px;margin-left: 20px;">
<vxe-checkbox-group v-model="formData[row.code+'_'+item.field]">
<vxe-checkbox v-for="(opt, optIndex) in item.options" :key="optIndex" :label="opt" style="line-height:30px;margin-left: 0px;">
{{ opt }}
</vxe-checkbox>
<template v-if="item.otherOption">
<vxe-checkbox label="其他" style="margin:0px">
其他:
</vxe-checkbox>
<vxe-input v-model="formData[row.code + '_'+ item.otherField]"
:disabled="!(formData[row.code+'_'+item.field]?.indexOf('其他')>-1)"
style="width: 300px;">
</vxe-input>
<div v-else-if="item.type === 'radio-group-extraFields'" class="radio-group">
<vxe-radio-group v-model="formData[row.code + '_' + item.field]">
<vxe-radio v-for="(opt, optIndex) in item.options" :key="optIndex" :label="opt.value">{{ opt.label }}</vxe-radio>
</vxe-radio-group>
<div v-if="formData[row.code + '_' + item.field]" class="extra-fields">
<template v-for="(option, optIndex) in item.options" :key="optIndex">
<template v-if="option.value === formData[row.code + '_' + item.field] && option.extraFields">
<template v-for="(ccopt, ccind) in option.extraFields" :key="ccind">
<span>{{ ccopt.label }}: </span>
<template v-if="ccopt.formType === 'number'">
<vxe-input v-model="formData[row.code + '_' + ccopt.field]" type="number" style="width: 80px"></vxe-input>
</template>
<template v-else-if="ccopt.formType === 'input'">
<vxe-input v-model="formData[row.code + '_' + ccopt.field]" style="width: 250px"></vxe-input>
</template>
</vxe-checkbox-group>
</span>
<template v-else>
<vxe-input v-model="formData[row.code + '_' + ccopt.field]" :type="ccopt.formType" style="width: 100px"></vxe-input>
</template>
<span class="unit"> {{ ccopt.unit }}</span>
</template>
</template>
</template>
</div>
</div>
<div v-else-if="item.type === 'checkbox-group'" class="checkbox-group">
<span class="checkbox-group" style="max-width: 800px; margin-left: 20px">
<vxe-checkbox-group v-model="formData[row.code + '_' + item.field]">
<vxe-checkbox v-for="(opt, optIndex) in item.options" :key="optIndex" :label="opt" style="line-height: 30px; margin-left: 0px">
{{ opt }}
</vxe-checkbox>
<template v-if="item.otherOption">
<vxe-checkbox label="其他" style="margin: 0px"> 其他: </vxe-checkbox>
<vxe-input
v-model="formData[row.code + '_' + item.otherField]"
:disabled="!(formData[row.code + '_' + item.field]?.indexOf('其他') > -1)"
style="width: 300px"
>
</vxe-input>
</template>
</vxe-checkbox-group>
</span>
</div>
<div v-else-if="item.type === 'checkboxAndInput'">
<span class="checkbox-group">
<vxe-checkbox-group v-model="formData[row.code+'_'+item.field]">
<vxe-checkbox v-for="(opt, optIndex) in item.options" :key="optIndex" :label="opt" style="display: block;margin:0px 0px">
{{ opt }}
<vxe-input type="number" v-model="formData[row.code + '_'+ item.optionItemField[optIndex]]" style="width: 100px;margin: 0px;">
</vxe-input>
<span class="unit"> {{ item.optionItemUint }}</span>
</vxe-checkbox>
</vxe-checkbox-group>
</span>
<vxe-checkbox-group v-model="formData[row.code + '_' + item.field]">
<vxe-checkbox v-for="(opt, optIndex) in item.options" :key="optIndex" :label="opt" style="display: block; margin: 0px 0px">
{{ opt }}
<vxe-input
type="number"
v-model="formData[row.code + '_' + item.optionItemField[optIndex]]"
style="width: 100px; margin: 0px"
>
</vxe-input>
<span class="unit"> {{ item.optionItemUint }}</span>
</vxe-checkbox>
</vxe-checkbox-group>
</span>
</div>
<div v-else-if="item.type === 'yesno'" class="yesno-group">
<vxe-radio-group v-model="formData[row.code + '_' + item.field]">
<vxe-radio label="是"></vxe-radio>
<vxe-radio label="否"></vxe-radio>
</vxe-radio-group>
<div v-if="formData[row.code + '_' + item.field] === '是'" class="extra-fields">
<!-- 处理单个extraField的情况 -->
<template v-if="item.extraField">
<div style="margin-top: 5px">
<span>{{ item.extraLabel || '' }}: </span>
<vxe-input v-model="formData[row.code + '_' + item.extraField]" style="width: 100px"></vxe-input>
<span v-if="item.unit" class="unit"> {{ item.unit }}</span>
</div>
</template>
<!-- 处理extraFields数组的情况 -->
<template v-else-if="item.extraFields">
<template v-for="(ccopt, ccind) in item.extraFields" :key="ccind">
<div style="margin-top: 5px">
<span>{{ ccopt.label }}: </span>
<template v-if="ccopt.formType === 'input'">
<vxe-input v-model="formData[row.code + '_' + ccopt.field]" style="width: 250px"></vxe-input>
</template>
<template v-else-if="ccopt.formType === 'checkbox'">
<vxe-checkbox-group v-model="formData[row.code + '_' + ccopt.field]">
<vxe-checkbox v-for="(opt, optIndex) in ccopt.options" :key="optIndex" :label="opt">{{ opt }}</vxe-checkbox>
</vxe-checkbox-group>
<template v-if="ccopt.otherOption">
<div style="margin-top: 5px; margin-left: 20px">
其他:
<vxe-input
v-model="formData[row.code + '_' + ccopt.otherField]"
:disabled="
!(
Array.isArray(formData[row.code + '_' + ccopt.field]) &&
formData[row.code + '_' + ccopt.field].indexOf('其他') > -1
)
"
style="width: 200px"
>
</vxe-input>
</div>
</template>
</template>
<template v-else-if="ccopt.formType === 'radio'">
<vxe-radio-group v-model="formData[row.code + '_' + ccopt.field]">
<vxe-radio v-for="(opt, optIndex) in ccopt.options" :key="optIndex" :label="opt">{{ opt }}</vxe-radio>
</vxe-radio-group>
<template v-if="ccopt.otherOption && formData[row.code + '_' + ccopt.field] === '其他'">
<div style="margin-top: 5px; margin-left: 20px">
其他:
<vxe-input v-model="formData[row.code + '_' + ccopt.otherField]" style="width: 200px"></vxe-input>
</div>
</template>
</template>
</div>
</template>
</template>
</div>
</div>
<template v-else>
<vxe-input
:type="item.type"
v-model="formData[row.code +'_'+ item.field]"
size="mini"
class="table-input"
:style="item.style"
>
<vxe-input :type="item.type" v-model="formData[row.code + '_' + item.field]" size="mini" class="table-input" :style="item.style">
</vxe-input>
<span class="unit"> {{ item.unit }}</span>
</template>
......@@ -212,8 +278,7 @@
</vxe-table>
<!-- 历史填报检查组件 -->
<HistoryFillCheck ref="historyFillCheckRef" v-model="historyDrawerVisible" @closeDrawer="closeHistoryDrawer"/>
<HistoryFillCheck ref="historyFillCheckRef" v-model="historyDrawerVisible" @close-drawer="closeHistoryDrawer" />
<!-- 验证公式帮助提示 -->
<div
v-if="validationTooltipVisible"
......@@ -229,816 +294,791 @@
</template>
<script lang="ts" setup>
import MultiColumnTable from '../tableComponents/MultiColumnTable.vue'
import AttachTable from '../tableComponents/AttachTable.vue'
import MyVxeTable1 from '../tableComponents/MyVxeTable.vue'
import CheckTbData from './CheckTbData.vue'
import HistoryFillCheck from './check/historyFillCheck.vue'
import { tableFormData } from '../../data/tb6.data';
import { ref, reactive,nextTick,onMounted,toRaw } from 'vue'
import { VxeUI,VxeToolbarInstance,VxeToolbarPropTypes } from 'vxe-table'
import { batchSaveOrUpdate, queryRecord,batchSaveOrUpdateBeforeDelete } from '../../record/BaosongTaskRecord.api'
import { queryAllTplItemForUser, findUserRightForTplItem } from '../../alloc/BaosongTaskAlloc.api'
import { allTplItems } from '../../tpl/BaosongTplItem.api'
import { getTblvalidFormula } from '../../tpl/BaosongDataValid.api'
import { useRoute } from 'vue-router';
const refCheckTbData = ref();
const historyFillCheckRef = ref<any>(null);
const route = useRoute();
const tableRef = ref();
const tplItemMap = ref({});
const queryParam = ref({
taskId:-1,
taskName:'',
tplId:-1,
tplName:'',
tplCode:''
})
// 权限相关状态
const userAllocItems = ref<string[]>([])
const validFormula = ref<any[]>([])
const validationResultsList = ref<any[]>([])
const drawerVisible = ref(false)
const historyDrawerVisible = ref(false)
const validationTooltipVisible = ref(false)
const validationTooltipPosition = ref({ left: 0, top: 0 })
const validationTooltipContent = ref('')
interface FormData {
id: number | null
taskid: number
tplid: number
itemid?: number
itempid?:number
content: string
tplcode:string
rind:number
}
onMounted(async ()=>{
if (route.query.taskId) {
queryParam.value.taskId = Number(route.query.taskId);
}
if (route.query.taskName) {
queryParam.value.taskName = String(route.query.taskName);
}
if (route.query.tplId) {
queryParam.value.tplId = Number(route.query.tplId);
}
if (route.query.tplName) {
queryParam.value.tplName = String(route.query.tplName);
}
if (route.query.tplCode) {
queryParam.value.tplCode = String(route.query.tplCode);
}
// 获取权限和验证公式
try {
userAllocItems.value = await findUserRightForTplItem({
tplid: queryParam.value.tplId,
taskid: queryParam.value.taskId
})
validFormula.value = await getTblvalidFormula({
tplid: queryParam.value.tplId,
})
} catch (error) {
console.error('获取权限或验证公式失败:', error)
import MultiColumnTable from '../tableComponents/MultiColumnTable.vue';
import AttachTable from '../tableComponents/AttachTable.vue';
import MyVxeTable1 from '../tableComponents/MyVxeTable.vue';
import CheckTbData from './CheckTbData.vue';
import HistoryFillCheck from './check/historyFillCheck.vue';
import { tableFormData } from '../../data/tb6.data';
import { ref, reactive, nextTick, onMounted, toRaw } from 'vue';
import { VxeUI, VxeToolbarInstance, VxeToolbarPropTypes } from 'vxe-table';
import { batchSaveOrUpdate, queryRecord, batchSaveOrUpdateBeforeDelete } from '../../record/BaosongTaskRecord.api';
import { queryAllTplItemForUser, findUserRightForTplItem } from '../../alloc/BaosongTaskAlloc.api';
import { allTplItems } from '../../tpl/BaosongTplItem.api';
import { getTblvalidFormula } from '../../tpl/BaosongDataValid.api';
import { useRoute } from 'vue-router';
const refCheckTbData = ref();
const historyFillCheckRef = ref<any>(null);
const route = useRoute();
const tableRef = ref();
const tplItemMap = ref({});
const queryParam = ref({
taskId: -1,
taskName: '',
tplId: -1,
tplName: '',
tplCode: '',
});
// 权限相关状态
const userAllocItems = ref<string[]>([]);
const validFormula = ref<any[]>([]);
const validationResultsList = ref<any[]>([]);
const drawerVisible = ref(false);
const historyDrawerVisible = ref(false);
const validationTooltipVisible = ref(false);
const validationTooltipPosition = ref({ left: 0, top: 0 });
const validationTooltipContent = ref('');
interface FormData {
id: number | null;
taskid: number;
tplid: number;
itemid?: number;
itempid?: number;
content: string;
tplcode: string;
rind: number;
}
await setTplItemMap()
await setData();
})
onMounted(async () => {
if (route.query.taskId) {
queryParam.value.taskId = Number(route.query.taskId);
}
if (route.query.taskName) {
queryParam.value.taskName = String(route.query.taskName);
}
if (route.query.tplId) {
queryParam.value.tplId = Number(route.query.tplId);
}
if (route.query.tplName) {
queryParam.value.tplName = String(route.query.tplName);
}
if (route.query.tplCode) {
queryParam.value.tplCode = String(route.query.tplCode);
}
// 获取权限和验证公式
try {
userAllocItems.value = await findUserRightForTplItem({
tplid: queryParam.value.tplId,
taskid: queryParam.value.taskId,
});
validFormula.value = await getTblvalidFormula({
tplid: queryParam.value.tplId,
});
} catch (error) {
console.error('获取权限或验证公式失败:', error);
}
const loading = ref(false)
const formData = reactive({});
await setTplItemMap();
await setData();
});
const formValues = ref<FormData[]>([])
const loading = ref(false);
const formData = reactive({});
const formValues = ref<FormData[]>([]);
const saveBatch = async () => {
try {
formValues.value = []
await getFillDatas()
if(formValues.value.length > 0) {
await batchSaveOrUpdateBeforeDelete(formValues.value)
VxeUI.modal.message({ content: '保存成功', status: 'success' })
} else {
VxeUI.modal.message({ content: '没有需要保存的数据', status: 'warning' })
const saveBatch = async () => {
try {
formValues.value = [];
await getFillDatas();
if (formValues.value.length > 0) {
await batchSaveOrUpdateBeforeDelete(formValues.value);
VxeUI.modal.message({ content: '保存成功', status: 'success' });
} else {
VxeUI.modal.message({ content: '没有需要保存的数据', status: 'warning' });
}
} catch (error) {
VxeUI.modal.message({ content: `保存失败: ${error.message}`, status: 'error' });
} finally {
loading.value = false;
}
} catch (error) {
VxeUI.modal.message({ content: `保存失败: ${error.message}`, status: 'error' })
} finally {
loading.value = false
}
}
const getFillDatas = async() => {
};
try {
formValues.value = []
const getFillDatas = async () => {
try {
formValues.value = [];
for (const strKey in formData) {
const valData = formData[strKey]
if (valData!==undefined&&valData!=="") {
let tmpAry = strKey.split("_")
await setFormValues(tmpAry[0],tmpAry[1],valData,1)
for (const strKey in formData) {
const valData = formData[strKey];
if (valData !== undefined && valData !== '') {
let tmpAry = strKey.split('_');
await setFormValues(tmpAry[0], tmpAry[1], valData, 1);
}
}
await getAttachTableFormData();
await getAllMultiTableFormData();
await getVxeTableFormData();
} catch (error) {
console.log(error);
} finally {
}
await getAttachTableFormData();
await getAllMultiTableFormData()
await getVxeTableFormData()
} catch (error) {
console.log(error)
} finally {
}
}
const childMultiTableRefs = ref({})
const setMultiColumnTableRef = (el: any, index: string) => {
if (el) {
childMultiTableRefs.value[index] = el;
}
};
};
const childMultiTableRefs = ref({});
const setMultiColumnTableRef = (el: any, index: string) => {
if (el) {
childMultiTableRefs.value[index] = el;
}
};
const getAllMultiTableFormData = async () => {
for (const pcode in childMultiTableRefs.value) {
const getAllMultiTableFormData = async () => {
for (const pcode in childMultiTableRefs.value) {
const child = childMultiTableRefs.value[pcode];
if (child) {
const datas = await child.getFormData()
let rind = 0
for(const obj of datas) {
rind++
Object.keys(obj).forEach(code => {
setFormValues(pcode,code,obj[code],rind)
});
}
const datas = await child.getFormData();
let rind = 0;
for (const obj of datas) {
rind++;
Object.keys(obj).forEach((code) => {
setFormValues(pcode, code, obj[code], rind);
});
}
}
}
};
}
};
const childAttachTableRefs = ref({})
const setAttachTableRef = (el: any, index: string) => {
if (el) {
childAttachTableRefs.value[index] = el; // 保存子组件实例
}
};
const childAttachTableRefs = ref({});
const setAttachTableRef = (el: any, index: string) => {
if (el) {
childAttachTableRefs.value[index] = el; // 保存子组件实例
}
};
const childMyVexTableRefs = ref({})
const setMyVxeTableRef = (el: any, index: string) => {
if (el) {
childMyVexTableRefs.value[index] = el; // 保存子组件实例
}
};
const childMyVexTableRefs = ref({});
const setMyVxeTableRef = (el: any, index: string) => {
if (el) {
childMyVexTableRefs.value[index] = el; // 保存子组件实例
}
};
const getAttachTableFormData = async () => {
for (const pcode in childAttachTableRefs.value) {
const getAttachTableFormData = async () => {
for (const pcode in childAttachTableRefs.value) {
const child = childAttachTableRefs.value[pcode];
if (child) {
const datas = await child.getFormData()
for(const code in datas) {
await setFormValues(pcode,code,datas[code],1)
}
const datas = await child.getFormData();
for (const code in datas) {
await setFormValues(pcode, code, datas[code], 1);
}
}
}
};
}
};
const getVxeTableFormData = async () => {
for (const pcode in childMyVexTableRefs.value) {
const getVxeTableFormData = async () => {
for (const pcode in childMyVexTableRefs.value) {
const child = childMyVexTableRefs.value[pcode];
if (child) {
const formData = await child.getFormData()
console.log("formData",formData)
let rind = 0
for(const obj of formData.datas) {
rind++
Object.keys(obj).forEach(code => {
setFormValues(pcode,code,obj[code],rind)
});
}
if(formData.footer) {
Object.keys(formData.footer).forEach(code => {
setFormValues(pcode,code,formData.footer[code],1)
});
}
const formData = await child.getFormData();
console.log('formData', formData);
let rind = 0;
for (const obj of formData.datas) {
rind++;
Object.keys(obj).forEach((code) => {
setFormValues(pcode, code, obj[code], rind);
});
}
if (formData.footer) {
Object.keys(formData.footer).forEach((code) => {
setFormValues(pcode, code, formData.footer[code], 1);
});
}
}
}
}
};
};
const setFormValues = async (pcode,code,valData,rind) => {
if(!valData) return;
let vals = Array.isArray(valData) ? valData.join(',') : valData
let strKey = pcode+"_"+code
const item = tplItemMap.value[strKey];
const { pid, itemid } = item ?? {};
let tempForm: FormData = {
id: null,
rind:rind,
taskid: queryParam.value.taskId,
tplid: queryParam.value.tplId,
tplcode: code,
itemid: itemid,
itempid: pid,
content:vals
const setFormValues = async (pcode, code, valData, rind) => {
if (!valData) return;
let vals = Array.isArray(valData) ? valData.join(',') : valData;
let strKey = pcode + '_' + code;
const item = tplItemMap.value[strKey];
const { pid, itemid } = item ?? {};
let tempForm: FormData = {
id: null,
rind: rind,
taskid: queryParam.value.taskId,
tplid: queryParam.value.tplId,
tplcode: code,
itemid: itemid,
itempid: pid,
content: vals,
};
formValues.value.push(tempForm);
};
formValues.value.push(tempForm)
}
// 校验数据
const checkData = () => {
drawerVisible.value = true
}
// 校验结果抽屉显示时触发
const handleValidationDrawerShow = () => {
performValidation()
}
// 执行校验
const performValidation = () => {
validationResultsList.value = []
const process: string[] = []
process.push('开始校验')
process.push(`找到 ${validFormula.value.length} 个验证公式`)
validFormula.value.forEach((formulaItem: any) => {
process.push(`开始校验公式: ${formulaItem.des}`)
const result = evaluateFormula(formulaItem.formula, formulaItem.des, process)
if (result) {
validationResultsList.value.push(result)
}
})
process.push('校验完成')
}
// 解析和执行验证公式
const evaluateFormula = (formula: string, description: string, process: string[]): any => {
try {
const fieldMatch = formula.match(/\[(\w+)\]/)
if (!fieldMatch) {
process.push(`跳过: 无法解析公式字段 ${formula}`)
return null
}
const fieldName = fieldMatch[1]
const row = tableFormData.find((r: any) => r.content?.some((c: any) => c.field === fieldName))
if (!row) {
process.push(`跳过: 未找到字段 ${fieldName}`)
return null
}
// 校验数据
const checkData = () => {
drawerVisible.value = true;
};
const fieldItem = row.content.find((c: any) => c.field === fieldName)
if (!fieldItem) {
process.push(`跳过: 未找到字段 ${fieldName}`)
return null
}
// 校验结果抽屉显示时触发
const handleValidationDrawerShow = () => {
performValidation();
};
const strKey = `${row.code}_${fieldName}`
const fieldValue = formData[strKey]
// 执行校验
const performValidation = () => {
validationResultsList.value = [];
const process: string[] = [];
process.push('开始校验');
process.push(`找到 ${validFormula.value.length} 个验证公式`);
validFormula.value.forEach((formulaItem: any) => {
process.push(`开始校验公式: ${formulaItem.des}`);
const result = evaluateFormula(formulaItem.formula, formulaItem.des, process);
if (result) {
validationResultsList.value.push(result);
}
});
process.push('校验完成');
};
// 检查是否有空字段规则
const emptyFieldRule = validFormula.value.find((f: any) =>
f.formula.includes(fieldName) && f.des.includes('空字段')
)
// 解析和执行验证公式
const evaluateFormula = (formula: string, description: string, process: string[]): any => {
try {
const fieldMatch = formula.match(/\[(\w+)\]/);
if (!fieldMatch) {
process.push(`跳过: 无法解析公式字段 ${formula}`);
return null;
}
if (emptyFieldRule && (!fieldValue || fieldValue === '')) {
process.push(`跳过: 字段 ${fieldName} 为空,跳过空字段规则`)
return null
}
const fieldName = fieldMatch[1];
const row = tableFormData.find((r: any) => r.content?.some((c: any) => c.field === fieldName));
if (!row) {
process.push(`跳过: 未找到字段 ${fieldName}`);
return null;
}
const expression = formula.replace(/\[(\w+)\]/g, (_, field) => {
const value = formData[`${row.code}_${field}`]
return value !== undefined ? `Number(${value})` : '0'
})
process.push(`执行公式: ${expression}`)
const isValid = eval(expression)
return {
field: fieldName,
description: description,
formula: formula,
isValid: isValid,
fieldValue: fieldValue,
rowCode: row.code
}
} catch (error) {
process.push(`公式执行错误: ${error instanceof Error ? error.message : String(error)}`)
return null
}
}
// 处理校验结果点击,定位到表格
const handleValidationResultClick = (result: any) => {
const row = tableFormData.find((r: any) => r.code === result.rowCode)
if (row) {
const fieldItem = row.content.find((c: any) => c.field === result.field)
if (fieldItem) {
const strKey = `${row.code}_${result.field}`
const inputElement = document.querySelector(`[data-field="${strKey}"]`) as HTMLElement
if (inputElement) {
inputElement.scrollIntoView({ behavior: 'smooth', block: 'center' })
inputElement.focus()
inputElement.style.border = '2px solid #ff4d4f'
setTimeout(() => {
inputElement.style.border = ''
}, 2000)
const fieldItem = row.content.find((c: any) => c.field === fieldName);
if (!fieldItem) {
process.push(`跳过: 未找到字段 ${fieldName}`);
return null;
}
}
}
}
// 显示验证公式帮助
const showValidationHelp = (formulaItem: any, event: MouseEvent) => {
const rect = (event.target as HTMLElement).getBoundingClientRect()
validationTooltipPosition.value = {
left: rect.left + rect.width / 2,
top: rect.top - 10
}
validationTooltipContent.value = `验证公式: ${formulaItem.formula}\n说明: ${formulaItem.des}`
validationTooltipVisible.value = true
}
// 关闭验证公式帮助
const closeTooltip = () => {
validationTooltipVisible.value = false
}
// 打开历史填报抽屉
const handleOpenHistoryDrawer = () => {
historyDrawerVisible.value = true
}
// 关闭历史填报抽屉
const closeHistoryDrawer = () => {
historyDrawerVisible.value = false
}
// 原有检查方法
async function checkDataOrig() {
let tplName = queryParam.value.tplName;
await getFillDatas();
if(formValues.value.length > 0) {
refCheckTbData.value.setIniData(tplName,formValues.value)
}
}
const strKey = `${row.code}_${fieldName}`;
const fieldValue = formData[strKey];
async function setData() {
try {
loading.value = true;
const taskId = queryParam.value.taskId;
const tplid = queryParam.value.tplId;
Object.keys(formData).forEach(key => delete formData[key]);
await setTplItemMap();
const recordData = await queryRecord({ taskid: taskId, tplid: tplid });
const valueObj = {};
for (const data of recordData) {
const key = `${data.itempid}_${data.itemid}_${data.rind}`;
valueObj[key] = data.content;
// 检查是否有空字段规则
const emptyFieldRule = validFormula.value.find((f: any) => f.formula.includes(fieldName) && f.des.includes('空字段'));
if (emptyFieldRule && (!fieldValue || fieldValue === '')) {
process.push(`跳过: 字段 ${fieldName} 为空,跳过空字段规则`);
return null;
}
const expression = formula.replace(/\[(\w+)\]/g, (_, field) => {
const value = formData[`${row.code}_${field}`];
return value !== undefined ? `Number(${value})` : '0';
});
process.push(`执行公式: ${expression}`);
const isValid = eval(expression);
return {
field: fieldName,
description: description,
formula: formula,
isValid: isValid,
fieldValue: fieldValue,
rowCode: row.code,
};
} catch (error) {
process.push(`公式执行错误: ${error instanceof Error ? error.message : String(error)}`);
return null;
}
const shouldSkip = (key) => {
const refsToCheck = [
childMultiTableRefs.value,
childAttachTableRefs.value,
];
for (const refs of refsToCheck) {
for (const pcode of Object.keys(refs)) {
if (key.startsWith(pcode + '_')) {
return true;
}
};
// 处理校验结果点击,定位到表格
const handleValidationResultClick = (result: any) => {
const row = tableFormData.find((r: any) => r.code === result.rowCode);
if (row) {
const fieldItem = row.content.find((c: any) => c.field === result.field);
if (fieldItem) {
const strKey = `${row.code}_${result.field}`;
const inputElement = document.querySelector(`[data-field="${strKey}"]`) as HTMLElement;
if (inputElement) {
inputElement.scrollIntoView({ behavior: 'smooth', block: 'center' });
inputElement.focus();
inputElement.style.border = '2px solid #ff4d4f';
setTimeout(() => {
inputElement.style.border = '';
}, 2000);
}
}
return false;
}
};
// 显示验证公式帮助
const showValidationHelp = (formulaItem: any, event: MouseEvent) => {
const rect = (event.target as HTMLElement).getBoundingClientRect();
validationTooltipPosition.value = {
left: rect.left + rect.width / 2,
top: rect.top - 10,
};
validationTooltipContent.value = `验证公式: ${formulaItem.formula}\n说明: ${formulaItem.des}`;
validationTooltipVisible.value = true;
};
for (const strKey of Object.keys(tplItemMap.value)) {
if (shouldSkip(strKey)) {
continue;
}
const item = tplItemMap.value[strKey];
if (!item) continue;
const { pid, itemid, formTp } = item;
const dataVal = valueObj[`${pid}_${itemid}_1`];
if (!dataVal) continue;
if (formTp === 'checkbox') {
formData[strKey] = dataVal?.split(",") || [];
} else {
formData[strKey] = dataVal || "";
}
// 关闭验证公式帮助
const closeTooltip = () => {
validationTooltipVisible.value = false;
};
// 打开历史填报抽屉
const handleOpenHistoryDrawer = () => {
historyDrawerVisible.value = true;
};
// 关闭历史填报抽屉
const closeHistoryDrawer = () => {
historyDrawerVisible.value = false;
};
// 原有检查方法
async function checkDataOrig() {
let tplName = queryParam.value.tplName;
await getFillDatas();
if (formValues.value.length > 0) {
refCheckTbData.value.setIniData(tplName, formValues.value);
}
}
async function setData() {
try {
loading.value = true;
const taskId = queryParam.value.taskId;
const tplid = queryParam.value.tplId;
Object.keys(formData).forEach((key) => delete formData[key]);
await setTplItemMap();
const recordData = await queryRecord({ taskid: taskId, tplid: tplid });
const valueObj = {};
for (const data of recordData) {
const key = `${data.itempid}_${data.itemid}_${data.rind}`;
valueObj[key] = data.content;
}
const shouldSkip = (key) => {
const refsToCheck = [childMultiTableRefs.value, childAttachTableRefs.value];
for (const refs of refsToCheck) {
for (const pcode of Object.keys(refs)) {
if (key.startsWith(pcode + '_')) {
return true;
}
}
}
return false;
};
for (const strKey of Object.keys(tplItemMap.value)) {
if (shouldSkip(strKey)) {
continue;
}
const item = tplItemMap.value[strKey];
if (!item) continue;
const { pid, itemid, formTp } = item;
const dataVal = valueObj[`${pid}_${itemid}_1`];
if (!dataVal) continue;
for (const pcode of Object.keys(childAttachTableRefs.value)) {
const child = childAttachTableRefs.value[pcode];
const matchingKeys = Object.keys(tplItemMap.value).filter(key =>
key.startsWith(pcode + '_')
);
const attachTableData = {};
for (const key of matchingKeys) {
const tmpData = tplItemMap.value[key];
if (!tmpData) continue;
const { pid, itemid, formTp, code } = tmpData;
const valueKey = `${pid}_${itemid}_1`;
if (formTp === 'checkbox') {
attachTableData[code] = valueObj[valueKey]?.split(",") || [];
formData[strKey] = dataVal?.split(',') || [];
} else {
attachTableData[code] = valueObj[valueKey] || "";
formData[strKey] = dataVal || '';
}
}
child.setFormData(attachTableData);
}
for (const pcode of Object.keys(childMultiTableRefs.value)) {
const child = childMultiTableRefs.value[pcode];
const matchingKeys = Object.keys(tplItemMap.value).filter(key =>
key.startsWith(pcode + '_')
);
const rowsMap = {};
for (const key of matchingKeys) {
const tmpData = tplItemMap.value[key];
if (!tmpData) continue;
const { pid, itemid, code } = tmpData;
const valKeys = Object.keys(valueObj).filter(k =>
k.startsWith(`${pid}_${itemid}_`)
);
for (const valKey of valKeys) {
const parts = valKey.split('_');
const rind = parts[2];
if (!rowsMap[rind]) {
rowsMap[rind] = {};
for (const pcode of Object.keys(childAttachTableRefs.value)) {
const child = childAttachTableRefs.value[pcode];
const matchingKeys = Object.keys(tplItemMap.value).filter((key) => key.startsWith(pcode + '_'));
const attachTableData = {};
for (const key of matchingKeys) {
const tmpData = tplItemMap.value[key];
if (!tmpData) continue;
const { pid, itemid, formTp, code } = tmpData;
const valueKey = `${pid}_${itemid}_1`;
if (formTp === 'checkbox') {
attachTableData[code] = valueObj[valueKey]?.split(',') || [];
} else {
attachTableData[code] = valueObj[valueKey] || '';
}
rowsMap[rind][code] = valueObj[valKey];
}
child.setFormData(attachTableData);
}
const tableDatas = Object.values(rowsMap);
nextTick();
child.setFormData(tableDatas);
}
} catch (error) {
VxeUI.modal.message({
content: `加载数据失败: ${error.message}`,
status: 'error'
});
} finally {
loading.value = false;
}
}
async function setTplItemMap() {
try {
const tplid = queryParam.value.tplId
const tplItem = await allTplItems({
tplid: tplid
})
tplItemMap.value = {}
tplItem.forEach(item => {
let strKey = item.pcode + "_" + item.xmlcode;
tplItemMap.value[strKey] = {pid:item.pid,itemid:item.id,formTp:item.formTp,code:item.xmlcode};
})
} catch (error) {
VxeUI.modal.message({ content: `加载数据失败: ${error.message}`, status: 'error' })
} finally {
for (const pcode of Object.keys(childMultiTableRefs.value)) {
const child = childMultiTableRefs.value[pcode];
const matchingKeys = Object.keys(tplItemMap.value).filter((key) => key.startsWith(pcode + '_'));
const rowsMap = {};
for (const key of matchingKeys) {
const tmpData = tplItemMap.value[key];
if (!tmpData) continue;
const { pid, itemid, code } = tmpData;
const valKeys = Object.keys(valueObj).filter((k) => k.startsWith(`${pid}_${itemid}_`));
for (const valKey of valKeys) {
const parts = valKey.split('_');
const rind = parts[2];
if (!rowsMap[rind]) {
rowsMap[rind] = {};
}
rowsMap[rind][code] = valueObj[valKey];
}
}
const tableDatas = Object.values(rowsMap);
nextTick();
child.setFormData(tableDatas);
}
} catch (error) {
VxeUI.modal.message({
content: `加载数据失败: ${error.message}`,
status: 'error',
});
} finally {
loading.value = false;
}
}
}
async function setTplItemMap() {
try {
const tplid = queryParam.value.tplId;
const tplItem = await allTplItems({
tplid: tplid,
});
tplItemMap.value = {};
tplItem.forEach((item) => {
let strKey = item.pcode + '_' + item.xmlcode;
tplItemMap.value[strKey] = { pid: item.pid, itemid: item.id, formTp: item.formTp, code: item.xmlcode };
});
} catch (error) {
VxeUI.modal.message({ content: `加载数据失败: ${error.message}`, status: 'error' });
} finally {
}
}
</script>
<style lang="less" scoped>
.bank-report-table {
font-family: "SimSun", "宋体", serif;
font-size: 12px;
color: #000;
margin: 5px auto;
width: 60%;
}
/* 加载遮罩层样式 */
.loading-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(255, 255, 255, 0.8);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
}
.loading-spinner {
display: flex;
flex-direction: column;
align-items: center;
}
.spinner {
width: 40px;
height: 40px;
border: 3px solid #f3f3f3;
border-top: 3px solid #3498db;
border-radius: 50%;
animation: spin 2s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.loading-text {
margin-top: 10px;
color: #666;
font-size: 14px;
}
/* 校验结果样式 */
.validation-results {
padding: 20px;
height: 600px;
overflow-y: auto;
}
.result-summary {
display: flex;
gap: 20px;
margin-bottom: 20px;
padding-bottom: 10px;
border-bottom: 1px solid #eee;
}
.summary-item {
display: flex;
flex-direction: column;
}
.summary-label {
font-size: 12px;
color: #666;
}
.summary-value {
font-size: 16px;
font-weight: bold;
color: #333;
}
.summary-value.success {
color: #52c41a;
}
.summary-value.error {
color: #ff4d4f;
}
.results-list {
margin-top: 10px;
}
.result-item {
padding: 10px;
margin-bottom: 8px;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.2s;
}
.result-item:hover {
background-color: #f5f5f5;
}
.result-item.success {
background-color: #f6ffed;
border-left: 4px solid #52c41a;
}
.result-item.error {
background-color: #fff2f0;
border-left: 4px solid #ff4d4f;
}
.result-field {
font-weight: bold;
margin-bottom: 5px;
}
.result-desc {
font-size: 12px;
color: #666;
margin-bottom: 5px;
}
.result-value {
font-size: 12px;
color: #999;
}
.result-error {
font-size: 12px;
color: #ff4d4f;
margin-top: 5px;
}
/* 验证公式帮助提示样式 */
.validation-tooltip {
position: absolute;
background-color: #333;
color: #fff;
padding: 10px;
border-radius: 4px;
font-size: 12px;
z-index: 1000;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
}
.tooltip-content {
margin: 0;
white-space: pre-wrap;
}
.custom-table {
width: 100%;
border: 1px solid #000;
}
.custom-table .vxe-header--column,
.custom-table .vxe-body--column {
border-right: 1px solid #000;
border-bottom: 1px solid #000;
padding: 5px;
}
.custom-table .vxe-cell {
padding: 5px;
}
.content-cell {
line-height: 1.8;
}
.table-input {
width: 80px;
margin: 0 2px;
}
.radio-group {
display: inline-block;
margin-right: 10px;
}
.checkbox-group {
display: inline-block;
margin-right: 10px;
}
.vxe-radio,
.vxe-checkbox {
margin-right:4px;
white-space: nowrap;
}
.vxe-input--inner {
height: 24px;
line-height: 24px;
padding: 0 5px;
}
.vxe-radio--label,
.vxe-checkbox--label {
font-size: 12px;
}
.vxe-radio--icon,
.vxe-checkbox--icon {
font-size: 12px;
}
.vxe-radio-group,
.vxe-checkbox-group {
display: inline-block;
}
.bank-report-table {
font-family: "SimSun", "宋体", serif;
font-size: 12px;
color: #000;
margin: 5px auto;
width: 90%;
}
.custom-table {
width: 100%;
border: 1px solid #000;
}
.custom-table .vxe-header--column,
.custom-table .vxe-body--column {
border-right: 1px solid #000;
border-bottom: 1px solid #000;
padding: 5px;
}
.content-cell {
line-height: 1.8;
}
.table-input {
width: 150px;
margin: 0 2px;
}
.radio-group {
display: inline-block;
margin-right: 10px;
}
.checkbox-group {
display: inline-block;
margin-right: 10px;
}
.vxe-radio,
.vxe-checkbox {
margin-right: 8px;
white-space: nowrap;
}
/* 附件样式 */
.attachments {
margin-top: 20px;
width: 100%;
}
.attachments h4 {
font-size: 14px;
font-weight: bold;
margin-bottom: 10px;
}
.attachment-table {
width: 100%;
border: 1px solid #000;
}
.attachment-table .vxe-header--column,
.attachment-table .vxe-body--column {
border-right: 1px solid #000;
border-bottom: 1px solid #000;
padding: 5px;
}
.vxe-input {
border-bottom: 1px solid #333;
text-align: center;
margin: 5px 3px;
padding: 0;
border-top: none;
border-left: none;
border-right: none;
background: transparent;
}
blockquote {
padding: 0px 5px;
color: black;
cursor: pointer;
}
</style>
\ No newline at end of file
.bank-report-table {
font-family: 'SimSun', '宋体', serif;
font-size: 12px;
color: #000;
margin: 5px auto;
width: 60%;
}
/* 加载遮罩层样式 */
.loading-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(255, 255, 255, 0.8);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
}
.loading-spinner {
display: flex;
flex-direction: column;
align-items: center;
}
.spinner {
width: 40px;
height: 40px;
border: 3px solid #f3f3f3;
border-top: 3px solid #3498db;
border-radius: 50%;
animation: spin 2s linear infinite;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.loading-text {
margin-top: 10px;
color: #666;
font-size: 14px;
}
/* 校验结果样式 */
.validation-results {
padding: 20px;
height: 600px;
overflow-y: auto;
}
.result-summary {
display: flex;
gap: 20px;
margin-bottom: 20px;
padding-bottom: 10px;
border-bottom: 1px solid #eee;
}
.summary-item {
display: flex;
flex-direction: column;
}
.summary-label {
font-size: 12px;
color: #666;
}
.summary-value {
font-size: 16px;
font-weight: bold;
color: #333;
}
.summary-value.success {
color: #52c41a;
}
.summary-value.error {
color: #ff4d4f;
}
.results-list {
margin-top: 10px;
}
.result-item {
padding: 10px;
margin-bottom: 8px;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.2s;
}
.result-item:hover {
background-color: #f5f5f5;
}
.result-item.success {
background-color: #f6ffed;
border-left: 4px solid #52c41a;
}
.result-item.error {
background-color: #fff2f0;
border-left: 4px solid #ff4d4f;
}
.result-field {
font-weight: bold;
margin-bottom: 5px;
}
.result-desc {
font-size: 12px;
color: #666;
margin-bottom: 5px;
}
.result-value {
font-size: 12px;
color: #999;
}
.result-error {
font-size: 12px;
color: #ff4d4f;
margin-top: 5px;
}
/* 验证公式帮助提示样式 */
.validation-tooltip {
position: absolute;
background-color: #333;
color: #fff;
padding: 10px;
border-radius: 4px;
font-size: 12px;
z-index: 1000;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
}
.tooltip-content {
margin: 0;
white-space: pre-wrap;
}
.custom-table {
width: 100%;
border: 1px solid #000;
}
.custom-table .vxe-header--column,
.custom-table .vxe-body--column {
border-right: 1px solid #000;
border-bottom: 1px solid #000;
padding: 5px;
}
.custom-table .vxe-cell {
padding: 5px;
}
.content-cell {
line-height: 1.8;
}
.table-input {
width: 80px;
margin: 0 2px;
}
.radio-group {
display: inline-block;
margin-right: 10px;
}
.checkbox-group {
display: inline-block;
margin-right: 10px;
}
.vxe-radio,
.vxe-checkbox {
margin-right: 4px;
white-space: nowrap;
}
.vxe-input--inner {
height: 24px;
line-height: 24px;
padding: 0 5px;
}
.vxe-radio--label,
.vxe-checkbox--label {
font-size: 12px;
}
.vxe-radio--icon,
.vxe-checkbox--icon {
font-size: 12px;
}
.vxe-radio-group,
.vxe-checkbox-group {
display: inline-block;
}
.bank-report-table {
font-family: 'SimSun', '宋体', serif;
font-size: 12px;
color: #000;
margin: 5px auto;
width: 90%;
}
.custom-table {
width: 100%;
border: 1px solid #000;
}
.custom-table .vxe-header--column,
.custom-table .vxe-body--column {
border-right: 1px solid #000;
border-bottom: 1px solid #000;
padding: 5px;
}
.content-cell {
line-height: 1.8;
}
.table-input {
width: 150px;
margin: 0 2px;
}
.radio-group {
display: inline-block;
margin-right: 10px;
}
.checkbox-group {
display: inline-block;
margin-right: 10px;
}
.vxe-radio,
.vxe-checkbox {
margin-right: 8px;
white-space: nowrap;
}
/* 附件样式 */
.attachments {
margin-top: 20px;
width: 100%;
}
.attachments h4 {
font-size: 14px;
font-weight: bold;
margin-bottom: 10px;
}
.attachment-table {
width: 100%;
border: 1px solid #000;
}
.attachment-table .vxe-header--column,
.attachment-table .vxe-body--column {
border-right: 1px solid #000;
border-bottom: 1px solid #000;
padding: 5px;
}
.vxe-input {
border-bottom: 1px solid #333;
text-align: center;
margin: 5px 3px;
padding: 0;
border-top: none;
border-left: none;
border-right: none;
background: transparent;
}
blockquote {
padding: 0px 5px;
color: black;
cursor: pointer;
}
</style>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论