Files
education/frontend/node_modules/.cache/vue-loader/4afb635d918fc775537104e495546124.json
T

1 line
104 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"remainingRequest":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\textbook\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\textbook\\index.vue","mtime":1787640892029},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\babel-loader\\lib\\index.js","mtime":1787309793142},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js","mtime":1787309793790}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJw0KaW1wb3J0IHsNCiAgbGlzdFRlYWNoaW5nTWF0ZXJpYWwsDQogIGdldFRlYWNoaW5nTWF0ZXJpYWxCeUlkLA0KICBhZGRUZWFjaGluZ01hdGVyaWFsLA0KICB1cGRhdGVUZWFjaGluZ01hdGVyaWFsLA0KICBkZWxldGVUZWFjaGluZ01hdGVyaWFsLA0KICBkb3dubG9hZFRlYWNoaW5nTWF0ZXJpYWxUZW1wbGF0ZSwNCiAgaW1wb3J0VGVhY2hpbmdNYXRlcmlhbA0KfSBmcm9tICdAL2FwaS90ZXh0Ym9vay90ZWFjaGluZ01hdGVyaWFsJw0KaW1wb3J0IHsNCiAgbGlzdFRlYWNoaW5nU3RvY2ssDQogIGdldFRlYWNoaW5nU3RvY2ssDQogIGFkZFRlYWNoaW5nU3RvY2ssDQogIHVwZGF0ZVRlYWNoaW5nU3RvY2ssDQogIGRlbGV0ZVRlYWNoaW5nU3RvY2ssDQogIGxpc3RUZWFjaGluZ1N0b2NrRGV0YWlsLA0KICBnZXRUZWFjaGluZ1N0b2NrRGV0YWlsLA0KICBhZGRUZWFjaGluZ1N0b2NrRGV0YWlsLA0KICB1cGRhdGVUZWFjaGluZ1N0b2NrRGV0YWlsLA0KICBkZWxldGVUZWFjaGluZ1N0b2NrRGV0YWlsDQp9IGZyb20gJ0AvYXBpL3RleHRib29rL3RlYWNoaW5nU3RvY2snDQoNCmV4cG9ydCBkZWZhdWx0IHsNCiAgbmFtZTogJ1RleHRib29rSW5kZXgnLA0KICBkYXRhKCkgew0KICAgIHJldHVybiB7DQogICAgICBhY3RpdmVUYWI6ICdpbmZvJywNCg0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5p+l6K+i6KGo5Y2V77yI5LuF5ZCO56uvIE1hcHBlciDmlK/mjIHnmoTlrZfmrrXvvIkgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIHNlYXJjaEZvcm06IHsNCiAgICAgICAgYmg6ICcnLCBtYzogJycsIHp6OiAnJywgY2JzOiAnJywgaXNibjogJycsDQogICAgICAgIGpjZmw6ICcnLCBqY2x4OiAnJywgdHlUeXBlOiAnJw0KICAgICAgfSwNCg0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5LiL5ouJ6YCJ6aG5ID09PT09PT09PT09PT09PT09PT09DQogICAgICBqY2ZsT3B0aW9uczogWyfln7rmnKzmlZnmnZAnLCAn6L6F5Yqp5pWZ5p2QJywgJ+WPguiAg+i1hOaWmSddLA0KICAgICAgamNseE9wdGlvbnM6IFsn5Zu95a626KeE5YiSJywgJ+WGm+mYn+inhOWIkicsICfpmaLmoKHoh6rnvJYnXSwNCiAgICAgIGpjYnhseE9wdGlvbnM6IFsn6Ieq57yWJywgJ+mAieeUqCddLA0KICAgICAgamN6ZGx4T3B0aW9uczogWyfkuIDoiKzmlZnmnZAnLCAn6YeN54K55pWZ5p2QJywgJ+inhOWIkuaVmeadkCddLA0KICAgICAgamNseU9wdGlvbnM6IFsn5pWZ56CU5L+d6Zqc5Lit5b+D5aSW6LStJywgJ+iHqui0rScsICfkuIrnuqfphY3lj5EnXSwNCiAgICAgIGpjY2NPcHRpb25zOiBbJ+aXoCcsICfmnKznp5EnLCAn56CU56m255SfJ10sDQogICAgICBjYmZzT3B0aW9uczogWyflhazlvIDlh7rniYgnLCAn5YaF6YOo5Ye654mIJ10sDQogICAgICBqY21qT3B0aW9uczogWyflhazlvIAnLCAn5YaF6YOoJywgJ+enmOWvhiddLA0KICAgICAgamxkd09wdGlvbnM6IFsn5pysJywgJ+WGjCddLA0KDQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDooajmoLzmlbDmja4gPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIGxvYWRpbmc6IGZhbHNlLA0KICAgICAgdGFibGVEYXRhOiBbXSwNCiAgICAgIHBhZ2VOdW06IDEsDQogICAgICBwYWdlU2l6ZTogMjAsDQogICAgICB0b3RhbDogMCwNCg0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5paw5bu65pWZ5p2QID09PT09PT09PT09PT09PT09PT09DQogICAgICBhZGREaWFsb2dWaXNpYmxlOiBmYWxzZSwNCiAgICAgIGFkZFNhdmluZzogZmFsc2UsDQogICAgICBhZGRGb3JtOiB0aGlzLmNyZWF0ZUVtcHR5Rm9ybSgpLA0KDQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDnvJbovpHmlZnmnZAgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIGVkaXREaWFsb2dWaXNpYmxlOiBmYWxzZSwNCiAgICAgIGVkaXRMb2FkaW5nOiBmYWxzZSwNCiAgICAgIGVkaXRTYXZpbmc6IGZhbHNlLA0KICAgICAgZWRpdEZvcm06IHRoaXMuY3JlYXRlRW1wdHlGb3JtKCksDQoNCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09IOihqOWNleagoemqjCA9PT09PT09PT09PT09PT09PT09PQ0KICAgICAgZm9ybVJ1bGVzOiB7DQogICAgICAgIG1jOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeaVmeadkOWQjeensCcsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgamNieGx4OiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+mAieaLqee8luWGmeexu+WeiycsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dDQogICAgICB9LA0KDQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDlr7zlhaUgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIHNlbGVjdGVkRmlsZTogbnVsbCwNCg0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5pWZ5p2Q5bqT5a2Y5Y2V77yISkNLQ0TvvIkgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIHN0b2NrU2VhcmNoRm9ybTogeyBiaDogJycsIG1jOiAnJywgbGI6ICcnLCB6YjogJycsIHp0OiAnJyB9LA0KICAgICAgc3RvY2tMb2FkaW5nOiBmYWxzZSwNCiAgICAgIHN0b2NrVGFibGVEYXRhOiBbXSwNCiAgICAgIHN0b2NrUGFnZU51bTogMSwNCiAgICAgIHN0b2NrUGFnZVNpemU6IDIwLA0KICAgICAgc3RvY2tUb3RhbDogMCwNCiAgICAgIHN0b2NrRm9ybURpYWxvZ1Zpc2libGU6IGZhbHNlLA0KICAgICAgc3RvY2tGb3JtTG9hZGluZzogZmFsc2UsDQogICAgICBzdG9ja1NhdmluZzogZmFsc2UsDQogICAgICBpc1N0b2NrQWRkOiB0cnVlLA0KICAgICAgc3RvY2tGb3JtOiB0aGlzLmNyZWF0ZUVtcHR5U3RvY2tGb3JtKCksDQogICAgICBzdG9ja0Zvcm1SdWxlczogew0KICAgICAgICBtYzogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXlkI3np7AnLCB0cmlnZ2VyOiAnYmx1cicgfV0NCiAgICAgIH0sDQogICAgICBzdG9ja0RldGFpbERpYWxvZ1Zpc2libGU6IGZhbHNlLA0KICAgICAgc3RvY2tEZXRhaWxEYXRhOiB7fSwNCg0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5pWZ5p2Q5bqT5a2Y5piO57uG6aG577yISkNLQ01YWO+8iSA9PT09PT09PT09PT09PT09PT09PQ0KICAgICAgZGV0YWlsU2VhcmNoRm9ybTogeyBiaDogJycsIGpja2NkYmJoOiAnJywgamN4eGJoOiAnJywgaHdid1R5cGU6ICcnIH0sDQogICAgICBkZXRhaWxMb2FkaW5nOiBmYWxzZSwNCiAgICAgIGRldGFpbFRhYmxlRGF0YTogW10sDQogICAgICBkZXRhaWxQYWdlTnVtOiAxLA0KICAgICAgZGV0YWlsUGFnZVNpemU6IDIwLA0KICAgICAgZGV0YWlsVG90YWw6IDAsDQogICAgICBkZXRhaWxGb3JtRGlhbG9nVmlzaWJsZTogZmFsc2UsDQogICAgICBkZXRhaWxGb3JtTG9hZGluZzogZmFsc2UsDQogICAgICBkZXRhaWxTYXZpbmc6IGZhbHNlLA0KICAgICAgaXNEZXRhaWxBZGQ6IHRydWUsDQogICAgICBkZXRhaWxGb3JtOiB0aGlzLmNyZWF0ZUVtcHR5RGV0YWlsRm9ybSgpLA0KICAgICAgZGV0YWlsRm9ybVJ1bGVzOiB7DQogICAgICAgIGpja2NkYmJoOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeW6k+WtmOWNlee8luWPtycsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgamN4eGJoOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeaVmeadkOS/oeaBr+e8luWPtycsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgc2w6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5pWw6YePJywgdHJpZ2dlcjogJ2NoYW5nZScgfV0NCiAgICAgIH0sDQogICAgICBkZXRhaWxWaWV3RGlhbG9nVmlzaWJsZTogZmFsc2UsDQogICAgICBkZXRhaWxWaWV3RGF0YToge30NCiAgICB9DQogIH0sDQogIGNvbXB1dGVkOiB7DQogICAgZmlsZU5hbWUoKSB7DQogICAgICByZXR1cm4gKHRoaXMuc2VsZWN0ZWRGaWxlICYmIHRoaXMuc2VsZWN0ZWRGaWxlLm5hbWUpIHx8ICfmnKrpgInmi6nku7vkvZXmlofku7YnDQogICAgfQ0KICB9LA0KICBtb3VudGVkKCkgew0KICAgIHRoaXMuZmV0Y2hMaXN0KCkNCiAgfSwNCiAgbWV0aG9kczogew0KICAgIC8qKiDooajmoLzml6XmnJ/moLzlvI/ljJYgKi8NCiAgICBmb3JtYXREYXRlKHJvdywgY29sdW1uLCBjZWxsVmFsdWUpIHsNCiAgICAgIHJldHVybiBjZWxsVmFsdWUgPyBTdHJpbmcoY2VsbFZhbHVlKS5zbGljZSgwLCAxMCkgOiAnJw0KICAgIH0sDQoNCiAgICAvKiog57uf5LiA5qC85byP5YyW5ZCO56uvIExvY2FsRGF0ZVRpbWXvvIjljrvpmaQgVOOAgeaIquaWreWIsOenku+8iSAqLw0KICAgIGZtdERhdGVUaW1lKHZhbCkgew0KICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09ICcnKSByZXR1cm4gJycNCiAgICAgIHJldHVybiBTdHJpbmcodmFsKS5yZXBsYWNlKCdUJywgJyAnKS5zbGljZSgwLCAxOSkNCiAgICB9LA0KDQogICAgLyoqIOepuuWAvOaYvuekuuS4uiAnLSfvvIhWdWUgMiDmqKHmnb/ooajovr7lvI/kuI3mlK/mjIEgPz8g6L+Q566X56ym77yJICovDQogICAgZm10VmFsKHZhbCkgew0KICAgICAgcmV0dXJuICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSAnJykgPyAnLScgOiB2YWwNCiAgICB9LA0KDQogICAgLyoqIOWIm+W7uuepuueZveaVmeadkOihqOWNlSAqLw0KICAgIGNyZWF0ZUVtcHR5Rm9ybSgpIHsNCiAgICAgIHJldHVybiB7DQogICAgICAgIG1jOiAnJywgeno6ICcnLCBjYnM6ICcnLCBpc2JuOiAnJywgY2JycTogJycsIGpjZmw6ICcnLCBqY2x4OiAnJywNCiAgICAgICAgamNieGx4OiAnJywgamN6ZGx4OiAnJywgamNseTogJycsIGpjY2M6ICcnLCBiYzogJycsIGtiOiAnJywgZGo6IG51bGwsDQogICAgICAgIGpsZHc6ICfmnKwnLCB6cmp5amx4ZmY6ICcnLCBqY2RtOiAnJywgY2JmczogJycsIGpjbWo6ICcnLCBieGR3OiAnJywNCiAgICAgICAgYno6ICcnLCB4Y3k6IGZhbHNlLCB0eTogZmFsc2UNCiAgICAgIH0NCiAgICB9LA0KDQogICAgLyoqIOWIm+W7uuepuueZveW6k+WtmOWNleihqOWNlSAqLw0KICAgIGNyZWF0ZUVtcHR5U3RvY2tGb3JtKCkgew0KICAgICAgcmV0dXJuIHsNCiAgICAgICAgbWM6ICcnLCBxa3NtOiAnJywgbGI6ICcnLCB6YjogJycsIGNiYm1iaDogJycsIGNicmJoOiAnJywNCiAgICAgICAgYmd5Ymg6ICcnLCBzcHJiaDogJycsIHp0OiAnJywgYno6ICcnLCBqc29uemQ6ICcnDQogICAgICB9DQogICAgfSwNCg0KICAgIC8qKiDliJvlu7rnqbrnmb3lupPlrZjmmI7nu4bpobnooajljZUgKi8NCiAgICBjcmVhdGVFbXB0eURldGFpbEZvcm0oKSB7DQogICAgICByZXR1cm4gew0KICAgICAgICBqY2tjZGJiaDogJycsIGpjeHhiaDogJycsIHNsOiBudWxsLCBxemtjbXh4Ymg6ICcnLA0KICAgICAgICBod2J3OiBmYWxzZSwgaHdid3NqOiAnJywgYno6ICcnLCBqc29uemQ6ICcnDQogICAgICB9DQogICAgfSwNCg0KICAgIC8qKiDnp7vpmaTnqbrlgLwgKi8NCiAgICBjbGVhblBheWxvYWQob2JqKSB7DQogICAgICBjb25zdCBwYXlsb2FkID0ge30NCiAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrZXkgPT4gew0KICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldDQogICAgICAgIGlmICh2YWx1ZSAhPT0gJycgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgIHBheWxvYWRba2V5XSA9IHZhbHVlDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgICByZXR1cm4gcGF5bG9hZA0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDliJfooajliqDovb0gPT09PT09PT09PT09PT09PT09PT0NCiAgICBidWlsZFF1ZXJ5KCkgew0KICAgICAgY29uc3QgcGFyYW1zID0ge30NCiAgICAgIDtbJ2JoJywgJ21jJywgJ3p6JywgJ2NicycsICdpc2JuJywgJ2pjZmwnLCAnamNseCddLmZvckVhY2goa2V5ID0+IHsNCiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlYXJjaEZvcm1ba2V5XQ0KICAgICAgICBpZiAodmFsdWUgIT09ICcnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICBwYXJhbXNba2V5XSA9IFN0cmluZyh2YWx1ZSkudHJpbSgpDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgICBpZiAodGhpcy5zZWFyY2hGb3JtLnR5VHlwZSA9PT0gJzAnKSBwYXJhbXMudHkgPSBmYWxzZQ0KICAgICAgZWxzZSBpZiAodGhpcy5zZWFyY2hGb3JtLnR5VHlwZSA9PT0gJzEnKSBwYXJhbXMudHkgPSB0cnVlDQogICAgICByZXR1cm4gcGFyYW1zDQogICAgfSwNCg0KICAgIGZldGNoTGlzdCgpIHsNCiAgICAgIHRoaXMubG9hZGluZyA9IHRydWUNCiAgICAgIGNvbnN0IHBhcmFtcyA9IHsNCiAgICAgICAgcGFnZU51bTogdGhpcy5wYWdlTnVtLA0KICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSwNCiAgICAgICAgLi4udGhpcy5idWlsZFF1ZXJ5KCkNCiAgICAgIH0NCiAgICAgIGxpc3RUZWFjaGluZ01hdGVyaWFsKHBhcmFtcykudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhIHx8IHt9DQogICAgICAgIHRoaXMudGFibGVEYXRhID0gZGF0YS5yZWNvcmRzIHx8IFtdDQogICAgICAgIHRoaXMudG90YWwgPSBkYXRhLnRvdGFsIHx8IDANCiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2UNCiAgICAgIH0pLmNhdGNoKCgpID0+IHsNCiAgICAgICAgdGhpcy50YWJsZURhdGEgPSBbXQ0KICAgICAgICB0aGlzLnRvdGFsID0gMA0KICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkNCiAgICB9LA0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5p+l6K+iIC8g6YeN572uID09PT09PT09PT09PT09PT09PT09DQogICAgaGFuZGxlU2VhcmNoKCkgew0KICAgICAgdGhpcy5wYWdlTnVtID0gMQ0KICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgIH0sDQoNCiAgICBoYW5kbGVSZXNldCgpIHsNCiAgICAgIHRoaXMuc2VhcmNoRm9ybSA9IHsNCiAgICAgICAgYmg6ICcnLCBtYzogJycsIHp6OiAnJywgY2JzOiAnJywgaXNibjogJycsDQogICAgICAgIGpjZmw6ICcnLCBqY2x4OiAnJywgdHlUeXBlOiAnJw0KICAgICAgfQ0KICAgICAgdGhpcy5wYWdlTnVtID0gMQ0KICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgIH0sDQoNCiAgICBoYW5kbGVTaXplQ2hhbmdlKHNpemUpIHsNCiAgICAgIHRoaXMucGFnZVNpemUgPSBzaXplDQogICAgICB0aGlzLnBhZ2VOdW0gPSAxDQogICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgfSwNCiAgICBoYW5kbGVDdXJyZW50Q2hhbmdlKHBhZ2UpIHsNCiAgICAgIHRoaXMucGFnZU51bSA9IHBhZ2UNCiAgICAgIHRoaXMuZmV0Y2hMaXN0KCkNCiAgICB9LA0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5peg5ZCO56uv5o6l5Y+j55qE5pON5L2cID09PT09PT09PT09PT09PT09PT09DQogICAgaGFuZGxlRG93bmxvYWRMaXN0KCkgew0KICAgICAgdGhpcy4kbWVzc2FnZS5pbmZvKCflkI7nq6/mmoLmnKrmj5Dkvpvor6XmjqXlj6MnKQ0KICAgIH0sDQoNCiAgICBoYW5kbGVEb3dubG9hZFppcCgpIHsNCiAgICAgIHRoaXMuJG1lc3NhZ2UuaW5mbygn5ZCO56uv5pqC5pyq5o+Q5L6b6K+l5o6l5Y+jJykNCiAgICB9LA0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5paw5bu65pWZ5p2QID09PT09PT09PT09PT09PT09PT09DQogICAgaGFuZGxlTmV3KCkgew0KICAgICAgdGhpcy5hZGRGb3JtID0gdGhpcy5jcmVhdGVFbXB0eUZvcm0oKQ0KICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gew0KICAgICAgICB0aGlzLiRyZWZzLmFkZEZvcm1SZWYgJiYgdGhpcy4kcmVmcy5hZGRGb3JtUmVmLmNsZWFyVmFsaWRhdGUoKQ0KICAgICAgfSkNCiAgICAgIHRoaXMuYWRkRGlhbG9nVmlzaWJsZSA9IHRydWUNCiAgICB9LA0KDQogICAgaGFuZGxlQWRkQ29uZmlybSgpIHsNCiAgICAgIHRoaXMuJHJlZnMuYWRkRm9ybVJlZi52YWxpZGF0ZSh2YWxpZCA9PiB7DQogICAgICAgIGlmICghdmFsaWQpIHJldHVybg0KICAgICAgICB0aGlzLmFkZFNhdmluZyA9IHRydWUNCiAgICAgICAgYWRkVGVhY2hpbmdNYXRlcmlhbCh0aGlzLmJ1aWxkUGF5bG9hZCh0aGlzLmFkZEZvcm0pKS50aGVuKCgpID0+IHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoJ+aWsOWinuaIkOWKnycpDQogICAgICAgICAgdGhpcy5hZGREaWFsb2dWaXNpYmxlID0gZmFsc2UNCiAgICAgICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgICAgIH0pLmNhdGNoKCgpID0+IHsNCiAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7DQogICAgICAgICAgdGhpcy5hZGRTYXZpbmcgPSBmYWxzZQ0KICAgICAgICB9KQ0KICAgICAgfSkNCiAgICB9LA0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT0g57yW6L6R5pWZ5p2QID09PT09PT09PT09PT09PT09PT09DQogICAgaGFuZGxlRWRpdChyb3cpIHsNCiAgICAgIHRoaXMuZWRpdERpYWxvZ1Zpc2libGUgPSB0cnVlDQogICAgICB0aGlzLmVkaXRMb2FkaW5nID0gdHJ1ZQ0KICAgICAgZ2V0VGVhY2hpbmdNYXRlcmlhbEJ5SWQocm93LmlkKS50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLmRhdGEgfHwge30NCiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuY3JlYXRlRW1wdHlGb3JtKCkNCiAgICAgICAgT2JqZWN0LmtleXMoZm9ybSkuZm9yRWFjaChrZXkgPT4gew0KICAgICAgICAgIGlmIChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCAmJiBkYXRhW2tleV0gIT09IG51bGwpIGZvcm1ba2V5XSA9IGRhdGFba2V5XQ0KICAgICAgICB9KQ0KICAgICAgICAvLyDml6XmnJ/lrZfmrrXmiKrmlq3pgILphY0gZGF0ZSDmjqfku7YNCiAgICAgICAgaWYgKGZvcm0uY2JycSkgZm9ybS5jYnJxID0gU3RyaW5nKGZvcm0uY2JycSkuc2xpY2UoMCwgMTApDQogICAgICAgIGZvcm0uaWQgPSBkYXRhLmlkDQogICAgICAgIGZvcm0uYmggPSBkYXRhLmJoDQogICAgICAgIHRoaXMuZWRpdEZvcm0gPSBmb3JtDQogICAgICAgIHRoaXMuZWRpdExvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkuY2F0Y2goKCkgPT4gew0KICAgICAgICB0aGlzLmVkaXREaWFsb2dWaXNpYmxlID0gZmFsc2UNCiAgICAgICAgdGhpcy5lZGl0TG9hZGluZyA9IGZhbHNlDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICBoYW5kbGVFZGl0Q29uZmlybSgpIHsNCiAgICAgIHRoaXMuJHJlZnMuZWRpdEZvcm1SZWYudmFsaWRhdGUodmFsaWQgPT4gew0KICAgICAgICBpZiAoIXZhbGlkKSByZXR1cm4NCiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuYnVpbGRQYXlsb2FkKHRoaXMuZWRpdEZvcm0pDQogICAgICAgIGlmICghdGhpcy5lZGl0Rm9ybS5pZCkgew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn57y65bCR6K6w5b2VSUTvvIzml6Dms5Xkv53lrZgnKQ0KICAgICAgICAgIHJldHVybg0KICAgICAgICB9DQogICAgICAgIHBheWxvYWQuaWQgPSB0aGlzLmVkaXRGb3JtLmlkDQogICAgICAgIHBheWxvYWQuYmggPSB0aGlzLmVkaXRGb3JtLmJoDQogICAgICAgIHRoaXMuZWRpdFNhdmluZyA9IHRydWUNCiAgICAgICAgdXBkYXRlVGVhY2hpbmdNYXRlcmlhbChwYXlsb2FkKS50aGVuKCgpID0+IHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoJ+S/neWtmOaIkOWKnycpDQogICAgICAgICAgdGhpcy5lZGl0RGlhbG9nVmlzaWJsZSA9IGZhbHNlDQogICAgICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgICAgICB9KS5jYXRjaCgoKSA9PiB7DQogICAgICAgIH0pLmZpbmFsbHkoKCkgPT4gew0KICAgICAgICAgIHRoaXMuZWRpdFNhdmluZyA9IGZhbHNlDQogICAgICAgIH0pDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICAvKiog57uE6KOF5paw5aKeL+e8lui+keivt+axguS9k++8iEpDWFgg5a6e5L2T77yM5LuF5Lyg6Z2e56m65a2X5q6177yJICovDQogICAgYnVpbGRQYXlsb2FkKGZvcm0pIHsNCiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmNsZWFuUGF5bG9hZCh7DQogICAgICAgIG1jOiBmb3JtLm1jLA0KICAgICAgICB6ejogZm9ybS56eiwNCiAgICAgICAgY2JzOiBmb3JtLmNicywNCiAgICAgICAgaXNibjogZm9ybS5pc2JuLA0KICAgICAgICBqY2ZsOiBmb3JtLmpjZmwsDQogICAgICAgIGpjbHg6IGZvcm0uamNseCwNCiAgICAgICAgamNieGx4OiBmb3JtLmpjYnhseCwNCiAgICAgICAgamN6ZGx4OiBmb3JtLmpjemRseCwNCiAgICAgICAgamNseTogZm9ybS5qY2x5LA0KICAgICAgICBqY2NjOiBmb3JtLmpjY2MsDQogICAgICAgIGJjOiBmb3JtLmJjLA0KICAgICAgICBrYjogZm9ybS5rYiwNCiAgICAgICAgamxkdzogZm9ybS5qbGR3LA0KICAgICAgICB6cmp5amx4ZmY6IGZvcm0uenJqeWpseGZmLA0KICAgICAgICBqY2RtOiBmb3JtLmpjZG0sDQogICAgICAgIGNiZnM6IGZvcm0uY2JmcywNCiAgICAgICAgamNtajogZm9ybS5qY21qLA0KICAgICAgICBieGR3OiBmb3JtLmJ4ZHcsDQogICAgICAgIGJ6OiBmb3JtLmJ6LA0KICAgICAgICB4Y3k6ICEhZm9ybS54Y3ksDQogICAgICAgIHR5OiAhIWZvcm0udHkNCiAgICAgIH0pDQogICAgICAvLyDml6XmnJ/lrZfmrrXovawgSVNP77yI5ZCO56uvIGNicnEg5Li6IExvY2FsRGF0ZVRpbWXvvIkNCiAgICAgIGlmIChmb3JtLmNicnEpIHBheWxvYWQuY2JycSA9IGZvcm0uY2JycSArICdUMDA6MDA6MDAnDQogICAgICAvLyDmlbDlgLzlrZfmrrUNCiAgICAgIGlmIChmb3JtLmRqICE9PSAnJyAmJiBmb3JtLmRqICE9PSBudWxsICYmIGZvcm0uZGogIT09IHVuZGVmaW5lZCkgew0KICAgICAgICBwYXlsb2FkLmRqID0gTnVtYmVyKGZvcm0uZGopDQogICAgICB9DQogICAgICByZXR1cm4gcGF5bG9hZA0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDliKDpmaQgPT09PT09PT09PT09PT09PT09PT0NCiAgICBoYW5kbGVEZWxldGUocm93KSB7DQogICAgICBpZiAoIXJvdy5pZCkgew0KICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+W9k+WJjeihjOe8uuWwkUlEJykNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICB0aGlzLiRjb25maXJtKGDnoa7lrpropoHliKDpmaTmlZnmnZDjgIwke3Jvdy5tYyB8fCByb3cuYmh944CN5ZCX77yfYCwgJ+ezu+e7n+aPkOekuicsIHsNCiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLA0KICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywNCiAgICAgICAgdHlwZTogJ3dhcm5pbmcnDQogICAgICB9KS50aGVuKCgpID0+IHsNCiAgICAgICAgZGVsZXRlVGVhY2hpbmdNYXRlcmlhbChyb3cuaWQpLnRoZW4oKCkgPT4gew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5YqfJykNCiAgICAgICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgICAgIH0pLmNhdGNoKCgpID0+IHt9KQ0KICAgICAgfSkuY2F0Y2goKCkgPT4ge30pDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOaooeadv+S4i+i9vSAvIOWvvOWFpSA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGhhbmRsZURvd25sb2FkVGVtcGxhdGUoKSB7DQogICAgICBkb3dubG9hZFRlYWNoaW5nTWF0ZXJpYWxUZW1wbGF0ZSgpLnRoZW4oYmxvYiA9PiB7DQogICAgICAgIHNhdmVBcyhibG9iLCAn5pWZ5p2Q566h55CG5a+85YWl5qih5p2/LnhscycpDQogICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2Vzcygn5qih5p2/5LiL6L295oiQ5YqfJykNCiAgICAgIH0pLmNhdGNoKCgpID0+IHt9KQ0KICAgIH0sDQoNCiAgICBoYW5kbGVDaG9vc2VGaWxlKCkgew0KICAgICAgdGhpcy4kcmVmcy5maWxlSW5wdXQgJiYgdGhpcy4kcmVmcy5maWxlSW5wdXQuY2xpY2soKQ0KICAgIH0sDQoNCiAgICBoYW5kbGVGaWxlQ2hhbmdlKGUpIHsNCiAgICAgIGNvbnN0IGlucHV0ID0gZS50YXJnZXQNCiAgICAgIGlmIChpbnB1dC5maWxlcyAmJiBpbnB1dC5maWxlcy5sZW5ndGggPiAwKSB7DQogICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gaW5wdXQuZmlsZXNbMF0NCiAgICAgIH0NCiAgICB9LA0KDQogICAgaGFuZGxlSW1wb3J0KCkgew0KICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRmlsZSkgew0KICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+ivt+WFiOmAieaLqeaWh+S7ticpDQogICAgICAgIHJldHVybg0KICAgICAgfQ0KICAgICAgaW1wb3J0VGVhY2hpbmdNYXRlcmlhbCh0aGlzLnNlbGVjdGVkRmlsZSkudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgIGNvbnN0IGNvdW50ID0gKHJlc3BvbnNlICYmIHJlc3BvbnNlLmRhdGEpIHx8IDANCiAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKGDlr7zlhaXmiJDlip/vvIzlhbHlr7zlhaUgJHtjb3VudH0g5p2hYCkNCiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsDQogICAgICAgIGlmICh0aGlzLiRyZWZzLmZpbGVJbnB1dCkgdGhpcy4kcmVmcy5maWxlSW5wdXQudmFsdWUgPSAnJw0KICAgICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgICB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICB9LA0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5pWZ5p2Q5bqT5a2Y5Y2VID09PT09PT09PT09PT09PT09PT09DQogICAgYnVpbGRTdG9ja1F1ZXJ5KCkgew0KICAgICAgY29uc3QgcGFyYW1zID0ge30NCiAgICAgIDtbJ2JoJywgJ21jJywgJ2xiJywgJ3piJywgJ3p0J10uZm9yRWFjaChrZXkgPT4gew0KICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc3RvY2tTZWFyY2hGb3JtW2tleV0NCiAgICAgICAgaWYgKHZhbHVlICE9PSAnJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgcGFyYW1zW2tleV0gPSBTdHJpbmcodmFsdWUpLnRyaW0oKQ0KICAgICAgICB9DQogICAgICB9KQ0KICAgICAgcmV0dXJuIHBhcmFtcw0KICAgIH0sDQoNCiAgICBmZXRjaFN0b2NrTGlzdCgpIHsNCiAgICAgIHRoaXMuc3RvY2tMb2FkaW5nID0gdHJ1ZQ0KICAgICAgY29uc3QgcGFyYW1zID0gew0KICAgICAgICBwYWdlTnVtOiB0aGlzLnN0b2NrUGFnZU51bSwNCiAgICAgICAgcGFnZVNpemU6IHRoaXMuc3RvY2tQYWdlU2l6ZSwNCiAgICAgICAgLi4udGhpcy5idWlsZFN0b2NrUXVlcnkoKQ0KICAgICAgfQ0KICAgICAgbGlzdFRlYWNoaW5nU3RvY2socGFyYW1zKS50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLmRhdGEgfHwge30NCiAgICAgICAgdGhpcy5zdG9ja1RhYmxlRGF0YSA9IGRhdGEucmVjb3JkcyB8fCBbXQ0KICAgICAgICB0aGlzLnN0b2NrVG90YWwgPSBkYXRhLnRvdGFsIHx8IDANCiAgICAgICAgdGhpcy5zdG9ja0xvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkuY2F0Y2goKCkgPT4gew0KICAgICAgICB0aGlzLnN0b2NrVGFibGVEYXRhID0gW10NCiAgICAgICAgdGhpcy5zdG9ja1RvdGFsID0gMA0KICAgICAgICB0aGlzLnN0b2NrTG9hZGluZyA9IGZhbHNlDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICBoYW5kbGVTdG9ja1NlYXJjaCgpIHsNCiAgICAgIHRoaXMuc3RvY2tQYWdlTnVtID0gMQ0KICAgICAgdGhpcy5mZXRjaFN0b2NrTGlzdCgpDQogICAgfSwNCg0KICAgIGhhbmRsZVN0b2NrUmVzZXQoKSB7DQogICAgICB0aGlzLnN0b2NrU2VhcmNoRm9ybSA9IHsgYmg6ICcnLCBtYzogJycsIGxiOiAnJywgemI6ICcnLCB6dDogJycgfQ0KICAgICAgdGhpcy5zdG9ja1BhZ2VOdW0gPSAxDQogICAgICB0aGlzLmZldGNoU3RvY2tMaXN0KCkNCiAgICB9LA0KDQogICAgaGFuZGxlU3RvY2tTaXplQ2hhbmdlKHNpemUpIHsNCiAgICAgIHRoaXMuc3RvY2tQYWdlU2l6ZSA9IHNpemUNCiAgICAgIHRoaXMuc3RvY2tQYWdlTnVtID0gMQ0KICAgICAgdGhpcy5mZXRjaFN0b2NrTGlzdCgpDQogICAgfSwNCiAgICBoYW5kbGVTdG9ja0N1cnJlbnRDaGFuZ2UocGFnZSkgew0KICAgICAgdGhpcy5zdG9ja1BhZ2VOdW0gPSBwYWdlDQogICAgICB0aGlzLmZldGNoU3RvY2tMaXN0KCkNCiAgICB9LA0KDQogICAgaGFuZGxlU3RvY2tOZXcoKSB7DQogICAgICB0aGlzLmlzU3RvY2tBZGQgPSB0cnVlDQogICAgICB0aGlzLnN0b2NrRm9ybSA9IHRoaXMuY3JlYXRlRW1wdHlTdG9ja0Zvcm0oKQ0KICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gew0KICAgICAgICB0aGlzLiRyZWZzLnN0b2NrRm9ybVJlZiAmJiB0aGlzLiRyZWZzLnN0b2NrRm9ybVJlZi5jbGVhclZhbGlkYXRlKCkNCiAgICAgIH0pDQogICAgICB0aGlzLnN0b2NrRm9ybURpYWxvZ1Zpc2libGUgPSB0cnVlDQogICAgfSwNCg0KICAgIGhhbmRsZVN0b2NrRWRpdChyb3cpIHsNCiAgICAgIHRoaXMuaXNTdG9ja0FkZCA9IGZhbHNlDQogICAgICB0aGlzLnN0b2NrRm9ybURpYWxvZ1Zpc2libGUgPSB0cnVlDQogICAgICB0aGlzLnN0b2NrRm9ybUxvYWRpbmcgPSB0cnVlDQogICAgICBnZXRUZWFjaGluZ1N0b2NrKHJvdy5pZCkudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhIHx8IHt9DQogICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmNyZWF0ZUVtcHR5U3RvY2tGb3JtKCkNCiAgICAgICAgT2JqZWN0LmtleXMoZm9ybSkuZm9yRWFjaChrZXkgPT4gew0KICAgICAgICAgIGlmIChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCAmJiBkYXRhW2tleV0gIT09IG51bGwpIGZvcm1ba2V5XSA9IGRhdGFba2V5XQ0KICAgICAgICB9KQ0KICAgICAgICBmb3JtLmlkID0gZGF0YS5pZA0KICAgICAgICBmb3JtLmJoID0gZGF0YS5iaA0KICAgICAgICB0aGlzLnN0b2NrRm9ybSA9IGZvcm0NCiAgICAgICAgdGhpcy5zdG9ja0Zvcm1Mb2FkaW5nID0gZmFsc2UNCiAgICAgIH0pLmNhdGNoKCgpID0+IHsNCiAgICAgICAgdGhpcy5zdG9ja0Zvcm1EaWFsb2dWaXNpYmxlID0gZmFsc2UNCiAgICAgICAgdGhpcy5zdG9ja0Zvcm1Mb2FkaW5nID0gZmFsc2UNCiAgICAgIH0pDQogICAgfSwNCg0KICAgIGJ1aWxkU3RvY2tQYXlsb2FkKCkgew0KICAgICAgY29uc3QgZiA9IHRoaXMuc3RvY2tGb3JtDQogICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5jbGVhblBheWxvYWQoew0KICAgICAgICBtYzogZi5tYywNCiAgICAgICAgcWtzbTogZi5xa3NtLA0KICAgICAgICBsYjogZi5sYiwNCiAgICAgICAgemI6IGYuemIsDQogICAgICAgIGNiYm1iaDogZi5jYmJtYmgsDQogICAgICAgIGNicmJoOiBmLmNicmJoLA0KICAgICAgICBiZ3liaDogZi5iZ3liaCwNCiAgICAgICAgc3ByYmg6IGYuc3ByYmgsDQogICAgICAgIHp0OiBmLnp0LA0KICAgICAgICBiejogZi5ieiwNCiAgICAgICAganNvbnpkOiBmLmpzb256ZA0KICAgICAgfSkNCiAgICAgIHJldHVybiBwYXlsb2FkDQogICAgfSwNCg0KICAgIGhhbmRsZVN0b2NrRm9ybUNvbmZpcm0oKSB7DQogICAgICB0aGlzLiRyZWZzLnN0b2NrRm9ybVJlZi52YWxpZGF0ZSh2YWxpZCA9PiB7DQogICAgICAgIGlmICghdmFsaWQpIHJldHVybg0KICAgICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5idWlsZFN0b2NrUGF5bG9hZCgpDQogICAgICAgIGlmICghdGhpcy5pc1N0b2NrQWRkKSB7DQogICAgICAgICAgaWYgKCF0aGlzLnN0b2NrRm9ybS5pZCkgew0KICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfnvLrlsJHorrDlvZVJRO+8jOaXoOazleS/neWtmCcpDQogICAgICAgICAgICByZXR1cm4NCiAgICAgICAgICB9DQogICAgICAgICAgcGF5bG9hZC5pZCA9IHRoaXMuc3RvY2tGb3JtLmlkDQogICAgICAgICAgcGF5bG9hZC5iaCA9IHRoaXMuc3RvY2tGb3JtLmJoDQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zdG9ja1NhdmluZyA9IHRydWUNCiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuaXNTdG9ja0FkZCA/IGFkZFRlYWNoaW5nU3RvY2socGF5bG9hZCkgOiB1cGRhdGVUZWFjaGluZ1N0b2NrKHBheWxvYWQpDQogICAgICAgIHJlcXVlc3QudGhlbigoKSA9PiB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKHRoaXMuaXNTdG9ja0FkZCA/ICfmlrDlop7miJDlip8nIDogJ+S/ruaUueaIkOWKnycpDQogICAgICAgICAgdGhpcy5zdG9ja0Zvcm1EaWFsb2dWaXNpYmxlID0gZmFsc2UNCiAgICAgICAgICB0aGlzLmZldGNoU3RvY2tMaXN0KCkNCiAgICAgICAgfSkuY2F0Y2goKCkgPT4gew0KICAgICAgICB9KS5maW5hbGx5KCgpID0+IHsNCiAgICAgICAgICB0aGlzLnN0b2NrU2F2aW5nID0gZmFsc2UNCiAgICAgICAgfSkNCiAgICAgIH0pDQogICAgfSwNCg0KICAgIGhhbmRsZVN0b2NrRGV0YWlsKHJvdykgew0KICAgICAgdGhpcy5zdG9ja0RldGFpbERhdGEgPSByb3cNCiAgICAgIHRoaXMuc3RvY2tEZXRhaWxEaWFsb2dWaXNpYmxlID0gdHJ1ZQ0KICAgIH0sDQoNCiAgICBoYW5kbGVTdG9ja0RlbGV0ZShyb3cpIHsNCiAgICAgIGlmICghcm93LmlkKSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn5b2T5YmN6KGM57y65bCRSUQnKQ0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIHRoaXMuJGNvbmZpcm0oYOehruWumuimgeWIoOmZpOW6k+WtmOWNleOAjCR7cm93Lm1jIHx8IHJvdy5iaH3jgI3lkJfvvJ9gLCAn57O757uf5o+Q56S6Jywgew0KICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLA0KICAgICAgICB0eXBlOiAnd2FybmluZycNCiAgICAgIH0pLnRoZW4oKCkgPT4gew0KICAgICAgICBkZWxldGVUZWFjaGluZ1N0b2NrKHJvdy5pZCkudGhlbigoKSA9PiB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip8nKQ0KICAgICAgICAgIHRoaXMuZmV0Y2hTdG9ja0xpc3QoKQ0KICAgICAgICB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICAgIH0pLmNhdGNoKCgpID0+IHt9KQ0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmlZnmnZDlupPlrZjmmI7nu4bpobkgPT09PT09PT09PT09PT09PT09PT0NCiAgICBidWlsZERldGFpbFF1ZXJ5KCkgew0KICAgICAgY29uc3QgcGFyYW1zID0ge30NCiAgICAgIDtbJ2JoJywgJ2pja2NkYmJoJywgJ2pjeHhiaCddLmZvckVhY2goa2V5ID0+IHsNCiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRldGFpbFNlYXJjaEZvcm1ba2V5XQ0KICAgICAgICBpZiAodmFsdWUgIT09ICcnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICBwYXJhbXNba2V5XSA9IFN0cmluZyh2YWx1ZSkudHJpbSgpDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgICBpZiAodGhpcy5kZXRhaWxTZWFyY2hGb3JtLmh3YndUeXBlID09PSAnMCcpIHBhcmFtcy5od2J3ID0gZmFsc2UNCiAgICAgIGVsc2UgaWYgKHRoaXMuZGV0YWlsU2VhcmNoRm9ybS5od2J3VHlwZSA9PT0gJzEnKSBwYXJhbXMuaHdidyA9IHRydWUNCiAgICAgIHJldHVybiBwYXJhbXMNCiAgICB9LA0KDQogICAgZmV0Y2hEZXRhaWxMaXN0KCkgew0KICAgICAgdGhpcy5kZXRhaWxMb2FkaW5nID0gdHJ1ZQ0KICAgICAgY29uc3QgcGFyYW1zID0gew0KICAgICAgICBwYWdlTnVtOiB0aGlzLmRldGFpbFBhZ2VOdW0sDQogICAgICAgIHBhZ2VTaXplOiB0aGlzLmRldGFpbFBhZ2VTaXplLA0KICAgICAgICAuLi50aGlzLmJ1aWxkRGV0YWlsUXVlcnkoKQ0KICAgICAgfQ0KICAgICAgbGlzdFRlYWNoaW5nU3RvY2tEZXRhaWwocGFyYW1zKS50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLmRhdGEgfHwge30NCiAgICAgICAgdGhpcy5kZXRhaWxUYWJsZURhdGEgPSBkYXRhLnJlY29yZHMgfHwgW10NCiAgICAgICAgdGhpcy5kZXRhaWxUb3RhbCA9IGRhdGEudG90YWwgfHwgMA0KICAgICAgICB0aGlzLmRldGFpbExvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkuY2F0Y2goKCkgPT4gew0KICAgICAgICB0aGlzLmRldGFpbFRhYmxlRGF0YSA9IFtdDQogICAgICAgIHRoaXMuZGV0YWlsVG90YWwgPSAwDQogICAgICAgIHRoaXMuZGV0YWlsTG9hZGluZyA9IGZhbHNlDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICBoYW5kbGVEZXRhaWxTZWFyY2goKSB7DQogICAgICB0aGlzLmRldGFpbFBhZ2VOdW0gPSAxDQogICAgICB0aGlzLmZldGNoRGV0YWlsTGlzdCgpDQogICAgfSwNCg0KICAgIGhhbmRsZURldGFpbFJlc2V0KCkgew0KICAgICAgdGhpcy5kZXRhaWxTZWFyY2hGb3JtID0geyBiaDogJycsIGpja2NkYmJoOiAnJywgamN4eGJoOiAnJywgaHdid1R5cGU6ICcnIH0NCiAgICAgIHRoaXMuZGV0YWlsUGFnZU51bSA9IDENCiAgICAgIHRoaXMuZmV0Y2hEZXRhaWxMaXN0KCkNCiAgICB9LA0KDQogICAgaGFuZGxlRGV0YWlsU2l6ZUNoYW5nZShzaXplKSB7DQogICAgICB0aGlzLmRldGFpbFBhZ2VTaXplID0gc2l6ZQ0KICAgICAgdGhpcy5kZXRhaWxQYWdlTnVtID0gMQ0KICAgICAgdGhpcy5mZXRjaERldGFpbExpc3QoKQ0KICAgIH0sDQogICAgaGFuZGxlRGV0YWlsQ3VycmVudENoYW5nZShwYWdlKSB7DQogICAgICB0aGlzLmRldGFpbFBhZ2VOdW0gPSBwYWdlDQogICAgICB0aGlzLmZldGNoRGV0YWlsTGlzdCgpDQogICAgfSwNCg0KICAgIGhhbmRsZURldGFpbE5ldygpIHsNCiAgICAgIHRoaXMuaXNEZXRhaWxBZGQgPSB0cnVlDQogICAgICB0aGlzLmRldGFpbEZvcm0gPSB0aGlzLmNyZWF0ZUVtcHR5RGV0YWlsRm9ybSgpDQogICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7DQogICAgICAgIHRoaXMuJHJlZnMuZGV0YWlsRm9ybVJlZiAmJiB0aGlzLiRyZWZzLmRldGFpbEZvcm1SZWYuY2xlYXJWYWxpZGF0ZSgpDQogICAgICB9KQ0KICAgICAgdGhpcy5kZXRhaWxGb3JtRGlhbG9nVmlzaWJsZSA9IHRydWUNCiAgICB9LA0KDQogICAgaGFuZGxlRGV0YWlsRWRpdChyb3cpIHsNCiAgICAgIHRoaXMuaXNEZXRhaWxBZGQgPSBmYWxzZQ0KICAgICAgdGhpcy5kZXRhaWxGb3JtRGlhbG9nVmlzaWJsZSA9IHRydWUNCiAgICAgIHRoaXMuZGV0YWlsRm9ybUxvYWRpbmcgPSB0cnVlDQogICAgICBnZXRUZWFjaGluZ1N0b2NrRGV0YWlsKHJvdy5pZCkudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhIHx8IHt9DQogICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmNyZWF0ZUVtcHR5RGV0YWlsRm9ybSgpDQogICAgICAgIE9iamVjdC5rZXlzKGZvcm0pLmZvckVhY2goa2V5ID0+IHsNCiAgICAgICAgICBpZiAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQgJiYgZGF0YVtrZXldICE9PSBudWxsKSBmb3JtW2tleV0gPSBkYXRhW2tleV0NCiAgICAgICAgfSkNCiAgICAgICAgaWYgKGZvcm0uaHdid3NqKSBmb3JtLmh3YndzaiA9IFN0cmluZyhmb3JtLmh3YndzaikucmVwbGFjZSgnVCcsICcgJykuc2xpY2UoMCwgMTkpDQogICAgICAgIGZvcm0uaWQgPSBkYXRhLmlkDQogICAgICAgIGZvcm0uYmggPSBkYXRhLmJoDQogICAgICAgIHRoaXMuZGV0YWlsRm9ybSA9IGZvcm0NCiAgICAgICAgdGhpcy5kZXRhaWxGb3JtTG9hZGluZyA9IGZhbHNlDQogICAgICB9KS5jYXRjaCgoKSA9PiB7DQogICAgICAgIHRoaXMuZGV0YWlsRm9ybURpYWxvZ1Zpc2libGUgPSBmYWxzZQ0KICAgICAgICB0aGlzLmRldGFpbEZvcm1Mb2FkaW5nID0gZmFsc2UNCiAgICAgIH0pDQogICAgfSwNCg0KICAgIGJ1aWxkRGV0YWlsUGF5bG9hZCgpIHsNCiAgICAgIGNvbnN0IGYgPSB0aGlzLmRldGFpbEZvcm0NCiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmNsZWFuUGF5bG9hZCh7DQogICAgICAgIGpja2NkYmJoOiBmLmpja2NkYmJoLA0KICAgICAgICBqY3h4Ymg6IGYuamN4eGJoLA0KICAgICAgICBxemtjbXh4Ymg6IGYucXprY214eGJoLA0KICAgICAgICBod2J3OiAhIWYuaHdidywNCiAgICAgICAgYno6IGYuYnosDQogICAgICAgIGpzb256ZDogZi5qc29uemQNCiAgICAgIH0pDQogICAgICBpZiAoZi5zbCAhPT0gJycgJiYgZi5zbCAhPT0gbnVsbCAmJiBmLnNsICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgcGF5bG9hZC5zbCA9IE51bWJlcihmLnNsKQ0KICAgICAgfQ0KICAgICAgLy8g6L+Y5Zue5a6M5q+V5pe26Ze05Li6IExvY2FsRGF0ZVRpbWXvvIzovawgSVNPDQogICAgICBpZiAoZi5od2J3c2opIHBheWxvYWQuaHdid3NqID0gZi5od2J3c2oucmVwbGFjZSgnICcsICdUJykNCiAgICAgIHJldHVybiBwYXlsb2FkDQogICAgfSwNCg0KICAgIGhhbmRsZURldGFpbEZvcm1Db25maXJtKCkgew0KICAgICAgdGhpcy4kcmVmcy5kZXRhaWxGb3JtUmVmLnZhbGlkYXRlKHZhbGlkID0+IHsNCiAgICAgICAgaWYgKCF2YWxpZCkgcmV0dXJuDQogICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmJ1aWxkRGV0YWlsUGF5bG9hZCgpDQogICAgICAgIGlmICghdGhpcy5pc0RldGFpbEFkZCkgew0KICAgICAgICAgIGlmICghdGhpcy5kZXRhaWxGb3JtLmlkKSB7DQogICAgICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+e8uuWwkeiusOW9lUlE77yM5peg5rOV5L+d5a2YJykNCiAgICAgICAgICAgIHJldHVybg0KICAgICAgICAgIH0NCiAgICAgICAgICBwYXlsb2FkLmlkID0gdGhpcy5kZXRhaWxGb3JtLmlkDQogICAgICAgICAgcGF5bG9hZC5iaCA9IHRoaXMuZGV0YWlsRm9ybS5iaA0KICAgICAgICB9DQogICAgICAgIHRoaXMuZGV0YWlsU2F2aW5nID0gdHJ1ZQ0KICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5pc0RldGFpbEFkZCA/IGFkZFRlYWNoaW5nU3RvY2tEZXRhaWwocGF5bG9hZCkgOiB1cGRhdGVUZWFjaGluZ1N0b2NrRGV0YWlsKHBheWxvYWQpDQogICAgICAgIHJlcXVlc3QudGhlbigoKSA9PiB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKHRoaXMuaXNEZXRhaWxBZGQgPyAn5paw5aKe5oiQ5YqfJyA6ICfkv67mlLnmiJDlip8nKQ0KICAgICAgICAgIHRoaXMuZGV0YWlsRm9ybURpYWxvZ1Zpc2libGUgPSBmYWxzZQ0KICAgICAgICAgIHRoaXMuZmV0Y2hEZXRhaWxMaXN0KCkNCiAgICAgICAgfSkuY2F0Y2goKCkgPT4gew0KICAgICAgICB9KS5maW5hbGx5KCgpID0+IHsNCiAgICAgICAgICB0aGlzLmRldGFpbFNhdmluZyA9IGZhbHNlDQogICAgICAgIH0pDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICBoYW5kbGVEZXRhaWxWaWV3KHJvdykgew0KICAgICAgdGhpcy5kZXRhaWxWaWV3RGF0YSA9IHJvdw0KICAgICAgdGhpcy5kZXRhaWxWaWV3RGlhbG9nVmlzaWJsZSA9IHRydWUNCiAgICB9LA0KDQogICAgaGFuZGxlRGV0YWlsRGVsZXRlKHJvdykgew0KICAgICAgaWYgKCFyb3cuaWQpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCflvZPliY3ooYznvLrlsJFJRCcpDQogICAgICAgIHJldHVybg0KICAgICAgfQ0KICAgICAgdGhpcy4kY29uZmlybShg56Gu5a6a6KaB5Yig6Zmk5bqT5a2Y5piO57uG6aG544CMJHtyb3cuYmh944CN5ZCX77yfYCwgJ+ezu+e7n+aPkOekuicsIHsNCiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLA0KICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywNCiAgICAgICAgdHlwZTogJ3dhcm5pbmcnDQogICAgICB9KS50aGVuKCgpID0+IHsNCiAgICAgICAgZGVsZXRlVGVhY2hpbmdTdG9ja0RldGFpbChyb3cuaWQpLnRoZW4oKCkgPT4gew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5YqfJykNCiAgICAgICAgICB0aGlzLmZldGNoRGV0YWlsTGlzdCgpDQogICAgICAgIH0pLmNhdGNoKCgpID0+IHt9KQ0KICAgICAgfSkuY2F0Y2goKCkgPT4ge30pDQogICAgfQ0KICB9DQp9DQo="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/textbook","sourcesContent":["<template>\r\n <div class=\"app-container textbook-page\">\r\n <el-tabs v-model=\"activeTab\" type=\"border-card\" class=\"textbook-tabs\">\r\n <!-- 教材信息 -->\r\n <el-tab-pane label=\"教材信息\" name=\"info\">\r\n <!-- 查询条件 -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"searchForm\" label-width=\"90px\" class=\"search-form\">\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"编号\">\r\n <el-input v-model=\"searchForm.bh\" placeholder=\"请输入编号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"教材名称\">\r\n <el-input v-model=\"searchForm.mc\" placeholder=\"请输入教材名称\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"作者\">\r\n <el-input v-model=\"searchForm.zz\" placeholder=\"请输入作者\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"出版社\">\r\n <el-input v-model=\"searchForm.cbs\" placeholder=\"请输入出版社\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"ISBN\">\r\n <el-input v-model=\"searchForm.isbn\" placeholder=\"请输入ISBN\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"教材分类\">\r\n <el-select v-model=\"searchForm.jcfl\" placeholder=\"全部\" clearable class=\"w-full\">\r\n <el-option v-for=\"item in jcflOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"教材类型\">\r\n <el-select v-model=\"searchForm.jclx\" placeholder=\"全部\" clearable class=\"w-full\">\r\n <el-option v-for=\"item in jclxOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"停用\">\r\n <el-select v-model=\"searchForm.tyType\" class=\"w-full\">\r\n <el-option label=\"全部\" value=\"\" />\r\n <el-option label=\"在用\" value=\"0\" />\r\n <el-option label=\"已停用\" value=\"1\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div class=\"search-actions\">\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleSearch\">查询</el-button>\r\n <el-button icon=\"el-icon-refresh\" @click=\"handleReset\">重置</el-button>\r\n </div>\r\n </el-card>\r\n\r\n <!-- 教材信息列表 -->\r\n <div class=\"list-title\">教材信息列表:</div>\r\n <div class=\"list-toolbar\">\r\n <div class=\"left-group\">\r\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleNew\">新建教材信息</el-button>\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadList\">下载教材列表</el-button>\r\n <el-button icon=\"el-icon-folder-opened\" @click=\"handleDownloadZip\">所选文件资料打包ZIP下载</el-button>\r\n </div>\r\n <div class=\"right-group\">\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadTemplate\">【教材数据文件模板】下载</el-button>\r\n <div class=\"file-input\">\r\n <input ref=\"fileInput\" type=\"file\" accept=\".xls,.xlsx\" style=\"display: none\" @change=\"handleFileChange\" />\r\n <el-button icon=\"el-icon-folder-opened\" @click=\"handleChooseFile\">选择文件</el-button>\r\n <span class=\"file-name\">{{ fileName }}</span>\r\n <el-button type=\"primary\" icon=\"el-icon-upload2\" @click=\"handleImport\">上传数据</el-button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <el-table v-loading=\"loading\" :data=\"tableData\" stripe border highlight-current-row>\r\n <el-table-column type=\"index\" label=\"序号\" width=\"60\" align=\"center\" />\r\n <el-table-column prop=\"mc\" label=\"教材名称\" min-width=\"150\" show-overflow-tooltip />\r\n <el-table-column prop=\"zz\" label=\"作者\" min-width=\"120\" show-overflow-tooltip />\r\n <el-table-column prop=\"cbs\" label=\"出版社\" min-width=\"130\" show-overflow-tooltip />\r\n <el-table-column prop=\"cbrq\" label=\"出版日期\" min-width=\"100\" align=\"center\" :formatter=\"formatDate\" />\r\n <el-table-column prop=\"isbn\" label=\"ISBN\" min-width=\"140\" show-overflow-tooltip />\r\n <el-table-column prop=\"jclx\" label=\"教材类型\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"jcfl\" label=\"教材分类\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"jcbxlx\" label=\"编写类型\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"jcly\" label=\"教材来源\" min-width=\"130\" align=\"center\" />\r\n <el-table-column label=\"停用\" min-width=\"80\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <el-tag :type=\"row.ty ? 'danger' : 'success'\" size=\"small\">{{ row.ty ? '是' : '否' }}</el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"操作\" width=\"140\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-edit\" @click=\"handleEdit(row)\">编辑</el-button>\r\n <el-button type=\"text\" size=\"small\" class=\"danger-text\" @click=\"handleDelete(row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <el-empty v-if=\"!loading && tableData.length === 0\" description=\"暂无教材数据\" :image-size=\"60\" />\r\n <div class=\"pagination-wrap\">\r\n <el-pagination\r\n :current-page=\"pageNum\"\r\n :page-size=\"pageSize\"\r\n :total=\"total\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n background\r\n @size-change=\"handleSizeChange\"\r\n @current-change=\"handleCurrentChange\"\r\n />\r\n </div>\r\n </el-card>\r\n </el-tab-pane>\r\n\r\n <!-- 教材库存单 -->\r\n <el-tab-pane label=\"教材库存单\" name=\"stock\">\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"stockSearchForm\" label-width=\"90px\" class=\"search-form\">\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"编号\"><el-input v-model=\"stockSearchForm.bh\" placeholder=\"请输入编号\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"名称\"><el-input v-model=\"stockSearchForm.mc\" placeholder=\"请输入名称\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"类别\"><el-input v-model=\"stockSearchForm.lb\" placeholder=\"请输入类别\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"字别\"><el-input v-model=\"stockSearchForm.zb\" placeholder=\"请输入字别\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"状态\"><el-input v-model=\"stockSearchForm.zt\" placeholder=\"请输入状态\" clearable /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div class=\"search-actions\">\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleStockSearch\">查询</el-button>\r\n <el-button icon=\"el-icon-refresh\" @click=\"handleStockReset\">重置</el-button>\r\n </div>\r\n </el-card>\r\n\r\n <div class=\"list-title\">教材库存单列表:</div>\r\n <div class=\"list-toolbar\">\r\n <div class=\"left-group\">\r\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleStockNew\">新增库存单</el-button>\r\n </div>\r\n </div>\r\n\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <el-table v-loading=\"stockLoading\" :data=\"stockTableData\" stripe border highlight-current-row>\r\n <el-table-column type=\"index\" label=\"序号\" width=\"60\" align=\"center\" />\r\n <el-table-column prop=\"mc\" label=\"名称\" min-width=\"130\" show-overflow-tooltip />\r\n <el-table-column prop=\"qksm\" label=\"情况说明\" min-width=\"130\" show-overflow-tooltip />\r\n <el-table-column prop=\"lb\" label=\"类别\" min-width=\"90\" align=\"center\" />\r\n <el-table-column prop=\"zb\" label=\"字别\" min-width=\"90\" align=\"center\" />\r\n <el-table-column prop=\"cbbmbh\" label=\"承办部门编号\" min-width=\"110\" show-overflow-tooltip />\r\n <el-table-column prop=\"cbrbh\" label=\"承办人编号\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"bgybh\" label=\"保管员编号\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"sprbh\" label=\"审批人编号\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"zt\" label=\"状态\" min-width=\"90\" align=\"center\" />\r\n <el-table-column label=\"创建时间\" min-width=\"150\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtDateTime(row.cjsj) || '-' }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"修改时间\" min-width=\"150\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtDateTime(row.xgsj) || '-' }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"操作\" width=\"150\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-view\" @click=\"handleStockDetail(row)\">详情</el-button>\r\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-edit\" @click=\"handleStockEdit(row)\">编辑</el-button>\r\n <el-button type=\"text\" size=\"small\" class=\"danger-text\" @click=\"handleStockDelete(row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <el-empty v-if=\"!stockLoading && stockTableData.length === 0\" description=\"暂无库存单数据\" :image-size=\"60\" />\r\n <div class=\"pagination-wrap\">\r\n <el-pagination\r\n :current-page=\"stockPageNum\"\r\n :page-size=\"stockPageSize\"\r\n :total=\"stockTotal\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n background\r\n @size-change=\"handleStockSizeChange\"\r\n @current-change=\"handleStockCurrentChange\"\r\n />\r\n </div>\r\n </el-card>\r\n </el-tab-pane>\r\n\r\n <!-- 教材库存明细项 -->\r\n <el-tab-pane label=\"教材库存明细项\" name=\"detail\">\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"detailSearchForm\" label-width=\"110px\" class=\"search-form\">\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"编号\"><el-input v-model=\"detailSearchForm.bh\" placeholder=\"请输入编号\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"库存单编号\"><el-input v-model=\"detailSearchForm.jckcdbbh\" placeholder=\"请输入库存单编号\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"教材信息编号\"><el-input v-model=\"detailSearchForm.jcxxbh\" placeholder=\"请输入教材信息编号\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"还回完毕\">\r\n <el-select v-model=\"detailSearchForm.hwbwType\" class=\"w-full\">\r\n <el-option label=\"全部\" value=\"\" />\r\n <el-option label=\"未还回\" value=\"0\" />\r\n <el-option label=\"已还回\" value=\"1\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div class=\"search-actions\">\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleDetailSearch\">查询</el-button>\r\n <el-button icon=\"el-icon-refresh\" @click=\"handleDetailReset\">重置</el-button>\r\n </div>\r\n </el-card>\r\n\r\n <div class=\"list-title\">教材库存明细项列表:</div>\r\n <div class=\"list-toolbar\">\r\n <div class=\"left-group\">\r\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleDetailNew\">新增库存明细项</el-button>\r\n </div>\r\n </div>\r\n\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <el-table v-loading=\"detailLoading\" :data=\"detailTableData\" stripe border highlight-current-row>\r\n <el-table-column type=\"index\" label=\"序号\" width=\"60\" align=\"center\" />\r\n <el-table-column prop=\"jckcdbbh\" label=\"库存单编号\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"jcxxbh\" label=\"教材信息编号\" min-width=\"110\" align=\"center\" />\r\n <el-table-column prop=\"sl\" label=\"数量\" min-width=\"80\" align=\"center\" />\r\n <el-table-column prop=\"qzkcmxxbh\" label=\"前置库存明细项编号\" min-width=\"130\" show-overflow-tooltip />\r\n <el-table-column label=\"还回完毕\" min-width=\"90\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <el-tag :type=\"row.hwbw ? 'success' : 'info'\" size=\"small\">{{ row.hwbw ? '是' : '否' }}</el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"还回完毕时间\" min-width=\"150\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtDateTime(row.hwbwsj) || '-' }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"bz\" label=\"备注\" min-width=\"120\" show-overflow-tooltip />\r\n <el-table-column label=\"操作\" width=\"150\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-view\" @click=\"handleDetailView(row)\">详情</el-button>\r\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-edit\" @click=\"handleDetailEdit(row)\">编辑</el-button>\r\n <el-button type=\"text\" size=\"small\" class=\"danger-text\" @click=\"handleDetailDelete(row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <el-empty v-if=\"!detailLoading && detailTableData.length === 0\" description=\"暂无库存明细项数据\" :image-size=\"60\" />\r\n <div class=\"pagination-wrap\">\r\n <el-pagination\r\n :current-page=\"detailPageNum\"\r\n :page-size=\"detailPageSize\"\r\n :total=\"detailTotal\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n background\r\n @size-change=\"handleDetailSizeChange\"\r\n @current-change=\"handleDetailCurrentChange\"\r\n />\r\n </div>\r\n </el-card>\r\n </el-tab-pane>\r\n </el-tabs>\r\n\r\n <!-- 新建教材对话框 -->\r\n <el-dialog\r\n :visible=\"addDialogVisible\"\r\n title=\"新建教材\"\r\n width=\"780px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => addDialogVisible = val\"\r\n >\r\n <el-form ref=\"addFormRef\" :model=\"addForm\" :rules=\"formRules\" label-width=\"140px\" class=\"add-form\">\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材名称\" prop=\"mc\"><el-input v-model=\"addForm.mc\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编写类型\" prop=\"jcbxlx\">\r\n <el-select v-model=\"addForm.jcbxlx\" placeholder=\"请选择\" style=\"width:100%\">\r\n <el-option v-for=\"item in jcbxlxOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"作者\"><el-input v-model=\"addForm.zz\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"出版社\"><el-input v-model=\"addForm.cbs\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"ISBN\"><el-input v-model=\"addForm.isbn\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"出版日期\">\r\n <el-date-picker v-model=\"addForm.cbrq\" type=\"date\" value-format=\"yyyy-MM-dd\" placeholder=\"选择\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材分类\">\r\n <el-select v-model=\"addForm.jcfl\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jcflOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材类型\">\r\n <el-select v-model=\"addForm.jclx\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jclxOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"重点类型\">\r\n <el-select v-model=\"addForm.jczdlx\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jczdlxOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材来源\">\r\n <el-select v-model=\"addForm.jcly\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jclyOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材层次\">\r\n <el-select v-model=\"addForm.jccc\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jcccOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"出版方式\">\r\n <el-select v-model=\"addForm.cbfs\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in cbfsOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"版次\"><el-input v-model=\"addForm.bc\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"开本\"><el-input v-model=\"addForm.kb\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"单价\"><el-input-number v-model=\"addForm.dj\" :min=\"0\" :precision=\"2\" style=\"width:100%\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"计量单位\">\r\n <el-select v-model=\"addForm.jldw\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jldwOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"责任教员联系方式\"><el-input v-model=\"addForm.zrjyjlxff\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材代码\"><el-input v-model=\"addForm.jcdm\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材密级\">\r\n <el-select v-model=\"addForm.jcmj\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jcmjOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编写单位\"><el-input v-model=\"addForm.bxdw\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"备注\"><el-input v-model=\"addForm.bz\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"属性\">\r\n <el-checkbox v-model=\"addForm.xcy\">需彩印</el-checkbox>\r\n <el-checkbox v-model=\"addForm.ty\" class=\"margin-left-10\">停用</el-checkbox>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <el-button @click=\"addDialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"addSaving\" @click=\"handleAddConfirm\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 编辑教材对话框 -->\r\n <el-dialog\r\n :visible=\"editDialogVisible\"\r\n title=\"编辑教材\"\r\n width=\"780px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => editDialogVisible = val\"\r\n >\r\n <div v-loading=\"editLoading\">\r\n <el-form ref=\"editFormRef\" :model=\"editForm\" :rules=\"formRules\" label-width=\"140px\" class=\"add-form\">\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编号\"><el-input v-model=\"editForm.bh\" disabled /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材名称\" prop=\"mc\"><el-input v-model=\"editForm.mc\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编写类型\" prop=\"jcbxlx\">\r\n <el-select v-model=\"editForm.jcbxlx\" placeholder=\"请选择\" style=\"width:100%\">\r\n <el-option v-for=\"item in jcbxlxOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"作者\"><el-input v-model=\"editForm.zz\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"出版社\"><el-input v-model=\"editForm.cbs\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"ISBN\"><el-input v-model=\"editForm.isbn\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"出版日期\">\r\n <el-date-picker v-model=\"editForm.cbrq\" type=\"date\" value-format=\"yyyy-MM-dd\" placeholder=\"选择\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材分类\">\r\n <el-select v-model=\"editForm.jcfl\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jcflOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材类型\">\r\n <el-select v-model=\"editForm.jclx\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jclxOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"重点类型\">\r\n <el-select v-model=\"editForm.jczdlx\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jczdlxOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材来源\">\r\n <el-select v-model=\"editForm.jcly\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jclyOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材层次\">\r\n <el-select v-model=\"editForm.jccc\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jcccOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"出版方式\">\r\n <el-select v-model=\"editForm.cbfs\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in cbfsOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"版次\"><el-input v-model=\"editForm.bc\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"开本\"><el-input v-model=\"editForm.kb\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"单价\"><el-input-number v-model=\"editForm.dj\" :min=\"0\" :precision=\"2\" style=\"width:100%\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"计量单位\">\r\n <el-select v-model=\"editForm.jldw\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jldwOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"责任教员联系方式\"><el-input v-model=\"editForm.zrjyjlxff\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材代码\"><el-input v-model=\"editForm.jcdm\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材密级\">\r\n <el-select v-model=\"editForm.jcmj\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jcmjOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编写单位\"><el-input v-model=\"editForm.bxdw\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"备注\"><el-input v-model=\"editForm.bz\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"属性\">\r\n <el-checkbox v-model=\"editForm.xcy\">需彩印</el-checkbox>\r\n <el-checkbox v-model=\"editForm.ty\" class=\"margin-left-10\">停用</el-checkbox>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n </div>\r\n <div slot=\"footer\">\r\n <el-button @click=\"editDialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"editSaving\" @click=\"handleEditConfirm\">保存</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 库存单新增/编辑对话框 -->\r\n <el-dialog\r\n :visible=\"stockFormDialogVisible\"\r\n :title=\"isStockAdd ? '新增库存单' : '编辑库存单'\"\r\n width=\"640px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => stockFormDialogVisible = val\"\r\n >\r\n <div v-loading=\"stockFormLoading\">\r\n <el-form ref=\"stockFormRef\" :model=\"stockForm\" :rules=\"stockFormRules\" label-width=\"120px\" class=\"add-form\">\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编号\" v-if=\"!isStockAdd\"><el-input v-model=\"stockForm.bh\" disabled /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"名称\" prop=\"mc\"><el-input v-model=\"stockForm.mc\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"类别\"><el-input v-model=\"stockForm.lb\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"字别\"><el-input v-model=\"stockForm.zb\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"承办部门编号\"><el-input v-model=\"stockForm.cbbmbh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"承办人编号\"><el-input v-model=\"stockForm.cbrbh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"保管员编号\"><el-input v-model=\"stockForm.bgybh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"审批人编号\"><el-input v-model=\"stockForm.sprbh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"状态\"><el-input v-model=\"stockForm.zt\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"情况说明\"><el-input v-model=\"stockForm.qksm\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"备注\"><el-input v-model=\"stockForm.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"JSONZD\"><el-input v-model=\"stockForm.jsonzd\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n </div>\r\n <div slot=\"footer\">\r\n <el-button @click=\"stockFormDialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"stockSaving\" @click=\"handleStockFormConfirm\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 库存单详情对话框 -->\r\n <el-dialog\r\n :visible=\"stockDetailDialogVisible\"\r\n title=\"库存单详情\"\r\n width=\"640px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => stockDetailDialogVisible = val\"\r\n >\r\n <el-descriptions :column=\"2\" border size=\"medium\">\r\n <el-descriptions-item label=\"编号\">{{ stockDetailData.bh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"名称\">{{ stockDetailData.mc || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"类别\">{{ stockDetailData.lb || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"字别\">{{ stockDetailData.zb || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"情况说明\" :span=\"2\">{{ stockDetailData.qksm || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"承办部门编号\">{{ stockDetailData.cbbmbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"承办人编号\">{{ stockDetailData.cbrbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"保管员编号\">{{ stockDetailData.bgybh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"审批人编号\">{{ stockDetailData.sprbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"状态\">{{ stockDetailData.zt || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"备注\">{{ stockDetailData.bz || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"JSONZD\">{{ stockDetailData.jsonzd || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"创建时间\">{{ fmtDateTime(stockDetailData.cjsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"修改时间\">{{ fmtDateTime(stockDetailData.xgsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"提交时间\">{{ fmtDateTime(stockDetailData.tjsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"审批时间\">{{ fmtDateTime(stockDetailData.spsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"执行时间\">{{ fmtDateTime(stockDetailData.zxsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"结束时间\">{{ fmtDateTime(stockDetailData.jssj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"退回意见\">{{ stockDetailData.thyj || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"退回时间\">{{ fmtDateTime(stockDetailData.thsj) || '-' }}</el-descriptions-item>\r\n </el-descriptions>\r\n <div slot=\"footer\">\r\n <el-button @click=\"stockDetailDialogVisible = false\">关闭</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 库存明细项新增/编辑对话框 -->\r\n <el-dialog\r\n :visible=\"detailFormDialogVisible\"\r\n :title=\"isDetailAdd ? '新增库存明细项' : '编辑库存明细项'\"\r\n width=\"640px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => detailFormDialogVisible = val\"\r\n >\r\n <div v-loading=\"detailFormLoading\">\r\n <el-form ref=\"detailFormRef\" :model=\"detailForm\" :rules=\"detailFormRules\" label-width=\"140px\" class=\"add-form\">\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编号\" v-if=\"!isDetailAdd\"><el-input v-model=\"detailForm.bh\" disabled /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"库存单编号\" prop=\"jckcdbbh\"><el-input v-model=\"detailForm.jckcdbbh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材信息编号\" prop=\"jcxxbh\"><el-input v-model=\"detailForm.jcxxbh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"数量\" prop=\"sl\"><el-input-number v-model=\"detailForm.sl\" :min=\"0\" :precision=\"0\" style=\"width:100%\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"前置库存明细项编号\"><el-input v-model=\"detailForm.qzkcmxxbh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"还回完毕\">\r\n <el-switch v-model=\"detailForm.hwbw\" active-text=\"是\" inactive-text=\"否\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"还回完毕时间\">\r\n <el-date-picker v-model=\"detailForm.hwbwsj\" type=\"datetime\" value-format=\"yyyy-MM-dd HH:mm:ss\" placeholder=\"选择\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"备注\"><el-input v-model=\"detailForm.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"JSONZD\"><el-input v-model=\"detailForm.jsonzd\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n </div>\r\n <div slot=\"footer\">\r\n <el-button @click=\"detailFormDialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"detailSaving\" @click=\"handleDetailFormConfirm\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 库存明细项详情对话框 -->\r\n <el-dialog\r\n :visible=\"detailViewDialogVisible\"\r\n title=\"库存明细项详情\"\r\n width=\"640px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => detailViewDialogVisible = val\"\r\n >\r\n <el-descriptions :column=\"2\" border size=\"medium\">\r\n <el-descriptions-item label=\"编号\">{{ detailViewData.bh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"库存单编号\">{{ detailViewData.jckcdbbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"教材信息编号\">{{ detailViewData.jcxxbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"数量\">{{ fmtVal(detailViewData.sl) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"前置库存明细项编号\" :span=\"2\">{{ detailViewData.qzkcmxxbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"还回完毕\">\r\n <el-tag :type=\"detailViewData.hwbw ? 'success' : 'info'\" size=\"small\">{{ detailViewData.hwbw ? '是' : '否' }}</el-tag>\r\n </el-descriptions-item>\r\n <el-descriptions-item label=\"还回完毕时间\">{{ fmtDateTime(detailViewData.hwbwsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"备注\">{{ detailViewData.bz || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"JSONZD\">{{ detailViewData.jsonzd || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"快照_事务后库存数量\">{{ fmtVal(detailViewData.kzswHkcsl) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"快照_事务后借出数量\">{{ fmtVal(detailViewData.kzswHjcsl) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"快照_事务前库存数量\">{{ fmtVal(detailViewData.kzswQkcsl) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"快照_事务前借出数量\">{{ fmtVal(detailViewData.kzswQjcsl) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"创建时间\">{{ fmtDateTime(detailViewData.createTime) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"更新时间\">{{ fmtDateTime(detailViewData.updateTime) || '-' }}</el-descriptions-item>\r\n </el-descriptions>\r\n <div slot=\"footer\">\r\n <el-button @click=\"detailViewDialogVisible = false\">关闭</el-button>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { saveAs } from 'file-saver'\r\nimport {\r\n listTeachingMaterial,\r\n getTeachingMaterialById,\r\n addTeachingMaterial,\r\n updateTeachingMaterial,\r\n deleteTeachingMaterial,\r\n downloadTeachingMaterialTemplate,\r\n importTeachingMaterial\r\n} from '@/api/textbook/teachingMaterial'\r\nimport {\r\n listTeachingStock,\r\n getTeachingStock,\r\n addTeachingStock,\r\n updateTeachingStock,\r\n deleteTeachingStock,\r\n listTeachingStockDetail,\r\n getTeachingStockDetail,\r\n addTeachingStockDetail,\r\n updateTeachingStockDetail,\r\n deleteTeachingStockDetail\r\n} from '@/api/textbook/teachingStock'\r\n\r\nexport default {\r\n name: 'TextbookIndex',\r\n data() {\r\n return {\r\n activeTab: 'info',\r\n\r\n // ==================== 查询表单(仅后端 Mapper 支持的字段) ====================\r\n searchForm: {\r\n bh: '', mc: '', zz: '', cbs: '', isbn: '',\r\n jcfl: '', jclx: '', tyType: ''\r\n },\r\n\r\n // ==================== 下拉选项 ====================\r\n jcflOptions: ['基本教材', '辅助教材', '参考资料'],\r\n jclxOptions: ['国家规划', '军队规划', '院校自编'],\r\n jcbxlxOptions: ['自编', '选用'],\r\n jczdlxOptions: ['一般教材', '重点教材', '规划教材'],\r\n jclyOptions: ['教研保障中心外购', '自购', '上级配发'],\r\n jcccOptions: ['无', '本科', '研究生'],\r\n cbfsOptions: ['公开出版', '内部出版'],\r\n jcmjOptions: ['公开', '内部', '秘密'],\r\n jldwOptions: ['本', '册'],\r\n\r\n // ==================== 表格数据 ====================\r\n loading: false,\r\n tableData: [],\r\n pageNum: 1,\r\n pageSize: 20,\r\n total: 0,\r\n\r\n // ==================== 新建教材 ====================\r\n addDialogVisible: false,\r\n addSaving: false,\r\n addForm: this.createEmptyForm(),\r\n\r\n // ==================== 编辑教材 ====================\r\n editDialogVisible: false,\r\n editLoading: false,\r\n editSaving: false,\r\n editForm: this.createEmptyForm(),\r\n\r\n // ==================== 表单校验 ====================\r\n formRules: {\r\n mc: [{ required: true, message: '请输入教材名称', trigger: 'blur' }],\r\n jcbxlx: [{ required: true, message: '请选择编写类型', trigger: 'change' }]\r\n },\r\n\r\n // ==================== 导入 ====================\r\n selectedFile: null,\r\n\r\n // ==================== 教材库存单(JCKCD ====================\r\n stockSearchForm: { bh: '', mc: '', lb: '', zb: '', zt: '' },\r\n stockLoading: false,\r\n stockTableData: [],\r\n stockPageNum: 1,\r\n stockPageSize: 20,\r\n stockTotal: 0,\r\n stockFormDialogVisible: false,\r\n stockFormLoading: false,\r\n stockSaving: false,\r\n isStockAdd: true,\r\n stockForm: this.createEmptyStockForm(),\r\n stockFormRules: {\r\n mc: [{ required: true, message: '请输入名称', trigger: 'blur' }]\r\n },\r\n stockDetailDialogVisible: false,\r\n stockDetailData: {},\r\n\r\n // ==================== 教材库存明细项(JCKCMXX ====================\r\n detailSearchForm: { bh: '', jckcdbbh: '', jcxxbh: '', hwbwType: '' },\r\n detailLoading: false,\r\n detailTableData: [],\r\n detailPageNum: 1,\r\n detailPageSize: 20,\r\n detailTotal: 0,\r\n detailFormDialogVisible: false,\r\n detailFormLoading: false,\r\n detailSaving: false,\r\n isDetailAdd: true,\r\n detailForm: this.createEmptyDetailForm(),\r\n detailFormRules: {\r\n jckcdbbh: [{ required: true, message: '请输入库存单编号', trigger: 'blur' }],\r\n jcxxbh: [{ required: true, message: '请输入教材信息编号', trigger: 'blur' }],\r\n sl: [{ required: true, message: '请输入数量', trigger: 'change' }]\r\n },\r\n detailViewDialogVisible: false,\r\n detailViewData: {}\r\n }\r\n },\r\n computed: {\r\n fileName() {\r\n return (this.selectedFile && this.selectedFile.name) || '未选择任何文件'\r\n }\r\n },\r\n mounted() {\r\n this.fetchList()\r\n },\r\n methods: {\r\n /** 表格日期格式化 */\r\n formatDate(row, column, cellValue) {\r\n return cellValue ? String(cellValue).slice(0, 10) : ''\r\n },\r\n\r\n /** 统一格式化后端 LocalDateTime(去除 T、截断到秒) */\r\n fmtDateTime(val) {\r\n if (val === null || val === undefined || val === '') return ''\r\n return String(val).replace('T', ' ').slice(0, 19)\r\n },\r\n\r\n /** 空值显示为 '-'Vue 2 模板表达式不支持 ?? 运算符) */\r\n fmtVal(val) {\r\n return (val === null || val === undefined || val === '') ? '-' : val\r\n },\r\n\r\n /** 创建空白教材表单 */\r\n createEmptyForm() {\r\n return {\r\n mc: '', zz: '', cbs: '', isbn: '', cbrq: '', jcfl: '', jclx: '',\r\n jcbxlx: '', jczdlx: '', jcly: '', jccc: '', bc: '', kb: '', dj: null,\r\n jldw: '本', zrjyjlxff: '', jcdm: '', cbfs: '', jcmj: '', bxdw: '',\r\n bz: '', xcy: false, ty: false\r\n }\r\n },\r\n\r\n /** 创建空白库存单表单 */\r\n createEmptyStockForm() {\r\n return {\r\n mc: '', qksm: '', lb: '', zb: '', cbbmbh: '', cbrbh: '',\r\n bgybh: '', sprbh: '', zt: '', bz: '', jsonzd: ''\r\n }\r\n },\r\n\r\n /** 创建空白库存明细项表单 */\r\n createEmptyDetailForm() {\r\n return {\r\n jckcdbbh: '', jcxxbh: '', sl: null, qzkcmxxbh: '',\r\n hwbw: false, hwbwsj: '', bz: '', jsonzd: ''\r\n }\r\n },\r\n\r\n /** 移除空值 */\r\n cleanPayload(obj) {\r\n const payload = {}\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key]\r\n if (value !== '' && value !== null && value !== undefined) {\r\n payload[key] = value\r\n }\r\n })\r\n return payload\r\n },\r\n\r\n // ==================== 列表加载 ====================\r\n buildQuery() {\r\n const params = {}\r\n ;['bh', 'mc', 'zz', 'cbs', 'isbn', 'jcfl', 'jclx'].forEach(key => {\r\n const value = this.searchForm[key]\r\n if (value !== '' && value !== null && value !== undefined) {\r\n params[key] = String(value).trim()\r\n }\r\n })\r\n if (this.searchForm.tyType === '0') params.ty = false\r\n else if (this.searchForm.tyType === '1') params.ty = true\r\n return params\r\n },\r\n\r\n fetchList() {\r\n this.loading = true\r\n const params = {\r\n pageNum: this.pageNum,\r\n pageSize: this.pageSize,\r\n ...this.buildQuery()\r\n }\r\n listTeachingMaterial(params).then(response => {\r\n const data = response.data || {}\r\n this.tableData = data.records || []\r\n this.total = data.total || 0\r\n this.loading = false\r\n }).catch(() => {\r\n this.tableData = []\r\n this.total = 0\r\n this.loading = false\r\n })\r\n },\r\n\r\n // ==================== 查询 / 重置 ====================\r\n handleSearch() {\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handleReset() {\r\n this.searchForm = {\r\n bh: '', mc: '', zz: '', cbs: '', isbn: '',\r\n jcfl: '', jclx: '', tyType: ''\r\n }\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handleSizeChange(size) {\r\n this.pageSize = size\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n handleCurrentChange(page) {\r\n this.pageNum = page\r\n this.fetchList()\r\n },\r\n\r\n // ==================== 无后端接口的操作 ====================\r\n handleDownloadList() {\r\n this.$message.info('后端暂未提供该接口')\r\n },\r\n\r\n handleDownloadZip() {\r\n this.$message.info('后端暂未提供该接口')\r\n },\r\n\r\n // ==================== 新建教材 ====================\r\n handleNew() {\r\n this.addForm = this.createEmptyForm()\r\n this.$nextTick(() => {\r\n this.$refs.addFormRef && this.$refs.addFormRef.clearValidate()\r\n })\r\n this.addDialogVisible = true\r\n },\r\n\r\n handleAddConfirm() {\r\n this.$refs.addFormRef.validate(valid => {\r\n if (!valid) return\r\n this.addSaving = true\r\n addTeachingMaterial(this.buildPayload(this.addForm)).then(() => {\r\n this.$message.success('新增成功')\r\n this.addDialogVisible = false\r\n this.fetchList()\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.addSaving = false\r\n })\r\n })\r\n },\r\n\r\n // ==================== 编辑教材 ====================\r\n handleEdit(row) {\r\n this.editDialogVisible = true\r\n this.editLoading = true\r\n getTeachingMaterialById(row.id).then(response => {\r\n const data = response.data || {}\r\n const form = this.createEmptyForm()\r\n Object.keys(form).forEach(key => {\r\n if (data[key] !== undefined && data[key] !== null) form[key] = data[key]\r\n })\r\n // 日期字段截断适配 date 控件\r\n if (form.cbrq) form.cbrq = String(form.cbrq).slice(0, 10)\r\n form.id = data.id\r\n form.bh = data.bh\r\n this.editForm = form\r\n this.editLoading = false\r\n }).catch(() => {\r\n this.editDialogVisible = false\r\n this.editLoading = false\r\n })\r\n },\r\n\r\n handleEditConfirm() {\r\n this.$refs.editFormRef.validate(valid => {\r\n if (!valid) return\r\n const payload = this.buildPayload(this.editForm)\r\n if (!this.editForm.id) {\r\n this.$message.warning('缺少记录ID,无法保存')\r\n return\r\n }\r\n payload.id = this.editForm.id\r\n payload.bh = this.editForm.bh\r\n this.editSaving = true\r\n updateTeachingMaterial(payload).then(() => {\r\n this.$message.success('保存成功')\r\n this.editDialogVisible = false\r\n this.fetchList()\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.editSaving = false\r\n })\r\n })\r\n },\r\n\r\n /** 组装新增/编辑请求体(JCXX 实体,仅传非空字段) */\r\n buildPayload(form) {\r\n const payload = this.cleanPayload({\r\n mc: form.mc,\r\n zz: form.zz,\r\n cbs: form.cbs,\r\n isbn: form.isbn,\r\n jcfl: form.jcfl,\r\n jclx: form.jclx,\r\n jcbxlx: form.jcbxlx,\r\n jczdlx: form.jczdlx,\r\n jcly: form.jcly,\r\n jccc: form.jccc,\r\n bc: form.bc,\r\n kb: form.kb,\r\n jldw: form.jldw,\r\n zrjyjlxff: form.zrjyjlxff,\r\n jcdm: form.jcdm,\r\n cbfs: form.cbfs,\r\n jcmj: form.jcmj,\r\n bxdw: form.bxdw,\r\n bz: form.bz,\r\n xcy: !!form.xcy,\r\n ty: !!form.ty\r\n })\r\n // 日期字段转 ISO(后端 cbrq 为 LocalDateTime\r\n if (form.cbrq) payload.cbrq = form.cbrq + 'T00:00:00'\r\n // 数值字段\r\n if (form.dj !== '' && form.dj !== null && form.dj !== undefined) {\r\n payload.dj = Number(form.dj)\r\n }\r\n return payload\r\n },\r\n\r\n // ==================== 删除 ====================\r\n handleDelete(row) {\r\n if (!row.id) {\r\n this.$message.warning('当前行缺少ID')\r\n return\r\n }\r\n this.$confirm(`确定要删除教材「${row.mc || row.bh}」吗?`, '系统提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n deleteTeachingMaterial(row.id).then(() => {\r\n this.$message.success('删除成功')\r\n this.fetchList()\r\n }).catch(() => {})\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 模板下载 / 导入 ====================\r\n handleDownloadTemplate() {\r\n downloadTeachingMaterialTemplate().then(blob => {\r\n saveAs(blob, '教材管理导入模板.xls')\r\n this.$message.success('模板下载成功')\r\n }).catch(() => {})\r\n },\r\n\r\n handleChooseFile() {\r\n this.$refs.fileInput && this.$refs.fileInput.click()\r\n },\r\n\r\n handleFileChange(e) {\r\n const input = e.target\r\n if (input.files && input.files.length > 0) {\r\n this.selectedFile = input.files[0]\r\n }\r\n },\r\n\r\n handleImport() {\r\n if (!this.selectedFile) {\r\n this.$message.warning('请先选择文件')\r\n return\r\n }\r\n importTeachingMaterial(this.selectedFile).then(response => {\r\n const count = (response && response.data) || 0\r\n this.$message.success(`导入成功,共导入 ${count} 条`)\r\n this.selectedFile = null\r\n if (this.$refs.fileInput) this.$refs.fileInput.value = ''\r\n this.fetchList()\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 教材库存单 ====================\r\n buildStockQuery() {\r\n const params = {}\r\n ;['bh', 'mc', 'lb', 'zb', 'zt'].forEach(key => {\r\n const value = this.stockSearchForm[key]\r\n if (value !== '' && value !== null && value !== undefined) {\r\n params[key] = String(value).trim()\r\n }\r\n })\r\n return params\r\n },\r\n\r\n fetchStockList() {\r\n this.stockLoading = true\r\n const params = {\r\n pageNum: this.stockPageNum,\r\n pageSize: this.stockPageSize,\r\n ...this.buildStockQuery()\r\n }\r\n listTeachingStock(params).then(response => {\r\n const data = response.data || {}\r\n this.stockTableData = data.records || []\r\n this.stockTotal = data.total || 0\r\n this.stockLoading = false\r\n }).catch(() => {\r\n this.stockTableData = []\r\n this.stockTotal = 0\r\n this.stockLoading = false\r\n })\r\n },\r\n\r\n handleStockSearch() {\r\n this.stockPageNum = 1\r\n this.fetchStockList()\r\n },\r\n\r\n handleStockReset() {\r\n this.stockSearchForm = { bh: '', mc: '', lb: '', zb: '', zt: '' }\r\n this.stockPageNum = 1\r\n this.fetchStockList()\r\n },\r\n\r\n handleStockSizeChange(size) {\r\n this.stockPageSize = size\r\n this.stockPageNum = 1\r\n this.fetchStockList()\r\n },\r\n handleStockCurrentChange(page) {\r\n this.stockPageNum = page\r\n this.fetchStockList()\r\n },\r\n\r\n handleStockNew() {\r\n this.isStockAdd = true\r\n this.stockForm = this.createEmptyStockForm()\r\n this.$nextTick(() => {\r\n this.$refs.stockFormRef && this.$refs.stockFormRef.clearValidate()\r\n })\r\n this.stockFormDialogVisible = true\r\n },\r\n\r\n handleStockEdit(row) {\r\n this.isStockAdd = false\r\n this.stockFormDialogVisible = true\r\n this.stockFormLoading = true\r\n getTeachingStock(row.id).then(response => {\r\n const data = response.data || {}\r\n const form = this.createEmptyStockForm()\r\n Object.keys(form).forEach(key => {\r\n if (data[key] !== undefined && data[key] !== null) form[key] = data[key]\r\n })\r\n form.id = data.id\r\n form.bh = data.bh\r\n this.stockForm = form\r\n this.stockFormLoading = false\r\n }).catch(() => {\r\n this.stockFormDialogVisible = false\r\n this.stockFormLoading = false\r\n })\r\n },\r\n\r\n buildStockPayload() {\r\n const f = this.stockForm\r\n const payload = this.cleanPayload({\r\n mc: f.mc,\r\n qksm: f.qksm,\r\n lb: f.lb,\r\n zb: f.zb,\r\n cbbmbh: f.cbbmbh,\r\n cbrbh: f.cbrbh,\r\n bgybh: f.bgybh,\r\n sprbh: f.sprbh,\r\n zt: f.zt,\r\n bz: f.bz,\r\n jsonzd: f.jsonzd\r\n })\r\n return payload\r\n },\r\n\r\n handleStockFormConfirm() {\r\n this.$refs.stockFormRef.validate(valid => {\r\n if (!valid) return\r\n const payload = this.buildStockPayload()\r\n if (!this.isStockAdd) {\r\n if (!this.stockForm.id) {\r\n this.$message.warning('缺少记录ID,无法保存')\r\n return\r\n }\r\n payload.id = this.stockForm.id\r\n payload.bh = this.stockForm.bh\r\n }\r\n this.stockSaving = true\r\n const request = this.isStockAdd ? addTeachingStock(payload) : updateTeachingStock(payload)\r\n request.then(() => {\r\n this.$message.success(this.isStockAdd ? '新增成功' : '修改成功')\r\n this.stockFormDialogVisible = false\r\n this.fetchStockList()\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.stockSaving = false\r\n })\r\n })\r\n },\r\n\r\n handleStockDetail(row) {\r\n this.stockDetailData = row\r\n this.stockDetailDialogVisible = true\r\n },\r\n\r\n handleStockDelete(row) {\r\n if (!row.id) {\r\n this.$message.warning('当前行缺少ID')\r\n return\r\n }\r\n this.$confirm(`确定要删除库存单「${row.mc || row.bh}」吗?`, '系统提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n deleteTeachingStock(row.id).then(() => {\r\n this.$message.success('删除成功')\r\n this.fetchStockList()\r\n }).catch(() => {})\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 教材库存明细项 ====================\r\n buildDetailQuery() {\r\n const params = {}\r\n ;['bh', 'jckcdbbh', 'jcxxbh'].forEach(key => {\r\n const value = this.detailSearchForm[key]\r\n if (value !== '' && value !== null && value !== undefined) {\r\n params[key] = String(value).trim()\r\n }\r\n })\r\n if (this.detailSearchForm.hwbwType === '0') params.hwbw = false\r\n else if (this.detailSearchForm.hwbwType === '1') params.hwbw = true\r\n return params\r\n },\r\n\r\n fetchDetailList() {\r\n this.detailLoading = true\r\n const params = {\r\n pageNum: this.detailPageNum,\r\n pageSize: this.detailPageSize,\r\n ...this.buildDetailQuery()\r\n }\r\n listTeachingStockDetail(params).then(response => {\r\n const data = response.data || {}\r\n this.detailTableData = data.records || []\r\n this.detailTotal = data.total || 0\r\n this.detailLoading = false\r\n }).catch(() => {\r\n this.detailTableData = []\r\n this.detailTotal = 0\r\n this.detailLoading = false\r\n })\r\n },\r\n\r\n handleDetailSearch() {\r\n this.detailPageNum = 1\r\n this.fetchDetailList()\r\n },\r\n\r\n handleDetailReset() {\r\n this.detailSearchForm = { bh: '', jckcdbbh: '', jcxxbh: '', hwbwType: '' }\r\n this.detailPageNum = 1\r\n this.fetchDetailList()\r\n },\r\n\r\n handleDetailSizeChange(size) {\r\n this.detailPageSize = size\r\n this.detailPageNum = 1\r\n this.fetchDetailList()\r\n },\r\n handleDetailCurrentChange(page) {\r\n this.detailPageNum = page\r\n this.fetchDetailList()\r\n },\r\n\r\n handleDetailNew() {\r\n this.isDetailAdd = true\r\n this.detailForm = this.createEmptyDetailForm()\r\n this.$nextTick(() => {\r\n this.$refs.detailFormRef && this.$refs.detailFormRef.clearValidate()\r\n })\r\n this.detailFormDialogVisible = true\r\n },\r\n\r\n handleDetailEdit(row) {\r\n this.isDetailAdd = false\r\n this.detailFormDialogVisible = true\r\n this.detailFormLoading = true\r\n getTeachingStockDetail(row.id).then(response => {\r\n const data = response.data || {}\r\n const form = this.createEmptyDetailForm()\r\n Object.keys(form).forEach(key => {\r\n if (data[key] !== undefined && data[key] !== null) form[key] = data[key]\r\n })\r\n if (form.hwbwsj) form.hwbwsj = String(form.hwbwsj).replace('T', ' ').slice(0, 19)\r\n form.id = data.id\r\n form.bh = data.bh\r\n this.detailForm = form\r\n this.detailFormLoading = false\r\n }).catch(() => {\r\n this.detailFormDialogVisible = false\r\n this.detailFormLoading = false\r\n })\r\n },\r\n\r\n buildDetailPayload() {\r\n const f = this.detailForm\r\n const payload = this.cleanPayload({\r\n jckcdbbh: f.jckcdbbh,\r\n jcxxbh: f.jcxxbh,\r\n qzkcmxxbh: f.qzkcmxxbh,\r\n hwbw: !!f.hwbw,\r\n bz: f.bz,\r\n jsonzd: f.jsonzd\r\n })\r\n if (f.sl !== '' && f.sl !== null && f.sl !== undefined) {\r\n payload.sl = Number(f.sl)\r\n }\r\n // 还回完毕时间为 LocalDateTime,转 ISO\r\n if (f.hwbwsj) payload.hwbwsj = f.hwbwsj.replace(' ', 'T')\r\n return payload\r\n },\r\n\r\n handleDetailFormConfirm() {\r\n this.$refs.detailFormRef.validate(valid => {\r\n if (!valid) return\r\n const payload = this.buildDetailPayload()\r\n if (!this.isDetailAdd) {\r\n if (!this.detailForm.id) {\r\n this.$message.warning('缺少记录ID,无法保存')\r\n return\r\n }\r\n payload.id = this.detailForm.id\r\n payload.bh = this.detailForm.bh\r\n }\r\n this.detailSaving = true\r\n const request = this.isDetailAdd ? addTeachingStockDetail(payload) : updateTeachingStockDetail(payload)\r\n request.then(() => {\r\n this.$message.success(this.isDetailAdd ? '新增成功' : '修改成功')\r\n this.detailFormDialogVisible = false\r\n this.fetchDetailList()\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.detailSaving = false\r\n })\r\n })\r\n },\r\n\r\n handleDetailView(row) {\r\n this.detailViewData = row\r\n this.detailViewDialogVisible = true\r\n },\r\n\r\n handleDetailDelete(row) {\r\n if (!row.id) {\r\n this.$message.warning('当前行缺少ID')\r\n return\r\n }\r\n this.$confirm(`确定要删除库存明细项「${row.bh}」吗?`, '系统提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n deleteTeachingStockDetail(row.id).then(() => {\r\n this.$message.success('删除成功')\r\n this.fetchDetailList()\r\n }).catch(() => {})\r\n }).catch(() => {})\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.app-container {\r\n padding: 20px;\r\n}\r\n\r\n.textbook-tabs {\r\n .search-card {\r\n margin-bottom: 16px;\r\n\r\n .search-form {\r\n .w-full {\r\n width: 100%;\r\n }\r\n\r\n .el-form-item {\r\n margin-bottom: 0;\r\n padding: 10px 12px;\r\n }\r\n }\r\n\r\n .search-actions {\r\n display: flex;\r\n justify-content: flex-end;\r\n padding: 12px;\r\n border-top: 1px solid #ebeef5;\r\n }\r\n }\r\n\r\n .list-title {\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin-bottom: 12px;\r\n }\r\n\r\n .list-toolbar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 12px;\r\n flex-wrap: wrap;\r\n margin-bottom: 16px;\r\n\r\n .left-group,\r\n .right-group {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n flex-wrap: wrap;\r\n }\r\n\r\n .file-input {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n\r\n .file-name {\r\n font-size: 14px;\r\n color: #606266;\r\n min-width: 120px;\r\n }\r\n }\r\n }\r\n\r\n .table-card {\r\n margin-bottom: 16px;\r\n\r\n ::v-deep(.el-table) {\r\n width: 100%;\r\n }\r\n\r\n .pagination-wrap {\r\n display: flex;\r\n justify-content: flex-end;\r\n margin-top: 16px;\r\n }\r\n }\r\n\r\n .margin-left-10 {\r\n margin-left: 10px;\r\n }\r\n\r\n // 表格操作按钮文字颜色\r\n .danger-text {\r\n color: #f56c6c;\r\n padding: 0;\r\n }\r\n}\r\n</style>\r\n"]}]}