ContractDetail.cshtml 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436
  1. @using ContractService.Authorization
  2. @using ContractService.Configuration
  3. @using ContractService.LegalContract
  4. @using ContractService.Views.Shared.Modals
  5. @using ContractService.Views.Shared.Query
  6. @{
  7. ViewBag.Title = "法律服务合同详情";
  8. string activeMenu = PermissionNames.PagesCaseContractMgCaseMg; //The menu item will be active for this page.
  9. ViewBag.ActiveMenu = activeMenu;
  10. string contractNo = ViewBag.ContractNo, contractState = ViewBag.ContractState, kpLevel = ViewBag.KeyPointLevel, kpState = ViewBag.KeyPointState;
  11. int noteType = AbpSession.AccountType == AccountTypeDefinition.Lawyer ? NoteTypeDefinition.LawyerNote : NoteTypeDefinition.Note;
  12. var inputs = new List<Input>()
  13. {
  14. new InputHide("id"),
  15. new InputHide("contractNo"),
  16. new Input("code", "补充合同编号"),
  17. new Input("name", "补充合同名称"),
  18. new InputWangEditor("contentInfo", "补充合同信息").SetNotRequired(),
  19. };
  20. var modalBody = new ModalBodyViewModel(null, "form-sup")
  21. .AddTab("base", "补充合同信息", inputs)
  22. .AddTab("attach", "补充合同附件", "<div id=\"attach-box\" class=\"iwb-dynamic-box\"><button class=\"btn btn-sm btn-iwb\" type=\"button\" style=\"position: absolute; top: 8px;right:20px\" onclick=\"AddAttach($('#attach-box'))\">添加附件</button><div class=\"box-attaches\" style=\"display:none;width:100%;flex-wrap: wrap;\"></div><div class=\"row box-label\"><div class=\"col-md-11\"><label>附件名称</label></div><div class=\"col-md-1\"><label>操作</label></div></div><div class=\"box-body\"></div></div>");
  23. var modal = new ModalViewModel("添加补充合同", "", modalBody, "modal-sup");
  24. var kp_sup_inputs = new List<Input>()
  25. {
  26. new InputHide("id"),
  27. new InputHide("contractNo"),
  28. new InputHide("keyPointNo"),
  29. new Input("code", "变更材料编号"),
  30. new Input("name", "变更材料名称"),
  31. new InputWangEditor("contentInfo", "变更材料信息").SetNotRequired(),
  32. };
  33. var kp_sup_modalBody = new ModalBodyViewModel(null, "form-sup-kp")
  34. .AddTab("base-kp", "变更材料信息", kp_sup_inputs)
  35. .AddTab("attach-kp", "变更材料附件", "<div id=\"kp-attach-box\" class=\"iwb-dynamic-box\"><button class=\"btn btn-sm btn-iwb\" type=\"button\" style=\"position: absolute; top: 8px;right:20px\" onclick=\"AddAttach($('#kp-attach-box'))\">添加附件</button><div class=\"box-attaches\" style=\"display:none;width:100%;flex-wrap: wrap;\"></div><div class=\"row box-label\"><div class=\"col-md-11\"><label>附件名称</label></div><div class=\"col-md-1\"><label>操作</label></div></div><div class=\"box-body\"></div></div>");
  36. var kp_sup_modal = new ModalViewModel("变更材料(证据)", "", kp_sup_modalBody, "modal-sup-kp");
  37. var modal_note = new ModalViewModel("添加备注", "", new ModalBodyViewModel(new List<Input>()
  38. {
  39. new InputHide("id"),
  40. new InputHide("contractNo"),
  41. new InputHide("noteType"),
  42. new InputHide("keyPointNo"),
  43. new InputTextarea("noteContent","备注内容")
  44. }, "form-note"), "modal-note");
  45. var modal_attach = new ModalViewModel("添加附件", "", new ModalBodyViewModel(new List<Input>()
  46. {
  47. new Input("name", "附件名称"),
  48. new InputFile("attach", "合同附件").SetFileOption("a-info", "a-name", "a-ext")
  49. }, "form-attach"), "modal-attach", 0, "");
  50. var modal_kp = new ModalViewModel("关键点", new ModalBodyViewModel(new List<Input>()
  51. {
  52. new InputHide("id"),
  53. new InputHide("contractNo"),
  54. new InputHide("parentNo"),
  55. new Input("parentName", "父关键点").SetDisabled(),
  56. new Input("name", "关键点名称"),
  57. new Input("keyPointLevel", "紧急级别").SetSelectOptions(kpLevel),
  58. new Input("kpType", "关键点日期").SetSelectOptions("<option value=\"1\">自定义日期</option><option value=\"2\">根据父关键点履行日期</option>"),
  59. new InputDate("alarmDate", "提醒日期", @class: "t1"),
  60. new InputDate("expireDate", "过期日期", @class: "t1"),
  61. new InputNumber("expireDay", "提醒天数", 1, @class: "t2").SetMin(1).SetHelp("距父关键点履行后的天数"),
  62. new InputNumber("alarmDay", "过期天数", 1, @class: "t2").SetMin(0).SetHelp("距提醒后的天数"),
  63. new InputTextarea("description", "关键点描述")
  64. }, "form-kp"), "modal-kp");
  65. var modal_org = new ModalViewModel("分配关键点", "", new ModalBodyViewModel(new List<Input>()
  66. {
  67. new InputHide("id"),
  68. new AjaxSelect("staffNo", "关联员工", "Staff", contractNo, "query_staff").SetSearchClear("staffNo,staffOrgName"),
  69. new Input("staffOrgName", "员工部门").SetDisabled(),
  70. }, "form-org"), "modal-org");
  71. }
  72. @section css{
  73. <style>
  74. .iwb-bootstrap-table .table-box-content {
  75. padding: 10px .5rem 0;
  76. }
  77. p {
  78. margin-top: 0;
  79. margin-bottom: 0.25rem;
  80. }
  81. .timeline-item .timeline-header {
  82. cursor: pointer;
  83. }
  84. .timeline-item.active {
  85. border: 2px solid var(--mc);
  86. transition: all 0.3s;
  87. }
  88. .card .card-header {
  89. position: relative;
  90. }
  91. .card .card-tools .date-tool {
  92. position: absolute;
  93. }
  94. </style>
  95. }
  96. <div class="container-fluid">
  97. <div class="row">
  98. <div class="col-md-5 pt-2">
  99. <div class="card card-widget">
  100. <div class="card-header">
  101. <div class="card-title"><h4 id="contract-name" class="mb-0 text-iwb"></h4></div>
  102. <div class="card-tools">
  103. <div class="btn-group btn-group-sm" id="note-btn-tool">
  104. @if (AbpSession.AccountType != AccountTypeDefinition.System)
  105. {
  106. if (IsGranted(PermissionNames.PagesCaseContractMgContractMgNote))
  107. {
  108. <button type="button" class="btn btn-iwb fixed" onclick="AddNote(0)">合同备注</button>
  109. }
  110. if (IsGranted(PermissionNames.PagesCaseContractMgContractMgLawNote))
  111. {
  112. <button type="button" class="btn btn-iwb fixed" onclick="AddNote(1)">律师提示</button>
  113. }
  114. }
  115. </div>
  116. </div>
  117. </div>
  118. <div class="card-body">
  119. <div class="card card-widget collapsed-card mb-3">
  120. <div class="card-header">
  121. <div class="card-title"><h5 class="mb-0">合同内容</h5></div>
  122. <div class="card-tools">
  123. <button type="button" class="btn btn-tool" data-card-widget="collapse" id="contract-tool">
  124. <i class="fa fa-plus"></i>
  125. </button>
  126. </div>
  127. </div>
  128. <div class="card-body card-comments">
  129. <div id="contract-desc"></div>
  130. <div id="contract-attach" style="display: none">
  131. <span style="font-size: 0.75rem; font-weight: 600;">附件:</span>
  132. <div></div>
  133. </div>
  134. </div>
  135. </div>
  136. <div class="card card-widget collapsed-card mb-0">
  137. <div class="card-header">
  138. <div class="card-title"><h5 class="mb-0">补充合同</h5></div>
  139. <div class="card-tools">
  140. <div class="btn-group btn-group-sm">
  141. @if (AbpSession.AccountType == AccountTypeDefinition.Client && IsGranted(PermissionNames.PagesCaseContractMgContractMgSupplement))
  142. {
  143. <button type="button" class="btn btn-iwb fixed" onclick="AddSupplement()">补充合同</button>
  144. }
  145. </div>
  146. <button type="button" class="btn btn-tool" data-card-widget="collapse" id="supplement-tool">
  147. <i class="fa fa-plus"></i>
  148. </button>
  149. </div>
  150. </div>
  151. <div id="contract-sup" class="card-body card-comments"></div>
  152. </div>
  153. </div>
  154. <div class="card-footer card-comments" id="contract-note">
  155. <div id="contract-note-tool">
  156. <label class="iwb-checkbox checkbox-solid"><input name="note-tool" type="checkbox" value="@(NoteTypeDefinition.LawyerTip)"><span>律师提示</span></label>
  157. <label class="iwb-checkbox checkbox-solid"><input name="note-tool" type="checkbox" value="@(AbpSession.AccountType == AccountTypeDefinition.System?NoteTypeDefinition.LawyerNote+","+NoteTypeDefinition.Note:noteType+"")"><span>备注</span></label>
  158. <label class="iwb-checkbox checkbox-solid"><input name="note-tool" type="checkbox" value="@(NoteTypeDefinition.StateChange)"><span>状态变更</span></label>
  159. <label class="iwb-checkbox checkbox-solid"><input name="note-tool" type="checkbox" value="@(NoteTypeDefinition.ContentChange)"><span>内容变更</span></label>
  160. @*<label class="iwb-checkbox checkbox-solid"><input name="note-tool" type="checkbox" value="@(NoteTypeDefinition.EvidenceChange)"><span>材料变更</span></label>*@
  161. </div>
  162. <div id="contract-note-content"></div>
  163. </div>
  164. </div>
  165. </div>
  166. <div class="col-md-7 pt-2">
  167. <div class="card card-widget">
  168. <div class="card-header">
  169. <div class="card-title">
  170. <h4 class="mb-0 text-iwb">
  171. 合同关键点
  172. <span class="btn btn-outline-iwb circle btn-sm mr-3 ml-3">律师负责人:@ViewBag.MasterLawyer</span>
  173. <span class="btn btn-outline-iwb circle btn-sm mr-3">法务负责人:@ViewBag.MasterStaff</span>
  174. </h4>
  175. </div>
  176. <div class="card-tools">
  177. <div class="btn-group btn-group-sm">
  178. @if (AbpSession.AccountType != AccountTypeDefinition.System && IsGranted(PermissionNames.PagesCaseContractMgContractMgNote))
  179. {
  180. <button type="button" class="btn btn-iwb fixed" onclick="AddKp()">添加关键点</button>
  181. }
  182. </div>
  183. <div class="date-tool">
  184. </div>
  185. </div>
  186. </div>
  187. <div id="kp-body" class="card-body pr-0" style="min-height: 80px;"></div>
  188. </div>
  189. </div>
  190. </div>
  191. </div>
  192. @section modal{
  193. <!--Modal Start-->
  194. @Html.Partial("Modals/_Modal", modal)
  195. @Html.Partial("Modals/_Modal", kp_sup_modal)
  196. @Html.Partial("Modals/_Modal", modal_note)
  197. @Html.Partial("Modals/_Modal", modal_attach)
  198. @Html.Partial("Modals/_Modal", modal_kp)
  199. @Html.Partial("Modals/_Modal", modal_org)
  200. @Html.Partial("Query/_Lawyer", new QuerySearchModel("query_lawyer", "lawyerNo|lawyer_no").SetOriginField("id").SetSearchFun("SetLawFirmQueryFun()").SetAjaxSelectName("name"))
  201. @Html.Partial("Query/_Staff", new QuerySearchModel("query_staff", "staffNo,name,staffOrgName").SetOriginField("id,name,staffOrgName").SetSearchFun("SetContractQueryFun()").SetAjaxSelectName("name"))
  202. <!--Modal End-->
  203. }
  204. @section scripts
  205. {
  206. <script type="text/javascript">
  207. var $table;
  208. $(function() {
  209. GetContract();
  210. GetNote();
  211. GetKp(document.location.hash);
  212. $('#supplement-tool').on('expanded.lte.cardwidget.sup', function() { GetSupplement(); });
  213. $('#modal-kp #expireDate,#modal-kp #alarmDate').on('change.compare',
  214. function() {
  215. var aD = $('#modal-kp #alarmDate').val(), eD = $('#modal-kp #expireDate').val(), $this = $(this);
  216. if (aD && eD && aD > eD) {
  217. abp.message.warn('提醒日期不能晚于过期日期!').done(function() {
  218. $this.val('').trigger('focus');
  219. });
  220. }
  221. });
  222. $('#modal-kp #kpType').on("change.kp",
  223. function() {
  224. var t = $(this).val();
  225. $('#modal-kp .t1,#modal-kp .t2').removeClass('required').closest('.form-group')
  226. .css("display", "none");
  227. if (t == 1) {
  228. $('#modal-kp .t1').addClass('required').closest('.form-group').css("display", "flex");
  229. $('#modal-kp .t2').val('');
  230. } else {
  231. $('#modal-kp .t2').addClass('required').closest('.form-group').css("display", "flex");
  232. $('#modal-kp .t1').val('');
  233. }
  234. });
  235. $('#contract-note-tool input[type="checkbox"]').on('change', function() { GetNote(); });
  236. $('#modal-org #staffNo').on('change',
  237. function() {
  238. var no = $('#modal-org #staffNo').val();
  239. if (no) {
  240. $.iwbAjax41({
  241. url: abp.appUrl + "Query/QueryStaff?no=" + no,
  242. success: function(res) {
  243. if (res.organizationName) {
  244. $('#modal-org #staffOrgName').val(res.organizationName);
  245. }
  246. }
  247. });
  248. }
  249. });
  250. });
  251. function SetOrg(id) {
  252. var $that = $('#' + id);
  253. OpenModal({
  254. url: abp.appUrl + "LegalContractKeyPoint/SetKeyPointOrg",
  255. modal: "modal-org",
  256. data: { id: id, staffNo: $that.data('staff-no'), staffOrgName: $that.data('staff-org') },
  257. success: function() {
  258. GetKp(id);
  259. }
  260. });
  261. }
  262. function SetContractQueryFun() {
  263. return { "KeyField": "contractall", "KeyWords": '@(contractNo)' }
  264. }
  265. </script>
  266. <script id="Note-Contract-Script">
  267. function GetContract() {
  268. $.iwbAjax4({
  269. url: abp.appUrl + 'LegalContract/GetDtoById?id=@(contractNo)',
  270. success: function(res) {
  271. if (res) {
  272. var name = '<span>{0}</span><small class="text-sm">({1})</small>'.format(res.name,
  273. ContractStateFormatter(res.contractState));
  274. $('#contract-name').html(name);
  275. $('#contract-desc').html(res.contentInfo);
  276. GetContractAttach();
  277. @if (IsGranted(PermissionNames.PagesCaseContractMgContractMgChangeState) && AbpSession.AccountType == AccountTypeDefinition.Client)
  278. {
  279. <text>
  280. var btnS =
  281. '<button type="button" class="btn btn-iwb" onclick="MsgConfirm(\'确认要启动合同吗?\',\'开启合同\',function() {ChangeContractState(@(LegalContractStateDefinition.Running),\'开启合同\')});">开启合同</button>',
  282. btnH =
  283. '<button type="button" class="btn btn-iwb" onclick="ChangeContractStateWithModal(@LegalContractStateDefinition.Hang ,\'挂起合同\')">挂起合同</button>',
  284. btnR =
  285. '<button type="button" class="btn btn-iwb" onclick="ChangeContractStateWithModal(@LegalContractStateDefinition.Running,\'恢复合同\')">恢复合同</button>',
  286. btnRs =
  287. '<button type="button" class="btn btn-iwb" onclick="ChangeContractStateWithModal(@LegalContractStateDefinition.Running,\'重启合同\')">重启合同</button>',
  288. btnE =
  289. '<button type="button" class="btn btn-iwb" onclick="ChangeContractStateWithModal(@LegalContractStateDefinition.End ,\'关闭合同\')">关闭合同</button>';
  290. var str = '';
  291. switch (res.contractState) {
  292. case @(LegalContractStateDefinition.New):
  293. str += btnS;
  294. break;
  295. case @(LegalContractStateDefinition.Running):
  296. str += btnH;
  297. str += btnE;
  298. break;
  299. case @(LegalContractStateDefinition.Hang):
  300. str += btnR;
  301. str += btnE;
  302. break;
  303. case @(LegalContractStateDefinition.End):
  304. default:
  305. str = '';
  306. break;
  307. }
  308. </text>
  309. if (IsGranted(PermissionNames.PagesCaseContractMgContractMgRestart))
  310. {
  311. <text>
  312. if (res.contractState == @(LegalContractStateDefinition.End)) {
  313. str += btnRs;
  314. }
  315. </text>
  316. }
  317. <text>
  318. $('#note-btn-tool button:not(.fixed)').remove();
  319. if (str) {
  320. $('#note-btn-tool').prepend(str);
  321. }
  322. </text>
  323. }
  324. }
  325. $('#contract-tool').CardWidget("expand");
  326. }
  327. });
  328. }
  329. function GetNote(count, id) {
  330. var $that = id ? $('#kp-note_' + id) : $('#contract-note');
  331. $that.find('.tool-more').remove();
  332. count = count || 0;
  333. id = id || "";
  334. var skip = count == 0 ? 0 : $that.find('.card-comment').length, take = (count + 1) * 5;
  335. var keyword = "";
  336. $that.find('input[type="checkbox"]:checked').each(function() {
  337. keyword += "," + $(this).val();
  338. });
  339. if (keyword) {
  340. keyword = keyword.substr(1);
  341. }
  342. keyword = id + "|" + keyword;
  343. $.iwbAjax4({
  344. url: abp.appUrl + 'LegalContract/QueryNote',
  345. data: {
  346. no: '@(contractNo)',
  347. skip: skip,
  348. take: take > 30 ? 30 : take,
  349. keyword: keyword
  350. },
  351. success: function(res) {
  352. NotesFormatter(res.items, count, res.totalCount > skip + res.items.length, id);
  353. }
  354. });
  355. }
  356. function NotesFormatter(data, count, hasMore, id) {
  357. var $that = id ? $('#kp-note-content_' + id) : $('#contract-note-content');
  358. var str = '';
  359. $that.find('.non-note').remove();
  360. if (data && data.length) {
  361. data.forEach(function(v) {
  362. str += NoteFormatter(v, id);
  363. });
  364. if (count == 0) {
  365. $that.empty();
  366. }
  367. $that.append(str);
  368. if (hasMore) {
  369. var more =
  370. '<div class="tool-more" style="position: absolute;bottom: 0;left: 0;width:100%;height:120px;display:flex;justify-content: center;align-items: center;background: linear-gradient(rgba(255,255,255,.2),rgb(255,255,255))"><button class="btn btn-iwb" style="width: 120px;" onclick="GetNote({0},\'{1}\')">查看更多...</button></div>'
  371. .format(count + 1, id || "");
  372. $that.append(more);
  373. } else {
  374. $that.find('.tool-more').remove();
  375. }
  376. if (id) {
  377. /* $('#kp-note-tool_' + id).show();*/
  378. $('#kp-note_' + id).data('init', true);
  379. }
  380. } else if (count == 0) {
  381. $that.html(
  382. '<div class="non-note"><span style="text-align: center;width: 100%;display: block;font-size: 1rem;font-weight: 400;color: var(--mc);">暂无内容</span></div>');
  383. $that.find('.tool-more').remove();
  384. //if (id) {
  385. // $('#kp-note_' + id).data('init', false);
  386. //}
  387. } else {
  388. $that.find('.tool-more').remove();
  389. }
  390. }
  391. function NoteFormatter(data, id) {
  392. var str = '';
  393. if (data) {
  394. var kp = !id && data.keyPointName
  395. ? '<span class="text-iwb"><strong>关键点</strong>:{0}</span><br />'.format(data.keyPointName)
  396. : "";
  397. var isLawyer = data.noteType == @NoteTypeDefinition.LawyerTip
  398. ? '<div style="width: 100%;height: 100%;top: 0;left: 0;position: absolute;display: flex;justify-content: center;align-items: center;"><span style="font-family:fangsong;font-size: 1.25rem;padding: 0 0.5rem;border: 2px solid;color: red;border-radius: 0.5rem;opacity: 0.7;transform: rotate(-25deg);">律师提示</span></div>'
  399. : "";
  400. var style = data.noteType == @NoteTypeDefinition.LawyerTip ? "position: relative;min-height:80px;" : "";
  401. str +=
  402. '<div class="card-comment" style="{6}">{4}<img class="img-circle img-sm" src="{1}"><div class="comment-text"><span class="username">{0}<span class="text-muted" style="float:right">{2}</span></span><span class="text-content">{5}{3}</span></div></div>'
  403. .format(data.userRealName,
  404. data.userImage ? data.userImage : '/Content/Image/user.png',
  405. new Date(data.creationTime).format("yyyy-MM-dd hh:mm:ss"),
  406. data.noteContent,
  407. isLawyer,
  408. kp,
  409. style);
  410. }
  411. return str;
  412. }
  413. function AddNote(type, id) {
  414. id = id || "";
  415. var mt = type == 0 ? "添加备注" : type == 2 ? "添加关键点备注" : "添加律师提示";
  416. $('#modal-note .modal-title span').html(mt);
  417. var noteType = '@noteType';
  418. if (type == 0 || type == 2) {
  419. $('#modal-note #noteContent').closest('.form-group').find('.iwb-label').html("备注内容");
  420. } else {
  421. noteType = '@NoteTypeDefinition.LawyerTip';
  422. $('#modal-note #noteContent').closest('.form-group').find('.iwb-label').html("律师提示");
  423. }
  424. OpenModal({
  425. url: abp.appUrl + "LegalContract/CreateNote",
  426. modal: "modal-note",
  427. data: {
  428. id: "0",
  429. noteType: noteType,
  430. contractNo: '@contractNo',
  431. keyPointNo: id
  432. },
  433. success: function() {
  434. GetNote();
  435. if (id) {
  436. GetNote(0, id);
  437. }
  438. }
  439. });
  440. }
  441. function AddKpNote(id) {
  442. OpenModal({
  443. url: abp.appUrl + "LegalContract/CreateNote",
  444. modal: "modal-note",
  445. data: {
  446. id: "0",
  447. contractNo: '@contractNo',
  448. keyPointNo: id
  449. },
  450. success: function () {
  451. GetNote();
  452. if (id) {
  453. GetNote(0, id);
  454. }
  455. }
  456. });
  457. }
  458. </script>
  459. <script id="Supplement-Script">
  460. function AddSupplement() {
  461. $('#modal-sup #attach-box .box-body').empty();
  462. $('#modal-sup #id_base').tab('show');
  463. OpenModal({
  464. url: abp.appUrl + "LegalContract/CreateSupplement",
  465. modal: "modal-sup",
  466. data: {
  467. contractNo: '@contractNo'
  468. },
  469. dataFun: GetSupSaveData,
  470. success: function() {
  471. $('#supplement-tool').CardWidget("collapse");
  472. $('#contract-sup').empty();
  473. $('#supplement-tool').CardWidget("expand");
  474. }
  475. });
  476. }
  477. function GetSupSaveData() {
  478. var data = $.formSerialize($('#modal-sup form'));
  479. data.AttachFiles = [];
  480. $('#modal-sup .attach-row').each(function() {
  481. var $this = $(this);
  482. var v = $this.find('input[name="attach-info"]').val();
  483. if (v) {
  484. data.AttachFiles.push({
  485. FileInfo: v,
  486. FileTitle: $this.find('input[name="attach-title"]').val(),
  487. FileName: $this.find('input[name="attach-name"]').val(),
  488. FileExt: $this.find('input[name="attach-ext"]').val()
  489. });
  490. }
  491. });
  492. return data;
  493. }
  494. function ChangeEvidenceKp(id) {
  495. $('#modal-sup-kp #kp-attach-box .box-body').empty();
  496. $('#modal-sup-kp #id_base-kp').tab('show');
  497. OpenModal({
  498. url: abp.appUrl + "LegalContractKeyPoint/CreateSupplement",
  499. modal: "modal-sup-kp",
  500. data: {
  501. contractNo: '@contractNo',
  502. keyPointNo: id
  503. },
  504. dataFun: GetKpSupSaveData,
  505. success: function() {
  506. GetSupplement(0, id);
  507. }
  508. });
  509. }
  510. function GetKpSupSaveData() {
  511. var data = $.formSerialize($('#modal-sup-kp form'));
  512. data.AttachFiles = [];
  513. $('#modal-sup-kp .attach-row').each(function() {
  514. var $this = $(this);
  515. var v = $this.find('input[name="attach-info"]').val();
  516. if (v) {
  517. data.AttachFiles.push({
  518. FileInfo: v,
  519. FileTitle: $this.find('input[name="attach-title"]').val(),
  520. FileName: $this.find('input[name="attach-name"]').val(),
  521. FileExt: $this.find('input[name="attach-ext"]').val()
  522. });
  523. }
  524. });
  525. return data;
  526. }
  527. function GetSupplement(count, id) {
  528. var $that = id ? $('#kp-sup_' + id) : $('#contract-sup');
  529. if (count == undefined) {
  530. if ($that.find('.card-comment').length) {
  531. return;
  532. } else {
  533. $that
  534. .html(
  535. '<div class="non-sup"><span style="text-align: center;width: 100%;display: block;font-size: 1rem;color: var(--mc);">暂无内容</span></div>');
  536. }
  537. }
  538. $that.find('.tool-more').remove();
  539. count = count == undefined ? 0 : count;
  540. var skip = count == 0 ? 0 : $that.find('.card-comment').length, take = 3;
  541. $.iwbAjax4({
  542. url: abp.appUrl + 'LegalContract/QuerySupplement',
  543. data: {
  544. no: '@(contractNo)',
  545. skip: skip,
  546. take: take,
  547. keyword: id
  548. },
  549. success: function (res) {
  550. SupsFormatter(res.items, count, res.totalCount > skip + res.items.length, id);
  551. }
  552. });
  553. }
  554. function SupsFormatter(data, count, hasMore, id) {
  555. var $that = id ? $('#kp-sup_' + id) : $('#contract-sup');
  556. $that.find('.non-sup').remove();
  557. if (data && data.length) {
  558. if (count == 0) {
  559. $that.empty();
  560. }
  561. data.forEach(function(v) {
  562. var str = SupFormatter(v, id);
  563. $that.append(str);
  564. GetSupAttach(v.id, id);
  565. });
  566. if (hasMore) {
  567. var more =
  568. '<div class="tool-more" style="position: absolute;bottom: 0;left: 0;width:100%;height:120px;display:flex;justify-content: center;align-items: center;background: linear-gradient(rgba(255,255,255,.2),rgb(255,255,255))"><button class="btn btn-iwb" style="width: 120px;" onclick="GetSupplement({0},\'{1}\')">查看更多...</button></div>'
  569. .format(count + 1, id);
  570. $that.append(more);
  571. } else {
  572. $that.find('.tool-more').remove();
  573. }
  574. if (id) {
  575. $('#kp-sup_' + id).data('init', true);
  576. }
  577. } else if (count == 0) {
  578. $that
  579. .html(
  580. '<div class="non-sup"><span style="text-align: center;width: 100%;display: block;font-size: 1rem;font-weight: 400;color: var(--mc);">暂无内容</span></div>');
  581. $that.find('.tool-more').remove();
  582. } else {
  583. $that.find('.tool-more').remove();
  584. }
  585. }
  586. function SupFormatter(data, id) {
  587. var str = '';
  588. if (data) {
  589. str +=
  590. '<div class="card-comment"><div class="comment-text ml-0"><span class="username">{2}<span class="text-muted" style="float:right">{3}</span></span> <span class="text-content">{0}</span></div><div id="{1}" class="sup-attach"><span style="font-size: 0.75rem; font-weight: 600;">附件:</span><div></div></div></div>'
  591. .format(data.contentInfo,
  592. id ? 'kp-sup-attach_' + data.id : 'sup-attach_' + data.id,
  593. data.name,
  594. new Date(data.creationTime).format("yyyy-MM-dd hh:mm:ss"));
  595. }
  596. return str;
  597. }
  598. </script>
  599. <script id="Attach-Script">
  600. function GetContractAttach() {
  601. $.iwbAjax4({
  602. url: abp.appUrl + 'AttachFiles/QueryAttaches',
  603. data: {
  604. TableName: "Contract",
  605. ColName: "Contract",
  606. Key: '@contractNo'
  607. },
  608. success: function(res) {
  609. var str = '';
  610. if (res) {
  611. res.forEach(function(v) {
  612. str += QueryAttachFormatter(v);
  613. });
  614. }
  615. if (str) {
  616. $('#contract-attach').css("display", "block").find('div').html(str);
  617. } else {
  618. $('#contract-attach').css("display", "none");
  619. }
  620. }
  621. });
  622. }
  623. function GetSupAttach(id, kpNo) {
  624. $.iwbAjax4({
  625. url: abp.appUrl + 'AttachFiles/QueryAttaches',
  626. data: {
  627. TableName: kpNo ? "KeyPoint" : "Contract",
  628. ColName: "Supplement",
  629. Key: id
  630. },
  631. success: function(res) {
  632. var str = '';
  633. if (res) {
  634. res.forEach(function(v) {
  635. str += QueryAttachFormatter(v);
  636. });
  637. }
  638. var $that = kpNo ? $('#kp-sup-attach_' + id) : $('#sup-attach_' + id);
  639. if (str) {
  640. $that.css("display", "block").find('div').html(str);
  641. } else {
  642. $that.css("display", "none");
  643. }
  644. }
  645. });
  646. }
  647. function QueryAttachFormatter(data, isDelete) {
  648. var str = "";
  649. if (data) {
  650. str = isDelete
  651. ? '<span class="attach-file ml-3 mb-2" title="点击查看(下载)附件" style="border: 1px solid #1e90ff; color: #1e90ff; background: #eee; border-radius:.25rem; padding: 3px 0px 3px 5px; display: block;"><a href="{1}" target="_blank">{2}</a><span class="pl-2 pr-2" title="删除附件" onclick="DeleteAttach(this,\'{0}\',\'{2}\')" style="cursor: pointer;">X</span></span>'
  652. .format(data.id, data.filePath, data.fileTitle)
  653. : '<span class="attach-file ml-3" title="点击查看(下载)附件" style=" color: #1e90ff; display: block;width:100%;"><a href="{0}" target="_blank">{1}</a></span>'
  654. .format(data.filePath, data.fileTitle);
  655. }
  656. return str;
  657. }
  658. function DeleteAttach(that, id, name) {
  659. MsgConfirm("您确定要删除附件[" + name + "]吗?",
  660. "删除附件",
  661. function() {
  662. $.iwbAjax1({
  663. url: abp.appUrl + "AttachFiles/DeleteAttach",
  664. data: {
  665. id: id
  666. },
  667. success: function() {
  668. $(that).parent().fadeOut(500,
  669. function() {
  670. $(this).remove();
  671. });
  672. }
  673. });
  674. });
  675. }
  676. //添加附件
  677. function AddAttach($target) {
  678. OpenModal({
  679. modal: "modal-attach",
  680. save: function() {
  681. if ($.formValidate($('#modal-attach form'))) {
  682. var v = $('#modal-attach #a-info').val(),
  683. t = $('#modal-attach #name').val(),
  684. n = $('#modal-attach #a-name').val(),
  685. e = $('#modal-attach #a-ext').val();
  686. if (!v) {
  687. abp.message.warn("请选择一个文件!");
  688. return;
  689. }
  690. AttachFormatter(v, t, n, e, $target);
  691. $('#modal-attach').modal('hide');
  692. }
  693. }
  694. });
  695. }
  696. function AttachFormatter(v, t, n, e, $target) {
  697. var str =
  698. '<div class="row attach-row"><input name="attach-info" type="hidden" value="{0}" /><input name="attach-title" type="hidden" value="{1}" /><input name="attach-name" type="hidden" value="{2}" /><input name="attach-ext" type="hidden" value="{3}" /><div class="col-md-11"><input type="text" class="form-control form-control-sm disabled" value="{1}({2})" disabled="" /></div><div class="col-md-1"><button class="btn btn-sm btn-danger" onclick="$(this).closest(\'.attach-row\').fadeOut(500,function(){$(this).remove()});">删除</button></div></div>'
  699. .format(v, t, n, e);
  700. $target.find('.box-body').append(str);
  701. }
  702. </script>
  703. <script id="ChangeContractState-Script">
  704. function ChangeContractState(state, reason) {
  705. $.iwbAjax1({
  706. url: abp.appUrl + 'LegalContract/ChangeState',
  707. table: $table,
  708. data: {
  709. Id: '@(contractNo)',
  710. State: state,
  711. Reason: reason
  712. },
  713. success: function() {
  714. GetContract();
  715. GetNote();
  716. }
  717. });
  718. }
  719. function ChangeContractStateWithModal(state, title) {
  720. $(document).iwbModal('create',
  721. {
  722. modal: 'change-state-modal',
  723. modaltitle: title,
  724. modalBody:
  725. '<div class="modal-body"><form class="form-horizontal iwb-form"><div class="form-group row"><label class="col-sm-3 col-md-2 iwb-label iwb-label-sm " for="reason">变更原因</label><div class="col-sm-9 col-md-10"><div class="input-group input-group-sm " style="position: relative"><textarea rows="5" class="form-control" id="reason" name="description" placeholder="请输入变更原因..." value="" style="width:100%"></textarea></div></div></div></form></div>',
  726. save: function() {
  727. var v = $('#change-state-modal #reason').val();
  728. if (v) {
  729. ChangeContractState(state, v);
  730. $('#change-state-modal').modal('hide');
  731. } else {
  732. abp.message.warn("请输入变更原因后再提交");
  733. }
  734. }
  735. });
  736. }
  737. </script>
  738. <script id="kp-script">
  739. function AddKp() {
  740. OpenModal({
  741. modal: "modal-kp",
  742. modaltitle: "添加",
  743. url: abp.appUrl + "LegalContractKeyPoint/CreateKp",
  744. data: {
  745. id: "",
  746. parentNo: "",
  747. kpType: 1,
  748. parentName: "根节点",
  749. contractNo: '@contractNo'
  750. },
  751. disabled: "kpType",
  752. success: function(res) {
  753. GetKp(res.id);
  754. }
  755. });
  756. }
  757. function AddChildKp(id, name) {
  758. var data = kpData.find(function(v) {
  759. return v.id == id;
  760. });
  761. if (!data) {
  762. abp.message.warn("未能查询到父关键点!");
  763. return;
  764. }
  765. var disabled = "", kpType = 1;
  766. if (data.expireDate == null || data.expireDay > 0) {
  767. disabled = "kpType";
  768. kpType = 2;
  769. }
  770. OpenModal({
  771. modal: "modal-kp",
  772. modaltitle: "添加",
  773. url: abp.appUrl + "LegalContractKeyPoint/CreateKp",
  774. data: {
  775. id: "",
  776. parentNo: id,
  777. kpType: kpType,
  778. parentName: name,
  779. contractNo: '@contractNo'
  780. },
  781. disabled: disabled,
  782. success: function(res) {
  783. GetKp(res.id);
  784. }
  785. });
  786. }
  787. function UpdateKp(id) {
  788. var data = kpData.find(function(v) {
  789. return v.id == id;
  790. });
  791. console.log("KP-Update", data);
  792. if (!data) {
  793. abp.message.warn("未能查询到关键点!");
  794. return;
  795. }
  796. var parent = kpData.find(function(v) {
  797. return v.id == data.parentNo;
  798. });
  799. var disabled = "";
  800. data.parentName = parent ? parent.name : "根节点";
  801. data.kpType = 2;
  802. if (data.expireDate) {
  803. data.expireDate = new Date(data.expireDate).format("yyyy-MM-dd");
  804. data.alarmDate = new Date(data.alarmDate).format("yyyy-MM-dd");
  805. data.kpType = 1;
  806. }
  807. if (data.keyPointState != @LegalKeyPointStateDefinition.New ||
  808. (parent != null && (parent.expireDate == null || parent.expireDay > 0))) {
  809. disabled = "kpType";
  810. } else {
  811. var child = kpData.find(function(v) {
  812. return data.id == v.parentNo;
  813. });
  814. if (child != null) {
  815. disabled = "kpType";
  816. }
  817. }
  818. OpenModal({
  819. modal: "modal-kp",
  820. modaltitle: "变更",
  821. url: abp.appUrl + "LegalContractKeyPoint/Update",
  822. data: data,
  823. disabled: disabled,
  824. success: function() {
  825. GetKp(id);
  826. if (data.keyPointState != @LegalKeyPointStateDefinition.New) {
  827. GetNote();
  828. GetNote(0,id);
  829. }
  830. }
  831. });
  832. }
  833. function DeleteKp(id) {
  834. var data = kpData.find(function(v) {
  835. return v.id == id;
  836. });
  837. if (!data) {
  838. abp.message.warn("未能查询到关键点!");
  839. return;
  840. }
  841. MsgConfirm("确认删除关键点[{0}]吗?".format(data.name),
  842. "删除关键点",
  843. function() {
  844. $.iwbAjax1({
  845. url: abp.appUrl + "LegalContractKeyPoint/Delete",
  846. data: { id: id },
  847. success: GetKp
  848. });
  849. });
  850. }
  851. function GetKp(id) {
  852. $.iwbAjax4({
  853. url: abp.appUrl + "LegalContractKeyPoint/GetKeyPoints?contractNo=@contractNo",
  854. success: function(res) {
  855. KpsFormatter(res, id);
  856. }
  857. });
  858. }
  859. var kpData = [], predate = "";
  860. function KpsFormatter(data, id) {
  861. var str = "";
  862. predate = "";
  863. if (data && data.length) {
  864. kpData = data;
  865. var pData = kpData.filter(function(v) {
  866. return !v.parentNo;
  867. });
  868. if (pData && pData.length) {
  869. pData = pData.sort(function(a, b) {
  870. return new Date(a.expireDate) - new Date(b.expireDate);
  871. });
  872. str += '<div class="timeline">';
  873. pData.forEach(function(v) {
  874. str += KpFormatter(v);
  875. });
  876. str += '<div><i class="fa fa-clock-o bg-gray"></i></div></div>';
  877. }
  878. str += '';
  879. } else {
  880. str =
  881. '<div class="non-note"><span style="text-align: center;width: 100%;display: block;font-size: 1.25rem;font-weight: 600;color: var(--mc);">暂无关键点</span></div>';
  882. }
  883. $('#kp-body').html(str);
  884. if (id) {
  885. var idStr = id.indexOf('#') == 0 ? id : '#' + id;
  886. ActiveKp(idStr);
  887. $('html,body').animate({ scrollTop: $(idStr).offset().top - 200 }, 800);
  888. }
  889. var t = 0;
  890. $('.timeline-item .timeline-header').on('click',
  891. function(e) {
  892. e.stopPropagation();
  893. e.preventDefault();
  894. $('.timeline-item').removeClass('active');
  895. $(this).closest('.timeline-item').addClass('active');
  896. });
  897. $('.timeline-item .timeline-footer .tool[data-toggle=collapse]').on('mouseover.collapse.iwb',
  898. function(e) {
  899. var $this = $(this);
  900. t = setTimeout(function() {
  901. var href,
  902. target = $this.attr('data-target') ||
  903. e.preventDefault() ||
  904. (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, ''),
  905. option = $this.data(); // $(target).data('collapse') ? 'show' : $this.data();
  906. if (!$(target).hasClass('show')) {
  907. $(target).collapse('show', option);
  908. }
  909. },
  910. 400);
  911. }).on('mouseout.collapse.iwb', function() { clearTimeout(t); });
  912. $('.timeline-item .timeline-footer .note[data-toggle=collapse]').on("click.collapse.iwb",
  913. function() {
  914. var id = $(this).data('id');
  915. $('#kp-note-tool_' + id).hide();
  916. if (!$('#kp-note_' + id).data("init")) {
  917. GetNote(0, id);
  918. }
  919. });
  920. $('.timeline-item .timeline-footer .kp-sup[data-toggle=collapse]').on("click.collapse.iwb",
  921. function() {
  922. var id = $(this).data('id');
  923. if (!$('#kp-sup_' + id).data("init")) {
  924. GetSupplement(undefined, id);
  925. }
  926. });
  927. $('.timeline-item .timeline-footer input[type="checkbox"]').on('change',
  928. function() {
  929. var id = $(this).closest('.kp-note').data('id');
  930. GetNote(0, id);
  931. });
  932. }
  933. function KpFormatter(data, withChild) {
  934. var str = '';
  935. if (data) {
  936. var dateStr, bg = 'bg-teal';
  937. if (data.expireDate) {
  938. var date = new Date(data.expireDate);
  939. dateStr = date.format("yyyy-MM-dd");
  940. bg = date - new Date() > 0 ? "bg-blue" : "bg-pink";
  941. } else {
  942. dateStr = '履行后 <strong>{0}</strong> 天'.format(data.expireDay + data.alarmDay);
  943. }
  944. if (predate != dateStr) {
  945. str += '<div class="time-label"><span class="{0} pl-2 pr-2">{1}</span></div>'.format(bg, dateStr);
  946. }
  947. predate = dateStr;
  948. str += '<div>';
  949. var icon = '';
  950. switch (data.keyPointState) {
  951. case @LegalKeyPointStateDefinition.New:
  952. icon = 'fa fa-circle bg-blue';
  953. break;
  954. case @LegalKeyPointStateDefinition.Run:
  955. icon = 'fa fa-hourglass bg-green';
  956. break;
  957. case @LegalKeyPointStateDefinition.Hang:
  958. icon = 'fa fa-exclamation-triangle bg-yellow';
  959. break;
  960. case @LegalKeyPointStateDefinition.Executed:
  961. icon = 'fa fa-briefcase bg-purple';
  962. break;
  963. case @LegalKeyPointStateDefinition.End:
  964. icon = 'fa fa-square bg-red';
  965. break;
  966. default:
  967. break;
  968. }
  969. str += '<i class="{0}"></i>'.format(icon);
  970. str +=
  971. '<div class="timeline-item" id="{0}" data-id="{0}" data-staff-no="{1}" data-staff-name="{2}" data-staff-org="{3}">'
  972. .format(data.id, data.staffNo, data.staffName, data.staffOrgName);
  973. var staffOrgName = data.staffNo
  974. ? '<span class="label circle sm label-iwb" style="cursor:default">{0}<span class="mr-1 ml-1">:</span>{1}</span>'.format(
  975. data.staffOrgName,
  976. data.staffName)
  977. : '<span class="btn btn-outline-iwb btn-sm circle" title="点击分配关键点" style="padding:3px 1rem;font-size: 0.875em!important;cursor: pointer;" onclick="SetOrg(\'{0}\')">暂未分配</span>'.format(data.id);
  978. str +=
  979. '<span class="time text-iwb"><span class="mr-3">{0}</span><span class="mr-3">{1}</span><span class="mr-2">{2}</span></span>'
  980. .format(staffOrgName, KpLevelFormatter(data.keyPointLevel), KpStateFormatter(data.keyPointState));
  981. str += '<h3 class="timeline-header"><a href="#" style="line-height: 1.45;">{0}</a></h3>'.format(
  982. data.name);
  983. str += '<div class="timeline-body">{0} {1}</div>'.format(data.description,
  984. (!withChild ? KpChildren(data.id, true) : ""));
  985. str +=
  986. '<div class="timeline-footer" style="display: flex;width: 100%;justify-content: space-between;">{0}</div>'
  987. .format(KpTool(data));
  988. str +=
  989. '<div class="timeline-footer collapse card-comments kp-note" id="kp-note_{0}" data-id="{0}" style="border-top:1px solid var(--mc);position: relative;"><div id="kp-note-tool_{0}" style="display:none;">{1}</div><div id="kp-note-content_{0}"></div></div>'
  990. .format(data.id, $('#contract-note-tool').html());
  991. str +=
  992. '<div class="timeline-footer collapse card-comments kp-sup" id="kp-sup_{0}" data-id="{0}" style="border-top:1px solid var(--mc);position: relative;"></div>'
  993. .format(data.id);
  994. str += '</div>';
  995. str += '</div>';
  996. }
  997. return str;
  998. }
  999. function KpChildren(id, isFirst) {
  1000. var child = kpData.find(function(v) {
  1001. return v.parentNo == id;
  1002. });
  1003. var str = '';
  1004. if (!child) {
  1005. return str;
  1006. }
  1007. if (isFirst) {
  1008. str +=
  1009. ' <div class="card card-widget card-outline card-{1} collapsed-card mt-2 mb-2 card-kp-child"><div class="card-header"><div class="card-title"><h6 class="mb-0">{0}</h6></div><div class="card-tools"><button type="button" class="btn btn-tool kp-collapse" data-card-widget="collapse" ><i class="fa fa-plus"></i></button></div></div><div class="card-body card-comments p-5 pr-0" style="background:#f5f5f5">'
  1010. .format(GetRunKpName(child.id),
  1011. child.keyPointState == @LegalKeyPointStateDefinition.New ? 'primary' : 'purple');
  1012. str += '<div class="timeline">';
  1013. }
  1014. str += KpFormatter(child, true);
  1015. str += KpChildren(child.id);
  1016. if (isFirst) {
  1017. str += '<div><i class="fa fa-clock-o bg-gray"></i></div></div>';
  1018. str += '</div></div>';
  1019. }
  1020. return str;
  1021. }
  1022. function GetRunKpName(id) {
  1023. var run = kpData.find(function(v) {
  1024. return v.keyPointPath.indexOf(id) >= 0 && v.keyPointState == @LegalKeyPointStateDefinition.Run;
  1025. });
  1026. var str = run
  1027. ? (run.staffNo
  1028. ? '<span class="label circle sm label-warning mr-3">{0}<span class="mr-1 ml-1">:</span>{1}</span>'
  1029. .format(run.staffOrgName,
  1030. run.staffName)
  1031. : '') +
  1032. '待履行:<span class="text-iwb" style="cursor: pointer" onclick="ActiveKp(\'#{0}\')">{1}</span>'.format(
  1033. run.id,
  1034. run.name)
  1035. : '<span onclick="ActiveKp(this)" style="cursor: pointer">暂无待履行的关键点</span>';
  1036. return str;
  1037. }
  1038. function ActiveKp(idStr) {
  1039. if (typeof idStr == 'string') {
  1040. $('.timeline-item').removeClass('active');
  1041. $(idStr).addClass('active');
  1042. }
  1043. var $cardTool = $(idStr).closest('.card-kp-child').find('.btn-tool.kp-collapse');
  1044. if ($cardTool && $cardTool.length) {
  1045. $cardTool.trigger('click');
  1046. }
  1047. }
  1048. function KpTool(data) {
  1049. var str = '',
  1050. str1 = '',
  1051. str2 = '',
  1052. strA = '',
  1053. strU = '',
  1054. strD = '',
  1055. strS = '',
  1056. strH = '',
  1057. strE = '',
  1058. strR = '',
  1059. strRs = '',
  1060. strCe = '',
  1061. strExecute = '',
  1062. strSo = '',
  1063. strN = '',
  1064. strLn = '';
  1065. @{
  1066. if (AbpSession.AccountType != AccountTypeDefinition.System)
  1067. {
  1068. if (IsGranted(PermissionNames.PagesCaseContractMgContractMgKeyPointMgCreate))
  1069. {
  1070. <text>
  1071. strA =
  1072. '<button type="button" class="btn btn-iwb btn-sm mr-1" onclick="AddChildKp(\'{0}\',\'{1}\')">添加子关键点</button>'
  1073. .format(data.id, data.name);
  1074. </text>
  1075. }
  1076. if (IsGranted(PermissionNames.PagesCaseContractMgContractMgKeyPointMgUpdate))
  1077. {
  1078. <text>
  1079. strU =
  1080. '<button type="button" class="btn btn-iwb btn-sm mr-1" onclick="UpdateKp(\'{0}\')">变更</button>'
  1081. .format(data.id);
  1082. </text>
  1083. }
  1084. if (IsGranted(PermissionNames.PagesCaseContractMgContractMgKeyPointMgDelete))
  1085. {
  1086. <text>
  1087. strD =
  1088. '<button type="button" class="btn btn-danger btn-sm mr-1" onclick="DeleteKp(\'{0}\')">删除</button>'
  1089. .format(data.id);
  1090. </text>
  1091. }
  1092. if (IsGranted(PermissionNames.PagesCaseContractMgContractMgKeyPointMgChangeEvidence))
  1093. {
  1094. <text>
  1095. strCe =
  1096. '<button type="button" class="btn btn-iwb btn-sm mr-1" onclick="ChangeEvidenceKp(\'{0}\')">材料(证据)</button>'
  1097. .format(data.id);
  1098. </text>
  1099. }
  1100. if (IsGranted(PermissionNames.PagesCaseContractMgContractMgKeyPointMgChangeState))
  1101. {
  1102. <text>
  1103. strS =
  1104. '<button type="button" class="btn btn-iwb btn-sm mr-1" onclick="MsgConfirm(\'确认要启动关键点吗?\',\'开启关键点\',function() {ChangeState(\'{0}\',@(LegalKeyPointStateDefinition.Run),\'开启关键点\')});">启动</button>'
  1105. .format(data.id);
  1106. strH =
  1107. '<button type="button" class="btn btn-warning btn-sm mr-1" onclick="ChangeStateWithModal(\'{0}\',@LegalKeyPointStateDefinition.Hang ,\'挂起关键点\')">挂起</button>'
  1108. .format(data.id);
  1109. strE =
  1110. '<button type="button" class="btn btn-danger btn-sm mr-1" onclick="ChangeStateWithModal(\'{0}\',@LegalKeyPointStateDefinition.End ,\'关闭关键点\')">关闭</button>'
  1111. .format(data.id);
  1112. strR =
  1113. '<button type="button" class="btn btn-success btn-sm mr-1" onclick="ChangeStateWithModal(\'{0}\',@LegalKeyPointStateDefinition.Run ,\'恢复关键点\')">恢复</button>';
  1114. </text>
  1115. }
  1116. if (AbpSession.AccountType == AccountTypeDefinition.Client)
  1117. {
  1118. if (IsGranted(PermissionNames.PagesCaseContractMgContractMgKeyPointMgChangeState))
  1119. {
  1120. <text>
  1121. strExecute =
  1122. '<button type="button" class="btn btn-danger btn-sm mr-1" onclick="ChangeStateWithModal(\'{0}\',@LegalKeyPointStateDefinition.Executed ,\'履行关键点\')">确认履行</button>'
  1123. .format(data.id);
  1124. </text>
  1125. }
  1126. if ((bool) ViewBag.IsContractMaster || IsGranted(PermissionNames.PagesCaseContractMgContractMgKeyPointMgSetOrg))
  1127. {
  1128. <text>
  1129. var btnStyle = data.staffNo ? "iwb" : "warning";
  1130. strSo = '<button type="button" class="btn btn-{1} btn-sm mr-1" onclick="SetOrg(\'{0}\')">分配关键点</button>'
  1131. .format(data.id, btnStyle);
  1132. </text>
  1133. }
  1134. }
  1135. if (IsGranted(PermissionNames.PagesCaseContractMgContractMgKeyPointMgNote))
  1136. {
  1137. <text>
  1138. strN =
  1139. '<button type="button" class="btn btn-iwb btn-sm mr-1" onclick="AddNote(2,\'{0}\')">备注</button>'
  1140. .format(data.id);
  1141. </text>
  1142. }
  1143. if (IsGranted(PermissionNames.PagesCaseContractMgContractMgKeyPointMgRestart))
  1144. {
  1145. <text>
  1146. strRs =
  1147. '<button type="button" class="btn btn-success btn-sm mr-1" onclick="ChangeStateWithModal(\'{0}\',@LegalKeyPointStateDefinition.Run ,\'重启关键点\')">重启</button>'
  1148. .format(data.id);
  1149. </text>
  1150. }
  1151. if (AbpSession.AccountType == AccountTypeDefinition.Lawyer && IsGranted(PermissionNames.PagesCaseContractMgContractMgKeyPointMgLawNote))
  1152. {
  1153. <text>
  1154. strLn =
  1155. '<button type="button" class="btn btn-success btn-sm mr-1" onclick="AddNote(3,\'{0}\')">律师提示</button>'
  1156. .format(data.id);
  1157. </text>
  1158. }
  1159. }
  1160. }
  1161. var child = kpData.find(function(v) {
  1162. return v.parentNo == data.id;
  1163. });
  1164. if (!child) {
  1165. str1 += strA;
  1166. }
  1167. str1 += strN;
  1168. str1 += strLn;
  1169. switch (data.keyPointState) {
  1170. case @LegalKeyPointStateDefinition.New:
  1171. str2 += strU;
  1172. if (!child) {
  1173. str2 += strD;
  1174. }
  1175. var parent = kpData.find(function(v) {
  1176. return v.id == data.parentNo;
  1177. });
  1178. if (!parent) {
  1179. str2 += strS;
  1180. }
  1181. str2 += strSo;
  1182. break;
  1183. case @LegalKeyPointStateDefinition.Run:
  1184. str2 += strU;
  1185. str2 += strCe;
  1186. str2 += strSo;
  1187. str2 += strH;
  1188. str2 += strE;
  1189. str1 += strExecute;
  1190. break;
  1191. case @LegalKeyPointStateDefinition.Hang:
  1192. str2 += strU;
  1193. str2 += strR;
  1194. str2 += strE;
  1195. str2 += strSo;
  1196. break;
  1197. case @LegalKeyPointStateDefinition.End:
  1198. //str2 += strU;
  1199. str2 += strRs;
  1200. //str2 += strSo;
  1201. break;
  1202. default:
  1203. break;
  1204. }
  1205. str = '<div style="display: flex;justify-content: flex-start;">';
  1206. str +=
  1207. '<button type="button" title="查看关键点记录" class="note btn btn-iwb circle btn-sm mr-1" data-id="{0}" data-toggle="collapse" data-target="#kp-note_{0}"><i class="fa fa-file-text-o"></i></button>'
  1208. .format(data.id);
  1209. str +=
  1210. '<button type="button" title="查看变更材料" class="kp-sup btn btn-iwb circle btn-sm mr-1" data-id="{0}" data-toggle="collapse" data-target="#kp-sup_{0}"><i class="fa fa-folder-open-o"></i></button>'
  1211. .format(data.id);
  1212. if (str2) {
  1213. str +=
  1214. '<button title="更多操作" type="button" class="tool btn btn-iwb circle btn-sm" data-toggle="collapse" data-target="#tool-box_{0}"><i class="fa fa-bars"></i></button>'
  1215. .format(data.id);
  1216. str +=
  1217. '<div id="tool-box_{0}" class="collapse" style="justify-content: flex-start;padding:0 10px;">{1}</div>'
  1218. .format(data.id, str2);
  1219. }
  1220. str += '</div>';
  1221. str += '<div style="display: flex;justify-content: flex-end;">{0}</div>'.format(str1);
  1222. return str;
  1223. }
  1224. </script>
  1225. <script id="ChangeKpState-Script">
  1226. function ChangeState(id, state, reason) {
  1227. $.iwbAjax1({
  1228. url: abp.appUrl + 'LegalContractKeyPoint/ChangeState',
  1229. table: $table,
  1230. data: {
  1231. Id: id,
  1232. State: state,
  1233. Reason: reason
  1234. },
  1235. success: function() {
  1236. GetKp(id);
  1237. GetNote();
  1238. GetNote(0,id);
  1239. }
  1240. });
  1241. }
  1242. function ChangeStateWithModal(id, state, title) {
  1243. $(document).iwbModal('create',
  1244. {
  1245. modal: 'change-state-modal',
  1246. modaltitle: title,
  1247. modalBody:
  1248. '<div class="modal-body"><form class="form-horizontal iwb-form"><div class="form-group row"><label class="col-sm-3 col-md-2 iwb-label iwb-label-sm " for="reason">变更原因</label><div class="col-sm-9 col-md-10"><div class="input-group input-group-sm " style="position: relative"><textarea rows="5" class="form-control" id="reason" name="description" placeholder="请输入变更原因..." value="" style="width:100%"></textarea></div></div></div></form></div>',
  1249. save: function() {
  1250. var v = $('#change-state-modal #reason').val();
  1251. if (v) {
  1252. ChangeState(id, state, v);
  1253. $('#change-state-modal').modal('hide');
  1254. } else {
  1255. abp.message.warn("请输入变更原因后再提交");
  1256. }
  1257. }
  1258. });
  1259. }
  1260. @*function GoDetail(id) {
  1261. window.location.href = '@Url.Action("ContractDetail")' + '/' + id;
  1262. }*@
  1263. </script>
  1264. <!--格式化-->
  1265. <script id="formatter-script" type="text/javascript">
  1266. function TypeFormatter(v) {
  1267. var name = $('#hid-type option[value="' + v + '"]').text();
  1268. switch (v) {
  1269. case 0:
  1270. return '<span class="label sm label-danger">' + name + '</span>';
  1271. default:
  1272. return '<span class="label sm label-info">' + name + '</span>';
  1273. }
  1274. }
  1275. function ContractStateFormatter(v) {
  1276. var name = $('#hid-contract-state option[value="' + v + '"]').text();
  1277. return name;
  1278. }
  1279. function KpStateFormatter(v) {
  1280. var name = $('#hid-kp-state option[value="' + v + '"]').text();
  1281. //return name;
  1282. switch (v) {
  1283. case @(LegalKeyPointStateDefinition.New):
  1284. return '<span class="label sm label-iwb">' + name + '</span>';
  1285. case @(LegalKeyPointStateDefinition.Run):
  1286. return '<span class="label sm label-success">' + name + '</span>';
  1287. case @(LegalKeyPointStateDefinition.Hang):
  1288. return '<span class="label sm label-warning">' + name + '</span>';
  1289. case @(LegalKeyPointStateDefinition.End):
  1290. return '<span class="label sm label-danger">' + name + '</span>';
  1291. case @(LegalKeyPointStateDefinition.Executed):
  1292. return '<span class="label sm label-purple">' + name + '</span>';
  1293. default:
  1294. return '<span class="label sm label-info">' + name + '</span>';
  1295. }
  1296. }
  1297. function KpLevelFormatter(v) {
  1298. var name = $('#hid-kp-level option[value="' + v + '"]').text();
  1299. switch (v) {
  1300. case @(LegalKeyPointLevelDefinition.Common):
  1301. return '<span class="label circle sm label-success">' + name + '</span>';
  1302. case @(LegalKeyPointLevelDefinition.Important):
  1303. return '<span class="label circle sm label-warning">' + name + '</span>';
  1304. case @(LegalKeyPointLevelDefinition.Urgent):
  1305. return '<span class="label circle sm label-danger">' + name + '</span>';
  1306. default:
  1307. return '<span class="label circle sm label-info">' + name + '</span>';
  1308. }
  1309. }
  1310. function ActionsFormatter(v, r) {
  1311. var str = '', state = r.contractState, id = r.id;
  1312. @if (IsGranted(PermissionNames.PagesCaseContractMgContractMgKeyPointMgChangeState))
  1313. {
  1314. <text>
  1315. var strS =
  1316. '<span class="table-action" onclick="MsgConfirm(\'确认要启动关键点[{2}]吗?\',\'开启关键点\',function() {ChangeState(\'{1}\',@(LegalKeyPointStateDefinition.Run),\'开启关键点\')});">{0} 开启关键点</span>'
  1317. .format(tableActionIcon, id, r.name),
  1318. strH =
  1319. '<span class="table-action" onclick="ChangeStateWithModal(\'{1}\',@(LegalKeyPointStateDefinition.Hang),\'挂起关键点\')">{0} 挂起关键点</span>'
  1320. .format(tableActionIcon, id),
  1321. strR =
  1322. '<span class="table-action" onclick="ChangeStateWithModal(\'{1}\',@(LegalKeyPointStateDefinition.Run),\'恢复关键点\')">{0} 恢复关键点</span>'
  1323. .format(tableActionIcon, id),
  1324. @*strRs =
  1325. '<span class="table-action" onclick="ChangeStateWithModal(\'{1}\',@(LegalKeyPointStateDefinition.Run),\'重启关键点\')">{0} 重启关键点</span>'
  1326. .format(tableActionIcon, id),*@
  1327. strE =
  1328. '<span class="table-action" onclick="ChangeStateWithModal(\'{1}\',@(LegalKeyPointStateDefinition.End),\'关闭关键点\')">{0} 关闭关键点</span>'
  1329. .format(tableActionIcon, id);
  1330. if (state == @(LegalKeyPointStateDefinition.New)) {
  1331. str += strS;
  1332. } else if (state == @(LegalKeyPointStateDefinition.Run)) {
  1333. str += strH;
  1334. str += strE;
  1335. } else if (state == @(LegalKeyPointStateDefinition.Hang)) {
  1336. str += strR;
  1337. str += strE;
  1338. }
  1339. </text>
  1340. }
  1341. str += '<span class="table-action" onclick="GoDetail(\'{1}\')">{0} 合同详情</span>'.format(tableActionIcon, id);
  1342. return str;
  1343. }
  1344. </script>
  1345. }
  1346. <section style="display: none">
  1347. <select id="hid-contract-state">
  1348. @Html.Raw(contractState)
  1349. </select>
  1350. <select id="hid-kp-state">
  1351. @Html.Raw(kpState)
  1352. </select>
  1353. <select id="hid-kp-level">
  1354. @Html.Raw(kpLevel)
  1355. </select>
  1356. @*@Html.DropDownList("hid-type", type)*@
  1357. </section>