apply.js 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942
  1. (function () {
  2. var lists = [];
  3. let viewState = z.ui.comm.getUrlParam("_o");
  4. let isKp = z.ui.comm.getUrlParam("kp");
  5. let read = z.ui.comm.getUrlParam("read");
  6. var totalContractAmount = 0;
  7. var totalReturnAmount =0;
  8. var totalInvoiceAmount = 0;
  9. var contractInvoiceList = [];
  10. let flowInstanceId = "";
  11. var contractId = $("[name='contractInvoice$contractId']").val()
  12. var contractInvoiceId = $("[name='contractInvoice$id']").val()
  13. var contractMilestoneId = $("[name='contractInvoice$contractMilestoneId']").val()
  14. var contractMilestoneName = $("[name='contractInvoice$contractMilestoneName']").val()
  15. let isView = "";
  16. window.onload = function () {
  17. flowInstanceId = z.ui.comm.getUrlParam("flowInstanceId");
  18. bindEvents();
  19. };
  20. function bindEvents() {
  21. initData();
  22. bindGenerateSerial();
  23. bindSelectMilestone();
  24. initContractReturnMoney();
  25. initContractInvoiceList();
  26. bindCalcInvoiceAmount();
  27. bindReturnMoney();
  28. initReturnReg();
  29. z.workflow.saveBtn.addListener("onSaveClick", submit);
  30. }
  31. function initData(){
  32. initPayCompany();
  33. initInvoiceCompany();
  34. initLpr();
  35. }
  36. function initLpr() {
  37. z.ui.ajax({
  38. type: "get",
  39. url: "/common/user-tree",
  40. data: {},
  41. success: function (res) {
  42. if (res && res.length > 0) {
  43. selecttree("[name='lpr']", res, clickLpr, allowChildClick,null,setLpr);
  44. }
  45. },
  46. error: function () {
  47. }
  48. })
  49. }
  50. function setLpr(){
  51. var id = $("[name='contractInvoice$lprId']").val();
  52. if(id){
  53. z.ui.selecttree("[name='lpr']").setValue(id);
  54. }
  55. }
  56. function clickLpr(even, treeId, treeNode) {
  57. if (treeNode.type === 3) {
  58. $("[name='contractInvoice$lpr']").val(treeNode.name);
  59. $("[name='contractInvoice$lprId']").val(treeNode.id);
  60. }
  61. }
  62. function initReturnReg(){
  63. let register = z.ui.comm.getUrlParam("registerReturn");
  64. if(register === '1'){
  65. $("[name=addData]").show().removeClass("z-hide").removeClass("z-readonly");
  66. $("[name=return-header]").css("display", "flex").removeClass("z-hide").removeClass("z-readonly");
  67. $("[name=return-body]").css("display", "flex").removeClass("z-hide").removeClass("z-readonly");
  68. $("[name=returnStats]").css("display", "flex").removeClass("z-hide").removeClass("z-readonly");
  69. }
  70. }
  71. function bindGenerateSerial(){
  72. $("#generateSerial").on("click",function(){
  73. var serial = $("[name='contractInvoice$invoiceNumber'] input").val();
  74. var postdata = {"name": '开票单号'};
  75. if(serial) {
  76. z.ui.confirm("confirm").init({
  77. content: '已有编号[' +serial + '],重新生成会覆盖原有编号,是否继续?',
  78. onConfirm: function() {
  79. z.ui.ajax({
  80. type: "post",
  81. contentType: "application/json",
  82. url: "/common/generate-serial-number",
  83. data: JSON.stringify(postdata),
  84. success: function (res) {
  85. if(res && res.code === 0){
  86. $("[name='contractInvoice$invoiceNumber'] input").val(res.data)
  87. } else {
  88. z.ui.alertWarning(res.msg);
  89. }
  90. },
  91. error: function () {
  92. }
  93. })
  94. },
  95. onCancel: function () {
  96. }
  97. })
  98. } else {
  99. z.ui.ajax({
  100. type: "post",
  101. contentType: "application/json",
  102. url: "/common/generate-serial-number",
  103. data: JSON.stringify(postdata),
  104. success: function (res) {
  105. if(res && res.code === 0){
  106. $("[name='contractInvoice$invoiceNumber'] input").val(res.data)
  107. } else {
  108. z.ui.alertWarning(res.msg);
  109. }
  110. },
  111. error: function () {
  112. }
  113. })
  114. }
  115. })
  116. }
  117. function bindSelectMilestone(){
  118. $("#selectMilestone").click(function () {
  119. var contractId = $("[name='contractInvoice$contractId']").val();
  120. selectMilestone(contractId, setMilestone);
  121. })
  122. }
  123. function setMilestone(res) {
  124. if (res.data) {
  125. $("[name='contractInvoice$contractMilestoneName']").val(res.data.name);
  126. $("[name='contractInvoice$contractMilestoneId']").val(res.data.id);
  127. contractMilestoneName = res.data.name;
  128. contractMilestoneId = res.data.id;
  129. }
  130. }
  131. function submit(all, istransfer) {
  132. var invoiceAmount = $('[name="contractInvoice$invoiceAmount"] input').val();
  133. var contractBalance = $('[name="amount$contractBalance"] input').val();
  134. if( !contractBalance ){
  135. contractBalance = $('[name="contract$contractAmount"] input').val();
  136. if(!contractBalance){
  137. contractBalance = '0';
  138. }
  139. }
  140. if(parseFloat(invoiceAmount) > parseFloat(contractBalance)){
  141. all({success: false, errorMsg: "开票金额超出合同余额!"});
  142. return;
  143. }
  144. var postData = z.ui.form.getFormFields("[name=flow-form]", {validatorRequired: istransfer});
  145. if (postData === false) {
  146. all({success: false});
  147. return;
  148. }
  149. let allInvoiceAmount = 0;
  150. for (let key of Object.keys(postData)) {
  151. let mealName = postData[key];
  152. if (key.startsWith("Contract")) {
  153. allInvoiceAmount += Number(mealName.invoiceAmount);
  154. }
  155. }
  156. if(contractInvoiceList.length>1){
  157. if(Number(postData.contractInvoice.invoiceAmount).toFixed(2) != Number(allInvoiceAmount).toFixed(2)){
  158. all({success: false, errorMsg: "开票金额与所有项目开票金额之和不相等!"});
  159. return;
  160. }
  161. }
  162. for (let key of Object.keys(postData)) {
  163. let mealName = postData[key];
  164. if (key.startsWith("Contract")) {
  165. z.ui.ajax({
  166. url: z.ui.comm.getEntranceUrl("/contract-invoice-relation"),
  167. type: 'put',
  168. contentType: 'application/json',
  169. data: JSON.stringify({
  170. 'id': mealName.id,
  171. 'returnAmount': mealName.returnAmount,
  172. 'invoiceAmount': mealName.invoiceAmount
  173. }),
  174. success: function (res) {
  175. },
  176. error: function () {
  177. }
  178. })
  179. }
  180. }
  181. z.ui.ajax({
  182. url: z.ui.comm.getEntranceUrl("/flow/invoice/update"),
  183. data: z.ui.form.childStringify(postData),
  184. success: function () {
  185. all({success: true});
  186. },
  187. error: function () {
  188. all({success: false});
  189. }
  190. })
  191. }
  192. function initContractInvoiceList(){
  193. var contractList = JSON.parse(window.contractList);
  194. if(!contractList || contractList.length<2){
  195. $("[name=invoice-header]").hide();
  196. $("[name=invoice-body]").hide();
  197. return ;
  198. }
  199. if (contractList.length > 0) {
  200. for (let i = 0; i < contractList.length; i++) {
  201. let obj = {
  202. type: contractList[i].contractType || "",
  203. zrbm: contractList[i].zrbm || "",
  204. xmjl: contractList[i].xmjl || "",
  205. virtualAmount: contractList[i].virtualAmount || "",
  206. invoiceAmount: contractList[i].invoiceAmount || "",
  207. returnAmount: contractList[i].returnAmount || "",
  208. id: contractList[i].id || "",
  209. contractId: contractList[i].contractId || "",
  210. }
  211. contractInvoiceList.push(obj)
  212. }
  213. }
  214. updateContractInoviceListView()
  215. }
  216. function updateContractInoviceListView() {
  217. let tbodyQjsq = document.querySelector('[name=contractInvoiceList]')
  218. let html = ''
  219. for (let i = 0; i < contractInvoiceList.length; i++) {
  220. var type = contractInvoiceList[i].type === 1? '主合同': '子合同'
  221. html += '<tr class="qjsjClass" id="contract_invoce_list' + i + '" style="background:#fff">'
  222. + '<td name="contract_invoce_list_seq">' + (i + 1) + '</td>'
  223. + '<td>'
  224. + '<div class="form-flex">'
  225. + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
  226. + '<input type="hidden" name="Contract[' + i + ']$id" value="'+contractInvoiceList[i].id+'"/>'
  227. + '<input type="hidden" name="Contract[' + i + ']$contractId" value="'+contractInvoiceList[i].contractId+'"/>'
  228. + '<div class="z-comp-input" name="Contract[' + i + ']$type">'
  229. + '<input type="text" value="'+type+'">'
  230. + '</div>'
  231. + '</div>'
  232. + '</div>'
  233. + '</td>'
  234. + '<td>'
  235. + '<div class="form-flex">'
  236. + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
  237. + '<div class="z-comp-input" name="Contract[' + i + ']$zrbm">'
  238. + '<input type="text" value="'+contractInvoiceList[i].zrbm+'">'
  239. + '</div>'
  240. + '</div>'
  241. + '</div>'
  242. + '</td>'
  243. + '<td>'
  244. + '<div class="form-flex">'
  245. + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
  246. + '<div class="z-comp-input" name="Contract[' + i + ']$xmjl">'
  247. + '<input type="text" value="'+contractInvoiceList[i].xmjl+'">'
  248. + '</div>'
  249. + '</div>'
  250. + '</div>'
  251. + '</td>'
  252. + '<td>'
  253. + '<div class="form-flex">'
  254. + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
  255. + '<div class="z-comp-input" name="Contract[' + i + ']$virtualAmount">'
  256. + '<input type="text" class="contractAmount" value="'+contractInvoiceList[i].virtualAmount+'">'
  257. + '</div>'
  258. + '</div>'
  259. + '</div>'
  260. + '</td>'
  261. + '<td>'
  262. + '<div class="form-flex">'
  263. + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
  264. + '<div class="z-comp-input" name="Contract[' + i + ']$invoiceAmount">'
  265. + '<input type="text" class="contractInvoice" value="'+contractInvoiceList[i].invoiceAmount+'">'
  266. + '</div>'
  267. + '</div>'
  268. + '</div>'
  269. + '</td>'
  270. + '<td>'
  271. + '<div class="form-flex">'
  272. + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
  273. + '<div class="z-comp-input" name="Contract[' + i + ']$returnAmount">'
  274. + '<input type="text" class="invoiceReturnAmount" value="'+contractInvoiceList[i].returnAmount+'">'
  275. + '</div>'
  276. + '</div>'
  277. + '</div>'
  278. + '</td>'
  279. + '<td>';
  280. if(viewState !== "v") {
  281. html += '<div id="invoiceEditBtn_' + (i) + '" class="table-btn editBtn_' + (i) + '" data-index="' + (i) + '">'
  282. + '<span>编辑</span>'
  283. + '</div>';
  284. }
  285. html += '</td>'
  286. + '</tr>';
  287. }
  288. tbodyQjsq.innerHTML = html
  289. for (let i = 0; i < contractInvoiceList.length; i++) {
  290. if(viewState !== "v") {
  291. $("#invoiceEditBtn_" + i).click(function () {
  292. const span = $(this).find("span");
  293. const html = span.html();
  294. var tr = $("#contract_invoce_list" + i);
  295. var invoiceInput = tr.find("[name='Contract[" + i + "]$invoiceAmount'] input");
  296. if (html === '编辑') {
  297. span.html('保存')
  298. invoiceInput.removeAttr('disabled').removeClass("z-readonly").addClass("z-write");
  299. return;
  300. }
  301. if (html === '保存') {
  302. var invoiceAmount = invoiceInput.val();
  303. var returnAmount = tr.find("[name='Contract[" + i + "]$returnAmount'] input").val();
  304. var id = tr.find("[name='Contract[" + i + "]$id']").val();
  305. z.ui.ajax({
  306. url: z.ui.comm.getEntranceUrl("/contract-invoice-relation"),
  307. type: 'put',
  308. contentType: 'application/json',
  309. data: JSON.stringify({
  310. 'id': id,
  311. 'returnAmount': returnAmount,
  312. 'invoiceAmount': invoiceAmount
  313. }),
  314. success: function (res) {
  315. if (res.code === 0) {
  316. z.ui.alertSuccess("保存成功");
  317. invoiceInput.addClass("z-readonly").removeClass("z-write");
  318. invoiceInput[0].disabled = true;
  319. span.html("编辑")
  320. } else {
  321. z.ui.alertWarning(res.msg);
  322. }
  323. },
  324. error: function () {
  325. }
  326. })
  327. return;
  328. }
  329. })
  330. }
  331. detailReadonly(i,false,"contract_invoce_list")
  332. $("#contract_invoce_list" + i).addClass("form-table-disable")
  333. }
  334. }
  335. function bindCalcInvoiceAmount(){
  336. $("[name='contractInvoice$invoiceAmount'] input").change(function(){
  337. if(!parseFloat($(this).val())){
  338. return;
  339. }
  340. totalContractAmount = 0;
  341. let arr = $('.contractAmount');
  342. for (let i = 0; i < arr.length; i++) {
  343. if(parseFloat($(arr[i]).val())) {
  344. totalContractAmount += parseFloat($(arr[i]).val())
  345. }
  346. }
  347. for (let i = 0; i < arr.length; i++) {
  348. var dom = $(arr[i]).closest("tr").find(".contractInvoice");
  349. $(dom).val(($(arr[i]).val() / totalContractAmount * $(this).val()).toFixed(2));
  350. }
  351. })
  352. }
  353. function bindReturnMoney(){
  354. var arr = $('.contractInvoice');
  355. for(var i =0 ;i < arr.length;i++){
  356. $(arr[i]).change(function(){
  357. calcReturnAmount();
  358. })
  359. }
  360. $("[name=returnMoney]").delegate('.returnAmount',"propertychange input",function(){
  361. calcReturnAmount();
  362. })
  363. // var arr = $('.returnAmount');
  364. // for(var i =0 ;i < arr.length;i++){
  365. // $(arr[i]).change(function(){
  366. // calcReturnAmount();
  367. // })
  368. // }
  369. }
  370. function calcReturnAmount(){
  371. calcTotalReturnAmount();
  372. calcTotalInvoiceAmount()
  373. let arr = $('.invoiceReturnAmount');
  374. for (let i = 0; i < arr.length; i++) {
  375. var ia = $(arr[i]).closest("tr").find(".contractInvoice").val();
  376. $(arr[i]).val((ia / totalInvoiceAmount * totalReturnAmount).toFixed(2));
  377. }
  378. }
  379. function calcTotalInvoiceAmount(){
  380. totalInvoiceAmount = 0;
  381. let arr = $('.contractInvoice');
  382. for (let i = 0; i < arr.length; i++) {
  383. if(parseFloat($(arr[i]).val())) {
  384. totalInvoiceAmount += parseFloat($(arr[i]).val());
  385. }
  386. }
  387. }
  388. function calcTotalReturnAmount(){
  389. totalReturnAmount = 0;
  390. let arr = $('.returnAmount');
  391. for (let i = 0; i < arr.length; i++) {
  392. if(parseFloat($(arr[i]).val())) {
  393. if(parseFloat($(arr[i]).val())){
  394. totalReturnAmount += parseFloat($(arr[i]).val())
  395. }
  396. }
  397. }
  398. }
  399. function initContractReturnMoney(){
  400. var returnMoney = JSON.parse(window.returnMoneyList);
  401. if (returnMoney.length > 0) {
  402. totalReturnAmount = 0;
  403. for (let i = 0; i < returnMoney.length; i++) {
  404. totalReturnAmount += returnMoney[i].returnAmount;
  405. let obj = {
  406. contractMilestoneName: returnMoney[i].contractMilestoneName || contractMilestoneName,
  407. contractMilestoneId: returnMoney[i].contractId || contractMilestoneId,
  408. returnAmount: returnMoney[i].returnAmount || "",
  409. returnDate: returnMoney[i].returnDate || "",
  410. bz: returnMoney[i].bz || "",
  411. id: returnMoney[i].id || "",
  412. contractId: returnMoney[i].contractId || contractId,
  413. contractInvoiceId: returnMoney[i].contractInvoiceId || contractInvoiceId,
  414. sortnum: returnMoney[i].sortnum || ""
  415. }
  416. lists.push(obj)
  417. }
  418. }
  419. $("#addData").click(function(){
  420. addContractReturnMoney();
  421. calcReturnAmount();
  422. })
  423. updateView()
  424. }
  425. function updateList(){
  426. lists = [];
  427. var postData = z.ui.form.getFormFields("[name=flow-form]", {validatorRequired: false});
  428. for (let key of Object.keys(postData)) {
  429. let mealName = postData[key];
  430. if (key.startsWith("ContractReturnMoney")) {
  431. var dataObj = {
  432. contractMilestoneName: contractMilestoneName,
  433. contractMilestoneId: contractMilestoneId,
  434. returnAmount: mealName.returnAmount,
  435. returnDate: mealName.returnDate,
  436. bz: mealName.bz,
  437. id: mealName.id,
  438. contractId: contractId,
  439. contractInvoiceId: contractInvoiceId,
  440. sortnum: lists.length
  441. }
  442. lists.push(dataObj);
  443. }
  444. }
  445. }
  446. function getCurrentDate() {
  447. const now = new Date();
  448. const year = now.getFullYear();
  449. const month = (now.getMonth() + 1).toString().padStart(2, '0');
  450. const day = now.getDate().toString().padStart(2, '0');
  451. return `${year}-${month}-${day}`;
  452. }
  453. function addContractReturnMoney(){
  454. var trFragment = document.createDocumentFragment();
  455. let tbody = document.querySelectorAll('[name=returnMoney] tr')
  456. let qjsjElements = document.getElementsByName("contract_return_seq");
  457. var dataObj = {
  458. contractMilestoneName: contractMilestoneName,
  459. contractMilestoneId: contractMilestoneId,
  460. returnAmount: window.invoiceReceivable,
  461. returnDate: getCurrentDate(),
  462. bz: "",
  463. id: "",
  464. contractId: contractId,
  465. contractInvoiceId: contractInvoiceId,
  466. sortnum: ""
  467. }
  468. lists.push(dataObj);
  469. trFragment.appendChild(generateTableTrHtml(lists.length-1))
  470. var index = lists.length - 1;
  471. $("[name=returnMoney]").append(trFragment)
  472. $("#delBtn_" + index).click(function () {
  473. var i = this.id.substring(this.id.indexOf("_") + 1)
  474. var tr =$("#contract_return_" + i);
  475. var returnId = tr.find("[name='ContractReturnMoney["+i+"]$id']").val();
  476. z.ui.confirm("compid").init({
  477. content: "确定删除吗?",
  478. onConfirm: function () {
  479. z.ui.ajax({
  480. url: z.ui.comm.getEntranceUrl("/contract-return-money?id="+returnId),
  481. type: 'delete',
  482. contentType: 'application/json',
  483. data: {},
  484. success: function (res) {
  485. if(res.code === 0){
  486. z.ui.alertSuccess("删除成功");
  487. var element = document.getElementById("contract_return_" + i);
  488. element.remove();
  489. buildSeq();
  490. updateList();
  491. //lists.splice(i,1);
  492. updateView();
  493. } else {
  494. z.ui.alertWarning(res.msg);
  495. }
  496. },
  497. error: function () {
  498. }
  499. })
  500. },
  501. onCancel: function () {
  502. }
  503. })
  504. })
  505. $("#editBtn_" + index).click(function () {
  506. var i = this.id.substring(this.id.indexOf("_") + 1)
  507. const span = $(this).find("span");
  508. const html = span.html();
  509. var tr =$("#contract_return_" + i);
  510. if (html === '保存') {
  511. var returnAmount = tr.find("[name='ContractReturnMoney["+i+"]$returnAmount'] input").val();
  512. var returnId = tr.find("[name='ContractReturnMoney["+i+"]$id']").val();
  513. var dom = $("[name^='ContractReturnMoney['][name$='$returnAmount'] input");
  514. var totalReturnAmount = 0;
  515. for (let j = 0; j < dom.length; j++) {
  516. var tmp = $(dom[j]).val()
  517. if(parseFloat(tmp)){
  518. totalReturnAmount += parseFloat(tmp);
  519. }
  520. }
  521. var invoiceAmount = $("[name='contractInvoice$invoiceAmount'] input").val();
  522. if(!returnAmount){
  523. z.ui.alertWarning("请填写回款金额");
  524. return;
  525. }
  526. if(!parseFloat(returnAmount)){
  527. z.ui.alertWarning("回款金额有误");
  528. return;
  529. }
  530. if(parseFloat(invoiceAmount) && (totalReturnAmount > parseFloat(invoiceAmount))){
  531. z.ui.alertWarning("回款金额不能超过开票金额");
  532. return;
  533. }
  534. var returnDate = tr.find("[name='ContractReturnMoney["+i+"]$returnDate'] input").val();
  535. if(!returnDate){
  536. z.ui.alertWarning("请填写回款日期");
  537. return;
  538. }
  539. var bz =tr.find("[name='ContractReturnMoney["+i+"]$bz'] input").val();
  540. var formInfo = z.ui.form.getFormFields("[name=flow-form]", {validatorRequired: false});
  541. var relationList = [];
  542. for (let key of Object.keys(formInfo)) {
  543. let mealName = formInfo[key];
  544. if (key.startsWith("Contract[")) {
  545. relationList.push(z.ui.form.childStringify(mealName));
  546. }
  547. }
  548. z.ui.loading(true, true, 0, "保存中...");
  549. z.ui.ajax({
  550. url: z.ui.comm.getEntranceUrl("/contract-return-money"),
  551. type: 'post',
  552. contentType: 'application/json',
  553. data: JSON.stringify({
  554. 'id': returnId,
  555. 'contractId' : contractId,
  556. 'contractInvoiceId' : contractInvoiceId,
  557. 'contractMilestoneId' : contractMilestoneId,
  558. 'contractMilestoneName' : contractMilestoneName,
  559. 'returnAmount': returnAmount,
  560. 'returnDate': returnDate,
  561. 'bz': bz,
  562. 'relationList': relationList
  563. }),
  564. success: function (res) {
  565. z.ui.loading(false);
  566. if(res.code === 0){
  567. if(!returnId){
  568. tr.find("[name='ContractReturnMoney["+i+"]$id']").val(res.data);
  569. }
  570. z.ui.alertSuccess("回款添加成功");
  571. detailReadonly(i, false,"contract_return_")
  572. $("#addData").removeAttr('disabled')
  573. tr.addClass("form-table-disable")
  574. span.html('编辑');
  575. } else {
  576. z.ui.alertWarning(res.msg);
  577. }
  578. },
  579. error: function () {
  580. z.ui.loading(false);
  581. }
  582. })
  583. } else if (html === '编辑') {
  584. span.html('保存')
  585. detailWrite(i);
  586. $("#addData").attr('disabled', "true");
  587. tr.removeClass("form-table-disable")
  588. }
  589. })
  590. z.ui.date("[name='ContractReturnMoney[" + (lists.length-1) + "]$returnDate']").init()
  591. buildSeq();
  592. for (let i = 0; i < tbody.length; i++) {
  593. z.ui.date("[name='ContractReturnMoney[" + i + "]$returnDate']").init({
  594. done: function (value, date, endDate) {
  595. //改变日期后触发
  596. console.log(value);
  597. }
  598. });
  599. }
  600. }
  601. function buildSeq() {
  602. let elementsByName = document.getElementsByName("contract_return_seq");
  603. for (let i = 0; i < elementsByName.length; i++) {
  604. const seqElement = elementsByName[i];
  605. seqElement.innerHTML = i + 1;
  606. }
  607. }
  608. function initInvoiceCompany(){
  609. z.ui.ajax({
  610. type: "get",
  611. url: "/common/company-tree",
  612. data: {},
  613. success: function (res) {
  614. if(res && res.code === 0 && res.data.length > 0){
  615. selecttree("[name='invoiceCompany']",res.data,clickInvoiceCompany,null,null,setInvoiceCompany)
  616. }
  617. },
  618. error: function () {
  619. }
  620. })
  621. }
  622. function setInvoiceCompany(){
  623. var id = $("[name='contractInvoice$invoiceCompanyId']").val();
  624. if(id){
  625. z.ui.selecttree("[name='invoiceCompany']").setValue(id);
  626. }
  627. }
  628. function clickInvoiceCompany(even, treeId, treeNode) {
  629. $("[name='contractInvoice$invoiceCompany']").val(treeNode.name);
  630. $("[name='contractInvoice$invoiceCompanyId']").val(treeNode.id);
  631. }
  632. function initPayCompany(){
  633. z.ui.ajax({
  634. type: "get",
  635. url: "/customer-tree",
  636. data: {},
  637. success: function (res) {
  638. if(res && res.code === 0 && res.data.length > 0){
  639. selecttree("[name='payCompany']",res.data,clickPayCompany,null,null,setPayCompany);
  640. }
  641. },
  642. error: function () {
  643. }
  644. })
  645. }
  646. function setPayCompany(){
  647. var id = $("[name='contractInvoice$payCompanyId']").val();
  648. if(id){
  649. z.ui.selecttree("[name='payCompany']").setValue(id);
  650. }
  651. }
  652. function clickPayCompany(even, treeId, treeNode) {
  653. $("[name='contractInvoice$payCompany']").val(treeNode.name);
  654. $("[name='contractInvoice$payCompanyId']").val(treeNode.id);
  655. $("[name='contractInvoice$payTaxNumber'] input").val(treeNode.extendData.taxNumber);
  656. $("[name='contractInvoice$payAddress'] input").val(treeNode.extendData.payAddress);
  657. $("[name='contractInvoice$payBank'] input").val(treeNode.extendData.bankaccount);
  658. }
  659. function updateView() {
  660. let tbodyQjsq = document.querySelector('[name=returnMoney]')
  661. let html = ''
  662. for (let i = 0; i < lists.length; i++) {
  663. // var ratio = '';
  664. // if(parseFloat(contractAmount) && parseFloat(contractAmount) > 0 ){
  665. // ratio = ((lists[i].returnAmount / parseFloat(contractAmount)) * 100).toFixed(2) + '%';
  666. // }
  667. html += '<tr class="qjsjClass" id="contract_return_' + i + '" style="background:#fff">'
  668. + '<td name="contract_return_seq">' + (i + 1) + '</td>'
  669. + '<td>'
  670. + '<div class="form-flex">'
  671. + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
  672. + '<input type="hidden" name="ContractReturnMoney[' + i + ']$id" value="'+lists[i].id+'"/>'
  673. + '<input type="hidden" name="ContractReturnMoney[' + i + ']$sortnum" value="'+lists[i].sortnum+'"/>'
  674. + '<input type="hidden" name="ContractReturnMoney[' + i + ']$contractInvoiceId" value="'+lists[i].contractInvoiceId+'"/>'
  675. + '<input type="hidden" name="ContractReturnMoney[' + i + ']$contractId" value="'+lists[i].contractId+'"/>'
  676. + '<input type="hidden" name="ContractReturnMoney[' + i + ']$contractMilestoneId" value="'+lists[i].contractMilestoneId+'"/>'
  677. + '<div class="z-comp-input" name="ContractReturnMoney[' + i + ']$returnAmount">'
  678. + '<input type="text" class="returnAmount" value="'+lists[i].returnAmount+'">'
  679. + '</div>'
  680. + '</div>'
  681. + '</div>'
  682. + '</td>'
  683. + '<td>'
  684. + '<div class="form-flex">'
  685. + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
  686. + '<div class="z-comp-date" name="ContractReturnMoney[' + i + ']$returnDate">'
  687. + '<input type="text" value="'+lists[i].returnDate+'">'
  688. + '</div>'
  689. + '</div>'
  690. + '</div>'
  691. + '</td>'
  692. + '<td>'
  693. + '<div class="form-flex">'
  694. + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
  695. + '<div class="z-comp-input" name="ContractReturnMoney[' + i + ']$bz">'
  696. + '<input type="text" value="'+lists[i].bz+'">'
  697. + '</div>'
  698. + '</div>'
  699. + '</div>'
  700. + '</td>'
  701. + '<td>'
  702. + '<div style="display: flex;white-space: nowrap">'
  703. + '<div id="editBtn_' + (i) + '" class="table-btn editBtn_' + (i) + '" data-index="' + (i) + '">'
  704. + '<span>编辑</span>'
  705. + '</div>'
  706. + '<div id="delBtn_' + (i) + '" class="table-btn delBtn_' + (i) + '" data-index="' + (i) + '">'
  707. + '<span>删除</span>'
  708. + '</div></div>'
  709. + '</td></tr>';
  710. }
  711. tbodyQjsq.innerHTML = html
  712. for (let i = 0; i < lists.length; i++) {
  713. z.ui.date("[name='ContractReturnMoney[" + i + "]$returnDate']").init()
  714. $("#delBtn_" + i).click(function () {
  715. var tr =$("#contract_return_" + i);
  716. var returnId = tr.find("[name='ContractReturnMoney["+i+"]$id']").val();
  717. z.ui.confirm("compid").init({
  718. content: "确定删除吗?",
  719. onConfirm: function () {
  720. z.ui.ajax({
  721. url: z.ui.comm.getEntranceUrl("/contract-return-money?id="+returnId),
  722. type: 'delete',
  723. contentType: 'application/json',
  724. data: {},
  725. success: function (res) {
  726. if(res.code === 0){
  727. z.ui.alertSuccess("删除成功");
  728. var element = document.getElementById("contract_return_" + i);
  729. element.remove();
  730. buildSeq();
  731. updateList();
  732. //lists.splice(i,1);
  733. updateView();
  734. } else {
  735. z.ui.alertWarning(res.msg);
  736. }
  737. },
  738. error: function () {
  739. }
  740. })
  741. },
  742. onCancel: function () {
  743. }
  744. })
  745. })
  746. $("#editBtn_" + i).click(function () {
  747. const span = $(this).find("span");
  748. const html = span.html();
  749. var tr =$("#contract_return_" + i);
  750. var returnAmount = tr.find("[name='ContractReturnMoney["+i+"]$returnAmount'] input").val();
  751. var returnDate = tr.find("[name='ContractReturnMoney["+i+"]$returnDate'] input").val();
  752. var returnId = tr.find("[name='ContractReturnMoney["+i+"]$id']").val();
  753. var bz =tr.find("[name='ContractReturnMoney["+i+"]$bz'] input").val();
  754. var formInfo = z.ui.form.getFormFields("[name=flow-form]", {validatorRequired: false});
  755. var relationList = [];
  756. for (let key of Object.keys(formInfo)) {
  757. let mealName = formInfo[key];
  758. if (key.startsWith("Contract[")) {
  759. relationList.push(z.ui.form.childStringify(mealName));
  760. }
  761. }
  762. if (html === '保存') {
  763. z.ui.loading(true, true, 0, "保存中...");
  764. z.ui.ajax({
  765. url: z.ui.comm.getEntranceUrl("/contract-return-money"),
  766. type: 'post',
  767. contentType: 'application/json',
  768. data: JSON.stringify({
  769. 'id': returnId,
  770. 'contractId' : contractId,
  771. 'contractInvoiceId' : contractInvoiceId,
  772. 'contractMilestoneId' : contractMilestoneId,
  773. 'contractMilestoneName' : contractMilestoneName,
  774. 'returnAmount': returnAmount,
  775. 'returnDate': returnDate,
  776. 'bz': bz,
  777. 'relationList': relationList
  778. }),
  779. success: function (res) {
  780. z.ui.loading(false)
  781. if(res.code === 0){
  782. if(!returnId){
  783. tr.find("[name='ContractReturnMoney["+i+"]$id']").val(res.data);
  784. }
  785. z.ui.alertSuccess("回款添加成功");
  786. detailReadonly(i, false,"contract_return_")
  787. $("#addData").removeAttr('disabled')
  788. tr.addClass("form-table-disable")
  789. span.html('编辑');
  790. } else {
  791. z.ui.alertWarning(res.msg);
  792. }
  793. },
  794. error: function () {
  795. z.ui.loading(false)
  796. }
  797. })
  798. } else if (html === '编辑'){
  799. span.html('保存')
  800. detailWrite(i);
  801. $("#addData").attr('disabled', "true");
  802. tr.removeClass("form-table-disable")
  803. }
  804. })
  805. detailReadonly(i,false,"contract_return_")
  806. $("#contract_return_" + i).addClass("form-table-disable")
  807. }
  808. // detailTotalInit()
  809. }
  810. function detailReadonly(i, isBool = true,prefix) {
  811. if (isBool) {
  812. $("#delBtn_" + i).css("display", "none");
  813. $("#editBtn_" + i).css("display", "none");
  814. }
  815. let detailElement = document.getElementById(prefix + i);
  816. let detailInput = detailElement.getElementsByTagName("input");
  817. for (let j = 0; j < detailInput.length; j++) {
  818. detailInput[j].disabled = true;
  819. detailInput[j].className += " z-readonly"
  820. }
  821. }
  822. function detailWrite(i) {
  823. //财务审核时可以核减修改金额
  824. let detailElement = document.getElementById("contract_return_" + i);
  825. let detailInput = detailElement.getElementsByTagName("input");
  826. for (let j = 0; j < detailInput.length; j++) {
  827. detailInput[j].disabled = false;
  828. $(detailInput[j]).removeClass(" z-readonly")
  829. }
  830. }
  831. function generateTableTrHtml(index) {
  832. var trDom = document.createElement("tr");
  833. trDom.style.backgroundColor = "#fff";
  834. trDom.id = "contract_return_" + index;
  835. trDom.className = 'qjsjClass';
  836. trDom.innerHTML = '<td name="contract_return_seq">' + (index + 1) + '</td>'
  837. + '<td>'
  838. + '<div class="form-flex">'
  839. + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
  840. + '<input type="hidden" name="ContractReturnMoney[' + index + ']$id" value="'+lists[index].id+'"/>'
  841. + '<input type="hidden" name="ContractReturnMoney[' + index + ']$sortnum" value="'+lists[index].sortnum+'"/>'
  842. + '<input type="hidden" name="ContractReturnMoney[' + index + ']$contractInvoiceId" value="'+lists[index].contractInvoiceId+'"/>'
  843. + '<input type="hidden" name="ContractReturnMoney[' + index + ']$contractId" value="'+lists[index].contractId+'"/>'
  844. + '<input type="hidden" name="ContractReturnMoney[' + index + ']$contractMilestoneId" value="'+lists[index].contractMilestoneId+'"/>'
  845. + '<div class="z-comp-input" name="ContractReturnMoney[' + index + ']$returnAmount">'
  846. + '<input type="text" class="returnAmount" value="'+lists[index].returnAmount+'">'
  847. + '</div>'
  848. + '</div>'
  849. + '</div>'
  850. + '</td>'
  851. + '<td>'
  852. + '<div class="form-flex">'
  853. + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
  854. + '<div class="z-comp-date" name="ContractReturnMoney[' + index + ']$returnDate">'
  855. + '<input type="text" value="'+lists[index].returnDate+'">'
  856. + '</div>'
  857. + '</div>'
  858. + '</div>'
  859. + '</td>'
  860. + '<td>'
  861. + '<div class="form-flex">'
  862. + '<div class="form-item" style="width: 100%;margin-right: 5px;">'
  863. + '<div class="z-comp-input" name="ContractReturnMoney[' + index + ']$bz">'
  864. + '<input type="text" value="">'
  865. + '</div>'
  866. + '</div>'
  867. + '</div>'
  868. + '</td>'
  869. + '<td>'
  870. + '<div style="display: flex;white-space: nowrap">'
  871. + '<div id="editBtn_' + (index) + '" class="table-btn editBtn_' + (index) + '" data-index="' + (index) + '">'
  872. + '<span>保存</span>'
  873. + '</div>'
  874. + '<div id="delBtn_' + (index) + '" class="table-btn delBtn_' + (index) + '" data-index="' + (index) + '">'
  875. + '<span>删除</span>'
  876. + '</div></div>'
  877. + '</td>';
  878. return trDom;
  879. }
  880. }())