main.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  6. <meta http-equiv="x-ua-compatible" content="ie=edge">
  7. <title>清单规则编辑器</title>
  8. <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
  9. <link rel="stylesheet" href="/web/maintain/bills_lib/css/main.css">
  10. <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
  11. <style>
  12. .avatar {
  13. display: flex;
  14. align-items: center;
  15. height: 38px;
  16. cursor: pointer;
  17. padding: 0 20px;
  18. }
  19. .avatar:hover {
  20. text-decoration: none;
  21. box-shadow: inset 0 3px 5px rgb(0 0 0 / 13%);
  22. }
  23. .avatar .dropdown-menu a {
  24. display: block;
  25. padding: 3px 20px;
  26. clear: both;
  27. font-weight: 400;
  28. line-height: 1.42857143;
  29. color: #333;
  30. white-space: nowrap;
  31. }
  32. </style>
  33. <script>
  34. const isTemporary = '<%- manager.isTemporary %>';
  35. </script>
  36. </head>
  37. <body>
  38. <div class="header">
  39. <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 " style="display: flex; justify-content: space-between;">
  40. <span class="header-logo px-2">清单规则编辑器</span>
  41. <!-- <% if (manager.isTemporary) { %>
  42. <div style="cursor: pointer;">
  43. <a href="/billsGuidance/main">
  44. <span>切换到清单精灵编辑器</span>
  45. </a>
  46. </div>
  47. <% } %> -->
  48. <% if (manager.isTemporary) { %>
  49. <div class="avatar btn-group">
  50. <a class="dropdown-toggle" data-toggle="dropdown">
  51. <span><%= manager.username %></span>
  52. </a>
  53. <ul class="dropdown-menu dropdown-menu-right">
  54. <li><a href="/login/logout">退出登录</a></li>
  55. </ul>
  56. </div>
  57. <% } %>
  58. </nav>
  59. <% if (!manager.isTemporary) { %>
  60. <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
  61. <ul class="nav navbar-nav px-1">
  62. <li class="nav-item">
  63. <a class="nav-link" href="javascript:void(0);" aria-haspopup="true" aria-expanded="false" data-toggle="modal" data-target="#add">新建清单规则</a>
  64. </li>
  65. </ul>
  66. </nav>
  67. <% } %>
  68. </div>
  69. <div class="main">
  70. <div class="content">
  71. <div class="container-fluid">
  72. <div class="row">
  73. <div class="col-md-10">
  74. <div class="warp-p2 mt-3">
  75. <table class="table table-hover table-bordered">
  76. <thead>
  77. <tr>
  78. <th>清单规则名称</th>
  79. <th>清单规则类型</th>
  80. <th width="160">添加时间</th>
  81. <th width="70">操作</th>
  82. <% if (!manager.isTemporary) { %><th width="90" >导入</th> <% } %>
  83. <% if (!manager.isTemporary) { %><th width="90">复制</th><% } %>
  84. </tr>
  85. </thead>
  86. <tbody id="showArea">
  87. </tbody>
  88. </table>
  89. </div>
  90. </div>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. <!--弹出添加-->
  96. <div class="modal fade" id="add" data-backdrop="static" style="display: none;" aria-hidden="true">
  97. <div class="modal-dialog" role="document">
  98. <div class="modal-content">
  99. <div class="modal-header">
  100. <h5 class="modal-title">添加清单规则</h5>
  101. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  102. <span aria-hidden="true">×</span>
  103. </button>
  104. </div>
  105. <div class="modal-body">
  106. <form>
  107. <div class="form-group">
  108. <label>清单规则名称</label>
  109. <input id="createText" class="form-control" placeholder="输入清单规则名称" type="text">
  110. </div>
  111. <div class="form-group">
  112. <label>清单规则类型</label>
  113. <div>
  114. <div class="form-check form-check-inline">
  115. <label class="form-check-label">
  116. <input class="form-check-input" type="radio" checked name="inlineRadioOptions" id="inlineRadio1" value="1"> 标准清单
  117. </label>
  118. </div>
  119. <div class="form-check form-check-inline">
  120. <label class="form-check-label">
  121. <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio2" value="2">
  122. 指标项目表
  123. </label>
  124. </div>
  125. </div>
  126. </div>
  127. </form>
  128. </div>
  129. <div class="modal-footer">
  130. <a id="createA" href="javascript:void(0);" class="btn btn-primary">确定</a>
  131. <button type="button" id="cancelBtn" class="btn btn-secondary" data-dismiss="modal">取消</button>
  132. </div>
  133. </div>
  134. </div>
  135. </div>
  136. <!--弹出编辑-->
  137. <div class="modal fade" id="edit" data-backdrop="static" style="display: none;" aria-hidden="true">
  138. <div class="modal-dialog" role="document">
  139. <div class="modal-content">
  140. <div class="modal-header">
  141. <h5 class="modal-title">编辑清单规则</h5>
  142. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  143. <span aria-hidden="true">×</span>
  144. </button>
  145. </div>
  146. <div class="modal-body">
  147. <form>
  148. <div class="form-group">
  149. <label>清单规则名称</label>
  150. <input id="renameText" class="form-control" placeholder="输入名称" type="text" value="">
  151. </div>
  152. </form>
  153. </div>
  154. <div class="modal-footer">
  155. <a id="renameA" href="javascript: void(0);" class="btn btn-primary" data-dismiss="modal" renameId="">确定</a>
  156. <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
  157. </div>
  158. </div>
  159. </div>
  160. </div>
  161. <!--弹出删除-->
  162. <div class="modal fade" id="del" data-backdrop="static" style="display: none;" aria-hidden="true">
  163. <div class="modal-dialog" role="document">
  164. <div class="modal-content">
  165. <div class="modal-header">
  166. <h5 class="modal-title">删除确认</h5>
  167. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  168. <span aria-hidden="true">×</span>
  169. </button>
  170. </div>
  171. <div class="modal-body">
  172. <h5 class="text-danger">删除后无法恢复,确认是否删除?</h5>
  173. </div>
  174. <div class="modal-footer">
  175. <a id="deleteA" href="javascript:void(0);" class="btn btn-danger" deleteId="">确认</a>
  176. <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
  177. </div>
  178. </div>
  179. </div>
  180. </div>
  181. <!--弹出导入数据-->
  182. <div class="modal fade" id="import" data-backdrop="static" style="display: none;" aria-hidden="true">
  183. <div class="modal-dialog" role="document">
  184. <div class="modal-content">
  185. <div class="modal-header">
  186. <h5 class="modal-title">导入数据</h5>
  187. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  188. <span aria-hidden="true">×</span>
  189. </button>
  190. </div>
  191. <div class="modal-body">
  192. <div class="alert alert-warning" role="alert">
  193. 导入操作会覆盖数据,请谨慎操作!!
  194. </div>
  195. <form>
  196. <div class="form-group">
  197. <label>请选择Excel格式文件</label>
  198. <input class="form-control-file" type="file" accept=".xlsx,.xls" name="import_data"/>
  199. </div>
  200. </form>
  201. </div>
  202. <div class="modal-footer">
  203. <button type="button" class="btn btn-primary" id="data-import">确定导入</button>
  204. <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
  205. </div>
  206. </div>
  207. </div>
  208. </div>
  209. <!--弹出复制库-->
  210. <div class="modal fade" id="copy" data-backdrop="static" aria-hidden="true">
  211. <div class="modal-dialog" role="document">
  212. <div class="modal-content">
  213. <div class="modal-header">
  214. <h5 class="modal-title">复制清单规则</h5>
  215. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  216. <span aria-hidden="true">×</span>
  217. </button>
  218. </div>
  219. <div class="modal-body">
  220. <form>
  221. <div class="form-group">
  222. <label>清单规则名称</label>
  223. <input id="copyName" class="form-control" autofocus placeholder="输入清单规则名称" type="text">
  224. </div>
  225. </form>
  226. </div>
  227. <div class="modal-footer">
  228. <a id="copyA" href="javascript:void(0);" class="btn btn-primary">确定</a>
  229. <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
  230. </div>
  231. </div>
  232. </div>
  233. </div>
  234. <!-- JS. -->
  235. <script src="/lib/jquery/jquery.min.js"></script>
  236. <script src="/lib/tether/tether.min.js"></script>
  237. <script src="/lib/bootstrap/bootstrap.min.js"></script>
  238. <script src="/public/web/PerfectLoad.js"></script>
  239. <script src="/public/web/common_ajax.js"></script>
  240. <script src="/public/web/lock_util.js"></script>
  241. <script src="/web/maintain/bills_lib/scripts/global.js"></script>
  242. <script src="/web/maintain/bills_lib/scripts/bills_lib_ajax.js"></script>
  243. <script src="/web/maintain/bills_lib/scripts/tools.js"></script>
  244. </body>
  245. <script type="text/javascript">
  246. autoFlashHeight();
  247. </script>
  248. <script>
  249. let userAccount = '<%= userAccount %>';
  250. let deleteCount = 0;
  251. let preDeleteId = null;
  252. //mainAjax.getCompilationList();
  253. mainAjax.getStdBillsLib();
  254. $(document).ready(function(){
  255. //main 增删改
  256. $("#createA").click(function(){
  257. let billsLibName = $("#createText").val();
  258. let billsLibType = $('[name=inlineRadioOptions]:checked').val();
  259. if(billsLibName.trim().length === 0){
  260. alert("请输入清单规则名称!");
  261. } else {
  262. mainAjax.createStdBillsLib(userAccount, billsLibName,billsLibType);
  263. $("#createText").val("");
  264. }
  265. });
  266. $("#showArea").on("click", "[data-target = '#del']", function(){
  267. let deleteId = $(this).parent().parent().attr("id");
  268. $("#deleteA").attr("deleteId", deleteId);
  269. });
  270. $("#deleteA").click(function(){
  271. let deleteId = $(this).attr("deleteId");
  272. if(preDeleteId && preDeleteId !== deleteId){
  273. deleteCount = 0;
  274. }
  275. preDeleteId = deleteId;
  276. deleteCount++;
  277. if(deleteCount === 3){
  278. //被清单指引引用则不可删除
  279. CommonAjax.post('/billsGuidance/api/getBillsGuideLibs', {}, function (rstData) {
  280. let canDel = true;
  281. for(let lib of rstData){
  282. if(lib.billsLibId == deleteId){
  283. canDel = false;
  284. break;
  285. }
  286. }
  287. if(canDel){
  288. mainAjax.deleteStdBillsLib(userAccount, deleteId);
  289. }
  290. else {
  291. alert('当前清单规则已被清单指引库引用,请先删除对应的清单指引库。');
  292. $('#del').modal('hide');
  293. }
  294. });
  295. deleteCount = 0;
  296. }
  297. });
  298. $('#del').on('hidden.bs.modal', function () {
  299. deleteCount = 0;
  300. });
  301. $("#showArea").on("click", "[data-target = '#edit']", function(){
  302. let renameId = $(this).parent().parent().attr("id");
  303. $('#renameText').val($(this).parent().parent().find('td:first-child').text());
  304. $("#renameA").attr("renameId", renameId);
  305. });
  306. $('#showArea').on('click', '.lock', function () {
  307. lockUtil.handleLockClick($(this));
  308. });
  309. $('#edit').on('shown.bs.modal', function () {
  310. setTimeout(function () {
  311. $('#renameText').focus();
  312. }, 100);
  313. });
  314. $('#add').on('shown.bs.modal', function () {
  315. setTimeout(function () {
  316. $('#createText').focus();
  317. }, 100);
  318. });
  319. $('#add').on('hidden.bs.modal', function () {
  320. $('#createText').val('');
  321. });
  322. $("#renameA").click(function(){
  323. let newName = $("#renameText").val();
  324. let renameId = $(this).attr("renameId");
  325. if(newName){
  326. mainAjax.renameStdBillsLib(userAccount, renameId, newName);
  327. $("#renameText").val("");
  328. }
  329. else {
  330. alert("请输入名称!");
  331. }
  332. });
  333. //清空选择
  334. $('#import').on('shown.bs.modal', function () {
  335. $("input[name='import_data']").val('');
  336. });
  337. let selLibId = -1;
  338. let selLibType='1';
  339. $("#showArea").on("click", ".import-data", function () {
  340. let id = $(this).data("id");
  341. id = parseInt(id);
  342. if (isNaN(id) || id <= 0) {
  343. return false;
  344. }
  345. selLibId = id;
  346. $("#import").modal("show");
  347. });
  348. //导入数据
  349. $("#data-import").click(function() {
  350. $.bootstrapLoading.start();
  351. const self = $(this);
  352. try {
  353. let formData = new FormData();
  354. let file = $("input[name='import_data']")[0];
  355. if (file.files.length <= 0) {
  356. throw '请选择文件!';
  357. }
  358. formData.append('file', file.files[0]);
  359. // 获取库id
  360. if (selLibId <= 0) {
  361. return false;
  362. }
  363. formData.append('billsLibId', selLibId);
  364. $.ajax({
  365. url: '/stdBillsEditor/importBills',
  366. type: 'POST',
  367. data: formData,
  368. cache: false,
  369. contentType: false,
  370. processData: false,
  371. beforeSend: function() {
  372. self.attr('disabled', 'disabled');
  373. self.text('上传中...');
  374. },
  375. success: function(response){
  376. self.removeAttr('disabled');
  377. self.text('确定导入');
  378. if (response.error === 0) {
  379. $.bootstrapLoading.end();
  380. // 成功则关闭窗体
  381. $('#import').modal("hide");
  382. } else {
  383. $.bootstrapLoading.end();
  384. const message = response.msg !== undefined ? response.msg : '上传失败!';
  385. alert(message);
  386. }
  387. },
  388. error: function(){
  389. $.bootstrapLoading.end();
  390. alert("与服务器通信发生错误");
  391. self.removeAttr('disabled');
  392. self.text('确定导入');
  393. }
  394. });
  395. } catch(error) {
  396. alert(error);
  397. $.bootstrapLoading.end();
  398. }
  399. });
  400. // 复制库
  401. $("#showArea").on("click", ".copy-data", function () {
  402. let id = $(this).data("id");
  403. let type = $(this).data("type");
  404. id = parseInt(id);
  405. if (isNaN(id) || id <= 0) {
  406. return false;
  407. }
  408. selLibId = id;
  409. selLibType=type;
  410. $("#copy").modal("show");
  411. });
  412. $('#copyA').click(function () {
  413. const libId = selLibId;
  414. const libName = $('#copyName').val();
  415. const libType=selLibType;
  416. mainAjax.copyBillsLib(libId, libName,libType);
  417. });
  418. });
  419. </script>
  420. </html>