CaseDetail.cshtml 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031
  1. @using ContractService.Configuration
  2. @using ContractService.Authorization
  3. @using ContractService.LegalCase
  4. @using ContractService.LegalContract
  5. @using ContractService.Views.Shared.Modals
  6. @using ContractService.Views.Shared.Query
  7. @using ContractService.Views.Shared.SearchForm
  8. @using ContractService.Views.Shared.Table
  9. @using IwbZero.Runtime.Session
  10. @{
  11. ViewBag.Title = "法律服务项目详情";
  12. string activeMenu = PermissionNames.PagesCaseContractMgCaseMg; //The menu item will be active for this page.
  13. ViewBag.ActiveMenu = activeMenu;
  14. string caseNo = ViewBag.CaseNo, caseState = ViewBag.CaseState, contractState = ViewBag.ContractState;
  15. int noteType = AbpSession.AccountType == AccountTypeDefinition.Lawyer ? NoteTypeDefinition.LawyerNote : NoteTypeDefinition.Note;
  16. var perm = AbpSession.AccountType == AccountTypeDefinition.Client ? PermissionNames.PagesCaseContractMgContractMg : "";
  17. var searchList = new List<SearchItem>()
  18. {
  19. new SearchItem("code", "合同编号"),
  20. new SearchItem("name", "合同名称"),
  21. new SearchItem("contractState", "合同状态", FieldType.I).SetSelectItem(contractState),
  22. new SearchItem("startDateTime", "启动时间", FieldType.Dn),
  23. };
  24. var fields = new List<FieldItem>()
  25. {
  26. new FieldItem("code", "合同编号"),
  27. new FieldItem("name", "合同名称"),
  28. new FieldItem("contractState", "合同状态", "ContractStateFormatter"),
  29. };
  30. if (AbpSession.AccountType == AccountTypeDefinition.System || AbpSession.AccountType == AccountTypeDefinition.Lawyer)
  31. {
  32. searchList.AddRange(new List<SearchItem>()
  33. {
  34. new SearchItem("companyName", "企业名称")
  35. });
  36. fields.AddRange(new List<FieldItem>()
  37. {
  38. new FieldItem("companyName", "企业名称")
  39. });
  40. }
  41. else
  42. {
  43. fields.AddRange(new List<FieldItem>()
  44. {
  45. new FieldItem("startDateTime", "启动时间", "DateFormatter"),
  46. new FieldItem("endDateTime", "关闭时间", "DateFormatter"),
  47. new FieldItem("stateLastChangeTime", "状态变更时间", "DateTimeFormatter"),
  48. new FieldItem("stateLastChangeCause", "状态变更原由"),
  49. });
  50. }
  51. if (AbpSession.AccountType == AccountTypeDefinition.System)
  52. {
  53. searchList.Add(new SearchItem("hasLawFirm", "分配律所").SetSelectItem(new List<SelectListItem>()
  54. {
  55. new SelectListItem() {Text = @"全部", Value = ""},
  56. new SelectListItem() {Text = @"未分配", Value = "0"},
  57. new SelectListItem() {Text = @"已分配", Value = "1"},
  58. }));
  59. fields.Add(new FieldItem("lawFirmName", "律所名称", "LawFirmNameFormatter"));
  60. }
  61. fields.Add(new FieldItem("", "操作", "ActionsFormatter"));
  62. var searchForm = new SearchFormViewModel(searchList);
  63. var table = new TableViewModel(IwbConsts.ApiAppUrl + "LegalContract/GetAll", perm, searchForm)
  64. .SetFields(fields);
  65. var inputs = new List<Input>()
  66. {
  67. new InputHide("id"),
  68. new InputHide("caseNo"),
  69. new Input("code", "合同编号"),
  70. new Input("name", "合同名称"),
  71. new InputWangEditor("contentInfo", "合同信息").SetNotRequired(),
  72. };
  73. var modalBody = new ModalBodyViewModel()
  74. .AddTab("base", "合同信息", inputs)
  75. .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()\">添加附件</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>");
  76. var modal = new ModalViewModel("合同").SetBody(modalBody);
  77. var modal_note = new ModalViewModel("添加备注", "", new ModalBodyViewModel(new List<Input>()
  78. {
  79. new InputHide("id"),
  80. new InputHide("caseNo"),
  81. new InputHide("noteType"),
  82. new InputTextarea("noteContent", "备注内容")
  83. }, "form-note"), "modal-note");
  84. var modal_lawFirm = new ModalViewModel("分配律所", "", new ModalBodyViewModel(new List<Input>()
  85. {
  86. new AjaxSelect("lawFirmNo", "律所信息", "LawFirm", "contract", "query_lawFirm", "lawFirmNo")
  87. }, "form-lawFirm"), "modal-lawFirm", 0, "");
  88. var body_lawyer = new ModalBodyViewModel(new List<Input>()
  89. {
  90. new AjaxSelect("lawyerNo", "关联律师", "Lawyer", caseNo, "query_lawyer").SetSearchClear("lawyerNo"),
  91. }, "form-lawyer");
  92. body_lawyer.AddInput((bool)ViewBag.IsLawFirmMaster ? new Input("lawyerMaster", "负责人").SetSelectOptions("<option value=\"0\" selected>辅助律师</option><option value=\"1\">主律师</option>") : new InputHide("lawyerMaster"));
  93. var modal_lawyer = new ModalViewModel("添加律师", "", body_lawyer, "modal-lawyer", 0, "");
  94. // var modal_lawyer = new ModalViewModel("添加律师", "", new ModalBodyViewModel(new List<Input>()
  95. //{
  96. // new Input("lawyerMaster", "负责人").SetSelectOptions("<option value=\"0\" selected>辅助律师</option><option value=\"1\">主律师</option>"),
  97. // new AjaxSelect("lawyerNo", "辅助律师", "Lawyer", "contract", "query_lawyer", "lawyerNo")
  98. // }, "form-lawyer"), "modal-lawyer", 0, "");
  99. var body_staff = new ModalBodyViewModel(new List<Input>()
  100. {
  101. new AjaxSelect("staffNo", "关联员工", "Staff", caseNo, "query_staff").SetSearchClear("staffNo,staffOrgName"),
  102. new Input("staffOrgName", "员工部门").SetDisabled(),
  103. }, "form-staff");
  104. body_staff.AddInput((bool)ViewBag.IsCaseMaster ? new Input("staffMaster", "负责人").SetSelectOptions("<option value=\"0\" selected>普通员工</option><option value=\"1\">负责人</option>") : new InputHide("staffMaster"));
  105. var modal_staff = new ModalViewModel("添加员工", "", body_staff, "modal-staff", 0, "");
  106. var modal_attach = new ModalViewModel("添加附件", "", new ModalBodyViewModel(new List<Input>()
  107. {
  108. new Input("name", "附件名称"),
  109. new InputFile("attach", "合同附件").SetFileOption("a-info", "a-name", "a-ext")
  110. }, "form-attach"), "modal-attach", 0, "");
  111. }
  112. @section css{
  113. <style>
  114. .iwb-bootstrap-table .table-box-content {
  115. padding: 10px .5rem 0;
  116. }
  117. </style>
  118. }
  119. <div class="container-fluid">
  120. <div class="row">
  121. <div class="col-md-4" style="padding-top: 10px;">
  122. <div class="card card-widget">
  123. <div class="card-header">
  124. <div class="card-title"><h4 id="case-name" class="mb-0 text-iwb"></h4></div>
  125. <div class="card-tools">
  126. <div class="btn-group btn-group-sm" id="note-btn-tool">
  127. @if (AbpSession.AccountType == AccountTypeDefinition.Client && IsGranted(PermissionNames.PagesCaseContractMgCaseMgNote))
  128. {
  129. <button type="button" class="btn btn-iwb fixed" onclick="AddNote()">项目备注</button>
  130. }
  131. </div>
  132. </div>
  133. </div>
  134. <div class="card-body">
  135. <div id="case-desc"></div>
  136. </div>
  137. <div class="card-footer card-comments">
  138. <div id="case-note-tool">
  139. <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>
  140. <label class="iwb-checkbox checkbox-solid"><input name="note-tool" type="checkbox" value="@(NoteTypeDefinition.StateChange)"><span>状态变更</span></label>
  141. </div>
  142. <div id="case-note"></div>
  143. </div>
  144. </div>
  145. </div>
  146. <div class="col-md-8">
  147. @Html.Partial("Table/_Table", table)
  148. </div>
  149. </div>
  150. </div>
  151. @section modal{
  152. <!--Modal Start-->
  153. @Html.Partial("Modals/_Modal", modal)
  154. @Html.Partial("Modals/_Modal", modal_note)
  155. <div class="modal fade " id="modal-lawyers" aria-modal="true">
  156. <div class="modal-dialog modal-dialog-centered modal-lg" style="margin-top: 15px;">
  157. <div class="modal-content">
  158. <div class="modal-header" style="cursor: move;">
  159. <h4 class="modal-title">分配律师 <button class="btn btn-iwb btn-sm ml-2" onclick="AddLawyer()">添加律师</button></h4>
  160. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
  161. </div>
  162. <div class="modal-body">
  163. <form id="form-lawyers" class="iwb-dynamic-box">
  164. <div class="row box-label">
  165. <div class="col-md-9"><label>律师姓名</label></div>
  166. <div class="col-md-2"><label>主律师</label></div>
  167. <div class="col-md-1"><label>操作</label></div>
  168. </div>
  169. <div class="box-body"></div>
  170. </form>
  171. </div>
  172. @Html.Partial("Modals/_ModalFooter", "0")
  173. </div>
  174. </div>
  175. </div>
  176. <div class="modal fade " id="modal-staffs" aria-modal="true">
  177. <div class="modal-dialog modal-dialog-centered modal-lg" style="margin-top: 15px;">
  178. <div class="modal-content">
  179. <div class="modal-header" style="cursor: move;">
  180. <h4 class="modal-title">添加合同关联职员 <button class="btn btn-iwb btn-sm ml-2" onclick="AddStaff()">添加关联员工</button></h4>
  181. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
  182. </div>
  183. <div class="modal-body">
  184. <form id="form-staffs" class="iwb-dynamic-box">
  185. <div class="row box-label">
  186. <div class="col-md-5"><label>员工</label></div>
  187. <div class="col-md-4"><label>部门</label></div>
  188. <div class="col-md-2"><label>负责人</label></div>
  189. <div class="col-md-1"><label>操作</label></div>
  190. </div>
  191. <div class="box-body"></div>
  192. </form>
  193. </div>
  194. @Html.Partial("Modals/_ModalFooter", "0")
  195. </div>
  196. </div>
  197. </div>
  198. @Html.Partial("Modals/_Modal", modal_staff)
  199. @Html.Partial("Modals/_Modal", modal_lawFirm)
  200. @Html.Partial("Modals/_Modal", modal_lawyer)
  201. @Html.Partial("Modals/_Modal", modal_attach)
  202. @Html.Partial("Query/_LawFirm", new QuerySearchModel("query_lawFirm", "lawFirmNo").SetOriginField("id").SetAjaxSelectName("name"))
  203. @Html.Partial("Query/_Staff", new QuerySearchModel("query_staff", "staffNo,name,staffOrgName").SetOriginField("id,name,staffOrgName").SetSearchFun("SetCaseQueryFun()").SetAjaxSelectName("name"))
  204. @*@Html.Partial("Query/_LawyerWithLaw", new QuerySearchModel("query_lawyer", "lawyerNo|lawyer_no").SetOriginField("id").SetAjaxSelectName("name"))*@
  205. @if (AbpSession.AccountType == AccountTypeDefinition.Lawyer)
  206. {
  207. @Html.Partial("Query/_LawyerWithLaw", new QuerySearchModel("query_lawyer", "lawyerNo|lawyer_no").SetOriginField("id").SetAjaxSelectName("name").SetSearchFun("SetLawyerQueryFun()"))
  208. }
  209. <!--Modal End-->
  210. }
  211. @section scripts
  212. {
  213. <script type="text/javascript">
  214. var $table;
  215. $(function() {
  216. GetCase();
  217. GetNote();
  218. $table = LoadTable({
  219. searchList: [{ "KeyField": "caseNo", "KeyWords": '@(caseNo)', "FieldType": 0, "ExpType": 0 }]
  220. });
  221. var funs = window.iwbfuns || { none: function() { console.log("No type"); } };
  222. funs["btnCreate"] = function() {
  223. $('#id_base').tab('show');
  224. $('#attach-box .box-body').empty();
  225. $('#attach-box .box-attaches').css("display", "none");
  226. BtnCreate({ data: { id: "", caseNo: '@(caseNo)' }, dataFun: GetSaveData });
  227. }
  228. funs["btnUpdate"] = function() {
  229. var row = $table.bootstrapTable("getSelections")[0];
  230. if (row) {
  231. if (row.contractState !== @(LegalCaseStateDefinition.New)) {
  232. abp.message.warn("只能修改新建的合同!");
  233. return;
  234. }
  235. $('#id_base').tab('show');
  236. $('#attach-box .box-body').empty();
  237. GetAttach(row.id);
  238. $.iwbAjax4({
  239. url: abp.appUrl + "LegalContract/GetDtoById?id=" + row.id,
  240. success: function(res) {
  241. BtnUpdate({ disabled: "", dataFun: GetSaveData }, res);
  242. }
  243. });
  244. }
  245. };
  246. funs["btnSetStaff"] = function(url) {
  247. var row = $table.bootstrapTable("getSelections")[0];
  248. if (row) {
  249. var id = row.id;
  250. OpenModal({
  251. url: url,
  252. modal: "modal-staffs",
  253. shownBefore: function() {
  254. $.iwbAjax4({
  255. url: abp.appUrl + "LegalContract/GetContractStaffs?no=" + id,
  256. success: function(res) {
  257. $('#form-staffs .box-body').empty();
  258. if (res && res.length) {
  259. res.forEach(function(v) {
  260. //if (v.isMaster) {
  261. // $('#modal-staff #staffMaster').closest('.row').css("display", "flex");
  262. //}
  263. StaffFormatter(v.no, v.name, v.orgName, v.isMaster);
  264. });
  265. } else {
  266. $('#form-staffs .box-body')
  267. .html('<label class="empty text-danger">暂未分配关联职员</label>');
  268. }
  269. }
  270. });
  271. },
  272. dataFun: function() {
  273. var data = {};
  274. data.id = id;
  275. data.list = [];
  276. data.master = $('#modal-staffs input[name="master"]').val();
  277. $('#modal-staffs input[name="staff"]').each(function() {
  278. var v = $(this).val();
  279. if (v) {
  280. data.list.push(v);
  281. }
  282. });
  283. return data;
  284. }
  285. });
  286. }
  287. }
  288. //funs["btnSetMasterLawyer"] = function(url) {
  289. // var row = $table.bootstrapTable("getSelections")[0];
  290. // if (row) {
  291. // OpenModal({
  292. // url: url,
  293. // modal: "modal-master",
  294. // data: { no: row.id }
  295. // });
  296. // }
  297. //};
  298. //funs["btnSetLawyer"] = function(url) {
  299. // var row = $table.bootstrapTable("getSelections")[0];
  300. // if (row) {
  301. // var id = row.id;
  302. // OpenModal({
  303. // url: url,
  304. // modal: "modal-lawyers",
  305. // shownBefore: function() {
  306. // $.iwbAjax4({
  307. // url: abp.appUrl + "LegalContract/GetContractLawyers?no=" + id,
  308. // success: function(res) {
  309. // $('#form-lawyers .box-body').empty();
  310. // if (res && res.length) {
  311. // res.forEach(function(v) {
  312. // LawyerFormatter(v.no, v.name);
  313. // });
  314. // } else {
  315. // $('#form-lawyers .box-body')
  316. // .html('<label class="empty text-danger">暂未分配辅助律师</label>');
  317. // }
  318. // }
  319. // });
  320. // },
  321. // dataFun: function() {
  322. // var data = {};
  323. // data.id = id;
  324. // data.lawyers = [];
  325. // $('#modal-lawyers input[name="lawyers"]').each(function() {
  326. // var v = $(this).val();
  327. // if (v) {
  328. // data.lawyers.push(v);
  329. // }
  330. // });
  331. // return data;
  332. // }
  333. // });
  334. // }
  335. //};
  336. $('#case-note-tool input[type="checkbox"]').on('change',function() {GetNote();});
  337. $('#modal-staff #staffNo').on('change',
  338. function () {
  339. var no = $('#modal-staff #staffNo').val();
  340. if (no) {
  341. $.iwbAjax41({
  342. url: abp.appUrl + "Query/QueryStaff?no=" + no,
  343. success: function (res) {
  344. if (res.organizationName) {
  345. $('#modal-staff #staffOrgName').val(res.organizationName);
  346. }
  347. }
  348. });
  349. }
  350. });
  351. });
  352. function GetSaveData() {
  353. var data = $.formSerialize($('#modal form'));
  354. data.AttachFiles = [];
  355. $('#modal .attach-row').each(function() {
  356. var $this = $(this);
  357. var v = $this.find('input[name="attach-info"]').val();
  358. if (v) {
  359. data.AttachFiles.push({
  360. FileInfo: v,
  361. FileTitle: $this.find('input[name="attach-title"]').val(),
  362. FileName: $this.find('input[name="attach-name"]').val(),
  363. FileExt: $this.find('input[name="attach-ext"]').val()
  364. });
  365. }
  366. });
  367. return data;
  368. }
  369. function SetCaseQueryFun() {
  370. return { "KeyField": "caseall", "KeyWords": '@(caseNo)' }
  371. }
  372. </script>
  373. <script id="staff-script">
  374. //添加职员
  375. function AddStaff() {
  376. OpenModal({
  377. modal: "modal-staff",
  378. data: { staffMaster: 0 },
  379. save: function () {
  380. var v = $('#modal-staff #staffNo').val(),
  381. n = $('#modal-staff #staffNo option[value="' + v + '"]').text(),
  382. on = $('#modal-staff #staffOrgName').val(),
  383. m = $('#modal-staff #staffMaster').val();
  384. if (!v) {
  385. abp.message.warn("请选择一名员工!");
  386. return;
  387. } else if ($('#modal-staffs input[value="' + v + '"]').length) {
  388. abp.message.warn("员工已关联,请勿重复添加!");
  389. return;
  390. }
  391. if (m == "1" && $('#modal-staffs input[name="master"]').length) {
  392. abp.message.warn("已有负责人,请勿重复添加!");
  393. return;
  394. }
  395. StaffFormatter(v, n, on, m == "1");
  396. $('#modal-staff').modal('hide');
  397. }
  398. });
  399. }
  400. //职员显示格式化
  401. function StaffFormatter(v, n, on, m) {
  402. var str = '<div class="row staff-group"><input name="{3}" type="hidden" value="{0}" /><div class="col-md-5"><input type="text" class="form-control form-control-sm disabled" value="{1}" disabled="" /></div><div class="col-md-4"><input type="text" class="form-control form-control-sm disabled" value="{2}" disabled="" /></div><div class="col-md-2"><input type="text" class="form-control form-control-sm disabled" value="{4}" disabled="" /></div><div class="col-md-1"><button type="button" class="btn btn-sm btn-danger" onclick="DeleteStaff(this)">删除</button></div></div>'
  403. .format(v, n, on, m ? "master" : "staff", m ? "负责人" : "普通员工");
  404. $('#modal-staffs .box-body .empty').remove();
  405. //$('#form-staffs .box-body .empty').fadeOut(500, function () { $(this).remove(); });
  406. $('#form-staffs .box-body').append(str);
  407. }
  408. function DeleteStaff(that) {
  409. var $that = $(that).closest('.staff-group');
  410. $that.remove();
  411. //$that.fadeOut(500, function () {
  412. // $that.remove();
  413. //});
  414. }
  415. </script>
  416. <script id="Note-Case-Script">
  417. function GetCase() {
  418. $.iwbAjax4({
  419. url: abp.appUrl + 'LegalCase/GetDtoById?id=@(caseNo)',
  420. success: function(res) {
  421. if (res) {
  422. var name = '<span>{0}</span><small class="text-sm">({1})</small>'.format(res.name,
  423. CaseStateFormatter(res.caseState));
  424. $('#case-name').html(name);
  425. $('#case-desc').html(res.description);
  426. @if (AbpSession.AccountType == AccountTypeDefinition.Client && IsGranted(PermissionNames.PagesCaseContractMgCaseMgChangeState))
  427. {
  428. <text>
  429. var btnS =
  430. '<button type="button" class="btn btn-iwb" onclick="MsgConfirm(\'确认要启动项目吗?\',\'开启项目\',function() {ChangeCaseState(@(LegalCaseStateDefinition.Running),\'开启项目\')});">开启项目</button>',
  431. btnH =
  432. '<button type="button" class="btn btn-iwb" onclick="ChangeCaseStateWithModal(@LegalCaseStateDefinition.Hang ,\'挂起项目\')">挂起项目</button>',
  433. btnR =
  434. '<button type="button" class="btn btn-iwb" onclick="ChangeCaseStateWithModal(@LegalCaseStateDefinition.Running,\'恢复项目\')">恢复项目</button>',
  435. btnRs =
  436. '<button type="button" class="btn btn-iwb" onclick="ChangeCaseStateWithModal(@LegalCaseStateDefinition.Running,\'重启项目\')">重启项目</button>',
  437. btnE =
  438. '<button type="button" class="btn btn-iwb" onclick="ChangeCaseStateWithModal(@LegalCaseStateDefinition.End ,\'关闭项目\')">关闭项目</button>';
  439. var str = '';
  440. switch (res.caseState) {
  441. case @(LegalCaseStateDefinition.New):
  442. str += btnS;
  443. break;
  444. case @(LegalCaseStateDefinition.Running):
  445. str += btnH;
  446. str += btnE;
  447. break;
  448. case @(LegalCaseStateDefinition.Hang):
  449. str += btnR;
  450. str += btnE;
  451. break;
  452. case @(LegalCaseStateDefinition.End):
  453. default:
  454. str = '';
  455. break;
  456. }
  457. </text>
  458. if (IsGranted(PermissionNames.PagesCaseContractMgCaseMgRestart))
  459. {
  460. <text>
  461. if(res.caseState===@(LegalCaseStateDefinition.End)) {
  462. str += btnRs;
  463. }
  464. </text>
  465. }
  466. <text>
  467. $('#note-btn-tool button:not(.fixed)').remove();
  468. if (str) {
  469. $('#note-btn-tool').prepend(str);
  470. }
  471. </text>
  472. }
  473. }
  474. }
  475. });
  476. }
  477. function GetNote(count) {
  478. $('.tool-more').remove();
  479. count = count || 0;
  480. var skip = count === 0 ? 0 : $('#case-note .card-comment').length, take = (count + 1) * 5;
  481. var keyword = "";
  482. $('#case-note-tool input[type="checkbox"]:checked').each(function() {
  483. keyword += "," + $(this).val();
  484. });
  485. if (keyword) {
  486. keyword = keyword.substr(1);
  487. }
  488. $.iwbAjax4({
  489. url: abp.appUrl + 'LegalCase/QueryNote',
  490. data: {
  491. no: '@(caseNo)',
  492. skip: skip,
  493. take: take > 30 ? 30 : take,
  494. keyword: keyword
  495. },
  496. success: function(res) {
  497. NotesFormatter(res.items, count, res.totalCount > skip + res.items.length);
  498. }
  499. });
  500. }
  501. function NotesFormatter(data, count, hasMore) {
  502. var str = '';
  503. $('.no-note').remove();
  504. if (data && data.length) {
  505. data.forEach(function(v) {
  506. str += NoteFormatter(v);
  507. });
  508. if (count == 0) {
  509. $('#case-note').empty();
  510. }
  511. $('#case-note').append(str);
  512. if (hasMore) {
  513. var more =
  514. '<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})">查看更多...</button></div>'
  515. .format(count + 1);
  516. $('#case-note').append(more);
  517. } else {
  518. $('.tool-more').remove();
  519. }
  520. } else if (count == 0) {
  521. $('#case-note')
  522. .html(
  523. '<div class="no-note"><span style="text-align: center;width: 100%;display: block;font-size: 1.25rem;font-weight: 600;color: var(--mc);">暂无备注</span></div>');
  524. $('.tool-more').remove();
  525. } else {
  526. $('.tool-more').remove();
  527. }
  528. }
  529. function NoteFormatter(data) {
  530. var str = '';
  531. if (data) {
  532. str +=
  533. '<div class="card-comment"><img class="img-circle img-sm" src="{1}"><div class="comment-text"><span class="username">{0}<span lass="text-muted" style="float:right">{2}</span></span><span class="text-content">{3}</span></div></div>'
  534. .format(data.userRealName,
  535. data.userImage ? data.userImage : '/Content/Image/user.png',
  536. new Date(data.creationTime).format("yyyy-MM-dd hh:mm:ss"),
  537. data.noteContent);
  538. }
  539. return str;
  540. }
  541. function AddNote() {
  542. OpenModal({
  543. url: abp.appUrl + "LegalCase/CreateNote",
  544. modal: "modal-note",
  545. data: {
  546. id: "0",
  547. caseNo: '@caseNo',
  548. noteType:'@noteType'
  549. },
  550. success: GetNote
  551. });
  552. }
  553. </script>
  554. <script id="Attach-Script">
  555. function GetAttach(id) {
  556. $.iwbAjax4({
  557. url: abp.appUrl + 'AttachFiles/QueryAttaches',
  558. data: {
  559. TableName: "Contract",
  560. ColName: "Contract",
  561. Key: id
  562. },
  563. success: function (res) {
  564. var str = '';
  565. if (res) {
  566. res.forEach(function (v) {
  567. str += QueryAttachFormatter(v);
  568. });
  569. }
  570. if (str) {
  571. $('#attach-box .box-attaches').html(str).css("display", "flex");
  572. } else {
  573. $('#attach-box .box-attaches').css("display", "none");
  574. }
  575. }
  576. });
  577. }
  578. function QueryAttachFormatter(data) {
  579. var str = "";
  580. if (data) {
  581. str =
  582. '<span class="attach-file ml-3 mb-2" style="border: 1px solid #1e90ff; color: #1e90ff; background: #eee; border-radius:.25rem; padding: 3px 0px 3px 5px; display: block;"><a title="点击查看(下载)附件" href="{1}" target="_blank">{2}</a><span class="pl-2 pr-2" title="删除附件" onclick="DeleteAttach(this,\'{0}\',\'{2}\')" style="cursor: pointer;">X</span></span>'
  583. .format(data.id, data.filePath, data.fileTitle);
  584. }
  585. return str;
  586. }
  587. function DeleteAttach(that, id, name) {
  588. MsgConfirm("您确定要删除附件[" + name + "]吗?",
  589. "删除附件",
  590. function () {
  591. $.iwbAjax1({
  592. url: abp.appUrl + "AttachFiles/DeleteAttach",
  593. data: {
  594. id: id
  595. },
  596. success: function () {
  597. $(that).parent().fadeOut(500,
  598. function () {
  599. $(this).remove();
  600. });
  601. }
  602. });
  603. });
  604. }
  605. //添加附件
  606. function AddAttach() {
  607. OpenModal({
  608. modal: "modal-attach",
  609. save: function () {
  610. if ($.formValidate($('#modal-attach form'))) {
  611. var v = $('#modal-attach #a-info').val(),
  612. t = $('#modal-attach #name').val(),
  613. n = $('#modal-attach #a-name').val(),
  614. e = $('#modal-attach #a-ext').val();
  615. if (!v) {
  616. abp.message.warn("请选择一个文件!");
  617. return;
  618. }
  619. AttachFormatter(v, t, n, e);
  620. $('#modal-attach').modal('hide');
  621. }
  622. }
  623. });
  624. }
  625. function AttachFormatter(v, t, n, e) {
  626. var str =
  627. '<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>'
  628. .format(v, t, n, e);
  629. $('#attach-box .box-body').append(str);
  630. }
  631. </script>
  632. <script id="LawFirm-Script">
  633. function SetLawFirm(id, name) {
  634. OpenModal({
  635. url: abp.appUrl + "LegalContract/SetLawFirm",
  636. modal: "modal-lawFirm",
  637. shownBefore: function () {
  638. $.iwbAjax4({
  639. url: abp.appUrl + "LegalContract/CheckContractHasLawFirm?no=" + id,
  640. success: function (res) {
  641. if (res) {
  642. abp.message.error("当前合同已分配!").done(function () {
  643. $("#modal-lawFirm").modal("hide");
  644. });
  645. }
  646. }
  647. });
  648. },
  649. save: function (opt) {
  650. var lawFirmNo = $("#modal-lawFirm #lawFirmNo").val();
  651. var lawFirmName = $("#modal-lawFirm #lawFirmNo option[value='" + lawFirmNo + "']").text();
  652. abp.message.confirm(
  653. '确认将合同<span class="text-danger">【{0}】</span>分配给律所<span class="text-danger">【{1}】</span>吗?分配后将无法更改!'
  654. .format(name, lawFirmName),
  655. "确认律所",
  656. function (isConfirmed) {
  657. if (isConfirmed) {
  658. $.iwbAjax1({
  659. url: opt.url,
  660. data: { id: id, lawFirmNo: lawFirmNo },
  661. success: function () {
  662. RefreshTable();
  663. $("#modal-lawFirm").modal("hide");
  664. }
  665. });
  666. }
  667. },
  668. true);
  669. }
  670. });
  671. }
  672. </script>
  673. @if (AbpSession.AccountType == AccountTypeDefinition.Lawyer)
  674. {
  675. <script id="Lawyer-Script">
  676. function SetLawyerQueryFun() {
  677. return { "KeyField": "lawFirmNo", "KeyWords": '@(AbpSession.GetClaimValue(IwbConsts.UserCompanyLawFirmClaimType))' }
  678. }
  679. //添加辅助律师
  680. function SetLawyer(id) {
  681. OpenModal({
  682. data: { lawyerMaster: 0 },
  683. url: abp.appUrl +"LegalContract/SetLawyer",
  684. modal: "modal-lawyers",
  685. shownBefore: function() {
  686. $.iwbAjax4({
  687. url: abp.appUrl + "LegalContract/GetContractLawyers?no=" + id,
  688. success: function(res) {
  689. $('#form-lawyers .box-body').empty();
  690. if (res && res.length) {
  691. res.forEach(function(v) {
  692. LawyerFormatter(v.no, v.name,v.isMaster);
  693. });
  694. } else {
  695. $('#form-lawyers .box-body')
  696. .html('<label class="empty text-danger">暂未分配辅助律师</label>');
  697. }
  698. }
  699. });
  700. },
  701. dataFun: function() {
  702. var data = {};
  703. data.id = id;
  704. data.list = [];
  705. data.master = $('#modal-lawyers input[name="master"]').val();
  706. $('#modal-lawyers input[name="lawyer"]').each(function() {
  707. var v = $(this).val();
  708. if (v) {
  709. data.list.push(v);
  710. }
  711. });
  712. return data;
  713. }
  714. @if ((bool) ViewBag.IsLawFirmMaster)
  715. {
  716. <text>
  717. , save: function (opt) {
  718. var data = opt.data;
  719. if (!data) {
  720. data = opt.dataFun.call();
  721. }
  722. if (!data.master) {
  723. abp.message.warn("请设置一名主律师!");
  724. return;
  725. }
  726. $.iwbAjax1({
  727. url: opt.url,
  728. data: data,
  729. success: function () {
  730. $('#modal-lawyers').modal('hide');
  731. }
  732. });
  733. }
  734. </text>
  735. }
  736. });
  737. }
  738. //添加辅助律师
  739. function AddLawyer() {
  740. OpenModal({
  741. modal: "modal-lawyer",
  742. data: { lawyerMaster: 0 },
  743. save: function () {
  744. var v = $('#modal-lawyer #lawyerNo').val(),
  745. n = $('#modal-lawyer #lawyerNo option[value="' + v + '"]').text(),
  746. m = $('#modal-lawyer #lawyerMaster').val();
  747. if (!v) {
  748. abp.message.warn("请选择一名律师!");
  749. return;
  750. } else if ($('#modal-lawyers input[value="' + v + '"]').length) {
  751. abp.message.warn("律师已关联,请勿重复添加!");
  752. return;
  753. }
  754. if (m == "1" && $('#modal-lawyers input[name="master"]').length) {
  755. abp.message.warn("已有主律师,请勿重复添加!");
  756. return;
  757. }
  758. LawyerFormatter(v, n, m == "1");
  759. $('#modal-lawyer').modal('hide');
  760. }
  761. });
  762. }
  763. //辅助律师显示格式化
  764. function LawyerFormatter(v, n,m) {
  765. var str =
  766. '<div class="row group"><input name="{2}" type="hidden" value="{0}" /><div class="col-md-9"><input type="text" class="form-control form-control-sm disabled" value="{1}" disabled="" /></div><div class="col-md-2"><input type="text" class="form-control form-control-sm disabled" value="{3}" disabled="" /></div><div class="col-md-1"><button class="btn btn-sm btn-danger" onclick="DeleteGroup(this);">删除</button></div></div>'
  767. .format(v, n, m ? "master" : "lawyer", m ? "主律师" : "辅助律师");
  768. $('#modal-lawyers .box-body .empty').remove();
  769. $('#form-lawyers .box-body').append(str);
  770. }
  771. function DeleteGroup(that) {
  772. var $that = $(that).closest('.group');
  773. $that.remove();
  774. //$that.fadeOut(500, function () {
  775. // $that.remove();
  776. //});
  777. }
  778. </script>
  779. }
  780. <script id="ChangeCaseState-Script">
  781. function ChangeCaseState(state, reason) {
  782. $.iwbAjax1({
  783. url: abp.appUrl + 'LegalCase/ChangeState',
  784. table: $table,
  785. data: {
  786. Id: '@(caseNo)',
  787. State: state,
  788. Reason: reason
  789. },
  790. success: function() {
  791. GetCase();
  792. GetNote();
  793. }
  794. });
  795. }
  796. function ChangeCaseStateWithModal(state, title) {
  797. $(document).iwbModal('create',
  798. {
  799. modal: 'change-state-modal',
  800. modaltitle: title,
  801. modalBody:
  802. '<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>',
  803. save: function() {
  804. var v = $('#change-state-modal #reason').val();
  805. if (v) {
  806. ChangeCaseState(state, v);
  807. $('#change-state-modal').modal('hide');
  808. } else {
  809. abp.message.warn("请输入变更原因后再提交");
  810. }
  811. }
  812. });
  813. }
  814. </script>
  815. <script id="ChangeContractState-Script">
  816. function ChangeState(id, state, reason) {
  817. $.iwbAjax1({
  818. url: abp.appUrl + 'LegalContract/ChangeState',
  819. table: $table,
  820. data: {
  821. Id: id,
  822. State: state,
  823. Reason: reason
  824. }
  825. });
  826. }
  827. function ChangeStateWithModal(id, state, title) {
  828. $(document).iwbModal('create',
  829. {
  830. modal: 'change-state-modal',
  831. modaltitle: title,
  832. modalBody:
  833. '<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>',
  834. save: function() {
  835. var v = $('#change-state-modal #reason').val();
  836. if (v) {
  837. ChangeState(id, state, v);
  838. $('#change-state-modal').modal('hide');
  839. } else {
  840. abp.message.warn("请输入变更原因后再提交");
  841. }
  842. }
  843. });
  844. }
  845. function GoDetail(id) {
  846. window.location.href = '@Url.Action("ContractDetail")' + '/' + id;
  847. }
  848. </script>
  849. <!--格式化-->
  850. <script id="formatter-script" type="text/javascript">
  851. function TypeFormatter(v) {
  852. var name = $('#hid-type option[value="' + v + '"]').text();
  853. switch (v) {
  854. case 0:
  855. return '<span class="label sm label-danger">' + name + '</span>';
  856. default:
  857. return '<span class="label sm label-info">' + name + '</span>';
  858. }
  859. }
  860. function ContractStateFormatter(v) {
  861. var name = $('#hid-contract-state option[value="' + v + '"]').text();
  862. return name;
  863. }
  864. function CaseStateFormatter(v) {
  865. var name = $('#hid-case-state option[value="' + v + '"]').text();
  866. return name;
  867. @*switch (v) {
  868. case @(LegalCaseStateDefinition.New):
  869. return '<span class="label sm label-iwb">' + name + '</span>';
  870. case @(LegalCaseStateDefinition.Running):
  871. return '<span class="label sm label-success">' + name + '</span>';
  872. case @(LegalCaseStateDefinition.Hang):
  873. return '<span class="label sm label-warning">' + name + '</span>';
  874. case @(LegalCaseStateDefinition.End):
  875. return '<span class="label sm label-danger">' + name + '</span>';
  876. default:
  877. return '<span class="label sm label-info">' + name + '</span>';
  878. }*@
  879. }
  880. function LawFirmNameFormatter(v) {
  881. if (v) {
  882. return v;
  883. } else {
  884. return '<span class="text-danger">未分配</span>';
  885. }
  886. }
  887. function ActionsFormatter(v, r) {
  888. var str = '', state = r.contractState, id = r.id;
  889. @if (IsGranted(PermissionNames.PagesCaseContractMgContractMgChangeState) && AbpSession.AccountType == AccountTypeDefinition.Client)
  890. {
  891. <text>
  892. var strS =
  893. '<span class="table-action" onclick="MsgConfirm(\'确认要启动合同[{2}]吗?\',\'开启合同\',function() {ChangeState(\'{1}\',@(LegalContractStateDefinition.Running),\'开启合同\')});">{0} 开启合同</span>'
  894. .format(tableActionIcon, id, r.name),
  895. strH =
  896. '<span class="table-action" onclick="ChangeStateWithModal(\'{1}\',@(LegalContractStateDefinition.Hang),\'挂起合同\')">{0} 挂起合同</span>'
  897. .format(tableActionIcon, id),
  898. strR =
  899. '<span class="table-action" onclick="ChangeStateWithModal(\'{1}\',@(LegalContractStateDefinition.Running),\'恢复合同\')">{0} 恢复合同</span>'
  900. .format(tableActionIcon, id),
  901. strRs =
  902. '<span class="table-action" onclick="ChangeStateWithModal(\'{1}\',@(LegalContractStateDefinition.Running),\'重启合同\')">{0} 重启合同</span>'
  903. .format(tableActionIcon, id),
  904. strE =
  905. '<span class="table-action" onclick="ChangeStateWithModal(\'{1}\',@(LegalContractStateDefinition.End),\'关闭合同\')">{0} 关闭合同</span>'
  906. .format(tableActionIcon, id);
  907. if (state == @(LegalContractStateDefinition.New)) {
  908. str += strS;
  909. } else if (state == @(LegalContractStateDefinition.Running)) {
  910. str += strH;
  911. str += strE;
  912. } else if (state == @(LegalContractStateDefinition.Hang)) {
  913. str += strR;
  914. str += strE;
  915. }
  916. </text>
  917. if (IsGranted(PermissionNames.PagesCaseContractMgContractMgRestart))
  918. {
  919. <text>
  920. if (state == @(LegalContractStateDefinition.End)) {
  921. str += strRs;
  922. }
  923. </text>
  924. }
  925. }
  926. @if (IsGranted(PermissionNames.PagesCaseContractMgContractMgSetLawFirm) && AbpSession.AccountType == AccountTypeDefinition.System)
  927. {
  928. <text>
  929. if (!r.lawFirmName) {
  930. str += '<span class="table-action" onclick="SetLawFirm(\'{1}\',\'{2}\')">{0} 分配律所</span>'.format(tableActionIcon, id, r.name);
  931. }
  932. </text>
  933. }
  934. @if (((bool)ViewBag.IsLawFirmMaster || IsGranted(PermissionNames.PagesCaseContractMgContractMgSetLawyer)) && AbpSession.AccountType == AccountTypeDefinition.Lawyer)
  935. {
  936. <text>
  937. if (r.isMaster) {
  938. str +=
  939. '<span class="table-action" onclick="SetLawyer(\'{1}\')">{0} 分配律师</span>'
  940. .format(tableActionIcon, id);
  941. }
  942. </text>
  943. }
  944. @if (IsGranted(PermissionNames.PagesCaseContractMgContractMgQuery))
  945. {
  946. <text>
  947. str += '<span class="table-action" onclick="GoDetail(\'{1}\')">{0} 合同详情</span>'.format(
  948. tableActionIcon,
  949. id);
  950. </text>
  951. }
  952. if (!str) {
  953. str += '<span class="table-action" >{0} 暂无操作</span>'.format(tableActionIcon);
  954. }
  955. return str;
  956. }
  957. </script>
  958. }
  959. <section style="display: none">
  960. <select id="hid-contract-state">
  961. @Html.Raw(contractState)
  962. </select>
  963. <select id="hid-case-state">
  964. @Html.Raw(caseState)
  965. </select>
  966. @*@Html.DropDownList("hid-type", type)*@
  967. </section>