Commit 152036a7ab5f9250c874eb8be138f62cfca04a5a

Authored by YunaiV
1 parent d5fe12eb

fix(fms): 补齐报表模板及默认公式修正

sql/mysql/upgrade/20260926-fms-report-template.sql 0 → 100644
  1 +INSERT IGNORE INTO `fms_report_template` (`id`, `name`, `row_no`, `formula`, `remark`, `editable`, `sort`, `row_id`, `type`, `category`, `create_time`, `level`) VALUES
  2 +(1, '流动资产:', 0, '[]', NULL, 0, 0, 0, 1, NULL, '2021-09-18 16:39:40', 1),
  3 +(2, '流动负债:', 0, '[]', NULL, 0, 32, 0, 1, NULL, '2021-09-18 16:39:40', 1),
  4 +(3, '货币资金', 1, '[{"operator":"+","rules":0,"subjectId":1331,"subjectName":"库存现金","subjectNumber":"1001"},{"operator":"+","rules":0,"subjectId":1332,"subjectName":"银行存款","subjectNumber":"1002"},{"operator":"+","rules":0,"subjectId":1333,"subjectName":"其他货币资金","subjectNumber":"1012"}]', NULL, 1, 1, 1, 1, NULL, '2021-09-18 16:39:40', 2),
  5 +(4, '短期借款', 31, '[{"operator":"+","rules":0,"subjectId":1375,"subjectName":"短期借款","subjectNumber":"2001"}]', NULL, 1, 33, 1, 1, NULL, '2021-09-18 16:39:40', 2),
  6 +(5, '短期投资', 2, '[{"operator":"+","rules":0,"subjectId":1334,"subjectName":"短期投资","subjectNumber":"1101"}]', NULL, 1, 2, 2, 1, NULL, '2021-09-18 16:39:40', 2),
  7 +(6, '应付票据', 32, '[{"operator":"+","rules":0,"subjectId":1376,"subjectName":"应付票据","subjectNumber":"2201"}]', NULL, 1, 34, 2, 1, NULL, '2021-09-18 16:39:40', 2),
  8 +(7, '应收票据', 3, '[{"operator":"+","rules":0,"subjectId":1339,"subjectName":"应收票据","subjectNumber":"1121"}]', NULL, 1, 3, 3, 1, NULL, '2021-09-18 16:39:40', 2),
  9 +(8, '应付账款', 33, '[{"operator":"+","rules":4,"subjectId":1341,"subjectName":"预付账款","subjectNumber":"1123"},{"operator":"+","rules":4,"subjectId":1377,"subjectName":"应付账款","subjectNumber":"2202"}]', NULL, 1, 35, 3, 1, NULL, '2021-09-18 16:39:40', 2),
  10 +(9, '应收账款', 4, '[{"operator":"+","rules":3,"subjectId":1340,"subjectName":"应收账款","subjectNumber":"1122"},{"operator":"+","rules":3,"subjectId":1378,"subjectName":"预收账款","subjectNumber":"2203"}]', NULL, 1, 4, 4, 1, NULL, '2021-09-18 16:39:40', 2),
  11 +(10, '预收账款', 34, '[{"operator":"+","rules":4,"subjectId":1340,"subjectName":"应收账款","subjectNumber":"1122"},{"operator":"+","rules":4,"subjectId":1378,"subjectName":"预收账款","subjectNumber":"2203"}]', NULL, 1, 36, 4, 1, NULL, '2021-09-18 16:39:40', 2),
  12 +(11, '预付账款', 5, '[{"operator":"+","rules":3,"subjectId":1341,"subjectName":"预付账款","subjectNumber":"1123"},{"operator":"+","rules":3,"subjectId":1377,"subjectName":"应付账款","subjectNumber":"2202"}]', NULL, 1, 5, 5, 1, NULL, '2021-09-18 16:39:40', 2),
  13 +(12, '应付职工薪酬', 35, '[{"operator":"+","rules":0,"subjectId":1379,"subjectName":"应付职工薪酬","subjectNumber":"2211"}]', NULL, 1, 37, 5, 1, NULL, '2021-09-18 16:39:40', 2),
  14 +(13, '应收股利', 6, '[{"operator":"+","rules":0,"subjectId":1342,"subjectName":"应收股利","subjectNumber":"1131"}]', NULL, 1, 6, 6, 1, NULL, '2021-09-18 16:39:40', 2),
  15 +(14, '应交税费', 36, '[{"operator":"+","rules":0,"subjectId":1393,"subjectName":" 应交税费","subjectNumber":"2221"}]', NULL, 1, 38, 6, 1, NULL, '2021-09-18 16:39:40', 2),
  16 +(15, '应收利息', 7, '[{"operator":"+","rules":0,"subjectId":1343,"subjectName":"应收利息","subjectNumber":"1132"}]', NULL, 1, 7, 7, 1, NULL, '2021-09-18 16:39:40', 2),
  17 +(16, '应付利息', 37, '[{"operator":"+","rules":0,"subjectId":1412,"subjectName":"应付利息","subjectNumber":"2231"}]', NULL, 1, 39, 7, 1, NULL, '2021-09-18 16:39:40', 2),
  18 +(17, '其他应收款', 8, '[{"operator":"+","rules":0,"subjectId":1344,"subjectName":"其他应收款","subjectNumber":"1221"}]', NULL, 1, 8, 8, 1, NULL, '2021-09-18 16:39:40', 2),
  19 +(18, '应付利润', 38, '[{"operator":"+","rules":0,"subjectId":1413,"subjectName":"应付利润","subjectNumber":"2232"}]', NULL, 1, 40, 8, 1, NULL, '2021-09-18 16:39:41', 2),
  20 +(19, '存货', 9, '[{"operator":"+","rules":0,"subjectId":1345,"subjectName":"材料采购","subjectNumber":"1401"},{"operator":"+","rules":0,"subjectId":1346,"subjectName":"在途物资","subjectNumber":"1402"},{"operator":"+","rules":0,"subjectId":1347,"subjectName":"原材料","subjectNumber":"1403"},{"operator":"+","rules":0,"subjectId":1348,"subjectName":"材料成本差异","subjectNumber":"1404"},{"operator":"+","rules":0,"subjectId":1349,"subjectName":"库存商品","subjectNumber":"1405"},{"operator":"-","rules":0,"subjectId":1350,"subjectName":"商品进销差价","subjectNumber":"1407"},{"operator":"+","rules":0,"subjectId":1351,"subjectName":"委托加工物资","subjectNumber":"1408"},{"operator":"+","rules":0,"subjectId":1352,"subjectName":"周转材料","subjectNumber":"1411"},{"operator":"+","rules":0,"subjectId":1353,"subjectName":"消耗性生物资产","subjectNumber":"1421"},{"operator":"+","rules":0,"subjectId":1437,"subjectName":"生产成本","subjectNumber":"4001"},{"operator":"+","rules":0,"subjectId":1440,"subjectName":"制造费用","subjectNumber":"4101"},{"operator":"+","rules":0,"subjectId":1442,"subjectName":"工程施工","subjectNumber":"4401"},{"operator":"+","rules":0,"subjectId":1443,"subjectName":"机械作业","subjectNumber":"4403"}]', NULL, 1, 9, 9, 1, NULL, '2021-09-18 16:39:41', 2),(20, '其他应付款', 39, '[{"operator":"+","rules":0,"subjectId":1414,"subjectName":"其他应付款","subjectNumber":"2241"}]', NULL, 1, 41, 9, 1, NULL, '2021-09-18 16:39:41', 2),
  21 +(21, '其中:原材料', 10, '[{"operator":"+","rules":0,"subjectId":1347,"subjectName":"原材料","subjectNumber":"1403"}]', NULL, 1, 10, 10, 1, NULL, '2021-09-18 16:39:41', 2),
  22 +(22, '其他流动负债', 40, '[{"operator":"+","rules":0,"subjectId":1396,"subjectName":"待转销项税额","subjectNumber":"222106"}]', NULL, 1, 42, 10, 1, NULL, '2021-09-18 16:39:41', 2),
  23 +(23, '在产品', 11, '[{"operator":"+","rules":0,"subjectId":1437,"subjectName":"生产成本","subjectNumber":"4001"},{"operator":"+","rules":0,"subjectId":1440,"subjectName":"制造费用","subjectNumber":"4101"},{"operator":"+","rules":0,"subjectId":1442,"subjectName":"工程施工","subjectNumber":"4401"},{"operator":"+","rules":0,"subjectId":1443,"subjectName":"机械作业","subjectNumber":"4403"}]', NULL, 1, 11, 11, 1, NULL, '2021-09-18 16:39:41', 2),
  24 +(24, '流动负债合计', 41, '["L31+L32+L33+L34+L35+L36+L37+L38+L39+L40"]', NULL, 0, 43, 11, 1, NULL, '2021-09-18 16:39:41', 1),
  25 +(25, '库存商品', 12, '[{"operator":"+","rules":0,"subjectId":1349,"subjectName":"库存商品","subjectNumber":"1405"}]', NULL, 1, 12, 12, 1, NULL, '2021-09-18 16:39:41', 2),
  26 +(26, '非流动负债:', 0, '[]', NULL, 0, 44, 12, 1, NULL, '2021-09-18 16:39:41', 1),
  27 +(27, '周转材料', 13, '[{"operator":"+","rules":0,"subjectId":1352,"subjectName":"周转材料","subjectNumber":"1411"}]', NULL, 1, 13, 13, 1, NULL, '2021-09-18 16:39:41', 2),
  28 +(28, '长期借款', 42, '[{"operator":"+","rules":0,"subjectId":1416,"subjectName":"长期借款","subjectNumber":"2501"}]', NULL, 1, 45, 13, 1, NULL, '2021-09-18 16:39:41', 2),
  29 +(29, '其他流动资产', 14, '[{"operator":"+","rules":0,"subjectId":1394,"subjectName":"待抵扣进项税额","subjectNumber":"222104"},{"operator":"+","rules":0,"subjectId":1395,"subjectName":"待认证进项税额","subjectNumber":"222105"},{"operator":"+","rules":1,"subjectId":1392,"subjectName":"未交增值税","subjectNumber":"222102"},{"operator":"+","rules":0,"subjectId":1397,"subjectName":"增值税留抵税额","subjectNumber":"222107"}]', NULL, 1, 14, 14, 1, NULL, '2021-09-18 16:39:41', 2),
  30 +(30, '长期应付款', 43, '[{"operator":"+","rules":0,"subjectId":1417,"subjectName":"长期应付款","subjectNumber":"2701"}]', NULL, 1, 46, 14, 1, NULL, '2021-09-18 16:39:41', 2),
  31 +(31, '流动资产合计', 15, '["L1+L2+L3+L4+L5+L6+L7+L8+L9+L14"]', NULL, 0, 15, 15, 1, NULL, '2021-09-18 16:39:41', 1),
  32 +(32, '递延收益', 44, '[{"operator":"+","rules":0,"subjectId":1415,"subjectName":"递延收益","subjectNumber":"2401"}]', NULL, 1, 47, 15, 1, NULL, '2021-09-18 16:39:41', 2),
  33 +(33, '非流动资产:', 0, '[]', NULL, 0, 16, 16, 1, NULL, '2021-09-18 16:39:41', 1),
  34 +(34, '其他非流动负债', 45, '[]', NULL, 0, 48, 16, 1, NULL, '2021-09-18 16:39:41', 2),
  35 +(35, '长期债券投资', 16, '[{"operator":"+","rules":0,"subjectId":1354,"subjectName":"长期债券投资","subjectNumber":"1501"}]', NULL, 1, 17, 17, 1, NULL, '2021-09-18 16:39:41', 2),
  36 +(36, '非流动负债合计', 46, '["L42+L43+L44+L45"]', NULL, 0, 49, 17, 1, NULL, '2021-09-18 16:39:41', 1),
  37 +(37, '长期股权投资', 17, '[{"operator":"+","rules":0,"subjectId":1357,"subjectName":"长期股权投资","subjectNumber":"1511"}]', NULL, 1, 18, 18, 1, NULL, '2021-09-18 16:39:41', 2),
  38 +(38, '负债合计', 47, '["L41+L46"]', NULL, 0, 50, 18, 1, NULL, '2021-09-18 16:39:41', 1),
  39 +(39, '固定资产原价', 18, '[{"operator":"+","rules":0,"subjectId":1360,"subjectName":"固定资产","subjectNumber":"1601"}]', NULL, 1, 19, 19, 1, NULL, '2021-09-18 16:39:41', 2),
  40 +(40, '减:累计折旧', 19, '[{"operator":"+","rules":0,"subjectId":1361,"subjectName":"累计折旧","subjectNumber":"1602"}]', NULL, 1, 20, 20, 1, NULL, '2021-09-18 16:39:41', 2),
  41 +(41, '固定资产账面价值', 20, '["L18-L19"]', NULL, 0, 21, 21, 1, NULL, '2021-09-18 16:39:41', 2),
  42 +(42, '在建工程', 21, '[{"operator":"+","rules":0,"subjectId":1362,"subjectName":"在建工程","subjectNumber":"1604"}]', NULL, 1, 22, 22, 1, NULL, '2021-09-18 16:39:41', 2),
  43 +(43, '工程物资', 22, '[{"operator":"+","rules":0,"subjectId":1367,"subjectName":"工程物资","subjectNumber":"1605"}]', NULL, 1, 23, 23, 1, NULL, '2021-09-18 16:39:41', 2),
  44 +(44, '固定资产清理', 23, '[{"operator":"+","rules":0,"subjectId":1368,"subjectName":"固定资产清理","subjectNumber":"1606"}]', NULL, 1, 24, 24, 1, NULL, '2021-09-18 16:39:41', 2),
  45 +(45, '生产性生物资产', 24, '[{"operator":"+","rules":0,"subjectId":1369,"subjectName":"生产性生物资产","subjectNumber":"1621"},{"operator":"-","rules":0,"subjectId":1370,"subjectName":"生产性生物资产累计折旧","subjectNumber":"1622"}]', NULL, 1, 25, 25, 1, NULL, '2021-09-18 16:39:41', 2),(46, '所有者权益(或股东权益):', 0, '[]', NULL, 0, 51, 25, 1, NULL, '2021-09-18 16:39:41', 1),
  46 +(47, '无形资产', 25, '[{"operator":"+","rules":0,"subjectId":1371,"subjectName":"无形资产","subjectNumber":"1701"},{"operator":"-","rules":0,"subjectId":1372,"subjectName":"累计摊销","subjectNumber":"1702"}]', NULL, 1, 26, 26, 1, NULL, '2021-09-18 16:39:41', 2),(48, '实收资本(或股本)', 48, '[{"operator":"+","rules":0,"subjectId":1418,"subjectName":"实收资本","subjectNumber":"3001"}]', NULL, 1, 52, 26, 1, NULL, '2021-09-18 16:39:41', 2),
  47 +(49, '开发支出', 26, '[{"operator":"+","rules":0,"subjectId":1441,"subjectName":"研发支出","subjectNumber":"4301"}]', NULL, 1, 27, 27, 1, NULL, '2021-09-18 16:39:41', 2),
  48 +(50, '资本公积', 49, '[{"operator":"+","rules":0,"subjectId":1419,"subjectName":"资本公积","subjectNumber":"3002"}]', NULL, 1, 53, 27, 1, NULL, '2021-09-18 16:39:41', 2),
  49 +(51, '长期待摊费用', 27, '[{"operator":"+","rules":0,"subjectId":1373,"subjectName":"长期待摊费用","subjectNumber":"1801"}]', NULL, 1, 28, 28, 1, NULL, '2021-09-18 16:39:41', 2),
  50 +(52, '盈余公积', 50, '[{"operator":"+","rules":0,"subjectId":1424,"subjectName":"盈余公积","subjectNumber":"3101"}]', NULL, 1, 54, 28, 1, NULL, '2021-09-18 16:39:41', 2),
  51 +(53, '其他非流动资产', 28, '[{"operator":"+","rules":0,"subjectId":1374,"subjectName":"待处理财产损溢","subjectNumber":"1901"}]', NULL, 1, 29, 29, 1, NULL, '2021-09-18 16:39:41', 2),
  52 +(54, '未分配利润', 51, '[{"operator":"+","rules":0,"subjectId":1428,"subjectName":"本年利润","subjectNumber":"3103"},{"operator":"+","rules":0,"subjectId":1429,"subjectName":"利润分配","subjectNumber":"3104"}]', NULL, 1, 55, 29, 1, NULL, '2021-09-18 16:39:41', 2),
  53 +(55, '非流动资产合计', 29, '["L16+L17+L20+L21+L22+L23+L24+L25+L26+L27+L28"]', NULL, 0, 30, 30, 1, NULL, '2021-09-18 16:39:41', 1),
  54 +(56, '所有者权益(或股东权益)合计', 52, '["L48+L49+L50+L51"]', NULL, 0, 56, 30, 1, NULL, '2021-09-18 16:39:41', 1),
  55 +(57, '资产总计', 30, '["L15+L29"]', NULL, 0, 31, 31, 1, NULL, '2021-09-18 16:39:41', 1),
  56 +(58, '负债和所有者权益(或股东权益)总计', 53, '["L47+L52"]', NULL, 0, 57, 31, 1, NULL, '2021-09-18 16:39:41', 1),
  57 +(59, '一、营业收入', 1, '[{"operator":"+","rules":6,"subjectId":1444,"subjectName":"主营业务收入","subjectNumber":"5001"},{"operator":"+","rules":6,"subjectId":1445,"subjectName":"其他业务收入","subjectNumber":"5051"}]', NULL, 1, 0, NULL, 2, NULL, '2021-09-18 16:39:56', 1),
  58 +(60, '减:营业成本', 2, '[{"operator":"+","rules":5,"subjectId":1453,"subjectName":"主营业务成本","subjectNumber":"5401"},{"operator":"+","rules":5,"subjectId":1454,"subjectName":"其他业务成本","subjectNumber":"5402"}]', NULL, 1, 1, NULL, 2, NULL, '2021-09-18 16:39:56', 2),
  59 +(61, '税金及附加', 3, '[{"operator":"+","rules":5,"subjectId":1455,"subjectName":"税金及附加","subjectNumber":"5403"}]', NULL, 1, 2, NULL, 2, NULL, '2021-09-18 16:39:56', 2),
  60 +(62, '其中:消费税', 4, '[{"operator":"+","rules":5,"subjectId":1456,"subjectName":"消费税","subjectNumber":"540301"}]', NULL, 1, 3, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  61 +(63, '城市维护建设税', 6, '[{"operator":"+","rules":5,"subjectId":1457,"subjectName":"城市维护建设税","subjectNumber":"540303"}]', NULL, 1, 4, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  62 +(64, '资源税', 7, '[{"operator":"+","rules":5,"subjectId":1458,"subjectName":"资源税","subjectNumber":"540304"}]', NULL, 1, 5, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  63 +(65, '土地增值税', 8, '[{"operator":"+","rules":5,"subjectId":1459,"subjectName":"土地增值税","subjectNumber":"540305"}]', NULL, 1, 6, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  64 +(66, '城镇土地使用税、房产税、车船税、印花税', 9, '[{"operator":"+","rules":5,"subjectId":1460,"subjectName":"城镇土地使用税","subjectNumber":"540306"},{"operator":"+","rules":5,"subjectId":1462,"subjectName":"车船税","subjectNumber":"540308"},{"operator":"+","rules":5,"subjectId":1461,"subjectName":"房产税","subjectNumber":"540307"},{"operator":"+","rules":5,"subjectId":1463,"subjectName":"印花税","subjectNumber":"540309"}]', NULL, 1, 7, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  65 +(67, '教育费附加、矿产资源补偿费、排污费', 10, '[{"operator":"+","rules":5,"subjectId":1466,"subjectName":"排污费","subjectNumber":"540312"},{"operator":"+","rules":5,"subjectId":1465,"subjectName":"矿产资源补偿费","subjectNumber":"540311"},{"operator":"+","rules":5,"subjectId":1464,"subjectName":"教育费附加","subjectNumber":"540310"}]', NULL, 1, 8, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  66 +(68, '销售费用', 11, '[{"operator":"+","rules":5,"subjectId":1468,"subjectName":"销售费用","subjectNumber":"5601"}]', NULL, 1, 9, NULL, 2, NULL, '2021-09-18 16:39:56', 2),
  67 +(69, '其中:商品维修费', 12, '[{"operator":"+","rules":5,"subjectId":1483,"subjectName":"商品维修费","subjectNumber":"560115"}]', NULL, 1, 10, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  68 +(70, '广告费和业务宣传费', 13, '[{"operator":"+","rules":5,"subjectId":1484,"subjectName":"广告和业务宣传费","subjectNumber":"560116"}]', NULL, 1, 11, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  69 +(71, '管理费用', 14, '[{"operator":"+","rules":5,"subjectId":1486,"subjectName":"管理费用","subjectNumber":"5602"}]', NULL, 1, 12, NULL, 2, NULL, '2021-09-18 16:39:56', 2),
  70 +(72, '其中:开办费', 15, '[{"operator":"+","rules":5,"subjectId":1499,"subjectName":"开办费","subjectNumber":"560213"}]', NULL, 1, 13, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  71 +(73, '业务招待费', 16, '[{"operator":"+","rules":5,"subjectId":1491,"subjectName":"交际应酬费","subjectNumber":"560205"}]', NULL, 1, 14, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  72 +(74, '研究费用', 17, '[{"operator":"+","rules":5,"subjectId":1501,"subjectName":"研究费用","subjectNumber":"560215"}]', NULL, 1, 15, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  73 +(75, '财务费用', 18, '[{"operator":"+","rules":5,"subjectId":1503,"subjectName":"财务费用","subjectNumber":"5603"}]', NULL, 1, 16, NULL, 2, NULL, '2021-09-18 16:39:56', 2),
  74 +(76, '其中:利息费用(收入以“-”号填列)', 19, '[{"operator":"+","rules":5,"subjectId":1505,"subjectName":"利息","subjectNumber":"560302"}]', NULL, 1, 17, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  75 +(77, '加:投资收益(损失以“-”号填列)', 20, '[{"operator":"+","rules":6,"subjectId":1446,"subjectName":"投资收益","subjectNumber":"5111"}]', NULL, 1, 18, NULL, 2, NULL, '2021-09-18 16:39:56', 2),
  76 +(78, '二、营业利润(亏损以“-”号填列)', 21, '["L1-L2-L3-L11-L14-L18+L20"]', NULL, 0, 19, NULL, 2, NULL, '2021-09-18 16:39:56', 1),(79, '加:营业外收入', 22, '[{"operator":"+","rules":6,"subjectId":1447,"subjectName":"营业外收入","subjectNumber":"5301"}]', NULL, 1, 20, NULL, 2, NULL, '2021-09-18 16:39:56', 2),
  77 +(80, '其中:政府补助', 23, '[{"operator":"+","rules":6,"subjectId":1449,"subjectName":"政府补助","subjectNumber":"530102"}]', NULL, 1, 21, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  78 +(81, '减:营业外支出', 24, '[{"operator":"+","rules":5,"subjectId":1508,"subjectName":"营业外支出","subjectNumber":"5711"}]', NULL, 1, 22, NULL, 2, NULL, '2021-09-18 16:39:56', 2),
  79 +(82, '其中:坏账损失', 25, '[{"operator":"+","rules":5,"subjectId":1511,"subjectName":"坏账损失","subjectNumber":"571103"}]', NULL, 1, 23, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  80 +(83, '无法收回的长期债券投资损失', 26, '[{"operator":"+","rules":5,"subjectId":1512,"subjectName":"无法收回的长期债券投资损失","subjectNumber":"571104"}]', NULL, 1, 24, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  81 +(84, '无法收回的长期股权投资损失', 27, '[{"operator":"+","rules":5,"subjectId":1513,"subjectName":"无法收回的长期股权投资损失","subjectNumber":"571105"}]', NULL, 1, 25, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  82 +(85, '自然灾害等不可抗力因素造成的损失', 28, '[{"operator":"+","rules":5,"subjectId":1514,"subjectName":"自然灾害等不可抗力造成的损失","subjectNumber":"571106"}]', NULL, 1, 26, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  83 +(86, '税收滞纳金', 29, '[{"operator":"+","rules":5,"subjectId":1515,"subjectName":"税收滞纳金","subjectNumber":"571107"}]', NULL, 1, 27, NULL, 2, NULL, '2021-09-18 16:39:56', 3),
  84 +(87, '三、利润总额(亏损总额以“-”号填列)', 30, '["L21+L22-L24"]', NULL, 0, 28, NULL, 2, NULL, '2021-09-18 16:39:56', 1),
  85 +(88, '减:所得税费用', 31, '[{"operator":"+","rules":5,"subjectId":1519,"subjectName":"所得税费用","subjectNumber":"5801"}]', NULL, 1, 29, NULL, 2, NULL, '2021-09-18 16:39:56', 2),
  86 +(89, '四、净利润(净亏损以“-”号填列)', 32, '["L30-L31"]', NULL, 0, 30, NULL, 2, NULL, '2021-09-18 16:39:56', 1);
  87 +
  88 +INSERT IGNORE INTO `fms_report_template` (`id`, `name`, `row_no`, `formula`, `remark`, `editable`, `sort`, `row_id`, `type`, `category`, `create_time`, `level`) VALUES
  89 +(90, '一、经营活动产生的现金流量:', 0, '[]', NULL, 0, 0, 0, 3, 1, '2021-09-18 16:39:59', 1),
  90 +(91, '销售产成品、商品、提供劳务收到的现金', 1, '["IN1-((BA[3,2]-BA[3,1])+(BA[4,2]-BA[4,1])-(BA[34,2]-BA[34,1]))+EX5+EX11"]', NULL, 0, 1, 1, 3, 1, '2021-09-18 16:39:59', 2),
  91 +(92, '收到其他与经营活动有关的现金', 2, '["((IN22-(BA[8,2]-BA[8,1])) < 0 ? 0 : (IN22-(BA[8,2]-BA[8,1])))"]', NULL, 0, 2, 2, 3, 1, '2021-09-18 16:39:59', 2),
  92 +(93, '购买原材料、商品、接受劳务支付的现金', 3, '["IN2+(BA[9,2]-BA[9,1])-(BA[32,2]-BA[32,1])-(BA[33,2]-BA[33,1])+(BA[5,2]-BA[5,1])+EX6"]', NULL, 0, 3, 3, 3, 1, '2021-09-18 16:39:59', 2),
  93 +(94, '支付的职工薪酬', 4, '["EX4"]', NULL, 0, 4, 4, 3, 1, '2021-09-18 16:39:59', 2),
  94 +(95, '支付的税费', 5, '["EX12-(BA[36,2]-BA[36,1])"]', NULL, 0, 5, 5, 3, 1, '2021-09-18 16:39:59', 2),
  95 +(96, '支付其他与经营活动有关的现金', 6, '["(((IN24+IN14+IN11+IN18+IN3+IN19)-(EX15+EX16+EX4+EX18+EX14+EX17+EX13+EX10+EX9+EX8-EX19)+(BA[14,2]-BA[14,1])-(BA[39,2]-BA[39,1]-(BA[35,2]-BA[35,1])-(BA[40,2]-BA[40,1]))) < 0 ? 0 : ((IN24+IN14+IN11+IN18+IN3+IN19)-(EX15+EX16+EX4+EX18+EX14+EX17+EX13+EX10+EX9+EX8-EX19)+(BA[14,2]-BA[14,1])-(BA[39,2]-BA[39,1]-(BA[35,2]-BA[35,1])-(BA[40,2]-BA[40,1]))))"]', NULL, 0, 6, 6, 3, 1, '2021-09-18 16:39:59', 2),
  96 +(97, '经营活动产生的现金流量净额', 7, '["L1+L2-L3-L4-L5-L6"]', NULL, 0, 7, 7, 3, 1, '2021-09-18 16:39:59', 2),
  97 +(98, '二、投资活动产生的现金流量:', 0, '[]', NULL, 0, 8, 8, 3, 1, '2021-09-18 16:39:59', 1),
  98 +(99, '收回短期投资、长期债券投资和长期股权投资收到的现金', 8, '["((BA[2,2]-BA[2,1])+(BA[16,2]-BA[16,1])+(BA[17,2]-BA[17,1]))*(-1) < 0 ? 0 : ((BA[2,2]-BA[2,1])+(BA[16,2]-BA[16,1])+(BA[17,2]-BA[17,1]))*(-1)"]', NULL, 0, 9, 9, 3, 1, '2021-09-18 16:39:59', 2),
  99 +(100, '取得投资收益收到的现金', 9, '["IN20-((BA[7,2]-BA[7,1])+(BA[6,2]-BA[6,1]))"]', NULL, 0, 10, 10, 3, 1, '2021-09-18 16:39:59', 2),
  100 +(101, '处置固定资产、无形资产和其他非流动资产收回的现金净额', 10, '[]', NULL, 0, 11, 11, 3, 1, '2021-09-18 16:39:59', 2),
  101 +(102, '短期投资、长期债券投资和长期股权投资支付的现金', 11, '["(((BA[2,2]-BA[2,1])+(BA[16,2]-BA[16,1])+(BA[17,2]-BA[17,1]))*(-1)) < 0 ? (((BA[2,2]-BA[2,1])+(BA[16,2]-BA[16,1])+(BA[17,2]-BA[17,1]))*(-1))*(-1) : 0"]', NULL, 0, 12, 12, 3, 1, '2021-09-18 16:39:59', 2),
  102 +(103, '购建固定资产、无形资产和其他非流动资产支付的现金', 12, '["((BA[21,2]-BA[21,1])+(BA[20,2]-BA[20,1])+(BA[25,2]-BA[25,1])+(BA[28,2]-BA[28,1])+(BA[23,2]-BA[23,1])+(BA[22,2]-BA[22,1])+(BA[26,2]-BA[26,1])+(BA[27,2]-BA[27,1])+(BA[24,2]-BA[24,1]))+(EX15+EX16+EX18)+(EX13+EX17)"]', NULL, 0, 13, 13, 3, 1, '2021-09-18 16:39:59', 2),
  103 +(104, '投资活动产生的现金流量净额', 13, '["L8+L9+L10-L11-L12"]', NULL, 0, 14, 14, 3, 1, '2021-09-18 16:39:59', 2),
  104 +(105, '三、筹资活动产生的现金流量:', 0, '[]', NULL, 0, 15, 15, 3, 1, '2021-09-18 16:39:59', 1),
  105 +(106, '取得借款收到的现金', 14, '["((BA[31,2]-BA[31,1])+(BA[42,2]-BA[42,1])+(BA[43,2]-BA[43,1])+(BA[44,2]-BA[44,1])+(BA[45,2]-BA[45,1])) < 0 ? 0 : ((BA[31,2]-BA[31,1])+(BA[42,2]-BA[42,1])+(BA[43,2]-BA[43,1])+(BA[44,2]-BA[44,1])+(BA[45,2]-BA[45,1]))"]', NULL, 0, 16, 16, 3, 1, '2021-09-18 16:39:59', 2),
  106 +(107, '吸收投资者投资收到的现金', 15, '["(BA[48,2]-BA[48,1])+(BA[49,2]-BA[49,1])+(BA[50,2]-BA[50,1])"]', NULL, 0, 17, 17, 3, 1, '2021-09-18 16:39:59', 2),
  107 +(108, '偿还借款本金支付的现金', 16, '["((BA[31,2]-BA[31,1])+(BA[42,2]-BA[42,1])+(BA[43,2]-BA[43,1])+(BA[44,2]-BA[44,1])+(BA[45,2]-BA[45,1])) < 0 ? ((BA[31,2]-BA[31,1])+(BA[42,2]-BA[42,1])+(BA[43,2]-BA[43,1])+(BA[44,2]-BA[44,1])+(BA[45,2]-BA[45,1]))*(-1) : 0"]', NULL, 0, 18, 18, 3, 1, '2021-09-18 16:39:59', 2),
  108 +(109, '偿还借款利息支付的现金', 17, '["IN19-(BA[37,2]-BA[37,1])"]', NULL, 0, 19, 19, 3, 1, '2021-09-18 16:39:59', 2),
  109 +(110, '分配利润支付的现金', 18, '["IN32-((BA[38,2]-BA[38,1])+(BA[51,2]-BA[51,1]))"]', NULL, 0, 20, 20, 3, 1, '2021-09-18 16:39:59', 2),
  110 +(111, '筹资活动产生的现金流量净额', 19, '["L14+L15-L16-L17-L18"]', NULL, 0, 21, 21, 3, 1, '2021-09-18 16:39:59', 2),(112, '四、现金净增加额', 20, '["L7+L13+L19"]', NULL, 0, 22, 22, 3, 1, '2021-09-18 16:39:59', 1),
  111 +(113, '加:期初现金余额', 21, '["BA[1,1]"]', NULL, 0, 23, 23, 3, 1, '2021-09-18 16:39:59', 2),
  112 +(114, '五、期末现金余额', 22, '["L20+L21"]', NULL, 0, 24, 24, 3, 1, '2021-09-18 16:39:59', 1);
  113 +
  114 +INSERT IGNORE INTO `fms_report_template` (`id`, `name`, `row_no`, `formula`, `remark`, `editable`, `sort`, `row_id`, `type`, `category`, `create_time`, `level`) VALUES
  115 +(115, '支付给职工的工资', 1, '[{"operator":"+","rules":5,"subjectId":1379,"subjectName":"应付职工薪酬","subjectNumber":"2211"}]', NULL, 1, 0, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  116 +(116, '支付给职工的四金', 2, '[]', NULL, 1, 1, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  117 +(117, '支付给职工的其他福利费', 3, '[]', NULL, 1, 2, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  118 +(118, '支付给职工以及为职工支付的现金', 4, '["L1+L2+L3"]', '行 1、2、3 之和,参与现金流量表行 4 计算', 0, 3, NULL, 4, 1, '2021-09-18 16:40:02', 2),
  119 +(119, '销项税额(小规模纳税人填本年累计应交增值税)', 5, '[{"operator":"+","rules":6,"subjectId":1388,"subjectName":"销项税额","subjectNumber":"22210107"}]', '参与现金流量表行 1 计算', 1, 4, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  120 +(120, '进项税额(小规模纳税人不填此项)', 6, '[{"operator":"+","rules":5,"subjectId":1382,"subjectName":"进项税额","subjectNumber":"22210101"}]', '参与现金流量表行 3 计算', 1, 5, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  121 +(121, '应交增值税', 7, '["L5-L6"]', '行 5、6 之差', 0, 6, NULL, 4, 1, '2021-09-18 16:40:02', 2),
  122 +(122, '主营业务税金及附加', 8, '[{"operator":"+","rules":7,"subjectId":1455,"subjectName":"税金及附加","subjectNumber":"5403"}]', '参与现金流量表行 6 计算', 1, 7, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  123 +(123, '所得税', 9, '[{"operator":"+","rules":7,"subjectId":1519,"subjectName":"所得税费用","subjectNumber":"5801"}]', '参与现金流量表行 6 计算', 1, 8, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  124 +(124, '管理费用中列支的税金', 10, '[]', '参与现金流量表行 6 计算', 1, 9, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  125 +(125, '在其他业务支出中列支的税金', 11, '[]', '参与现金流量表行 1 计算', 1, 10, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  126 +(126, '应缴纳各项税金合计', 12, '["L7+L8+L9+L10+L11"]', '行 7、8、9、10、11 之和,参与现金流量表行 5 计算', 0, 11, NULL, 4, 1, '2021-09-18 16:40:02', 2),
  127 +(127, '计提固定资产折旧', 13, '[{"operator":"+","rules":6,"subjectId":1370,"subjectName":"生产性生物资产累计折旧","subjectNumber":"1622"},{"operator":"+","rules":6,"subjectId":1361,"subjectName":"累计折旧","subjectNumber":"1602"}]', '参与现金流量表行 6、12 计算', 1, 12, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  128 +(128, '利息支出', 14, '[{"operator":"+","rules":7,"subjectId":1505,"subjectName":"利息","subjectNumber":"560302"}]', '参与现金流量表行 6 计算', 1, 13, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  129 +(129, '无形资产摊销', 15, '[]', '参与现金流量表行 6、12 计算', 1, 14, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  130 +(130, '长期待摊费用摊销', 16, '[]', '参与现金流量表行 6、12 计算', 1, 15, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  131 +(131, '计提的各项减值准备(仅反映本年与上年计提的差额)', 17, '[]', '参与现金流量表行 12 计算', 1, 16, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  132 +(132, '处置固定资产、无形资产和其他长期资产的损失(减:收益)', 18, '[]', '参与现金流量表行 6、12 计算', 1, 17, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  133 +(133, '汇兑收益(减:汇兑损失)', 19, '[]', '参与现金流量表行 6 计算', 1, 18, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  134 +(134, '不涉及现金收支的投资活动', 20, '[]', '参与现金流量表行 8 计算', 1, 19, NULL, 4, 1, '2021-09-18 16:40:02', 1),
  135 +(135, '不涉及现金收支的筹资活动', 21, '[]', '参与现金流量表行 15 计算', 1, 20, NULL, 4, 1, '2021-09-18 16:40:02', 1);
  136 +
  137 +-- 修正旧版默认公式;仅匹配原始公式,保留用户自定义内容
  138 +UPDATE `fms_report_template` SET `formula` = '[{"operator":"+","rules":0,"subjectId":1345,"subjectName":"材料采购","subjectNumber":"1401"},{"operator":"+","rules":0,"subjectId":1346,"subjectName":"在途物资","subjectNumber":"1402"},{"operator":"+","rules":0,"subjectId":1347,"subjectName":"原材料","subjectNumber":"1403"},{"operator":"+","rules":0,"subjectId":1348,"subjectName":"材料成本差异","subjectNumber":"1404"},{"operator":"+","rules":0,"subjectId":1349,"subjectName":"库存商品","subjectNumber":"1405"},{"operator":"-","rules":0,"subjectId":1350,"subjectName":"商品进销差价","subjectNumber":"1407"},{"operator":"+","rules":0,"subjectId":1351,"subjectName":"委托加工物资","subjectNumber":"1408"},{"operator":"+","rules":0,"subjectId":1352,"subjectName":"周转材料","subjectNumber":"1411"},{"operator":"+","rules":0,"subjectId":1353,"subjectName":"消耗性生物资产","subjectNumber":"1421"},{"operator":"+","rules":0,"subjectId":1437,"subjectName":"生产成本","subjectNumber":"4001"},{"operator":"+","rules":0,"subjectId":1440,"subjectName":"制造费用","subjectNumber":"4101"},{"operator":"+","rules":0,"subjectId":1442,"subjectName":"工程施工","subjectNumber":"4401"},{"operator":"+","rules":0,"subjectId":1443,"subjectName":"机械作业","subjectNumber":"4403"}]' WHERE `id` = 19 AND `formula` = '[{"operator":"+","rules":0,"subjectId":1345,"subjectName":"材料采购","subjectNumber":"1401"},{"operator":"+","rules":0,"subjectId":1346,"subjectName":"在途物资","subjectNumber":"1402"},{"operator":"+","rules":0,"subjectId":1347,"subjectName":"原材料","subjectNumber":"1403"},{"operator":"+","rules":0,"subjectId":1348,"subjectName":"材料成本差异","subjectNumber":"1404"},{"operator":"+","rules":0,"subjectId":1349,"subjectName":"库存商品","subjectNumber":"1405"},{"operator":"+","rules":0,"subjectId":1350,"subjectName":"商品进销差价","subjectNumber":"1407"},{"operator":"+","rules":0,"subjectId":1351,"subjectName":"委托加工物资","subjectNumber":"1408"},{"operator":"+","rules":0,"subjectId":1352,"subjectName":"周转材料","subjectNumber":"1411"},{"operator":"+","rules":0,"subjectId":1353,"subjectName":"消耗性生物资产","subjectNumber":"1421"},{"operator":"+","rules":0,"subjectId":1437,"subjectName":"生产成本","subjectNumber":"4001"},{"operator":"+","rules":0,"subjectId":1440,"subjectName":"制造费用","subjectNumber":"4101"},{"operator":"+","rules":0,"subjectId":1442,"subjectName":"工程施工","subjectNumber":"4401"},{"operator":"+","rules":0,"subjectId":1443,"subjectName":"机械作业","subjectNumber":"4403"}]';
  139 +UPDATE `fms_report_template` SET `formula` = '[{"operator":"+","rules":0,"subjectId":1369,"subjectName":"生产性生物资产","subjectNumber":"1621"},{"operator":"-","rules":0,"subjectId":1370,"subjectName":"生产性生物资产累计折旧","subjectNumber":"1622"}]' WHERE `id` = 45 AND `formula` = '[{"operator":"+","rules":0,"subjectId":1369,"subjectName":"生产性生物资产","subjectNumber":"1621"},{"operator":"+","rules":0,"subjectId":1370,"subjectName":"生产性生物资产累计折旧","subjectNumber":"1622"}]';
  140 +UPDATE `fms_report_template` SET `formula` = '[{"operator":"+","rules":0,"subjectId":1371,"subjectName":"无形资产","subjectNumber":"1701"},{"operator":"-","rules":0,"subjectId":1372,"subjectName":"累计摊销","subjectNumber":"1702"}]' WHERE `id` = 47 AND `formula` = '[{"operator":"+","rules":0,"subjectId":1371,"subjectName":"无形资产","subjectNumber":"1701"},{"operator":"+","rules":0,"subjectId":1372,"subjectName":"累计摊销","subjectNumber":"1702"}]';
  141 +UPDATE `fms_report_template` SET `formula` = '["L1-L2-L3-L11-L14-L18+L20"]' WHERE `id` = 78 AND `formula` = '["L1-L2-L3-L11-L14-L18"]';
  142 +UPDATE `fms_report_template` SET `formula` = '["L14+L15-L16-L17-L18"]' WHERE `id` = 111 AND `formula` = '["L14+L15-L17-L18"]';
... ...
yudao-module-fms/src/test/java/cn/iocoder/yudao/module/fms/service/report/FmsReportTemplateServiceTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.fms.service.report;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.module.fms.controller.admin.ledger.vo.subjectbalance.FmsLedgerSubjectBalanceRespVO;
  6 +import cn.iocoder.yudao.module.fms.controller.admin.report.vo.FmsReportItemRespVO;
  7 +import cn.iocoder.yudao.module.fms.controller.admin.report.vo.FmsReportListReqVO;
  8 +import cn.iocoder.yudao.module.fms.controller.admin.report.vo.balance.FmsBalanceSheetRowRespVO;
  9 +import cn.iocoder.yudao.module.fms.dal.dataobject.config.FmsAccountSetDO;
  10 +import cn.iocoder.yudao.module.fms.dal.dataobject.config.FmsSubjectDO;
  11 +import cn.iocoder.yudao.module.fms.dal.dataobject.report.FmsReportTemplateDO;
  12 +import cn.iocoder.yudao.module.fms.dal.mysql.report.FmsReportTemplateMapper;
  13 +import cn.iocoder.yudao.module.fms.enums.report.FmsReportTypeEnum;
  14 +import cn.iocoder.yudao.module.fms.service.closing.FmsClosingPeriodService;
  15 +import cn.iocoder.yudao.module.fms.service.closing.FmsClosingSchemeService;
  16 +import cn.iocoder.yudao.module.fms.service.closing.FmsClosingVoucherService;
  17 +import cn.iocoder.yudao.module.fms.service.config.FmsAccountSetService;
  18 +import cn.iocoder.yudao.module.fms.service.config.FmsFinanceParameterService;
  19 +import cn.iocoder.yudao.module.fms.service.config.FmsInitialBalanceService;
  20 +import cn.iocoder.yudao.module.fms.service.config.FmsSubjectService;
  21 +import cn.iocoder.yudao.module.fms.service.ledger.FmsLedgerService;
  22 +import cn.iocoder.yudao.module.fms.service.voucher.FmsVoucherService;
  23 +import jakarta.annotation.Resource;
  24 +import org.junit.jupiter.api.BeforeEach;
  25 +import org.junit.jupiter.api.Test;
  26 +import org.springframework.context.annotation.Import;
  27 +import org.springframework.core.io.FileSystemResource;
  28 +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
  29 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
  30 +
  31 +import javax.sql.DataSource;
  32 +import java.math.BigDecimal;
  33 +import java.time.LocalDateTime;
  34 +import java.util.ArrayList;
  35 +import java.util.Collections;
  36 +import java.util.List;
  37 +
  38 +import static org.junit.jupiter.api.Assertions.assertEquals;
  39 +import static org.junit.jupiter.api.Assertions.assertNotNull;
  40 +import static org.mockito.ArgumentMatchers.any;
  41 +import static org.mockito.ArgumentMatchers.eq;
  42 +import static org.mockito.Mockito.when;
  43 +
  44 +@Import({FmsBalanceSheetServiceImpl.class, FmsIncomeStatementServiceImpl.class,
  45 + FmsCashFlowStatementServiceImpl.class, FmsReportCommonServiceImpl.class})
  46 +public class FmsReportTemplateServiceTest extends BaseDbUnitTest {
  47 +
  48 + @Resource
  49 + private DataSource dataSource;
  50 + @Resource
  51 + private FmsReportTemplateMapper reportTemplateMapper;
  52 + @Resource
  53 + private FmsBalanceSheetServiceImpl balanceSheetService;
  54 + @Resource
  55 + private FmsIncomeStatementServiceImpl incomeStatementService;
  56 + @Resource
  57 + private FmsCashFlowStatementServiceImpl cashFlowStatementService;
  58 +
  59 + @MockitoBean
  60 + private FmsAccountSetService accountSetService;
  61 + @MockitoBean
  62 + private FmsSubjectService subjectService;
  63 + @MockitoBean
  64 + private FmsLedgerService ledgerService;
  65 + @MockitoBean
  66 + private FmsFinanceParameterService financeParameterService;
  67 + @MockitoBean
  68 + private FmsInitialBalanceService initialBalanceService;
  69 + @MockitoBean
  70 + private FmsClosingPeriodService closingPeriodService;
  71 + @MockitoBean
  72 + private FmsClosingSchemeService closingSchemeService;
  73 + @MockitoBean
  74 + private FmsClosingVoucherService closingVoucherService;
  75 + @MockitoBean
  76 + private FmsVoucherService voucherService;
  77 +
  78 + private final List<FmsSubjectDO> subjects = new ArrayList<>();
  79 + private final List<FmsLedgerSubjectBalanceRespVO> balances = new ArrayList<>();
  80 +
  81 + @BeforeEach
  82 + public void before() {
  83 + // 初始化报表模板
  84 + initializeTemplates();
  85 + // mock 账套、科目和账簿余额
  86 + FmsAccountSetDO accountSet = new FmsAccountSetDO().setId(1L).setInitialized(true)
  87 + .setStartTime(LocalDateTime.of(2026, 1, 1, 0, 0));
  88 + when(accountSetService.validateAccountSetReadPermission(1L, 10L)).thenReturn(accountSet);
  89 + when(subjectService.getSubjectList(1L, null, 10L)).thenReturn(subjects);
  90 + when(ledgerService.getSubjectBalanceList(any(), eq(10L))).thenReturn(balances);
  91 + }
  92 +
  93 + @Test
  94 + public void testInitializeTemplates_repeatExecution() {
  95 + // mock 数据:模拟用户修改已有报表公式
  96 + FmsReportTemplateDO template = CollUtil.findOne(
  97 + reportTemplateMapper.selectListByType(FmsReportTypeEnum.INCOME_STATEMENT.getType()),
  98 + item -> Integer.valueOf(21).equals(item.getRowNo()));
  99 + reportTemplateMapper.updateById(new FmsReportTemplateDO().setId(template.getId()).setFormula("[\"L1\"]"));
  100 +
  101 + // 调用
  102 + initializeTemplates();
  103 +
  104 + // 断言
  105 + assertEquals(58, reportTemplateMapper.selectListByType(FmsReportTypeEnum.BALANCE_SHEET.getType()).size());
  106 + assertEquals(31, reportTemplateMapper.selectListByType(FmsReportTypeEnum.INCOME_STATEMENT.getType()).size());
  107 + assertEquals(25, reportTemplateMapper.selectListByType(FmsReportTypeEnum.CASH_FLOW_STATEMENT.getType()).size());
  108 + assertEquals(21, reportTemplateMapper.selectListByType(FmsReportTypeEnum.CASH_FLOW_ADJUSTMENT.getType()).size());
  109 + assertEquals(135, reportTemplateMapper.selectCount());
  110 + assertEquals("[\"L1\"]", reportTemplateMapper.selectById(template.getId()).getFormula());
  111 + }
  112 +
  113 + @Test
  114 + public void testInitializeTemplates_preserveExistingFormulas() {
  115 + // mock 数据:模拟旧版报表公式
  116 + List<FmsReportTemplateDO> templates = new ArrayList<>();
  117 + for (FmsReportTemplateDO template : reportTemplateMapper.selectList()) {
  118 + String oldFormula;
  119 + if (FmsReportTypeEnum.BALANCE_SHEET.getType().equals(template.getType()) && (template.getRowNo() == 9
  120 + || template.getRowNo() == 24 || template.getRowNo() == 25)) {
  121 + oldFormula = template.getFormula().replace("\"operator\":\"-\"", "\"operator\":\"+\"");
  122 + } else if (FmsReportTypeEnum.INCOME_STATEMENT.getType().equals(template.getType())
  123 + && template.getRowNo() == 21) {
  124 + oldFormula = "[\"L1-L2-L3-L11-L14-L18\"]";
  125 + } else if (FmsReportTypeEnum.CASH_FLOW_STATEMENT.getType().equals(template.getType())
  126 + && template.getRowNo() == 19) {
  127 + oldFormula = "[\"L14+L15-L17-L18\"]";
  128 + } else {
  129 + continue;
  130 + }
  131 + templates.add(template);
  132 + reportTemplateMapper.updateById(new FmsReportTemplateDO().setId(template.getId()).setFormula(oldFormula));
  133 + }
  134 +
  135 + // 调用
  136 + initializeTemplates();
  137 +
  138 + // 断言
  139 + assertEquals(5, templates.size());
  140 + for (FmsReportTemplateDO template : templates) {
  141 + assertEquals(template.getFormula(), reportTemplateMapper.selectById(template.getId()).getFormula());
  142 + }
  143 + assertEquals(135, reportTemplateMapper.selectCount());
  144 + }
  145 +
  146 + @Test
  147 + public void testInitializeTemplates_preserveLegacySubjectIds() {
  148 + // mock 数据:模拟使用历史科目编号的公式
  149 + FmsReportTemplateDO template = CollUtil.findOne(
  150 + reportTemplateMapper.selectListByType(FmsReportTypeEnum.BALANCE_SHEET.getType()),
  151 + item -> Integer.valueOf(25).equals(item.getRowNo()));
  152 + String oldFormula = "[{\"operator\":\"+\",\"rules\":0,\"subjectId\":1371,"
  153 + + "\"subjectName\":\"无形资产\",\"subjectNumber\":\"1701\"},"
  154 + + "{\"operator\":\"+\",\"rules\":0,\"subjectId\":1372,"
  155 + + "\"subjectName\":\"累计摊销\",\"subjectNumber\":\"1702\"}]";
  156 + reportTemplateMapper.updateById(new FmsReportTemplateDO().setId(template.getId()).setFormula(oldFormula));
  157 +
  158 + // 调用
  159 + initializeTemplates();
  160 +
  161 + // 断言
  162 + assertEquals(template.getFormula(), reportTemplateMapper.selectById(template.getId()).getFormula());
  163 + }
  164 +
  165 + @Test
  166 + public void testGetBalanceSheet_capitalContribution() {
  167 + // mock 数据:投入资本 100 元
  168 + mockSubjectBalance("1001", 1, 0, 100, 100, 0);
  169 + mockSubjectBalance("3001", 2, 0, -100, 0, 100);
  170 +
  171 + // 准备参数
  172 + FmsReportListReqVO reqVO = buildQueryReqVO();
  173 +
  174 + // 调用
  175 + List<FmsBalanceSheetRowRespVO> balanceSheet = balanceSheetService.getBalanceSheet(reqVO, 10L);
  176 + List<FmsReportItemRespVO> cashFlow = cashFlowStatementService.getCashFlowStatement(reqVO, 10L);
  177 +
  178 + // 断言
  179 + assertAssetAmount(balanceSheet, 30, 100);
  180 + FmsBalanceSheetRowRespVO total = CollUtil.findOne(balanceSheet,
  181 + row -> Integer.valueOf(53).equals(row.getLiabilityRowNo()));
  182 + assertNotNull(total);
  183 + assertAmount(100, total.getLiabilityClosingAmount());
  184 + assertItemAmount(cashFlow, 15, 100);
  185 + assertItemAmount(cashFlow, 22, 100);
  186 + }
  187 +
  188 + @Test
  189 + public void testGetBalanceSheet_inventoryAndContraAccounts() {
  190 + // mock 数据:存货、固定资产、无形资产及其备抵科目
  191 + mockSubjectBalance("1403", 1, 0, 30, 30, 0);
  192 + mockSubjectBalance("1407", 2, 0, -5, 0, 5);
  193 + mockSubjectBalance("1621", 1, 0, 100, 100, 0);
  194 + mockSubjectBalance("1622", 2, 0, -20, 0, 20);
  195 + mockSubjectBalance("1701", 1, 0, 100, 100, 0);
  196 + mockSubjectBalance("1702", 2, 0, -10, 0, 10);
  197 +
  198 + // 准备参数
  199 + FmsReportListReqVO reqVO = buildQueryReqVO();
  200 +
  201 + // 调用
  202 + List<FmsBalanceSheetRowRespVO> result = balanceSheetService.getBalanceSheet(reqVO, 10L);
  203 +
  204 + // 断言
  205 + assertAssetAmount(result, 9, 25);
  206 + assertAssetAmount(result, 24, 80);
  207 + assertAssetAmount(result, 25, 90);
  208 + assertAssetAmount(result, 30, 195);
  209 + }
  210 +
  211 + @Test
  212 + public void testGetCashFlowStatement_creditSale() {
  213 + // mock 数据:赊销 100 元并结转利润,尚未收款
  214 + mockSubjectBalance("1001", 1, 0, 0, 0, 0);
  215 + mockSubjectBalance("1122", 1, 0, 100, 100, 0);
  216 + mockSubjectBalance("5001", 2, 0, 0, 0, 100);
  217 + mockSubjectBalance("3103", 2, 0, -100, 0, 100);
  218 +
  219 + // 准备参数
  220 + FmsReportListReqVO reqVO = buildQueryReqVO();
  221 +
  222 + // 调用
  223 + List<FmsReportItemRespVO> incomeItems = incomeStatementService.getIncomeStatement(reqVO, 10L);
  224 + List<FmsReportItemRespVO> result = cashFlowStatementService.getCashFlowStatement(reqVO, 10L);
  225 +
  226 + // 断言
  227 + assertItemAmount(incomeItems, 1, 100);
  228 + assertItemAmount(result, 1, 0);
  229 + assertItemAmount(result, 6, 0);
  230 + assertItemAmount(result, 20, 0);
  231 + assertItemAmount(result, 22, 0);
  232 + }
  233 +
  234 + @Test
  235 + public void testGetCashFlowStatement_purchaseInventory() {
  236 + // mock 数据:期初现金 100 元,支付 40 元购入原材料
  237 + mockSubjectBalance("1001", 1, 100, 60, 0, 40);
  238 + mockSubjectBalance("1403", 1, 0, 40, 40, 0);
  239 + mockSubjectBalance("3001", 2, -100, -100, 0, 0);
  240 +
  241 + // 准备参数
  242 + FmsReportListReqVO reqVO = buildQueryReqVO();
  243 +
  244 + // 调用
  245 + List<FmsReportItemRespVO> result = cashFlowStatementService.getCashFlowStatement(reqVO, 10L);
  246 +
  247 + // 断言
  248 + assertItemAmount(result, 3, 40);
  249 + assertItemAmount(result, 6, 0);
  250 + assertItemAmount(result, 20, -40);
  251 + assertItemAmount(result, 22, 60);
  252 + }
  253 +
  254 + @Test
  255 + public void testGetCashFlowStatement_payWagesAndIncomeTax() {
  256 + // mock 数据:计提并支付工资 30 元、所得税 10 元,期末应付款为零
  257 + mockSubjectBalance("1001", 1, 100, 60, 0, 40);
  258 + mockSubjectBalance("3001", 2, -100, -100, 0, 0);
  259 + mockSubjectBalance("3103", 2, 0, 40, 40, 0);
  260 + mockSubjectBalance("5602", 1, 0, 0, 30, 0);
  261 + mockSubjectBalance("5801", 1, 0, 0, 10, 0);
  262 + mockSubjectBalance("2211", 2, 0, 0, 30, 30);
  263 + mockSubjectBalance("2221", 2, 0, 0, 10, 10);
  264 +
  265 + // 准备参数
  266 + FmsReportListReqVO reqVO = buildQueryReqVO();
  267 +
  268 + // 调用
  269 + List<FmsReportItemRespVO> result = cashFlowStatementService.getCashFlowStatement(reqVO, 10L);
  270 +
  271 + // 断言
  272 + assertItemAmount(result, 4, 30);
  273 + assertItemAmount(result, 5, 10);
  274 + assertItemAmount(result, 6, 0);
  275 + assertItemAmount(result, 20, -40);
  276 + assertItemAmount(result, 22, 60);
  277 + }
  278 +
  279 + @Test
  280 + public void testGetCashFlowStatement_repayLoan() {
  281 + // mock 数据:期初现金 100 元,偿还借款 30 元
  282 + mockSubjectBalance("1001", 1, 100, 70, 0, 30);
  283 + mockSubjectBalance("2001", 2, -100, -70, 30, 0);
  284 +
  285 + // 准备参数
  286 + FmsReportListReqVO reqVO = buildQueryReqVO();
  287 +
  288 + // 调用
  289 + List<FmsReportItemRespVO> result = cashFlowStatementService.getCashFlowStatement(reqVO, 10L);
  290 +
  291 + // 断言
  292 + assertItemAmount(result, 16, 30);
  293 + assertItemAmount(result, 19, -30);
  294 + assertItemAmount(result, 6, 0);
  295 + assertItemAmount(result, 22, 70);
  296 + }
  297 +
  298 + @Test
  299 + public void testGetIncomeStatement_investmentIncomeAndNonOperatingExpense() {
  300 + // mock 数据:投资收益 20 元,营业外支出 5 元
  301 + mockSubjectBalance("5111", 2, 0, -20, 0, 20);
  302 + mockSubjectBalance("5711", 1, 0, 5, 5, 0);
  303 +
  304 + // 准备参数
  305 + FmsReportListReqVO reqVO = buildQueryReqVO();
  306 +
  307 + // 调用
  308 + List<FmsReportItemRespVO> result = incomeStatementService.getIncomeStatement(reqVO, 10L);
  309 +
  310 + // 断言
  311 + assertItemAmount(result, 20, 20);
  312 + assertItemAmount(result, 21, 20);
  313 + assertItemAmount(result, 24, 5);
  314 + assertItemAmount(result, 32, 15);
  315 + }
  316 +
  317 + /**
  318 + * 执行报表模板升级脚本
  319 + */
  320 + private void initializeTemplates() {
  321 + new ResourceDatabasePopulator(new FileSystemResource("../sql/mysql/upgrade/20260926-fms-report-template.sql"))
  322 + .execute(dataSource);
  323 + }
  324 +
  325 + /**
  326 + * 模拟科目余额和发生额:余额借方为正、贷方为负,发生额已扣除损益结转数据
  327 + */
  328 + private void mockSubjectBalance(String code, int direction, int opening, int closing, int debit, int credit) {
  329 + Long id = Long.valueOf(code);
  330 + subjects.add(new FmsSubjectDO().setId(id).setAccountSetId(1L).setCode(code).setName(code)
  331 + .setLevel(1).setBalanceDirection(direction));
  332 + balances.add(new FmsLedgerSubjectBalanceRespVO().setSubjectId(id).setSubjectCode(code)
  333 + .setOpeningDebitAmount(BigDecimal.valueOf(Math.max(opening, 0)))
  334 + .setOpeningCreditAmount(BigDecimal.valueOf(Math.max(-opening, 0)))
  335 + .setEndingDebitAmount(BigDecimal.valueOf(Math.max(closing, 0)))
  336 + .setEndingCreditAmount(BigDecimal.valueOf(Math.max(-closing, 0)))
  337 + .setPeriodDebitAmount(BigDecimal.valueOf(debit)).setPeriodCreditAmount(BigDecimal.valueOf(credit))
  338 + .setYearDebitAmount(BigDecimal.valueOf(debit)).setYearCreditAmount(BigDecimal.valueOf(credit))
  339 + .setChildren(Collections.emptyList()));
  340 + }
  341 +
  342 + /**
  343 + * 构造 2026 年 8 月的报表查询参数
  344 + */
  345 + private FmsReportListReqVO buildQueryReqVO() {
  346 + FmsReportListReqVO reqVO = new FmsReportListReqVO();
  347 + reqVO.setAccountSetId(1L);
  348 + reqVO.setStartMonth("2026-08");
  349 + reqVO.setEndMonth("2026-08");
  350 + return reqVO;
  351 + }
  352 +
  353 + /**
  354 + * 断言报表指定行的本期和本年金额
  355 + */
  356 + private void assertItemAmount(List<FmsReportItemRespVO> rows, int rowNo, int expected) {
  357 + FmsReportItemRespVO item = CollUtil.findOne(rows, row -> Integer.valueOf(rowNo).equals(row.getRowNo()));
  358 + assertNotNull(item);
  359 + assertAmount(expected, item.getCurrentAmount());
  360 + assertAmount(expected, item.getYearAmount());
  361 + }
  362 +
  363 + /**
  364 + * 断言资产负债表指定行的资产期末余额
  365 + */
  366 + private void assertAssetAmount(List<FmsBalanceSheetRowRespVO> rows, int rowNo, int expected) {
  367 + FmsBalanceSheetRowRespVO item = CollUtil.findOne(rows,
  368 + row -> Integer.valueOf(rowNo).equals(row.getAssetRowNo()));
  369 + assertNotNull(item);
  370 + assertAmount(expected, item.getAssetClosingAmount());
  371 + }
  372 +
  373 + /**
  374 + * 按数值比较金额,忽略 BigDecimal 的小数位数差异
  375 + */
  376 + private void assertAmount(int expected, BigDecimal actual) {
  377 + assertNotNull(actual);
  378 + assertEquals(0, BigDecimal.valueOf(expected).compareTo(actual), "实际金额:" + actual);
  379 + }
  380 +
  381 +}
... ...