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

更新tb6字段

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